source: titan/titan/frontenddev.h @ 41155

Last change on this file since 41155 was 41155, checked in by gost, 6 years ago

[titan] new test fbc

File size: 66.0 KB
Line 
1#ifndef FRONTENDDEV_H
2#define FRONTENDDEV_H
3
4enum {
5                T_Bandwidth_8MHz, T_Bandwidth_7MHz, T_Bandwidth_6MHz, T_Bandwidth_Auto, T_Bandwidth_5MHz, T_Bandwidth_1_712MHz, T_Bandwidth_10MHz
6};
7
8enum {
9                T_FEC_1_2=0, T_FEC_2_3=1, T_FEC_3_4=2, T_FEC_5_6=3, T_FEC_7_8=4, T_FEC_Auto=5, T_FEC_6_7=6, T_FEC_8_9=7
10};
11
12enum {
13                System_DVB_T_T2 = -1, System_DVB_T, System_DVB_T2
14};
15
16enum {
17                T_TransmissionMode_2k, T_TransmissionMode_8k, T_TransmissionMode_Auto, T_TransmissionMode_4k, T_TransmissionMode_1k, T_TransmissionMode_16k, T_TransmissionMode_32k
18};
19
20enum {
21                T_GuardInterval_1_32, T_GuardInterval_1_16, T_GuardInterval_1_8, T_GuardInterval_1_4, T_GuardInterval_Auto, T_GuardInterval_1_128, T_GuardInterval_19_128, T_GuardInterval_19_256
22};
23
24enum {
25                T_Hierarchy_None, T_Hierarchy_1, T_Hierarchy_2, T_Hierarchy_4, T_Hierarchy_Auto
26};
27
28enum {
29                T_Modulation_QPSK, T_Modulation_QAM16, T_Modulation_QAM64, T_Modulation_Auto, T_Modulation_QAM256
30};
31
32enum {
33                T_Inversion_Off, T_Inversion_On, T_Inversion_Unknown
34};
35
36int calclof(struct dvbdev* node, struct transponder* tpnode, char* feaktnr, int flag)
37{
38        int loftype = 0;
39        int lofl, lofh, lofthreshold;
40        int satcrfrequ = 0;
41        char* tmpstr = NULL;
42
43        if(node == NULL || tpnode == NULL)
44        {
45                err("NULL detect");
46                return -1;
47        }
48
49        if(node->feinfo->type != FE_QPSK)
50                return 0;
51
52        unsigned int frequency = tpnode->frequency;
53        node->feunicable = 0;
54
55        if(feaktnr == NULL) feaktnr = node->feaktnr;
56
57        tmpstr = ostrcat(node->feshortname, "_lnb_loftype", 0, 0);
58        loftype = getconfigint(tmpstr, feaktnr);
59        free(tmpstr); tmpstr = NULL;
60        switch(loftype)
61        {
62                case 1: //c-band
63                        lofl = 5150 * 1000;
64                        lofh = 5150 * 1000;
65                        lofthreshold = 5150 * 1000;
66                        break;
67                case 2: //user
68                        tmpstr = ostrcat(node->feshortname, "_lnb_lofl", 0, 0);
69                        lofl = getconfigint(tmpstr, feaktnr) * 1000;
70                        free(tmpstr); tmpstr = NULL;
71                        tmpstr = ostrcat(node->feshortname, "_lnb_lofh", 0, 0);
72                        lofh = getconfigint(tmpstr, feaktnr) * 1000;
73                        free(tmpstr); tmpstr = NULL;
74                        tmpstr = ostrcat(node->feshortname, "_lnb_lofthreshold", 0, 0);
75                        lofthreshold = getconfigint(tmpstr, feaktnr) * 1000;
76                        free(tmpstr); tmpstr = NULL;
77                        break;
78                case 3: //unicable
79                case 4: //user unicable
80                        tmpstr = ostrcat(node->feshortname, "_lnb_lofl", 0, 0);
81                        lofl = getconfigint(tmpstr, feaktnr) * 1000;
82                        free(tmpstr); tmpstr = NULL;
83                        if(lofl == 0) lofl = 9750 * 1000;
84                        tmpstr = ostrcat(node->feshortname, "_lnb_lofh", 0, 0);
85                        lofh = getconfigint(tmpstr, feaktnr) * 1000;
86                        free(tmpstr); tmpstr = NULL;
87                        if(lofh == 0) lofh = 10600 * 1000;
88                        tmpstr = ostrcat(node->feshortname, "_lnb_lofthreshold", 0, 0);
89                        lofthreshold = getconfigint(tmpstr, feaktnr) * 1000;
90                        free(tmpstr); tmpstr = NULL;
91                        if(lofthreshold == 0) lofthreshold = 11700 * 1000;
92                        tmpstr = ostrcat(node->feshortname, "_lnb_satcrfrequ", 0, 0);
93                        satcrfrequ = getconfigint(tmpstr, feaktnr) * 1000;
94                        free(tmpstr); tmpstr = NULL;
95                        break;
96                default: //standard lnb
97                        lofl = 9750 * 1000;
98                        lofh = 10600 * 1000;
99                        lofthreshold = 11700 * 1000;
100        }
101
102        if(lofthreshold && lofh && frequency >= lofthreshold)
103        {
104                if(flag == 1) return 1;
105                node->feaktband = 1;
106        }
107        else
108        {
109                if(flag == 1) return 0;
110                node->feaktband = 0;
111        }
112
113        if(satcrfrequ == 0)
114        {
115                if(node->feaktband)
116                        node->feloffrequency = frequency - lofh;
117                else
118                {
119                        if(frequency < lofl)
120                                node->feloffrequency = lofl - frequency;
121                        else
122                                node->feloffrequency = frequency - lofl;
123                }
124        }
125        else
126        {
127                int lof = (node->feaktband & 1) ? lofh : lofl;
128                unsigned int tmp = (frequency - lof) + satcrfrequ;
129                node->feloffrequency = (tmp / 4) - 350000;
130                node->feunicable = 1;
131        }
132
133        debug(200, "tuning to freq %d (befor lof %d), band=%d, unicable=%d", node->feloffrequency, frequency, node->feaktband, node->feunicable);
134        return node->feaktband;
135}
136
137char* fegettypestr(struct dvbdev* dvbnode)
138{
139        char* text = NULL;
140
141        if(dvbnode == NULL)
142        {
143                err("NULL detect");
144                return NULL;
145        }
146
147        switch(dvbnode->feinfo->type)
148        {
149                case FE_QPSK: text = ostrcat(text, "DVB-S", 1, 0); break;
150                case FE_QAM: text = ostrcat(text, "DVB-C", 1, 0); break;
151                case FE_OFDM: text = ostrcat(text, "DVB-T", 1, 0); break;
152                default: text = ostrcat(text, "unknown", 1, 0);
153        }
154
155        return text;
156}
157
158struct dvbdev* fegetbyshortname(char* feshortname)
159{
160        struct dvbdev* dvbnode = dvbdev;
161       
162        while(dvbnode != NULL)
163        {
164                if(dvbnode->type == FRONTENDDEV && ostrcmp(dvbnode->feshortname, feshortname) == 0)
165                        return dvbnode;
166                dvbnode = dvbnode->next;
167        }
168        return NULL;
169}
170
171void fegetconfig(struct dvbdev *dvbnode, struct transponder *tpnode, char** aktnr, char* tmpnr)
172{
173        char* tmpstr = NULL;
174
175        if(dvbnode == NULL || tpnode == NULL)
176        {
177                err("NULL detect");
178                return;
179        }
180
181        tmpstr = ostrcat(dvbnode->feshortname, "_satnr", 0, 0);
182        *aktnr = getconfig(tmpstr, tmpnr);
183        free(tmpstr); tmpstr = NULL;
184}
185
186struct dvbdev* fegetdummy()
187{
188        struct dvbdev* dvbnode = dvbdev;
189
190        while(dvbnode != NULL)
191        {
192                if(dvbnode->type == FRONTENDDEVDUMMY)
193                        return dvbnode;
194                dvbnode = dvbnode->next;
195        }
196        return NULL;
197}
198
199void settunerstatus()
200{
201        struct dvbdev* dvbnode = dvbdev;
202        char *tmpstr = NULL;
203        char *buf = NULL;
204        int fbc = 0;
205        while(dvbnode != NULL)
206        {
207                //FRONTENDDEV first in the list
208                if(dvbnode->type != FRONTENDDEV) break;
209               
210                if(dvbnode != NULL && ostrstr(dvbnode->feinfo->name, "BCM45208") != NULL)
211                        fbc = 1;
212                else
213                        fbc = 0;
214
215                if((checkbox("DM900") == 1 || checkbox("DM520") == 1 || checkbox("DM525") == 1) && fbc != 1)
216                {
217                        if(ostrcmp("fe_01", dvbnode->feshortname) == 0)
218                        {
219                                if(ostrcmp("fe_00", getconfig(dvbnode->feshortname, NULL)) == 0)
220                                        system("echo internal > /proc/stb/frontend/1/rf_switch");
221                                else
222                                        system("echo external > /proc/stb/frontend/1/rf_switch");
223                        }
224                }
225                if(fbc == 1)
226                {
227                        buf = malloc(MINMALLOC);
228                        if(buf == NULL)
229                        {
230                                err("no memory");
231                                return;
232                        }
233                        sprintf(buf, "/proc/stb/frontend/%d/input",dvbnode->devnr);
234                        tmpstr = ostrcat(dvbnode->feshortname, "_fbc", 0, 0);
235                        if(ostrcmp("AM", getconfig(tmpstr, NULL)) == 0 || ostrcmp("AU", getconfig(tmpstr, NULL)) == 0 || ostrcmp("A", getconfig(tmpstr, NULL)) == 0)
236                                writesys(buf, "A", 1);
237                        else
238                                writesys(buf, "B", 1); 
239                        free(buf); buf = NULL;
240                        free(tmpstr); tmpstr = NULL;
241                }
242                //check if tuner is deactivate
243                if(ostrcmp("x", getconfig(dvbnode->feshortname, NULL)) == 0)
244                        dvbnode->deactive = 1;
245                else
246                        dvbnode->deactive = 0;
247
248                dvbnode = dvbnode->next;
249        }
250}
251
252//flag 0 = normal
253//flag 1 = check only
254//flag 2 = from record
255//flag 3 = from rectimer
256struct dvbdev* fegetfree(struct transponder* tpnode, int flag, struct dvbdev* dvbfirst)
257{
258        struct dvbdev* dvbnode = NULL;
259        struct dvbdev* tmpdvbnode = NULL;
260        char* tmpstr = NULL, *tmpnr = NULL, *aktnr = NULL;
261        int i, orbitalpos = 0, band = 0;
262        int found = 0;
263        //char *CharPtrTmp[20];
264        struct dvbdev* CharPtrTmp[20];
265       
266        if(dvbfirst != NULL)
267                dvbnode = dvbfirst;
268        else
269                dvbnode = dvbdev;
270
271        if(tpnode == NULL)
272        {
273                err("NULL detect");
274                return NULL;
275        }
276
277        //suche tuner der auf der gleichen orbitalpos/frequency/pol/band ist
278        if(flag != 1) printf("****** gesucht wird.. orbitalpos:%d frequency:%d feaktpolarization:%d\n", tpnode->orbitalpos, tpnode->frequency, tpnode->polarization);
279        while(dvbnode != NULL)
280        {
281                //FRONTENDDEV first in the list
282                if(dvbnode->type != FRONTENDDEV) break;
283
284                //check if tuner is deactivate
285                if(dvbnode->deactive == 1)
286                {
287                        dvbnode = dvbnode->next;
288                        continue;
289                }
290                if(dvbnode->type == FRONTENDDEV && dvbnode->feinfo->type == tpnode->fetype)
291                {
292                        if(flag != 1 && dvbnode->feakttransponder != NULL) printf("-----11 %s orbitalpos:%d frequency:%d feaktpolarization:%d lock:%d\n", dvbnode->feshortname, dvbnode->feakttransponder->orbitalpos, dvbnode->feakttransponder->frequency, dvbnode->feaktpolarization, dvbnode->felock);
293                        else  if(flag != 1) printf("-----11 %s feakttransponder = NULL\n", dvbnode->feshortname);
294                        if(dvbnode->feakttransponder != NULL && dvbnode->feakttransponder->orbitalpos == tpnode->orbitalpos && dvbnode->feakttransponder->frequency == tpnode->frequency && dvbnode->feaktpolarization == tpnode->polarization)
295                        {
296                                band = calclof(dvbnode, tpnode, dvbnode->feaktnr, 1);
297                                if(dvbnode->feaktband != band)
298                                {
299                                        if(flag != 1) printf("-----1 Band passt nicht\n");
300                                        dvbnode = dvbnode->next;
301                                        continue;
302                                }
303                                dvbnode->felasttransponder = dvbnode->feakttransponder;
304                                dvbnode->feakttransponder = tpnode;
305                                if(flag != 1) debug(200, "found tuner with same orbitalpos/frequency/pol/band %s", dvbnode->feshortname);
306                                if(flag != 1) printf("------ found tuner with same orbitalpos/frequency/pol/band %s\n", dvbnode->feshortname);
307                                return(dvbnode);
308                        }
309                }
310                dvbnode = dvbnode->next;
311        }
312        if(dvbfirst != NULL)
313                dvbnode = dvbfirst;
314        else
315                dvbnode = dvbdev;
316
317        //suche tuner der die gewuenschte orbitalpos kann und belegt ist und dessen looptuner es kann
318        while(dvbnode != NULL)
319        {
320                //FRONTENDDEV first in the list
321                if(dvbnode->type != FRONTENDDEV) break;
322
323                //check if tuner is deactivate
324                if(dvbnode->deactive == 1)
325                {
326                        dvbnode = dvbnode->next;
327                        continue;
328                }
329                if(dvbnode->type == FRONTENDDEV && dvbnode->feinfo->type == tpnode->fetype && (dvbnode->felock != 0 || (flag == 2 && status.aktservice->fedev == dvbnode)))
330                {
331                        //check if tuner is main tuner
332                        if(getconfig(dvbnode->feshortname, NULL) != NULL)
333                        {
334                                if(flag != 1) printf("-----xx %s no main tuner... exit\n", dvbnode->feshortname);
335                                dvbnode = dvbnode->next;
336                                continue;                               
337                        }
338                        if(dvbnode->feaktpolarization != tpnode->polarization || dvbnode->feakttransponder->orbitalpos != tpnode->orbitalpos)
339                        {
340                                dvbnode = dvbnode->next;
341                                continue;                               
342                        }
343                        found = 0;
344                        if(flag != 1 && dvbnode->type == FRONTENDDEV) printf("+++++xx %s feaktpolarization:%d lock:%d\n", dvbnode->feshortname, dvbnode->feaktpolarization, dvbnode->felock);
345                        //check looptuner is free
346                        tmpstr = getconfigbyval(dvbnode->feshortname, NULL);
347                        CharPtrTmp[0] = NULL;
348                        while(tmpstr != NULL) //found loop tuner
349                        {
350                                tmpdvbnode = fegetbyshortname(tmpstr);
351                                if(flag != 1 && tmpdvbnode->feakttransponder != NULL) printf("-----xx %s orbitalpos:%d frequency:%d feaktpolarization:%d lock:%d\n", tmpdvbnode->feshortname, tmpdvbnode->feakttransponder->orbitalpos, tmpdvbnode->feakttransponder->frequency, tmpdvbnode->feaktpolarization, tmpdvbnode->felock);
352                                else  if(flag != 1) printf("-----xx %s feakttransponder = NULL\n", tmpdvbnode->feshortname);
353                                //if(flag != 1) printf("****** test tuner1 %s -> %s\n", dvbnode->feshortname, tmpdvbnode->feshortname);
354                                if(tmpdvbnode != NULL && tmpdvbnode->felock == 0 && status.aktservice->fedev != tmpdvbnode)
355                                {
356                                        found = 99;
357                                        break;
358                                }
359                                else
360                                {
361                                        CharPtrTmp[found] = tmpdvbnode;
362                                        found = found + 1;
363                                }
364                                tmpstr = getconfigbyval(tmpstr, NULL); //loop tuner also loop  ?
365                        }
366                        CharPtrTmp[0] = NULL;
367                        if(found != 99)
368                        {
369                                dvbnode = dvbnode->next;
370                                continue;
371                        }
372                        tmpstr = ostrcat(dvbnode->feshortname, "_sat", 0, 0);
373                        for(i = 1; i <= getmaxsat(dvbnode->feshortname); i++)
374                        {
375                                tmpnr = oitoa(i);
376                                orbitalpos = getconfigint(tmpstr, tmpnr);
377                                if(orbitalpos == tpnode->orbitalpos)
378                                {
379                                        fegetconfig(dvbnode, tpnode, &aktnr, tmpnr);
380                                        if(flag == 3)
381                                                band = calclof(dvbnode, tpnode, aktnr, 0);
382                                        else
383                                                band = calclof(dvbnode, tpnode, aktnr, 1);
384                                        found = 0;
385                                        if(dvbnode->feaktband != band)
386                                        {
387                                                if(tmpdvbnode != NULL)
388                                                {
389                                                        if(flag != 1) printf("-----xx %s band not ok... exit\n", tmpdvbnode->feshortname);
390                                                else
391                                                        if(flag != 1) printf("-----NULL band not ok... exit\n");
392                                                }
393                                                found = -1;
394                                                break;
395                                        }
396                       
397                                        if(flag == 1)
398                                        {
399                                                free(tmpstr); tmpstr = NULL;
400                                                free(tmpnr); tmpnr = NULL;
401                                                return tmpdvbnode;
402                                        }
403                                        //dvbnode->feaktband = band;
404                                        //dvbnode->feaktpolarization = tpnode->polarization;
405                                        if(tmpdvbnode->feakttransponder != NULL)
406                                                tmpdvbnode->felasttransponder = tmpdvbnode->feakttransponder;
407                                        tmpdvbnode->feakttransponder = tpnode;
408                                        tmpdvbnode->feaktpolarization = tpnode->polarization;
409                                        tmpdvbnode->feaktband = band;
410                                        free(tmpdvbnode->feaktnr);
411                                        if(aktnr != NULL)
412                                                tmpdvbnode->feaktnr = ostrcat(aktnr, NULL, 0, 0);
413                                        else
414                                                tmpdvbnode->feaktnr = NULL;
415
416                                        free(tmpstr); tmpstr = NULL;
417                                        free(tmpnr); tmpnr = NULL;
418                                        if(flag != 1) debug(200, "found free tuner witch same orbitalpos %s", dvbnode->feshortname);
419                                        if(flag != 1) printf("------ found free loop tuner: %s witch same orbitalpos main tuner: %s\n", tmpdvbnode->feshortname, dvbnode->feshortname);
420                                        return tmpdvbnode;
421                                }
422                                free(tmpnr); tmpnr = NULL;
423                        }
424                        free(tmpstr); tmpstr = NULL;
425                }
426                dvbnode = dvbnode->next;
427        }
428        if(dvbfirst != NULL)
429                dvbnode = dvbfirst;
430        else
431                dvbnode = dvbdev;
432
433        //suche tuner der die gewuenschte orbitalpos kann und nicht belegt ist
434        while(dvbnode != NULL)
435        {
436                //FRONTENDDEV first in the list
437                if(dvbnode->type != FRONTENDDEV) break;
438
439                //check if tuner is deactivate
440                if(dvbnode->deactive == 1)
441                {
442                        dvbnode = dvbnode->next;
443                        continue;
444                }
445                if(dvbnode->type == FRONTENDDEV && dvbnode->feinfo->type == tpnode->fetype && dvbnode->felock == 0)
446                {
447                        if(flag == 2 && status.aktservice->fedev == dvbnode)
448                        {
449                                dvbnode = dvbnode->next;
450                                continue;
451                        }
452                        //check if tuner is main tuner
453                        if(getconfig(dvbnode->feshortname, NULL) != NULL)
454                        {
455                                dvbnode = dvbnode->next;
456                                continue;                               
457                        }
458                        found = 0;
459                        if(flag != 1 && dvbnode->feakttransponder != NULL) printf("*****yy %s orbitalpos:%d frequency:%d feaktpolarization:%d lock:%d\n", dvbnode->feshortname, dvbnode->feakttransponder->orbitalpos, dvbnode->feakttransponder->frequency, dvbnode->feaktpolarization, dvbnode->felock);
460                        else  if(flag != 1) printf("*****yy %s feakttransponder = NULL\n", dvbnode->feshortname);
461                        //check if tuner is loop and looptuner is locked
462                        tmpstr = getconfigbyval(dvbnode->feshortname, NULL);
463                        CharPtrTmp[0] = NULL;
464                        while(tmpstr != NULL) //found loop tuner
465                        {
466                                tmpdvbnode = fegetbyshortname(tmpstr);
467                                if(flag != 1 && tmpdvbnode->feakttransponder != NULL) printf("-----yy %s orbitalpos:%d frequency:%d feaktpolarization:%d lock:%d\n",  tmpdvbnode->feshortname, tmpdvbnode->feakttransponder->orbitalpos, tmpdvbnode->feakttransponder->frequency, tmpdvbnode->feaktpolarization, tmpdvbnode->felock);
468                                else  if(flag != 1) printf("-----yy %s feakttransponder = NULL\n", tmpdvbnode->feshortname);
469                                //if(flag != 1) printf("****** test tuner1 %s -> %s\n", dvbnode->feshortname, tmpdvbnode->feshortname);
470                                if(tmpdvbnode != NULL && tmpdvbnode->feakttransponder != NULL && (tmpdvbnode->feaktpolarization != tpnode->polarization || tmpdvbnode->feakttransponder->orbitalpos != tpnode->orbitalpos) && (tmpdvbnode->felock != 0 || (flag == 2 && tmpdvbnode->felock == 0)))
471                                {
472                                        if(flag != 1) printf("-----yy %s not equal... exit\n", tmpdvbnode->feshortname);
473                                        found = -1;
474                                        break;
475                                }
476                                else
477                                {
478                                        CharPtrTmp[found] = tmpdvbnode;
479                                        found = found + 1;
480                                }
481                                tmpstr = getconfigbyval(tmpstr, NULL); //loop tuner also loop  ?
482                        }
483                        if(found == -1)
484                        {
485                                dvbnode = dvbnode->next;
486                                continue;
487                        }
488                        CharPtrTmp[found] = NULL;
489                        tmpstr = ostrcat(dvbnode->feshortname, "_sat", 0, 0);
490                        for(i = 1; i <= getmaxsat(dvbnode->feshortname); i++)
491                        {
492                                tmpnr = oitoa(i);
493
494                                orbitalpos = getconfigint(tmpstr, tmpnr);
495                                if(orbitalpos == tpnode->orbitalpos)
496                                {
497                                        fegetconfig(dvbnode, tpnode, &aktnr, tmpnr);
498                                        if(flag == 3)
499                                                band = calclof(dvbnode, tpnode, aktnr, 0);
500                                        else
501                                                band = calclof(dvbnode, tpnode, aktnr, 1);
502                                        found = 0;
503                                        while(CharPtrTmp[found] != NULL)
504                                        {
505                                                //if(flag != 1) printf("++++++ test band1 %s\n", CharPtrTmp[found]->feshortname);
506                                                if(CharPtrTmp[found]->feakttransponder != NULL)
507                                                {
508                                                        if(CharPtrTmp[found] != NULL && CharPtrTmp[found]->feaktband != band && (CharPtrTmp[found]->felock != 0 || (flag == 2 && CharPtrTmp[found]->felock == 0)))
509                                                        {
510                                                                if(flag != 1) printf("-----yy %s band not ok... exit\n", tmpdvbnode->feshortname);
511                                                                found = 99;
512                                                                break;
513                                                        }
514                                                }
515                                                found = found + 1;
516                                        }
517                                                //if(tmpdvbnode != NULL && tmpdvbnode->feaktband != band && (tmpdvbnode->felock != 0 || (flag == 2 && tmpdvbnode->felock == 0)))
518                                                //{
519                                                //      free(tmpnr); tmpnr = NULL;
520                                                //      continue;
521                                                //}
522                                        if(found == 99)
523                                        {
524                                                found = 0;
525                                                free(tmpnr); tmpnr = NULL;
526                                                continue;
527                                        }       
528                                        if(flag == 1)
529                                        {
530                                                free(tmpstr); tmpstr = NULL;
531                                                free(tmpnr); tmpnr = NULL;
532                                                return dvbnode;
533                                        }
534                                       
535                                        found = 0;
536                                        while(CharPtrTmp[found] != NULL)
537                                        {
538                                                CharPtrTmp[found]->feaktband = band;
539                                                CharPtrTmp[found]->feaktpolarization = tpnode->polarization;
540                                                found = found + 1;
541                                        }
542                                        //if(tmpdvbnode != NULL)
543                                        //{
544                                        //      tmpdvbnode->feaktband = band;
545                                        //      tmpdvbnode->feaktpolarization = tpnode->polarization;
546                                        //}
547                                        dvbnode->felasttransponder = dvbnode->feakttransponder;
548                                        dvbnode->feakttransponder = tpnode;
549                                        dvbnode->feaktpolarization = tpnode->polarization;
550                                        free(dvbnode->feaktnr);
551                                        if(aktnr != NULL)
552                                                dvbnode->feaktnr = ostrcat(aktnr, NULL, 0, 0);
553                                        else
554                                                dvbnode->feaktnr = NULL;
555
556                                        free(tmpstr); tmpstr = NULL;
557                                        free(tmpnr); tmpnr = NULL;
558                                        if(flag != 1) debug(200, "found free tuner witch same orbitalpos %s", dvbnode->feshortname);
559                                        if(flag != 1) printf("------ found free tuner witch same orbitalpos %s\n", dvbnode->feshortname);
560                                        return dvbnode;
561                                }
562                                free(tmpnr); tmpnr = NULL;
563                        }
564                        free(tmpstr); tmpstr = NULL;
565                }
566                dvbnode = dvbnode->next;
567        }
568        if(dvbfirst != NULL)
569                dvbnode = dvbfirst;
570        else
571                dvbnode = dvbdev;
572
573        //suche loop tuner, wo der haupttuner
574        //die gewuenschte orbitalpos kann, nicht belegt ist
575        //und auf der gleichen poarization/band ist, wo wir hintunen wollen
576        while(dvbnode != NULL)
577        {
578                //FRONTENDDEV first in the list
579                if(dvbnode->type != FRONTENDDEV) break;
580
581                //check if tuner is deactivate
582                if(dvbnode->deactive == 1)
583                {
584                        dvbnode = dvbnode->next;
585                        continue;
586                }
587                if(dvbnode->type == FRONTENDDEV && dvbnode->feinfo->type == tpnode->fetype && dvbnode->felock == 0)
588                {
589                        if(flag == 2 && status.aktservice->fedev == dvbnode)
590                        {
591                                dvbnode = dvbnode->next;
592                                continue;
593                        }
594                        if(getconfig(dvbnode->feshortname, NULL) == NULL)
595                        {
596                                dvbnode = dvbnode->next;
597                                continue;                               
598                        }
599                        //check if tuner is loop and an other loopt is locked
600                        found = 0;
601                        tmpstr = getconfigbyval(dvbnode->feshortname, NULL);
602                        if(flag != 1 && dvbnode->feakttransponder != NULL) printf("*****33 %s orbitalpos:%d frequency:%d feaktpolarization:%d lock:%d\n", tmpstr, dvbnode->feakttransponder->orbitalpos, dvbnode->feakttransponder->frequency, dvbnode->feaktpolarization, dvbnode->felock);
603                        else  if(flag != 1) printf("*****33 %s feakttransponder = NULL\n", tmpstr);
604                        while(tmpstr != NULL) //found loop tuner
605                        {
606                                tmpdvbnode = fegetbyshortname(tmpstr);
607                                if(flag != 1 && tmpdvbnode->feakttransponder != NULL) printf("-----33 %s orbitalpos:%d frequency:%d feaktpolarization:%d lock:%d\n", tmpstr, tmpdvbnode->feakttransponder->orbitalpos, tmpdvbnode->feakttransponder->frequency, tmpdvbnode->feaktpolarization, tmpdvbnode->felock);
608                                else  if(flag != 1) printf("-----33 %s feakttransponder = NULL\n", dvbnode->feshortname);
609                                //if(flag != 1) printf("****** test tuner2 %s -> %s\n", dvbnode->feshortname, tmpdvbnode->feshortname);
610                                if(tmpdvbnode != NULL && tmpdvbnode->feakttransponder != NULL && (tmpdvbnode->feaktpolarization != tpnode->polarization || tmpdvbnode->feakttransponder->orbitalpos != tpnode->orbitalpos) && (tmpdvbnode->felock != 0 || (flag == 2 && tmpdvbnode->felock == 0)))
611                                {
612                                        found = -1;
613                                        break;
614                                }
615                                else
616                                {
617                                        CharPtrTmp[found] = tmpdvbnode;
618                                        found = found + 1;
619                                }
620                                tmpstr = getconfigbyval(tmpstr, NULL); //loop tuner also loop  ?
621                        }
622                        if(found == -1)
623                        {
624                                dvbnode = dvbnode->next;
625                                continue;
626                        }       
627                        //check if tuner is loop an looptuner is locked
628                        tmpstr = getconfig(dvbnode->feshortname, NULL);
629                        while(tmpstr != NULL) //found loop tuner
630                        {
631                                tmpdvbnode = fegetbyshortname(tmpstr);
632                                if(flag != 1 && tmpdvbnode->feakttransponder != NULL) printf("-----44 %s orbitalpos:%d frequency:%d feaktpolarization:%d lock:%d\n", tmpstr, tmpdvbnode->feakttransponder->orbitalpos, tmpdvbnode->feakttransponder->frequency, tmpdvbnode->feaktpolarization, tmpdvbnode->felock);
633                                else  if(flag != 1) printf("-----44 %s feakttransponder = NULL\n", tmpstr);
634                                //if(flag != 1) printf("****** test tuner1 %s -> %s\n", dvbnode->feshortname, tmpdvbnode->feshortname);
635                                if(tmpdvbnode != NULL && tmpdvbnode->feakttransponder != NULL && (tmpdvbnode->feaktpolarization != tpnode->polarization || tmpdvbnode->feakttransponder->orbitalpos != tpnode->orbitalpos) && (tmpdvbnode->felock != 0 || (flag == 2 && tmpdvbnode->felock == 0)))
636                                {
637                                        found = -1;
638                                        break;
639                                }
640                                else
641                                {
642                                        CharPtrTmp[found] = tmpdvbnode;
643                                        found = found + 1;
644                                }
645                                tmpstr = getconfig(tmpstr, NULL);
646                        }
647                        CharPtrTmp[found] = NULL;
648                        if(found == -1)
649                        {
650                                dvbnode = dvbnode->next;
651                                continue;
652                        }
653       
654                        tmpstr = ostrcat(tmpdvbnode->feshortname, "_sat", 0, 0);
655                        for(i = 1; i <= getmaxsat(tmpdvbnode->feshortname); i++)
656                        {
657                                tmpnr = oitoa(i);
658                                orbitalpos = getconfigint(tmpstr, tmpnr);
659                                if(orbitalpos == tpnode->orbitalpos)
660                                {
661                                        fegetconfig(tmpdvbnode, tpnode, &aktnr, tmpnr);
662                                        if(flag == 3)
663                                                band = calclof(dvbnode, tpnode, aktnr, 0);
664                                        else
665                                                band = calclof(dvbnode, tpnode, aktnr, 1);
666                                        found = 0;
667                                        while(CharPtrTmp[found] != NULL)
668                                        {
669                                                //if(flag != 1) printf("++++++ test band2 %s\n", CharPtrTmp[found]->feshortname);
670                                                if(CharPtrTmp[found] != NULL && CharPtrTmp[found]->feaktband != band && (CharPtrTmp[found]->felock != 0 || (flag >= 2 && CharPtrTmp[found]->felock == 0)))     
671                                                {
672                                                        found = 99;
673                                                        break;
674                                                }
675                                                found = found + 1;
676                                                //if(tmpdvbnode != NULL && tmpdvbnode->feaktband != band && (tmpdvbnode->felock != 0 || (flag >= 2 && tmpdvbnode->felock == 0)))
677                                                //{
678                                                //      free(tmpnr); tmpnr = NULL;
679                                                //      continue;
680                                                //}
681                                        }
682                                        if(found == 99)
683                                        {
684                                                found = 0;
685                                                free(tmpnr); tmpnr = NULL;
686                                                continue;
687                                        }
688                                               
689                                        if(flag == 1)
690                                        {
691                                                free(tmpstr); tmpstr = NULL;
692                                                free(tmpnr); tmpnr = NULL;
693                                                return dvbnode;
694                                        }
695                                        found = 0;
696                                        while(CharPtrTmp[found] != NULL)
697                                        {
698                                                CharPtrTmp[found]->feaktband = band;
699                                                CharPtrTmp[found]->feaktpolarization = tpnode->polarization;
700                                                found = found + 1;
701                                        }
702                                        //if(tmpdvbnode != NULL)
703                                        //{
704                                        //      tmpdvbnode->feaktband = band;
705                                        //      tmpdvbnode->feaktpolarization = tpnode->polarization;
706                                        //}
707                                        dvbnode->felasttransponder = dvbnode->feakttransponder;
708                                        dvbnode->feakttransponder = tpnode;
709                                        dvbnode->feaktpolarization = tpnode->polarization;
710                                        free(dvbnode->feaktnr);
711                                        if(aktnr != NULL)
712                                                dvbnode->feaktnr = ostrcat(aktnr, NULL, 0, 0);
713                                        else
714                                                dvbnode->feaktnr = NULL;
715                                        free(tmpstr); tmpstr = NULL;
716                                        free(tmpnr); tmpnr = NULL;
717                                        if(flag != 1) debug(200, "found free looptuner witch same orbitalpos/polarization/band %s main: %s", dvbnode->feshortname, tmpdvbnode->feshortname);
718                                        if(flag != 1) printf("------ found free looptuner witch same orbitalpos/polarization/band %s main: %s\n", dvbnode->feshortname, tmpdvbnode->feshortname);
719                                        return dvbnode;
720                                }
721                                free(tmpnr); tmpnr = NULL;
722                        }
723                        free(tmpstr); tmpstr = NULL;
724                }
725                dvbnode = dvbnode->next;
726        }
727
728        return NULL;
729}
730
731int feopen(struct dvbdev* node, char *fedev)
732{
733        int fd = -1;
734
735        if(node != NULL)
736        {       
737                if((fd = open(node->dev, O_RDWR | O_NONBLOCK)) < 0)
738                        debug(200, "open frontend failed %s", node->dev);
739                node->fd = fd;
740        }
741        else
742        {
743                if((fd = open(fedev, O_RDWR | O_NONBLOCK)) < 0)
744                        debug(200, "open frontend failed %s", fedev);
745        }
746
747        closeonexec(fd);
748        return fd;
749}
750
751void feclose(struct dvbdev* node, int fd)
752{
753        if(node != NULL)
754        {
755                close(node->fd);
756                node->fd = -1;
757        }
758        else
759                close(fd);
760}
761
762int fegetunlock(struct dvbdev* node)
763{
764        fe_status_t status;
765
766        if(node == NULL)
767        {
768                err("NULL detect");
769                return 1;
770        }
771
772#ifdef SIMULATE
773        return 0;
774#endif
775
776        if(ioctl(node->fd, FE_READ_STATUS, &status) == -1)
777                perr("FE_READ_STATUS");
778
779        if(status & FE_HAS_LOCK)
780                return 0;
781        else
782                return 1;
783}
784
785int fewait(struct dvbdev* node)
786{
787        //struct dvb_frontend_event ev;
788        fe_status_t status;
789        fe_status_t status_m = 0;
790
791        int count = 0;
792
793        if(node == NULL)
794        {
795                err("NULL detect");
796                return 1;
797        }
798
799#ifdef SIMULATE
800        return 0;
801#endif
802
803        int timer = 500;
804
805#ifdef MIPSEL
806        timer = 2000;
807#endif
808
809#ifdef ARM
810        timer = 300;
811#endif
812
813        //wait for tuner ready
814        debug(200, "wait for tuner start");
815        while(count <= timer)
816        {
817                count++;
818
819                //ioctl(node->fd, FE_GET_EVENT, &ev);
820                //if(ev.status & FE_HAS_LOCK)
821                //      return 0;
822                ioctl(node->fd, FE_READ_STATUS, &status);
823                if(status != 0)
824                {
825                        if(status_m != status)
826                        {
827                                debug(200, "status=%02x, fe_lock=%02x, count=%d", status, FE_HAS_LOCK, count);
828                                status_m = status;
829                        }
830                }
831
832                if(errno == ERANGE)
833                {
834                        usleep(1000);
835                        continue;
836                }
837
838                if(status & FE_HAS_LOCK)
839                {
840        //              if(FE_HAS_SYNC | FE_HAS_LOCK)
841                        debug(200, "wait for tuner end with 0");
842                        return 0;
843                }
844                if(node != NULL && ostrstr(node->feinfo->name, "BCM45208") != NULL)
845                {
846                        if(status & FE_TIMEDOUT)
847                        {
848                                debug(200, "wait for tuner end with FE_TIMEDOUT");
849                                return 1;
850                        }
851                }
852                usleep(1000);
853        }
854        debug(200, "wait for tuner end");
855        //if(ev.status & FE_HAS_LOCK)
856        //      return 0;
857        if(status & FE_HAS_LOCK)
858//      if(FE_HAS_SYNC | FE_HAS_LOCK)
859                return 0;
860        else
861                return 1;
862}
863
864void fegetfrontend(struct dvbdev* node)
865{
866        if(node == NULL)
867        {
868                err("NULL detect");
869                return;
870        }
871
872#if DVB_API_VERSION >= 5
873        struct dtv_property p[8];
874        struct dtv_properties cmdseq;
875        cmdseq.props = p;
876
877        p[0].cmd = DTV_DELIVERY_SYSTEM;
878        p[1].cmd = DTV_FREQUENCY;
879        p[2].cmd = DTV_MODULATION;
880        p[3].cmd = DTV_SYMBOL_RATE;
881        p[4].cmd = DTV_INNER_FEC;
882        p[5].cmd = DTV_INVERSION;
883        p[6].cmd = DTV_ROLLOFF;
884        p[7].cmd = DTV_PILOT;
885        cmdseq.num = 8;
886       
887        if(ioctl(node->fd, FE_GET_PROPERTY, &cmdseq) < 0)
888        {
889                perr("FE_GET_PROPERTY");
890        }
891        else
892        {
893                debug(200, "frontend akt delivery system = %d", p[0].u.data);
894                debug(200, "frontend akt frequency = %d", p[1].u.data);
895                debug(200, "frontend akt inversion = %d", p[5].u.data);
896                debug(200, "frontend akt symbol_rate = %d", p[3].u.data);
897                debug(200, "frontend akt fec_inner = %d", p[4].u.data);
898                debug(200, "frontend akt modulation = %d", p[2].u.data);
899                debug(200, "frontend akt rolloff = %d", p[6].u.data);
900                debug(200, "frontend akt pilot = %d", p[7].u.data);
901        }
902#else
903        struct dvb_frontend_parameters fe_param;
904
905        if(ioctl(node->fd, FE_GET_FRONTEND, &fe_param) < 0)
906        {
907                perr("FE_GET_FRONTEND");
908        }
909        else
910        {
911                debug(200, "frontend akt frequency = %d", fe_param.frequency);
912                debug(200, "frontend akt inversion = %d", fe_param.inversion);
913                debug(200, "frontend akt u.qpsk.symbol_rate = %d", fe_param.u.qpsk.symbol_rate);
914                debug(200, "frontend akt u.qam.symbol_rate = %d", fe_param.u.qam.symbol_rate);
915                debug(200, "frontend akt u.qpsk.fec_inner = %d", fe_param.u.qpsk.fec_inner);
916                debug(200, "frontend akt u.qam.fec_inner = %d", fe_param.u.qam.fec_inner);
917                debug(200, "frontend akt u.qam.modulation = %d", fe_param.u.qam.modulation);
918        }
919#endif
920}
921
922int fesettone(struct dvbdev* node, fe_sec_tone_mode_t tone, int wait)
923{
924        int ret = 0;
925       
926        if(node == NULL)
927        {
928                err("NULL detect");
929                return 1;
930        }
931
932        debug(200, "FE_SET_TONE: %d (%s)", tone, node->feshortname);
933        if(ioctl(node->fd, FE_SET_TONE, tone) == -1)
934        {
935                perr("FE_SET_TONE");
936                ret = 1;
937        }
938        else
939        {
940                node->feakttone = tone;
941                usleep(wait * 1000);
942        }
943       
944        return ret;
945}
946
947//flag 0: reset tuner params on volt off
948//flag 1: don't reset tuner params on volt off
949int fesetvoltage(struct dvbdev* node, fe_sec_voltage_t volt, int wait)
950{
951        int ret = 0;
952       
953        if(node == NULL)
954        {
955                err("NULL detect");
956                return 1;
957        }
958
959        debug(200, "FE_SET_VOLT: %d (%s)", volt, node->feshortname);
960        if(ioctl(node->fd, FE_SET_VOLTAGE, volt) == -1)
961        {
962                perr("FE_SET_VOLTAGE");
963                ret = 1;
964        }
965        else
966        {
967                node->feaktvolt = volt;
968                if(wait > 0) usleep(wait * 1000);
969
970                if(volt == SEC_VOLTAGE_OFF)
971                {
972                        node->feakttransponder = NULL;
973                        node->felasttransponder = NULL;
974                        node->feunicable = 0;
975                        node->feloffrequency = 0;
976                        node->feaktband = 0;
977                        node->feaktpolarization = 0;
978                        node->feakttone = 0;
979                }
980        }
981
982        return ret;
983}
984
985void fediseqcsendburst(struct dvbdev* node, fe_sec_mini_cmd_t burst, int wait)
986{
987        if(node == NULL)
988        {
989                err("NULL detect");
990                return;
991        }
992
993        debug(200, "FE_DISEQC_SEND_BURST: %d (%s)", burst, node->feshortname);
994        if(ioctl(node->fd, FE_DISEQC_SEND_BURST, burst) == -1)
995                perr("FE_DISEQC_SEND_BURST");
996        usleep(wait * 1000);
997}
998
999void fediseqcsendmastercmd(struct dvbdev* node, struct dvb_diseqc_master_cmd *cmd, int wait)
1000{
1001        int i, repeat = 0, imsg = 0;
1002        char* tmpstr = NULL;
1003
1004        if(node == NULL)
1005        {
1006                err("NULL detect");
1007                return;
1008        }
1009       
1010        if(cmd == NULL) return;
1011        if(cmd->msg_len == 0) return;
1012
1013        tmpstr = ostrcat(node->feshortname, "_diseqc_repeat", 0, 0);
1014        repeat = getconfigint(tmpstr, node->feaktnr);
1015        free(tmpstr); tmpstr = NULL;
1016        if(repeat < 1) repeat = 1;
1017
1018        for(i = 0; i < repeat; i++)
1019        {
1020                if(ioctl(node->fd, FE_DISEQC_SEND_MASTER_CMD, cmd) == -1)
1021                {
1022                        perr("FE_DISEQC_SEND_MASTER_CMD");
1023                }
1024                usleep(wait * 1000);
1025        }
1026        imsg = (cmd->msg[0] << 24) | (cmd->msg[1] << 16) | (cmd->msg[2] << 8) | cmd->msg[3];
1027        debug(200, "DISEQC Master cmd (%s -> %04X)", node->feshortname, imsg);
1028}
1029
1030void fesdiseqcpoweron(struct dvbdev* node)
1031{
1032        struct dvb_diseqc_master_cmd cmd = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 0};
1033
1034        if(node == NULL)
1035        {
1036                err("NULL detect");
1037                return;
1038        }
1039
1040        cmd.msg[0] = 0xE0;
1041        cmd.msg[1] = 0x00;
1042        cmd.msg[2] = 0x03;
1043        cmd.msg_len = 3;
1044
1045        debug(200, "DISEQC Power on (%s)", node->feshortname);
1046        fediseqcsendmastercmd(node, &cmd, 100);
1047}
1048
1049void fesdiseqcreset(struct dvbdev* node)
1050{
1051        struct dvb_diseqc_master_cmd cmd = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 0};
1052       
1053        if(node == NULL)
1054        {
1055                err("NULL detect");
1056                return;
1057        }
1058
1059        cmd.msg[0] = 0xE0;
1060        cmd.msg[1] = 0x00;
1061        cmd.msg[2] = 0x00;
1062        cmd.msg_len = 3;
1063
1064        debug(200, "DISEQC Reset (%s)", node->feshortname);
1065        fediseqcsendmastercmd(node, &cmd, 100);
1066}
1067
1068void fesdiseqcstandby(struct dvbdev* node)
1069{
1070        struct dvb_diseqc_master_cmd cmd = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 0};
1071       
1072        if(node == NULL)
1073        {
1074                err("NULL detect");
1075                return;
1076        }
1077       
1078        cmd.msg[0] = 0xE0;
1079        cmd.msg[1] = 0x00;
1080        cmd.msg[2] = 0x02;
1081        cmd.msg_len = 3;
1082
1083        debug(200, "DISEQC Standby (%s)", node->feshortname);
1084        fediseqcsendmastercmd(node, &cmd, 100);
1085}
1086
1087void fediseqcrotor(struct dvbdev* node, struct transponder* tpnode, int pos, int flag)
1088{
1089        int orbitalpos = 0;
1090        fe_sec_voltage_t oldvolt = 0;
1091        fe_sec_tone_mode_t oldtone = 0;
1092        struct dvb_diseqc_master_cmd cmd = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 0};
1093       
1094        if(node == NULL)
1095        {
1096                err("NULL detect");
1097                return;
1098        }
1099       
1100        fesdiseqcpoweron(node);
1101       
1102        oldvolt = node->feaktvolt;
1103        oldtone = node->feakttone;
1104
1105        if(tpnode == NULL)
1106                orbitalpos = 0;
1107        else
1108                orbitalpos = tpnode->orbitalpos;
1109       
1110        //float speed13V = 1.5; //1.5 Grad pro sec
1111        float speed18V = 1; //2.4 Grad pro sek
1112        float degreesmov, waittime;
1113       
1114        switch(flag)
1115        {
1116                case 0: //stop move
1117                        cmd.msg[0] = 0xE0; cmd.msg[1] = 0x31; cmd.msg[2] = 0x60; cmd.msg_len = 3;
1118                        debug(200, "DISEQC Rotorpos stop move (%s)", node->feshortname);
1119                        break;
1120                case 1: //disable limits
1121                        cmd.msg[0] = 0xE0; cmd.msg[1] = 0x31; cmd.msg[2] = 0x63; cmd.msg_len = 3;
1122                        debug(200, "DISEQC Rotorpos disable limits (%s)", node->feshortname);
1123                        break;
1124                case 2: //enable limits
1125                        cmd.msg[0] = 0xE0; cmd.msg[1] = 0x31; cmd.msg[2] = 0x6A; cmd.msg[3] = 0x00; cmd.msg_len = 4;
1126                        debug(200, "DISEQC Rotorpos enable limits (%s)", node->feshortname);
1127                        break;
1128                case 3: //set east limit
1129                        cmd.msg[0] = 0xE0; cmd.msg[1] = 0x31; cmd.msg[2] = 0x66; cmd.msg_len = 3;
1130                        debug(200, "DISEQC Rotorpos set east limit (%s)", node->feshortname);
1131                        break;
1132                case 4: //set west limit
1133                        cmd.msg[0] = 0xE0; cmd.msg[1] = 0x31; cmd.msg[2] = 0x67; cmd.msg_len = 3;
1134                        debug(200, "DISEQC Rotorpos set west limit (%s)", node->feshortname);
1135                        break;
1136                case 5: //move east cont.
1137                        cmd.msg[0] = 0xE0; cmd.msg[1] = 0x31; cmd.msg[2] = 0x68; cmd.msg[3] = 0x00; cmd.msg_len = 4;
1138                        debug(200, "DISEQC Rotorpos move east cont. (%s)", node->feshortname);
1139                        break;
1140                case 6: //move west cont.
1141                        cmd.msg[0] = 0xE0; cmd.msg[1] = 0x31; cmd.msg[2] = 0x69; cmd.msg[3] = 0x00; cmd.msg_len = 4;
1142                        debug(200, "DISEQC Rotorpos move west cont. (%s)", node->feshortname);
1143                        break;
1144                case 7: //store pos
1145                        cmd.msg[0] = 0xE0; cmd.msg[1] = 0x31; cmd.msg[2] = 0x6A; cmd.msg[3] = pos; cmd.msg_len = 4;
1146                        debug(200, "DISEQC Rotorpos store pos=%d (%s)", pos, node->feshortname);
1147                        break;
1148                case 8: //goto pos
1149                        cmd.msg[0] = 0xE0; cmd.msg[1] = 0x31; cmd.msg[2] = 0x6B; cmd.msg[3] = pos; cmd.msg_len = 4;
1150                        debug(200, "DISEQC Rotorpos goto pos=%d (%s)", pos, node->feshortname);
1151                        break;
1152                case 9: //step xx pos east
1153                        cmd.msg[0] = 0xE0; cmd.msg[1] = 0x31; cmd.msg[2] = 0x68; cmd.msg[3] = 256 - pos; cmd.msg_len = 4;
1154                        debug(200, "DISEQC Rotorpos step east pos=%d (%s)", pos, node->feshortname);
1155                        break;
1156                case 10: //step xx pos west
1157                        cmd.msg[0] = 0xE0; cmd.msg[1] = 0x31; cmd.msg[2] = 0x69; cmd.msg[3] = 256 - pos; cmd.msg_len = 4;
1158                        debug(200, "DISEQC Rotorpos step west pos=%d (%s)", pos, node->feshortname);
1159                        break;
1160                case 11: //goto xx
1161                        cmd.msg[0] = 0xE0; cmd.msg[1] = 0x31; cmd.msg[2] = 0x6E; cmd.msg[3] = (pos >> 8) & 0xff; cmd.msg[4] = pos & 0xff; cmd.msg_len = 5;
1162                        debug(200, "DISEQC Rotorpos goto xx pos=%d (%s)", pos, node->feshortname);
1163                        break;
1164        }
1165
1166        if(flag >= 0 && flag < 7)
1167        {
1168                fesetvoltage(node, SEC_VOLTAGE_18, 15);
1169                fesettone(node, SEC_TONE_OFF, 15);
1170                fediseqcsendmastercmd(node, &cmd, 100);
1171        }
1172
1173        if((flag == 7 || flag == 9 || flag == 10) && pos != 0)
1174        {
1175                fesetvoltage(node, SEC_VOLTAGE_18, 15);
1176                fesettone(node, SEC_TONE_OFF, 15);
1177                fediseqcsendmastercmd(node, &cmd, 100);
1178        }
1179
1180        if((flag == 8 || flag == 11) && (orbitalpos == 0 || status.rotoroldorbitalpos == 0 || orbitalpos != status.rotoroldorbitalpos))
1181        {
1182                fesetvoltage(node, SEC_VOLTAGE_18, 15);
1183                fesettone(node, SEC_TONE_OFF, 15);
1184                fediseqcsendmastercmd(node, &cmd, 100);
1185
1186                if(status.rotoroldorbitalpos == 0 || orbitalpos == 0)
1187                        waittime = 15;
1188                else
1189                {
1190                        degreesmov = abs(orbitalpos - status.rotoroldorbitalpos) / 10;
1191                        waittime = (int)ceil((float)degreesmov / (float)speed18V);
1192                }
1193
1194                status.rotoroldorbitalpos = orbitalpos;
1195                sleep(waittime);
1196        }
1197       
1198        fesetvoltage(node, oldvolt, 15);
1199        fesettone(node, oldtone, 15);
1200}
1201
1202void fesetunicable(struct dvbdev* node)
1203{
1204        int unicabletune = 0;
1205        char* tmpstr = NULL;
1206        struct dvb_diseqc_master_cmd cmd = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 0};
1207
1208        if(node == NULL)
1209        {
1210                err("NULL detect");
1211                return;
1212        }
1213
1214        tmpstr = ostrcat(node->feshortname, "_lnb_satcr", 0, 0);
1215        int satcr = getconfigint(tmpstr, node->feaktnr) - 1;
1216        if(satcr < 0) satcr = 0;
1217        free(tmpstr); tmpstr = NULL;
1218
1219        tmpstr = ostrcat(node->feshortname, "_diseqc", 0, 0);
1220        int aktdiseqc = getconfigint(tmpstr, node->feaktnr);
1221        if(aktdiseqc < 1) aktdiseqc = 1;
1222        free(tmpstr); tmpstr = NULL;
1223
1224        unicabletune |= ((satcr & 0x7) << 13);
1225        unicabletune |= (((aktdiseqc - 1) & 0x1) << 12);
1226        unicabletune |= (((!node->feaktpolarization) & 0x1) << 11);
1227        unicabletune |= ((node->feaktband & 0x1) << 10);
1228        unicabletune |= ((node->feloffrequency / 1000) & 0x3ff);
1229
1230        debug(200, "unicabletune %04X", unicabletune);
1231       
1232        if(status.firstunicablewait == 0)
1233        {
1234                status.firstunicablewait = getconfigint("firstunicablewait", NULL);
1235                if(status.firstunicablewait == 0)
1236                        status.firstunicablewait = 1000;
1237        }               
1238       
1239        if(status.firstunicablewait > 0)
1240        {
1241                usleep(status.firstunicablewait * 1000);
1242                status.firstunicablewait = -1;
1243        }
1244       
1245        fesetvoltage(node, SEC_VOLTAGE_13, 15);
1246        fesetvoltage(node, SEC_VOLTAGE_18, 15);
1247        fesettone(node, SEC_TONE_OFF, 15);
1248
1249        //feunicable
1250        //byte1 (bit 7/6/5) -> satcr number
1251        //byte1 (bit 4/3/2) -> lnb number
1252        //byte1 (bit 1/0) -> frequ
1253        //byte0 -> frequ
1254       
1255        cmd.msg[0] = 0xE0;
1256        cmd.msg[1] = 0x10;
1257        cmd.msg[2] = 0x5A;
1258        cmd.msg[3] = (unicabletune >> 8) & 0xff;
1259        cmd.msg[4] = unicabletune & 0xff;
1260        cmd.msg_len = 5;
1261
1262        debug(200, "send diseqc unicable cmd (%s)", node->feshortname);
1263        fediseqcsendmastercmd(node, &cmd, 100);
1264        fesetvoltage(node, SEC_VOLTAGE_13, 15);
1265}
1266
1267void fediseqcset(struct dvbdev* node, struct transponder* tpnode)
1268{
1269        char* tmpstr = NULL;
1270        int toneburst = 0, cmdorder = 0, input = 0, uinput = 0, diseqmode = 0, rotorpos = 0, latpos = 0, longpos = 0;
1271        float latitude = 0, longitude = 0;
1272        fe_sec_mini_cmd_t mini = -1;
1273        struct dvb_diseqc_master_cmd cmd = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 0};
1274        struct dvb_diseqc_master_cmd ucmd = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 0};
1275       
1276        if(node == NULL) return;
1277       
1278        tmpstr = ostrcat(node->feshortname, "_diseqc_committedcmd", 0, 0);
1279        input = getconfigint(tmpstr, node->feaktnr);
1280        free(tmpstr); tmpstr = NULL;
1281        tmpstr = ostrcat(node->feshortname, "_diseqc_uncommittedcmd", 0, 0);
1282        uinput = getconfigint(tmpstr, node->feaktnr);
1283        free(tmpstr); tmpstr = NULL;
1284        tmpstr = ostrcat(node->feshortname, "_diseqc_mode", 0, 0);
1285        diseqmode = getconfigint(tmpstr, node->feaktnr);
1286        free(tmpstr); tmpstr = NULL;
1287        tmpstr = ostrcat(node->feshortname, "_diseqc_cmdorder", 0, 0);
1288        cmdorder = getconfigint(tmpstr, node->feaktnr);
1289        free(tmpstr); tmpstr = NULL;
1290        tmpstr = ostrcat(node->feshortname, "_diseqc_toneburst", 0, 0);
1291        toneburst = getconfigint(tmpstr, node->feaktnr);
1292        free(tmpstr); tmpstr = NULL;
1293        tmpstr = ostrcat(node->feshortname, "_diseqc_rotorpos", 0, 0);
1294        rotorpos = getconfigint(tmpstr, node->feaktnr);
1295        free(tmpstr); tmpstr = NULL;
1296       
1297        latitude = getconfigfloat("latitude", NULL);
1298        longitude = getconfigfloat("longitude", NULL);
1299        latpos = getconfigint("latpos", NULL);
1300        longpos = getconfigint("longpos", NULL);
1301
1302        tmpstr = ostrcat(node->feshortname, "_diseqc", 0, 0);
1303        int aktdiseqc = getconfigint(tmpstr, node->feaktnr);
1304        if(aktdiseqc < 1) aktdiseqc = 1;
1305        free(tmpstr); tmpstr = NULL;
1306
1307        debug(200, "set diseqc: number=%d, band=%d, pol=%d, diseqmode=%d, input=%d, uinput=%d, cmdorder=%d, toneburst=%d (%s)", aktdiseqc, node->feaktband, node->feaktpolarization, diseqmode, input, uinput, cmdorder, toneburst, node->feshortname);
1308         
1309        switch(toneburst)
1310        {
1311                case 1: mini = SEC_MINI_A; break;
1312                case 2: mini = SEC_MINI_B; break;
1313        }
1314       
1315        if(diseqmode == 100) // Tonburst A/B
1316        {
1317                debug(200, "set diseqc: Tonburst A/B (%s)", node->feshortname);
1318                if(mini == -1)
1319                        mini = (aktdiseqc - 1) % 2 ? SEC_MINI_B : SEC_MINI_A;
1320                fediseqcsendburst(node, mini, 15);
1321                return;
1322        }
1323               
1324        if(diseqmode == 0 || diseqmode == 1) // Diseqc 1.0 + 1.1
1325        {
1326                debug(200, "set committed switch (%s)", node->feshortname);
1327                fesdiseqcpoweron(node);
1328                cmd.msg[0] = 0xE0;
1329                cmd.msg[1] = 0x10;
1330                cmd.msg[2] = 0x38;
1331
1332                if(input == 0)
1333                        cmd.msg[3] = 0xF0 | ((((aktdiseqc - 1) * 4) & 0x0F) | (node->feaktband ? 1 : 0) | (node->feaktpolarization ? 0 : 2));
1334                else
1335                        cmd.msg[3] = 0xF0 + ((input - 1) & 0x0F);
1336
1337                cmd.msg_len = 4;
1338        }
1339
1340        if(diseqmode == 1) // Diseqc 1.1
1341        {
1342                if(uinput > 0)
1343                {
1344                        debug(200, "set uncommitted switch (%s)", node->feshortname);
1345                        fesdiseqcpoweron(node);
1346                        ucmd.msg[0] = 0xE0;
1347                        ucmd.msg[1] = 0x10;
1348                        ucmd.msg[2] = 0x39;
1349                        ucmd.msg[3] = 0xF0 + ((uinput - 1) & 0x0F);
1350                        ucmd.msg_len = 4;
1351                }
1352        }
1353                 
1354        switch(cmdorder)
1355        {
1356                case 1:
1357                        if(mini != -1) fediseqcsendburst(node, mini, 15);
1358                        fediseqcsendmastercmd(node, &cmd, 100);
1359                        break;
1360                case 2:
1361                        fediseqcsendmastercmd(node, &cmd, 100);
1362                        if(uinput > 0) fediseqcsendmastercmd(node, &ucmd, 100);
1363                        if(mini != -1) fediseqcsendburst(node, mini, 15);
1364                        break;
1365                case 3:
1366                        if(mini != -1) fediseqcsendburst(node, mini, 15);
1367                        fediseqcsendmastercmd(node, &cmd, 100);
1368                        if(uinput > 0) fediseqcsendmastercmd(node, &ucmd, 100);
1369                        break;
1370                case 4:
1371                        if(uinput > 0) fediseqcsendmastercmd(node, &ucmd, 100);
1372                        fediseqcsendmastercmd(node, &cmd, 100);
1373                        if(mini != -1) fediseqcsendburst(node, mini, 15);
1374                        break;
1375                case 5:
1376                        if(mini != -1) fediseqcsendburst(node, mini, 15);
1377                        if(uinput > 0) fediseqcsendmastercmd(node, &ucmd, 100);
1378                        fediseqcsendmastercmd(node, &cmd, 100);
1379                        break;
1380                default:
1381                        fediseqcsendmastercmd(node, &cmd, 100);
1382                        if(mini != -1) fediseqcsendburst(node, mini, 15);
1383                        break;
1384        }
1385       
1386        if(diseqmode == 2) // Diseqc 1.2
1387        {
1388                fediseqcrotor(node, tpnode, rotorpos, 8);
1389        }
1390       
1391        if(diseqmode == 3) // Diseqc 1.3 (USALS)
1392        {
1393                double orbitalpos = tpnode->orbitalpos / 10.00;
1394
1395                if(latpos == 1) // south
1396                        latitude = -latitude;
1397
1398                if(longpos == 1) // west
1399                        longitude = 360 - longitude;
1400
1401                double satHourAngle = calcSatHourangle(orbitalpos, latitude, longitude);
1402                int gotoXTable[10] = {0x00, 0x02, 0x03, 0x05, 0x06, 0x08, 0x0A, 0x0B, 0x0D, 0x0E};
1403
1404                if(latitude >= 0) // Northern Hemisphere
1405                {
1406                        int tmp = (int)round(fabs(180 - satHourAngle) * 10.0);
1407                        rotorpos = (tmp / 10) * 0x10 + gotoXTable[tmp % 10];
1408
1409                        if(satHourAngle < 180) // the east
1410                                rotorpos |= 0xE000;
1411                        else // west
1412                                rotorpos |= 0xD000;
1413                }
1414                else // Southern Hemisphere
1415                {
1416                        if(satHourAngle < 180) // the east
1417                        {
1418                                int tmp = (int)round(fabs(satHourAngle) * 10.0);
1419                                rotorpos = (tmp / 10) * 0x10 + gotoXTable[tmp % 10];
1420                                rotorpos |= 0xD000;
1421                        }
1422                        else // west
1423                        {
1424                                int tmp = (int)round(fabs(360 - satHourAngle) * 10.0);
1425                                rotorpos = (tmp / 10) * 0x10 + gotoXTable[tmp % 10];
1426                                rotorpos |= 0xE000;
1427                        }
1428                }
1429                debug(200, "orbitalpos=%f, latitude=%f, longitude=%f, rotorpos=%04x", orbitalpos, latitude, longitude, rotorpos);
1430
1431                fediseqcrotor(node, tpnode, rotorpos, 11);
1432        }
1433}
1434
1435void feset(struct dvbdev* node, struct transponder* tpnode)
1436{
1437        int voltagemode = 0, tonemode = 0;
1438        fe_sec_tone_mode_t tone;
1439        fe_sec_voltage_t volt;
1440        struct dvbdev* dvbnode = dvbdev;
1441        char* tmpstr = NULL;
1442
1443        if(node == NULL)
1444        {
1445                err("NULL detect");
1446                return;
1447        }
1448
1449        // set volage off from other unused frontend
1450        while(dvbnode != NULL)
1451        {
1452                if(dvbnode->type != FRONTENDDEV) break;
1453                if(dvbnode->type == FRONTENDDEV && dvbnode != node && dvbnode->felock == 0 && dvbnode != status.aktservice->fedev)
1454                {
1455                        fesetvoltage(dvbnode, SEC_VOLTAGE_OFF, 0);
1456                }
1457                dvbnode = dvbnode->next;
1458        }
1459
1460        calclof(node, tpnode, NULL, 0);
1461
1462        tmpstr = ostrcat(node->feshortname, "lnb_voltagemode", 0, 0);
1463        voltagemode = getconfigint(tmpstr, node->feaktnr);
1464        free(tmpstr); tmpstr = NULL;
1465        switch(voltagemode)
1466        {
1467                case 1: volt = SEC_VOLTAGE_13; break;
1468                case 2: volt = SEC_VOLTAGE_18; break;
1469                default: volt = node->feaktpolarization ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18;
1470                         if(node->feunicable == 1) volt = SEC_VOLTAGE_13;
1471        }
1472        fesetvoltage(node, volt, 15);
1473
1474        tmpstr = ostrcat(node->feshortname, "_diseqc", 0, 0);
1475        if(getconfigint(tmpstr, node->feaktnr) == 0 || node->feunicable == 1)
1476        {
1477                debug(200, "don't use diseqc");
1478        }
1479        else
1480        {
1481                fesettone(node, SEC_TONE_OFF, 15);
1482                fediseqcset(node, tpnode);
1483        }
1484        free(tmpstr); tmpstr = NULL;
1485
1486        tmpstr = ostrcat(node->feshortname, "_lnb_tonemode", 0, 0);
1487        tonemode = getconfigint(tmpstr, node->feaktnr);
1488        free(tmpstr); tmpstr = NULL;
1489        switch(tonemode)
1490        {
1491                case 1: tone = SEC_TONE_ON; break;
1492                case 2: tone = SEC_TONE_OFF; break;
1493                default: tone = node->feaktband ? SEC_TONE_ON : SEC_TONE_OFF;
1494                         if(node->feunicable == 1) tone = SEC_TONE_OFF;
1495        }
1496        fesettone(node, tone, 15);
1497}
1498
1499void fediscard(struct dvbdev* node)
1500{
1501        struct dvb_frontend_event ev;
1502        int count = 0;
1503
1504        if(node == NULL)
1505        {
1506                err("NULL detect");
1507                return;
1508        }
1509
1510        /* discard stale QPSK events */
1511        while(count < 20)
1512        {
1513                count++;
1514                if(ioctl(node->fd, FE_GET_EVENT, &ev) == -1)
1515                        break;
1516        }
1517}
1518
1519uint16_t fereadsnr(struct dvbdev* node)
1520{
1521        uint16_t snr = 0;
1522        if(node == NULL)
1523        {
1524                err("NULL detect");
1525                return 0;
1526        }
1527        int signalquality = 0;
1528        int signalqualitydb = 0;
1529//#ifdef ARM
1530#ifdef MIPSEL
1531//#if DVB_API_VERSION >= 5
1532#if DVB_API_VERSION > 5 || DVB_API_VERSION == 5 && DVB_API_VERSION_MINOR >= 10
1533
1534        int test1 = 0;
1535        int test2 = 0;
1536        struct dtv_property prop[1];
1537        prop[0].cmd = DTV_STAT_CNR;
1538        struct dtv_properties props;
1539        props.props = prop;
1540        props.num = 1;
1541       
1542        if(ioctl(node->fd, FE_GET_PROPERTY,  &props) < 0 && errno != ERANGE)
1543        {
1544                perr("FE_GET_PROPERTY");
1545        }
1546        else
1547        {
1548                for(unsigned int i=0; i<prop[0].u.st.len; i++)
1549                {
1550                        if (prop[0].u.st.stat[i].scale == FE_SCALE_DECIBEL && test1 == 0)
1551                        {
1552                                test1 = 1;
1553                                signalqualitydb = prop[0].u.st.stat[i].svalue / 10;
1554                                printf("***** new snr signalqualitydb:%d\n", signalqualitydb);
1555                        }
1556                        else if (prop[0].u.st.stat[i].scale == FE_SCALE_RELATIVE && test2 == 0)
1557                        {
1558                                test2 = 1;
1559                                signalquality = prop[0].u.st.stat[i].svalue;
1560                                printf("***** new snr signalquality:%d\n", signalquality);
1561                        }
1562                }
1563        }
1564#endif
1565        if(!signalquality && !signalqualitydb)
1566        {
1567                int ret = 0x12345678;
1568                int sat_max = 1600; // we assume a max of 16db here
1569                int ter_max = 2900; // we assume a max of 29db here
1570                int cab_max = 4200; // we assume a max of 42db here
1571                //int atsc_max = 4200; // we assume a max of 42db here
1572               
1573                ioctl(node->fd, FE_READ_SNR, &snr);
1574               
1575                printf("***** old snr signalquality\n");               
1576               
1577                if(ostrstr(node->feinfo->name, "Si2166B") != NULL)
1578                {
1579                        ret = (snr * 240) >> 8;
1580                }
1581                else if (ostrstr(node->feinfo->name, "ATBM781x") != NULL)
1582                {
1583                        ret = snr*10;
1584                }
1585                else if(ostrstr(node->feinfo->name, "BCM4506") != NULL || ostrstr(node->feinfo->name, "BCM4506 (internal)") != NULL || ostrstr(node->feinfo->name, "BCM4505") != NULL || ostrstr(node->feinfo->name, "BCM73625 (G3)") != NULL || ostrstr(node->feinfo->name, "BCM45208") != NULL)
1586                {
1587                        ret = (snr * 100) >> 8;
1588                }
1589                else if (ostrstr(node->feinfo->name, "Si216") != NULL) // all new Models with SI Tuners
1590                {
1591                        ret = snr;
1592                }
1593                signalqualitydb = ret;
1594                if (ret == 0x12345678) // no snr db calculation avail.. return untouched snr value..
1595                {
1596                        signalquality = snr;
1597                }
1598                else
1599                {
1600                        if(node->feinfo->type == FE_QPSK)
1601                                signalquality = (ret >= sat_max ? 65536 : ret * 65536 / sat_max);
1602                        else if(node->feinfo->type == FE_QAM)
1603                                signalquality = (ret >= cab_max ? 65536 : ret * 65536 / cab_max);
1604                        else if(node->feinfo->type == FE_OFDM)
1605                                signalquality = (ret >= ter_max ? 65536 : ret * 65536 / ter_max);
1606                }
1607        }
1608        debug(200, "frontend snr = %02x", signalquality );
1609        return signalquality;
1610#else
1611        ioctl(node->fd, FE_READ_SNR, &snr);
1612        debug(200, "frontend snr = %02x", (snr * 100) / 0xffff);
1613        return snr;
1614#endif
1615}
1616
1617uint16_t fereadsignalstrength(struct dvbdev* node)
1618{
1619        uint16_t signal = 0;
1620
1621        if(node == NULL)
1622        {
1623                err("NULL detect");
1624                return 0;
1625        }
1626//#ifdef ARM
1627//#ifdef MIPSEL
1628#if DVB_API_VERSION > 5 || DVB_API_VERSION == 5 && DVB_API_VERSION_MINOR >= 10
1629        struct dtv_property prop[1];
1630        prop[0].cmd = DTV_STAT_SIGNAL_STRENGTH;
1631        struct dtv_properties props;
1632        props.props = prop;
1633        props.num = 1;
1634        if (ioctl(node->fd, FE_GET_PROPERTY, &props) < 0 && errno != ERANGE)
1635        {
1636                debug(200, "DTV_STAT_SIGNAL_STRENGTH failed");
1637        }
1638        else
1639        {
1640                for(unsigned int i=0; i<prop[0].u.st.len; i++)
1641                {
1642                        if (prop[0].u.st.stat[i].scale == FE_SCALE_RELATIVE)
1643                                signal = prop[0].u.st.stat[i].uvalue;
1644                }
1645        }
1646        if (signal)
1647                return signal;
1648        // fallback to old DVB API
1649//#endif
1650#endif 
1651        if(ioctl(node->fd, FE_READ_SIGNAL_STRENGTH, &signal) < 0 && errno != ERANGE)
1652        {
1653                debug(200, "FE_READ_SIGNAL_STRENGTH failed");
1654        }
1655        else
1656        {
1657                if(ostrstr(node->feinfo->name, "Si2166B") != NULL || ostrstr(node->feinfo->name, "BCM45208") != NULL)
1658                        signal = signal * 1000;
1659                debug(200, "frontend signal = %02x", (signal * 100) / 0xffff);
1660        }
1661        return signal;
1662}
1663
1664uint32_t fereadber(struct dvbdev* node)
1665{
1666        uint32_t ber = 0;
1667
1668        if(node == NULL)
1669        {
1670                err("NULL detect");
1671                return 0;
1672        }
1673
1674        ioctl(node->fd, FE_READ_BER, &ber);
1675        debug(200, "frontend ber = %02x", ber);
1676        return ber;
1677}
1678
1679uint32_t fereaduncorrectedblocks(struct dvbdev* node)
1680{
1681        uint32_t unc = 0;
1682
1683        if(node == NULL)
1684        {
1685                err("NULL detect");
1686                return 0;
1687        }
1688
1689        ioctl(node->fd, FE_READ_UNCORRECTED_BLOCKS, &unc);
1690        debug(200, "frontend unc = %02x", unc);
1691        return unc;
1692}
1693
1694fe_status_t fereadstatus(struct dvbdev* node)
1695{
1696        fe_status_t status;
1697
1698        if(node == NULL)
1699        {
1700                err("NULL detect");
1701                return -1;
1702        }
1703
1704        if(ioctl(node->fd, FE_READ_STATUS, &status) == -1)
1705                perr("FE_READ_STATUS");
1706
1707        debug(200, "frontend status = %02x", status);
1708        if(status & FE_HAS_LOCK) debug(200, "frontend = FE_HAS_LOCK");
1709        if(status & FE_HAS_SIGNAL) debug(200, "frontend = FE_HAS_SIGNAL");
1710        if(status & FE_HAS_CARRIER) debug(200, "frontend = FE_HAS_CARRIER");
1711        if(status & FE_HAS_VITERBI) debug(200, "frontend = FE_HAS_VITERBI");
1712        if(status & FE_HAS_SYNC) debug(200, "frontend = FE_HAS_SYNC");
1713        if(status & FE_TIMEDOUT) debug(200, "frontend = FE_TIMEDOUT");
1714        if(status & FE_REINIT) debug(200, "frontend = FE_REINIT");
1715
1716        return status;
1717}
1718
1719int fetunedvbs(struct dvbdev* node, struct transponder* tpnode)
1720{
1721        if(node == NULL || tpnode == NULL)
1722        {
1723                err("NULL detect");
1724                return 1;
1725        }
1726       
1727        if(node->feunicable == 1)
1728        {
1729                fesetunicable(node);
1730                char* tmpstr = ostrcat(node->feshortname, "_lnb_satcrfrequ", 0, 0);
1731                node->feloffrequency = getconfigint(tmpstr, node->feaktnr) * 1000;
1732                free(tmpstr); tmpstr = NULL;
1733        }
1734
1735#if DVB_API_VERSION >= 5
1736        struct dtv_property p[10];
1737        struct dtv_properties cmdseq;
1738        cmdseq.props = p;
1739
1740        //convert transponderlist for dvbapi5
1741        int system = tpnode->system;
1742        switch(system)
1743        {
1744                case 0: system = SYS_DVBS; break;
1745                case 1: system = SYS_DVBS2; break;
1746                default: system = SYS_DVBS; break;
1747        }
1748
1749        int fec = tpnode->fec;
1750        switch(fec)
1751        {
1752                case 0: fec = FEC_AUTO; break;
1753                case 1: fec = FEC_1_2; break;
1754                case 2: fec = FEC_2_3; break;
1755                case 3: fec = FEC_3_4; break;
1756                case 4: fec = FEC_5_6; break;
1757                case 5: fec = FEC_7_8; break;
1758                case 6: fec = FEC_8_9; break;
1759                case 7: fec = FEC_3_5; break;
1760                case 8: fec = FEC_4_5; break;
1761                case 9: fec = FEC_9_10; break;
1762                case 15: fec = FEC_NONE; break;
1763                default: fec = FEC_AUTO; break;
1764        }
1765        int pilot = tpnode->pilot;
1766        switch(pilot)
1767        {
1768                case 0: pilot = PILOT_OFF; break;
1769                case 1: pilot = PILOT_ON; break;
1770                case 2: pilot = PILOT_AUTO; break;
1771                default: pilot = PILOT_AUTO; break;
1772        }
1773        int rolloff = tpnode->rolloff;
1774        switch(rolloff)
1775        {
1776                case 0: rolloff = ROLLOFF_35; break;
1777                case 1: rolloff = ROLLOFF_25; break;
1778                case 2: rolloff = ROLLOFF_20; break;
1779                default: rolloff = ROLLOFF_35; break;
1780        }
1781
1782        int modulation = tpnode->modulation;
1783        switch(modulation)
1784        {
1785                case 0: modulation = QPSK; break;
1786                case 1: modulation = QPSK; break;
1787                case 2: modulation = PSK_8; break;
1788                case 3: modulation = QAM_16; break;
1789                default: modulation = QPSK; break;
1790        }
1791
1792        p[0].cmd = DTV_CLEAR;
1793        p[1].cmd = DTV_DELIVERY_SYSTEM, p[1].u.data = system;
1794        p[2].cmd = DTV_FREQUENCY,       p[2].u.data = node->feloffrequency;
1795        p[3].cmd = DTV_MODULATION,      p[3].u.data = modulation;
1796        p[4].cmd = DTV_SYMBOL_RATE,     p[4].u.data = tpnode->symbolrate;
1797        p[5].cmd = DTV_INNER_FEC,       p[5].u.data = fec;
1798        p[6].cmd = DTV_INVERSION,       p[6].u.data = (fe_spectral_inversion_t) tpnode->inversion;
1799        if(system == SYS_DVBS2)
1800        {
1801                p[7].cmd = DTV_ROLLOFF,         p[7].u.data = rolloff;
1802                p[8].cmd = DTV_PILOT,           p[8].u.data = pilot;
1803                p[9].cmd = DTV_TUNE;
1804                cmdseq.num = 10;
1805        }
1806        else
1807        {
1808                p[7].cmd = DTV_TUNE;
1809                cmdseq.num = 8;
1810        }
1811
1812        debug(200, "new dvbapi: frequ=%d, inversion=%d, pilot=%d, rolloff=%d, fec=%d, sr=%d, modulation=%d, system=%d (%s)", node->feloffrequency, tpnode->inversion, pilot, rolloff, fec, tpnode->symbolrate, modulation, system, node->feshortname);
1813#else
1814        struct dvb_frontend_parameters tuneto;
1815        fe_spectral_inversion_t inversion = tpnode->inversion;
1816
1817        //convert transponderlist for dvbapi3
1818        int fec = tpnode->fec;
1819        if(tpnode->system == 1)
1820        {
1821                if(tpnode->modulation == 1) fec = fec + 9;
1822                if(tpnode->modulation == 2) fec = fec + 18;
1823        }
1824
1825        inversion |= (tpnode->rolloff << 2) | inversion; // use bit 2..3 of inversion for rolloff
1826        inversion |= (tpnode->pilot << 4) | inversion; // use bit 4..5 of inversion for pilot
1827
1828        tuneto.frequency = node->feloffrequency;
1829        tuneto.inversion = inversion;
1830        tuneto.u.qpsk.symbol_rate = tpnode->symbolrate;
1831        tuneto.u.qpsk.fec_inner = fec;
1832
1833        debug(200, "old dvbapi: frequ=%d, inversion=%d, pilot=%d, rolloff=%d, fec=%d, sr=%d modulation=%d, system=%d (%s)", node->feloffrequency, inversion, tpnode->pilot, tpnode->rolloff, fec, tpnode->symbolrate, tpnode->modulation, tpnode->system, node->feshortname);
1834#endif
1835
1836        fediscard(node);
1837
1838#if DVB_API_VERSION >= 5
1839        if((ioctl(node->fd, FE_SET_PROPERTY, &cmdseq)) == -1)
1840        {
1841                perr("FE_SET_PROPERTY");
1842                return 1;
1843        }
1844#else
1845        if(ioctl(node->fd, FE_SET_FRONTEND, &tuneto) == -1)
1846        {
1847                perr("FE_SET_FRONTEND");
1848                return 1;
1849        }
1850#endif
1851
1852        return 0;
1853}
1854
1855int fetunedvbc(struct dvbdev* node, struct transponder* tpnode)
1856{
1857        if(node == NULL || tpnode == NULL)
1858        {
1859                err("NULL detect");
1860                return 1;
1861        }
1862       
1863        int fec = tpnode->fec;
1864        switch(fec)
1865        {
1866                case 0: fec = FEC_AUTO; break;
1867                case 1: fec = FEC_1_2; break;
1868                case 2: fec = FEC_2_3; break;
1869                case 3: fec = FEC_3_4; break;
1870                case 4: fec = FEC_5_6; break;
1871                case 5: fec = FEC_7_8; break;
1872                case 6: fec = FEC_8_9; break;
1873                case 7: fec = FEC_3_5; break;
1874                case 8: fec = FEC_4_5; break;
1875                case 9: fec = FEC_9_10; break;
1876                case 15: fec = FEC_NONE; break;
1877                default: fec = FEC_AUTO; break;
1878        }
1879
1880        int modulation = tpnode->modulation;
1881        switch(modulation)
1882        {
1883                case 0: modulation = QAM_AUTO; break;
1884                case 1: modulation = QAM_16; break;
1885                case 2: modulation = QAM_32; break;
1886                case 3: modulation = QAM_64; break;
1887                case 4: modulation = QAM_128; break;
1888                case 5: modulation = QAM_256; break;
1889                default: modulation = QAM_AUTO; break;
1890        }
1891
1892#if DVB_API_VERSION >= 5
1893        struct dtv_property p[8];
1894        struct dtv_properties cmdseq;
1895        cmdseq.props = p;
1896       
1897        int system = tpnode->system;
1898       
1899#if DREAMBOX
1900        switch(system)
1901        {
1902                //case 0: system = SYS_DVBC_ANNEX_A; break;
1903                //case 1: system = SYS_DVBC_ANNEX_C; break;
1904                //default: system = SYS_DVBC_ANNEX_A; break;
1905                case 0: system = 1; break;
1906                case 1: system = 18; break;
1907                default: system = 1; break;
1908        }
1909#endif
1910        p[0].cmd = DTV_CLEAR;
1911        p[1].cmd = DTV_DELIVERY_SYSTEM, p[1].u.data = system;
1912        p[2].cmd = DTV_FREQUENCY,       p[2].u.data = tpnode->frequency;
1913        p[3].cmd = DTV_MODULATION,      p[3].u.data = modulation;
1914        p[4].cmd = DTV_SYMBOL_RATE,     p[4].u.data = tpnode->symbolrate;
1915        p[5].cmd = DTV_INVERSION,       p[5].u.data = (fe_spectral_inversion_t) tpnode->inversion;
1916        p[6].cmd = DTV_INNER_FEC,       p[6].u.data = fec;
1917        p[7].cmd = DTV_TUNE;
1918        cmdseq.num = 8;
1919
1920        debug(200, "new dvbapi: frequ=%d, inversion=%d, fec=%d, sr=%d, modulation=%d, system=%d (%s)", tpnode->frequency, tpnode->inversion, fec, tpnode->symbolrate, modulation, tpnode->system, node->feshortname);
1921#else
1922        struct dvb_frontend_parameters tuneto;
1923        tuneto.frequency = tpnode->frequency;
1924        tuneto.inversion = tpnode->inversion;
1925        tuneto.u.qam.symbol_rate = tpnode->symbolrate;
1926        tuneto.u.qam.fec_inner = tpnode->fec;
1927        tuneto.u.qam.modulation = tpnode->modulation;
1928
1929        debug(200, "old dvbapi: frequ=%d, inversion=%d, fec=%d, sr=%d, modulation=%d (%s)", tpnode->frequency, tpnode->inversion, fec, tpnode->symbolrate, modulation, node->feshortname);
1930#endif
1931
1932        fediscard(node);
1933
1934#if DVB_API_VERSION >= 5
1935        if((ioctl(node->fd, FE_SET_PROPERTY, &cmdseq)) == -1)
1936        {
1937                perr("FE_SET_PROPERTY");
1938                return 1;
1939        }
1940#else
1941        if(ioctl(node->fd, FE_SET_FRONTEND, &tuneto) == -1)
1942        {
1943                perr("FE_SET_FRONTEND");
1944                return 1;
1945        }
1946#endif
1947
1948        return 0;
1949}
1950
1951int fetunedvbt(struct dvbdev* node, struct transponder* tpnode)
1952{
1953        if(node == NULL || tpnode == NULL)
1954        {
1955                err("NULL detect");
1956                return 1;
1957        }
1958        debug(200, "transponder:frequ=%d, inversion=%d, bandwidth=%d, hp=%d, lp=%d, modulation=%d transmission=%d guardinterval=%d hierarchy=%d system=%d (%s)", tpnode->frequency, tpnode->inversion, tpnode->symbolrate, tpnode->fec, tpnode->polarization, tpnode->modulation, tpnode->pilot, tpnode->rolloff, tpnode->system, tpnode->system, node->feshortname);
1959       
1960        int system = tpnode->system;
1961       
1962        int hp = tpnode->fec; //fec = hp on DVBT
1963        switch(hp)
1964        {
1965                case T_FEC_1_2: hp = FEC_1_2; break;
1966                case T_FEC_2_3: hp = FEC_2_3; break;
1967                case T_FEC_3_4: hp = FEC_3_4; break;
1968                case T_FEC_5_6: hp = FEC_5_6; break;
1969                case T_FEC_6_7: hp = FEC_6_7; break;   
1970                case T_FEC_7_8: hp = FEC_7_8; break;
1971                case T_FEC_8_9: hp = FEC_8_9; break;
1972                default: hp = FEC_AUTO; break;
1973        }
1974
1975        int lp = tpnode->polarization; //polarization = lp on DVBT
1976        switch(lp)
1977        {
1978                case T_FEC_1_2: lp = FEC_1_2; break;
1979                case T_FEC_2_3: lp = FEC_2_3; break;
1980                case T_FEC_3_4: lp = FEC_3_4; break;
1981                case T_FEC_5_6: lp = FEC_5_6; break;
1982                case T_FEC_6_7: lp = FEC_6_7; break;   
1983                case T_FEC_7_8: lp = FEC_7_8; break;
1984                case T_FEC_8_9: lp = FEC_8_9; break;
1985                default: lp = FEC_AUTO; break;
1986        }
1987
1988        int modulation = tpnode->modulation;
1989        switch(modulation)
1990        {
1991                case T_Modulation_QPSK: modulation = QPSK; break;
1992                case T_Modulation_QAM16: modulation = QAM_16; break;
1993                case T_Modulation_QAM64: modulation = QAM_64; break;
1994                case T_Modulation_QAM256: modulation = QAM_256; break;
1995                default: modulation = QAM_AUTO; break;
1996        }
1997
1998        int bandwidth = tpnode->symbolrate; //symbolrate = bandwidth on DVBT
1999        switch(bandwidth)
2000        {
2001                case T_Bandwidth_8MHz: bandwidth = 8000000; break;
2002                case T_Bandwidth_7MHz: bandwidth = 7000000; break;
2003                case T_Bandwidth_6MHz: bandwidth = 6000000; break;
2004                case T_Bandwidth_5MHz: bandwidth = 5000000; break;
2005                case T_Bandwidth_1_712MHz: bandwidth = 1712000; break;
2006                case T_Bandwidth_10MHz: bandwidth = 10000000; break;   
2007                case T_Bandwidth_Auto: bandwidth = 0; break;
2008                default: bandwidth = 0; break;
2009        }
2010       
2011        int transmission = tpnode->pilot; //pilot = transmission on DVBT
2012        switch(transmission)
2013        {
2014                case T_TransmissionMode_2k: transmission = TRANSMISSION_MODE_2K; break;
2015                case T_TransmissionMode_4k: transmission = TRANSMISSION_MODE_4K; break;
2016                case T_TransmissionMode_8k: transmission = TRANSMISSION_MODE_8K; break;
2017                case T_TransmissionMode_Auto: transmission = TRANSMISSION_MODE_AUTO; break;
2018#if defined TRANSMISSION_MODE_1K
2019                case T_TransmissionMode_1k: transmission = TRANSMISSION_MODE_1K; break;
2020                case T_TransmissionMode_16k: transmission = TRANSMISSION_MODE_16K; break;
2021                case T_TransmissionMode_32k: transmission = TRANSMISSION_MODE_32K; break;
2022#endif
2023                default: transmission = TRANSMISSION_MODE_AUTO; break;
2024        }
2025
2026        int guardinterval = tpnode->rolloff; //rolloff = guardinterval on DVBT
2027        switch(guardinterval)
2028        {
2029                case T_GuardInterval_1_32: guardinterval = GUARD_INTERVAL_1_32; break;
2030                case T_GuardInterval_1_16: guardinterval = GUARD_INTERVAL_1_16; break;
2031                case T_GuardInterval_1_8: guardinterval = GUARD_INTERVAL_1_8; break;
2032                case T_GuardInterval_1_4: guardinterval = GUARD_INTERVAL_1_4; break;
2033                case T_GuardInterval_Auto: guardinterval = GUARD_INTERVAL_AUTO; break;
2034#if defined GUARD_INTERVAL_1_128
2035                case T_GuardInterval_1_128: guardinterval = GUARD_INTERVAL_1_128; break;
2036                case T_GuardInterval_19_128: guardinterval = GUARD_INTERVAL_19_128; break;
2037                case T_GuardInterval_19_256: guardinterval = GUARD_INTERVAL_19_256; break;
2038#endif
2039                default: guardinterval = GUARD_INTERVAL_AUTO; break;
2040        }
2041       
2042        int hierarchy = tpnode->system; //system = hierarchy on DVBT
2043        if(tpnode->system == System_DVB_T2) //system = DVB-T2 then hierarchy = HIERARCHY_AUTO
2044                hierarchy = T_Hierarchy_Auto;
2045       
2046        switch(hierarchy)
2047        {
2048                case T_Hierarchy_None: hierarchy = HIERARCHY_NONE;
2049                case T_Hierarchy_1: hierarchy = HIERARCHY_1;
2050                case T_Hierarchy_2: hierarchy = HIERARCHY_2;
2051                case T_Hierarchy_4: hierarchy = HIERARCHY_4;
2052                case T_Hierarchy_Auto: hierarchy = HIERARCHY_AUTO;
2053                default: hierarchy = HIERARCHY_AUTO; break;
2054        }
2055
2056        int ret = 0;
2057        fediscard(node);
2058
2059#if DVB_API_VERSION >= 5
2060        struct dtv_property p[12];
2061        struct dtv_properties cmdseq;
2062        cmdseq.props = p;
2063
2064// suchlauf geht an nemesis mit system=0
2065#if DREAMBOX
2066        switch(system)
2067        {
2068                case System_DVB_T: system = SYS_DVBT; break; //3
2069                case System_DVB_T2: system = SYS_DVBT2; break; //16
2070                default: system = SYS_DVBT; break;
2071        }
2072#endif
2073
2074        p[0].cmd = DTV_CLEAR;
2075        p[1].cmd = DTV_DELIVERY_SYSTEM, p[1].u.data = system;
2076        p[2].cmd = DTV_FREQUENCY,       p[2].u.data = tpnode->frequency;
2077        p[3].cmd = DTV_INVERSION,       p[3].u.data = (fe_spectral_inversion_t) tpnode->inversion;
2078        p[4].cmd = DTV_BANDWIDTH_HZ, p[4].u.data = bandwidth;
2079        p[5].cmd = DTV_CODE_RATE_LP, p[5].u.data = lp;
2080        p[6].cmd = DTV_CODE_RATE_HP, p[6].u.data = hp;
2081        p[7].cmd = DTV_MODULATION, p[7].u.data = modulation;
2082        p[8].cmd = DTV_TRANSMISSION_MODE,       p[8].u.data = transmission;
2083        p[9].cmd = DTV_GUARD_INTERVAL, p[9].u.data = guardinterval;
2084        p[10].cmd = DTV_HIERARCHY, p[10].u.data = hierarchy;
2085        p[11].cmd = DTV_TUNE;
2086        cmdseq.num = 12;
2087       
2088        if((ioctl(node->fd, FE_SET_PROPERTY, &cmdseq)) == -1)
2089        {
2090                perr("FE_SET_PROPERTY");
2091                ret = 1;
2092        }
2093
2094        debug(200, "new dvbapi 1: frequ=%d, inversion=%d, bandwidth=%d, hp=%d, lp=%d, modulation=%d transmission=%d guardinterval=%d hierarchy=%d system=%d (%s)", tpnode->frequency, tpnode->inversion, bandwidth, hp, lp, modulation, transmission, guardinterval, hierarchy, system, node->feshortname);
2095
2096#else
2097        struct dvb_frontend_parameters tuneto;
2098
2099        tuneto.frequency = tpnode->frequency;
2100        tuneto.inversion = tpnode->inversion;
2101        tuneto.u.ofdm.bandwidth = bandwidth;
2102        tuneto.u.ofdm.code_rate_HP = hp;
2103        tuneto.u.ofdm.code_rate_LP = lp;
2104        tuneto.u.ofdm.constellation = modulation;
2105        tuneto.u.ofdm.transmission_mode = transmission;
2106        tuneto.u.ofdm.guard_interval = guardinterval;
2107        tuneto.u.ofdm.hierarchy_information = hierarchy;
2108       
2109        if(ioctl(node->fd, FE_SET_FRONTEND, &tuneto) == -1)
2110        {
2111                perr("FE_SET_FRONTEND");
2112                ret = 1;
2113        }
2114
2115        debug(200, "old dvbapi 1: frequ=%d, inversion=%d, bandwidth=%d, hp=%d, lp=%d, modulation=%d transmission=%d guardinterval=%d hierarchy=%d system=%d (%s)", tpnode->frequency, tpnode->inversion, bandwidth, hp, lp, modulation, transmission, guardinterval, hierarchy, system, node->feshortname);
2116
2117#endif
2118        return ret;
2119}
2120
2121#ifdef SIMULATE
2122int tunercount = 0;
2123#endif
2124struct dvb_frontend_info* fegetinfo(struct dvbdev* node, int fd)
2125{
2126        struct dvb_frontend_info* feinfo = NULL;
2127        int tmpfd = -1;
2128
2129        if(node != NULL)
2130                tmpfd = node->fd;
2131        else
2132                tmpfd = fd;
2133
2134        feinfo = (struct dvb_frontend_info*)malloc(sizeof(struct dvb_frontend_info));
2135        if(feinfo == NULL)
2136        {
2137                err("no mem");
2138                return NULL;
2139        }
2140
2141#ifndef SIMULATE
2142        if(ioctl(tmpfd, FE_GET_INFO, feinfo) < 0)
2143        {
2144                perr("FE_GET_INFO");
2145                free(feinfo);
2146                return NULL;
2147        }
2148#else
2149        tunercount++;
2150        if(tunercount == 1)
2151        {
2152                sprintf(feinfo->name, "%s", "Conax 7500 DVB-C");
2153                feinfo->type = FE_QAM;
2154        }
2155        else
2156        {
2157                sprintf(feinfo->name, "%s", "Conax 7500 DVB-S");
2158                feinfo->type = FE_QPSK;
2159                //feinfo->type = FE_QAM;
2160        }
2161#endif
2162        return feinfo;
2163}
2164
2165int fegetdev()
2166{
2167        int i, y, fd = -1, count = 0;
2168        char *buf = NULL, *frontenddev = NULL, *fehyprid = NULL, *tmpstr = NULL, *tmpstr1 = NULL;
2169        struct dvb_frontend_info* feinfo = NULL;
2170        struct dvbdev* dvbnode = NULL;
2171
2172        frontenddev = getconfig("frontenddev", NULL);
2173        if(frontenddev == NULL)
2174        {
2175                err("NULL detect");
2176                return count;
2177        }
2178
2179        buf = malloc(MINMALLOC);
2180        if(buf == NULL)
2181        {
2182                err("no memory");
2183                return count;
2184        }
2185
2186        for(i = 0; i < MAXDVBADAPTER; i++)
2187        {
2188                for(y = 0; y < MAXFRONTENDDEV; y++)
2189                {
2190                        sprintf(buf, frontenddev, i, y);
2191                        fd = feopen(NULL, buf);
2192                        if(fd >= 0)
2193                        {
2194                                fehyprid = gethypridtunerchoicesvalue(y);
2195                                if(fehyprid != NULL)
2196                                {
2197                                        if(y < 10)
2198                                                tmpstr = ostrcat(tmpstr, "fe_0", 1, 0);
2199                                        else
2200                                                tmpstr = ostrcat(tmpstr, "fe_1", 1, 0);
2201
2202                                        tmpstr = ostrcat(tmpstr, oitoa(y), 1, 1);
2203                                        tmpstr = ostrcat(tmpstr, "_hyprid", 1, 0);
2204                                        tmpstr1 = ostrcat(tmpstr, "_last", 0, 0);
2205                                        addconfig(tmpstr1, "999"); //first set
2206                                        free(tmpstr1), tmpstr1 = NULL;
2207#ifndef MIPSEL
2208                                        if(getconfig(tmpstr, NULL) != NULL)
2209                                                sethypridtuner(y, getconfig(tmpstr, NULL));
2210                                        free(tmpstr), tmpstr = NULL;
2211#endif
2212                                }
2213                               
2214                                feinfo = fegetinfo(NULL, fd);
2215                                if(feinfo != NULL)
2216                                {
2217                                        count++;
2218                                        dvbnode = adddvbdev(buf, i, y, fd, FRONTENDDEV, feinfo, NULL, fehyprid, 0);
2219#ifdef MIPSEL
2220                                        if(fehyprid != NULL && getconfig(tmpstr, NULL) != NULL)
2221                                                sethypridtunernew(dvbnode, getconfig(tmpstr, NULL));
2222                                        free(tmpstr), tmpstr = NULL;
2223#endif                                 
2224                                        if(dvbnode->feinfo->type == FE_QPSK)
2225                                                fesetvoltage(dvbnode, SEC_VOLTAGE_OFF, 15);
2226                                               
2227                                        if(y < 10)
2228                                                tmpstr = ostrcat(tmpstr, "fe_0", 1, 0);
2229                                        else
2230                                                tmpstr = ostrcat(tmpstr, "fe_1", 1, 0);
2231                                        tmpstr = ostrcat(tmpstr, oitoa(y), 1, 1);
2232                                        tmpstr = ostrcat(tmpstr, "_fbc", 1, 0);
2233                                        if(ostrstr(feinfo->name, "BCM45208") != NULL) //fbc Tuner
2234                                        {
2235                                                if(getconfig(tmpstr, NULL) == NULL)
2236                                                        addconfig(tmpstr, "A");
2237                                        }
2238                                        else
2239                                                addconfig(tmpstr, "");
2240                                        free(tmpstr), tmpstr = NULL;
2241                                }
2242                        }
2243                }
2244        }
2245
2246        free(buf);
2247        return count;
2248}
2249
2250int fecreatedummy()
2251{
2252        //create dummy frontend for playback
2253        char *buf = NULL, *frontenddev = NULL;
2254        struct dvbdev* dvbnode = NULL;
2255
2256        frontenddev = getconfig("frontenddev", NULL);
2257        if(frontenddev == NULL)
2258        {
2259                err("NULL detect");
2260                return 1;
2261        }
2262
2263        buf = malloc(MINMALLOC);
2264        if(buf == NULL)
2265        {
2266                err("no memory");
2267                return 1;
2268        }
2269
2270        dvbnode = dmxgetlast(0);
2271        if(dvbnode != NULL)
2272        {
2273                sprintf(buf, frontenddev, 0, dvbnode->devnr);
2274                adddvbdev(buf, 0, dvbnode->devnr, -1, FRONTENDDEVDUMMY, NULL, NULL, NULL, 0);
2275        }
2276
2277        free(buf);
2278        return 0;
2279}
2280
2281int fegetlock(int tunernr)
2282{
2283        struct dvbdev* dvbnode = NULL;
2284        dvbnode = dvbdev;
2285
2286        while(dvbnode != NULL)
2287        {
2288                if(dvbnode->deactive == 1)
2289                {
2290                        dvbnode = dvbnode->next;
2291                        continue;
2292                }
2293                if(dvbnode->type == FRONTENDDEV && dvbnode->devnr == tunernr)
2294                {
2295                        return dvbnode->felock;
2296                }
2297                dvbnode = dvbnode->next;
2298        }
2299        return -1;
2300}
2301
2302#ifdef MIPSEL
2303int fechangetype(struct dvbdev* tuner, char* value)
2304{
2305#if DVB_API_VERSION >= 5       
2306
2307        struct dtv_property p[2];
2308        memset(p, 0, sizeof(p));
2309        struct dtv_properties cmdseq;
2310        cmdseq.props = p;
2311        cmdseq.num = 2;
2312        p[0].cmd = DTV_CLEAR;
2313        p[1].cmd = DTV_DELIVERY_SYSTEM;
2314        p[1].u.data = SYS_UNDEFINED;
2315        char* buf = NULL, *hypridtuner = NULL;
2316        int type = 0;
2317        int ret = 0;
2318        char* realname = gethypridtunerchoicesvaluename(tuner->devnr, value);
2319       
2320       
2321        printf("**** > realname: %s\n", realname);
2322       
2323        if(realname != NULL && ostrstr(realname, "DVB-S") != NULL)
2324                type = feSatellite;
2325        else if(realname != NULL && ostrstr(realname, "DVB-C") != NULL)
2326                type = feCable;
2327        else if(realname != NULL && ostrstr(realname, "DVB-T") != NULL)
2328                type = feTerrestrial;
2329        else
2330                type = -1;
2331       
2332        switch (type)
2333        {
2334                case feSatellite:
2335                {
2336                        p[1].u.data = SYS_DVBS;
2337                        break;
2338                }
2339                case feTerrestrial:
2340                {
2341                        //fesetvoltage(tuner, SEC_VOLTAGE_OFF, 10);
2342                        //to do set voltage --> wenn der Tuner es kann
2343                        //fesetvoltage(tuner, SEC_VOLTAGE_13, 10);
2344                        if(realname != NULL && ostrstr(realname, "DVB-T2") != NULL)
2345                                p[1].u.data = SYS_DVBT2;
2346                        else
2347                                p[1].u.data = SYS_DVBT;
2348                        break;
2349                }
2350                case feCable:
2351                {
2352                         fesetvoltage(tuner, SEC_VOLTAGE_OFF, 10);
2353#ifdef SYS_DVBC_ANNEX_A
2354                        p[1].u.data = SYS_DVBC_ANNEX_A;
2355#else
2356                        p[1].u.data = SYS_DVBC_ANNEX_AC;
2357#endif
2358                        break;
2359                }
2360#ifdef feATSC
2361                case feATSC:
2362                {
2363                        p[1].u.data = SYS_ATSC;
2364                        break;
2365                }
2366#endif
2367                default:
2368                        debug(200, "not supported delivery system type %i", type);
2369                        return 0; //false
2370        }
2371        debug(200, "data %d",p[1].u.data );
2372        if (ioctl(tuner->fd, FE_SET_PROPERTY, &cmdseq) == -1)
2373        {
2374                err("FE_SET_PROPERTY failed -> use procfs to switch delivery system tuner %d mode %s type %d",tuner->devnr ,value, type);
2375        }
2376                hypridtuner = getconfig("hypridtuner", NULL);
2377                if(hypridtuner != NULL)
2378                {
2379                        buf = malloc(MINMALLOC);
2380                        if(buf == NULL)
2381                        {
2382                                err("no memory");
2383                                return 0;
2384                        }
2385                }
2386                sprintf(buf, hypridtuner, tuner->devnr);
2387                if(file_exist(buf))
2388                {
2389                        if(tuner->fd > -1)
2390                        {
2391                                feclose(tuner, -1);
2392                                ret = writesys(buf, value, 0);
2393                                tuner->fd = feopen(tuner, NULL);
2394                        }
2395                        else
2396                                ret = writesys(buf, value, 0);
2397                        printf("set %s to %s RC:%i\n", buf, value, ret);
2398                }
2399                else
2400                        err("set system tuner to %d ... file not found -> %s", value, buf);
2401                free(buf); buf = NULL;
2402                return 1; //true
2403       
2404        return 0; //true
2405
2406#else //if DVB_API_VERSION < 5
2407        printf("Hinweis -> DVB API kleiner Version 5\n");
2408        if(sethypridtuner(tuner, value) == 0)
2409                return 1;
2410        return 0; //false
2411#endif
2412}               
2413#endif
2414       
2415
2416#endif
Note: See TracBrowser for help on using the repository browser.