source: titan/titan/frontenddev.h @ 42143

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

fix build dm520/525

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