source: titan/titan/scan.h @ 11023

Last change on this file since 11023 was 11023, checked in by nit, 12 years ago

[titan] fix channelist convert

File size: 28.8 KB
Line 
1#ifndef SCAN_H
2#define SCAN_H
3
4uint8_t changeservicetype(uint8_t type)
5{
6        int ret = type;
7
8        switch(type)
9        {
10                case 0x01:
11                case 0x11:
12                case 0x19:
13                case 0x9A:
14                case 0x86:
15                case 0xC3:
16                case 0xC5:
17                case 0xC6:
18                        ret = 0;
19                        break;
20                case 0x02:
21                        ret = 1;
22                        break;
23        }
24
25        return ret;
26}
27
28int parsenit()
29{
30        int ret = 0, i;
31        int secdone[255];
32        int sectotal = -1;
33
34        for(i = 0; i < 255; i++) secdone[i] = 0;
35
36        unsigned char buf[MINMALLOC];
37
38        // position in buffer
39        unsigned short pos;
40        unsigned short pos2;
41
42        // network_information_section elements
43        unsigned short seclen;
44        unsigned short desclen;
45        unsigned short tdesclen;
46        unsigned short looplen;
47        unsigned long transponderid;
48        unsigned short onid;
49        unsigned short nid;
50
51        while(sectotal < buf[7])
52        {
53                seclen = ((buf[1] & 0x0F) << 8) + buf[2];
54                nid = ((buf[3] << 8)| buf[4]);
55                desclen = ((buf[8] & 0x0F) << 8) | buf[9];
56                unsigned char secnr = buf[6];
57
58//printf("[NIT] section %X last %X network_id 0x%x -> %s\n", secnum, buffer[7], network_id, secdone[secnum] ? "skip" : "use");
59
60                if(secdone[secnr] == 1) continue;
61                secdone[secnr] = 1;
62                sectotal++;
63                for(pos = 10; pos < desclen + 10; pos += buf[pos + 1] + 2)
64                {
65                        looplen = ((buf[pos] & 0x0F) << 8) | buf[pos + 1];
66                        if (!looplen) continue;
67
68                        for(pos += 2; pos < seclen - 3; pos += tdesclen + 6)
69                        {
70                                transponderid = (buf[pos] << 8) | buf[pos + 1];
71                                onid = (buf[pos + 2] << 8) | buf[pos + 3];
72                                tdesclen = ((buf[pos + 4] & 0x0F) << 8) | buf[pos + 5];
73                                {
74                                        for(pos2 = pos + 6; pos2 < pos + tdesclen + 6; pos2 += buf[pos2 + 1] + 2)
75                                        {
76                                                switch(buf[pos2])
77                                                {
78                                                        case 0x41:
79                                                                //servicelistdesc(buffer + pos2, transponderid, onid);
80                                                                break;
81                                                        case 0x43:
82                                                                //if(satsystemdesc(buffer + pos2, transponderid, onid) < 0)
83                                                                {
84                                                                        ret = -2;
85                                                                        goto end;
86                                                                }
87                                                                break;
88                                                        case 0x44:
89                                                                //if(cablesystemdesc(buffer + pos2, transponderid, onid) < 0)
90                                                                {
91                                                                        ret = -2;
92                                                                        goto end;
93                                                                }
94                                                                break;
95                                                        case 0x5A:
96                                                                //if(terrestrialsystemdesc(buffer + pos2) < 0)
97                                                                {
98                                                                        ret = -2;
99                                                                        goto end;
100                                                                }
101                                                                break;
102                                                        case 0x62:
103                                                                //frequencylistdesc(buffer + pos2);
104                                                                break;
105
106                                                }
107                                        }
108                                }
109                        }
110                }
111        }
112
113end:
114        return ret;
115}
116
117int findchannel(unsigned char *buf, unsigned long transponderid, uint8_t* lastsecnr, struct skin* scan, struct skin* listbox)
118{
119        int ret = -1;
120        struct skin* node = NULL;
121        struct channel* chnode = NULL;
122
123        // position in buffer
124        unsigned short pos;
125        unsigned short pos2;
126
127        // service_description_section elements
128        unsigned short seclen;
129        uint8_t secnr;
130        unsigned short onid, tid;
131        unsigned short serviceid;
132        unsigned short desclooplen;
133        unsigned short running;
134        int eitscheduleflag;
135        int eitpresentfollowingflag;
136        int camode;
137        uint8_t servicetype = 0;
138        uint8_t providerlen = 0;
139        char* tmpstr = NULL, *tmpstr1 = NULL, *tmpstr2 = NULL;
140        unsigned long* tmplong = NULL;
141
142        seclen = ((buf[1] & 0x0F) << 8) | buf[2];
143        secnr = buf[6];
144        *lastsecnr = buf[7];
145        tid = (buf[3] << 8) | buf[4];
146        onid = (buf[8] << 8) | buf[9];
147       
148        transponderid = (onid << 16) | tid;
149        debug(500, "SDT nr: %d, lastnr: %d, len: %d, tid: %d, onid: %d, transponderid: %lu", secnr, *lastsecnr, seclen, tid, onid, transponderid);
150
151        for(pos = 11; pos < seclen - 1; pos += desclooplen + 5)
152        {
153                serviceid = (buf[pos] << 8) | buf[pos + 1];
154                eitscheduleflag = buf[pos + 2] & 0x02;
155                eitpresentfollowingflag = buf[pos + 2] & 0x01;
156                running = buf[pos + 3] & 0xE0;
157                camode = buf[pos + 3] & 0x10;
158                desclooplen = ((buf[pos + 3] & 0x0F) << 8) | buf[pos + 4];
159                if(scaninfo.onlyfree == 1 && camode > 0) continue;
160
161                for(pos2 = pos + 5; pos2 < pos + desclooplen + 5; pos2 += buf[pos2 + 1] + 2)
162                {
163                        switch(buf[pos2])
164                        {
165                                case 0x48:
166                                        servicetype = buf[pos2 + 2];
167                                        servicetype = changeservicetype(servicetype);
168                                        providerlen = buf[pos2 + 3];
169                                        tmpstr1 = strndup((char*)&(buf[pos2 + 4]), providerlen);
170                                        tmpstr2 = strndup((char*)&(buf[pos2 + 4 + providerlen + 1]), (2 + buf[pos2 + 1]) - (4 + providerlen + 1));
171
172                                        if(tmpstr1 == NULL || strlen(tmpstr1) == 0) tmpstr1 = ostrcat(tmpstr1, "unknown", 1, 0);
173                                        if(tmpstr2 == NULL || strlen(tmpstr2) == 0) tmpstr2 = ostrcat(tmpstr2, "unknown", 1, 0);
174
175                                        tmpstr1 = strutf8(tmpstr1, strlen(tmpstr1), 0, 0, 1, 0);
176                                        tmpstr1 = stringreplacechar(tmpstr1, '#', '_');
177                                        tmpstr2 = strutf8(tmpstr2, strlen(tmpstr2), 0, 0, 1, 1);
178                                        tmpstr2 = stringreplacechar(tmpstr2, '#', '_');
179
180                                        //add to listbox
181                                        chnode = getchannel(serviceid, transponderid);
182                                        node = addlistbox(scan, listbox, node, 1);
183                                        if(node != NULL)
184                                        {
185                                                if(chnode != NULL)
186                                                        node->fontcol = convertcol("deaktivcol");
187                                                switch(servicetype)
188                                                {
189                                                        case 0:
190                                                                scaninfo.tvcount++;
191                                                                if(chnode == NULL) scaninfo.newtvcount++;
192                                                                break;
193                                                        case 1:
194                                                                scaninfo.radiocount++;
195                                                                if(chnode == NULL) scaninfo.newradiocount++;
196                                                                break;
197                                                        default:
198                                                                scaninfo.datacount++;
199                                                                if(chnode == NULL) scaninfo.newdatacount++;
200                                                                break;
201                                                }
202                                                tmpstr = ostrcat(tmpstr2, " (", 0, 0);
203                                                tmpstr = ostrcat(tmpstr, tmpstr1, 0, 0);
204                                                tmpstr = ostrcat(tmpstr, " - ", 0, 0);
205                                                if(servicetype == 0)
206                                                        tmpstr = ostrcat(tmpstr, _("TV"), 0, 0);
207                                                else if(servicetype == 1)
208                                                        tmpstr = ostrcat(tmpstr, _("Radio"), 0, 0);
209                                                else
210                                                        tmpstr = ostrcat(tmpstr, _("Data"), 0, 0);
211                                                tmpstr = ostrcat(tmpstr, ")", 0, 0);
212                                                changetext(node, tmpstr);
213                                                changeparam1(node, tmpstr1);
214                                                changeparam2(node, tmpstr2);
215                                                tmplong = (unsigned long*)malloc(sizeof(unsigned long) * 3);
216                                                if(tmplong != NULL)
217                                                {
218                                                        tmplong[0] = serviceid;
219                                                        tmplong[1] = transponderid;
220                                                        tmplong[2] = servicetype;
221                                                }
222                                                free(node->name);
223                                                node->name = (char*)tmplong;
224                                        }
225                                        free(tmpstr); tmpstr = NULL;
226                                        free(tmpstr1); tmpstr1 = NULL;
227                                        free(tmpstr2); tmpstr2 = NULL;
228
229                                        ret = 0;
230                                        break;
231
232                        }
233                }
234        }
235
236        return ret;
237}
238
239void doscan(struct stimerthread* timernode)
240{
241        int festatus = 0, secnr = 0;
242        uint8_t lastsecnr = 0xff;
243        unsigned char* buf = NULL;
244        struct transponder* tpnode = NULL;
245        struct dvbdev* fenode = NULL;
246        struct channel* chnode = NULL;
247        struct sat* satnode = sat;
248
249        if(scaninfo.fenode == NULL || scaninfo.tpnode == NULL || timernode == NULL)
250        {
251                scaninfo.threadend = 1;
252                return;
253        }
254
255        debug(500, "channel scan thread start");
256
257        //sat loop
258        satnode = sat;
259        while(satnode != NULL && timernode->aktion == START)
260        {
261                if(satnode->scan == 0)
262                {
263                        satnode = satnode->next;
264                        continue;
265                }
266                scaninfo.satname = satnode->name;
267
268                if(scaninfo.scantype == 0)
269                        tpnode = scaninfo.tpnode;
270                else if(scaninfo.scantype == 1)
271                        tpnode = transponder;
272                else if(scaninfo.scantype == 2 || scaninfo.scantype == 3)
273                {
274                        tpnode = transponder;
275                        scaninfo.orbitalpos = satnode->orbitalpos;
276                }
277
278                //transponder loop
279                while(tpnode != NULL && timernode->aktion == START)
280                {
281                        if(scaninfo.orbitalpos != tpnode->orbitalpos)
282                        {
283                                tpnode = tpnode->next;
284                                if(scaninfo.scantype == 0) break;
285                                continue;
286                        }
287       
288                        fenode = fegetfree(tpnode, 0, scaninfo.fenode);
289                        if(fenode == NULL || (scaninfo.scantype != 3 && fenode != scaninfo.fenode))
290                        {
291                                scaninfo.tpcount++;
292                                tpnode = tpnode->next;
293                                debug(500, "Frontend for scan not free");
294                                if(scaninfo.scantype == 0) break;
295                                continue;
296                        }
297
298                        //frontend tune
299                        if(fenode->feinfo->type == FE_QPSK)
300                        {
301                                feset(fenode, tpnode);
302                                fetunedvbs(fenode, tpnode);
303                        }
304                        else if(fenode->feinfo->type == FE_QAM)
305                                fetunedvbc(fenode, tpnode);
306                        else if(fenode->feinfo->type == FE_OFDM)
307                                fetunedvbt(fenode, tpnode);
308                        else
309                        {
310                                scaninfo.tpcount++;
311                                tpnode = tpnode->next;
312                                debug(500, "Frontend type unknown");
313                                if(scaninfo.scantype == 0) break;
314                                continue;
315                        }
316
317                        festatus = fewait(fenode);
318                        if(debug_level == 200) fereadstatus(fenode);
319                        if(festatus != 0)
320                        {
321                                scaninfo.tpcount++;
322                                tpnode = tpnode->next;
323                                debug(500, "tuning failed");
324                                if(scaninfo.scantype == 0) break;
325                                continue;
326                        }
327
328                        //del channels from transponder if selected
329                        if(scaninfo.clear == 1)
330                        {
331                                chnode = channel;
332                                while(chnode != NULL)
333                                {
334                                        if(chnode->transponder == tpnode)
335                                                delchannel(chnode->serviceid, chnode->transponderid, 1);
336                                        chnode = chnode->next;
337                                }
338                        }
339
340                        lastsecnr = 0xff;
341                        secnr = 0;
342                        while(secnr <= lastsecnr && secnr <= 256)
343                        {
344                                if(timernode->aktion != START) break;
345                                buf = dvbgetsdt(fenode, secnr, scaninfo.timeout);
346                                if(buf != NULL)
347                                        findchannel(buf, tpnode->id, &lastsecnr, scaninfo.scanscreen, scaninfo.listbox);
348                                else
349                                        break;
350                                free(buf); buf = NULL;
351                                secnr++;
352                        }
353       
354                        scaninfo.tpcount++;
355                        if(scaninfo.scantype == 0) break;
356                        tpnode = tpnode->next;
357                }
358                if(scaninfo.scantype == 0 || scaninfo.scantype == 1) break;
359                satnode = satnode->next;
360        }
361        scaninfo.threadend = 1;
362        debug(500, "channel scan thread end");
363}
364
365void scanaddchannel(struct skin* node, int scantype, struct transponder* tp1)
366{
367        int serviceid = 0;
368        unsigned long transponderid = 0;
369        int servicetype = 0;
370        int providerid = 0;
371        struct provider* providernode = NULL;
372        char* tmpstr = NULL;
373        struct transponder* tp2 = NULL;
374
375        if(node == NULL || node->name == NULL) return;
376
377        serviceid = ((unsigned long*)node->name)[0];
378        transponderid = ((unsigned long*)node->name)[1];
379        servicetype = ((unsigned long*)node->name)[2];
380        if(getchannel(serviceid, transponderid) == NULL)
381        {
382                //check if provider valid
383                providernode = getproviderbyname(node->param1);
384                if(providernode != NULL)
385                        providerid = providernode->providerid;
386                else
387                {
388                        providerid = getlastproviderid();
389                        tmpstr = ostrcat(tmpstr, oitoa(providerid), 1, 1);
390                        tmpstr = ostrcat(tmpstr, "#", 1, 0);
391                        tmpstr = ostrcat(tmpstr, node->param1, 1, 0);
392                        tmpstr = ostrcat(tmpstr, "#0", 1, 0);
393                        addprovider(tmpstr, 1, NULL);
394                        free(tmpstr); tmpstr = NULL;
395                }
396
397                //check if transponder valid
398                if(scantype == 0)
399                {
400                        tp2 = gettransponder(transponderid);
401                        if(tp2 == NULL) //create new transponder
402                                copytransponder(tp1, tp2, transponderid);
403                        else //change transponder
404                                copytransponder(tp1, tp2, 0);
405                }
406
407                if(servicetype != 0 && servicetype != 1)
408                        servicetype = 0;
409
410                if(createchannel(node->param2, transponderid, providerid, serviceid, servicetype, 0, -1, -1, -1, -1, 0) != NULL)
411                        node->fontcol = convertcol("deaktivcol");
412        }
413        else
414                node->fontcol = convertcol("deaktivcol");
415}
416
417void scansetallsat(int fetype)
418{
419        struct sat* satnode = sat;
420
421        while(satnode != NULL)
422        {
423                if(fetype == satnode->fetype) satnode->scan = 1;
424                satnode = satnode->next;
425        }
426}
427
428void scansetmultisat(struct skin* scan)
429{
430        struct skin* node = scan;
431        struct sat* satnode = NULL;
432
433        while(node != NULL && node->name != NULL)
434        {
435                if(ostrcmp(node->ret, "1") == 0)
436                {
437                        satnode = getsatbyorbitalpos(atoi(node->name));
438                        if(satnode != NULL)
439                                satnode->scan = 1;
440                }
441                node = node->next;
442        }
443}
444
445void screenscan(struct skin* mscan, char* tuner, int scantype, int orbitalpos, int frequency, int inversion, int symbolrate, int polarization, int fec, int modulation, int rolloff, int pilot, int networkscan, int onlyfree, int clear, int system, int timeout)
446{
447        int rcret = 0, tpmax = 0, i = 0;
448        struct skin* scan = getscreen("scan");
449        struct skin* progress = getscreennode(scan, "progress");
450        struct skin* listbox = getscreennode(scan, "listbox");
451        struct skin* satname = getscreennode(scan, "satname");
452        struct skin* tpcount = getscreennode(scan, "tpcount");
453        struct skin* foundtv = getscreennode(scan, "foundtv");
454        struct skin* foundradio = getscreennode(scan, "foundradio");
455        struct skin* founddata = getscreennode(scan, "founddata");
456        struct transponder* tpnode = NULL;
457        struct dvbdev* fenode = NULL, *dvbnode = dvbdev;
458        struct stimerthread* timernode = NULL;
459        struct sat* satnode = NULL;
460        char* tmpstr = NULL;
461
462        listbox->aktline = 1;
463        listbox->aktpage = -1;
464        progress->progresssize = 0;
465        memset(&scaninfo, 0, sizeof(struct scaninfo));
466
467        addscreenrc(scan, listbox);
468        if(scantype != 3)
469        {
470                while(dvbnode != NULL)
471                {
472                        if(dvbnode->type == FRONTENDDEV && dvbnode->feinfo != NULL && dvbnode->felock < 1 && dvbnode->feinfo->type == FE_QPSK)
473                        {
474                                if(ostrcmp(dvbnode->feshortname, tuner) == 0)
475                                {
476                                        fenode = dvbnode;
477                                        break;
478                                }
479                        }
480                        dvbnode = dvbnode->next;
481                }
482                if(fenode == NULL) return;
483        }
484        else if(scantype == 3)
485                fenode = dvbdev;
486
487        if(scantype == 0) //single transponder
488        {
489                if(fenode != NULL && fenode->feinfo != NULL)
490                {
491                        debug(500, "fetype=%d, orbitalpos=%d, frequ=%d, inverion=%d, symbolrate=%d, polarization=%d, fec=%d, modulation=%d, rolloff=%d, pilot=%d, system=%d", fenode->feinfo->type, orbitalpos, frequency, inversion, symbolrate, polarization, fec, modulation, rolloff, pilot, system);
492                        tpnode = createtransponder(0, fenode->feinfo->type, orbitalpos, frequency, inversion, symbolrate, polarization, fec, modulation, rolloff, pilot, system);
493                }
494                if(tpnode != NULL)
495                {
496                        tpmax = 1;
497                        satnode = getsatbyorbitalpos(tpnode->orbitalpos);
498                        if(satnode != NULL) satnode->scan = 1;
499                }
500        }
501        else if(scantype == 1) //single sat
502        {
503                tpnode = transponder;
504                while(tpnode != NULL)
505                {
506                        if(tpnode->orbitalpos == orbitalpos)
507                                tpmax++;
508                        tpnode = tpnode->next;
509                }
510                tpnode = transponder;
511                satnode = getsatbyorbitalpos(orbitalpos);
512                if(satnode != NULL) satnode->scan = 1;
513        }
514        else if(scantype == 2 || scantype == 3) //2: multi sat, 3: all
515        {
516                if(scantype == 2) scansetmultisat(mscan);
517                if(scantype == 3) scansetallsat(FE_QPSK);
518                satnode = sat;
519                while(satnode != NULL)
520                {
521                        if(satnode->scan != 0)
522                        {
523                                tpnode = transponder;
524                                while(tpnode != NULL)
525                                {
526                                        if(tpnode->orbitalpos == satnode->orbitalpos)
527                                                tpmax++;
528                                        tpnode = tpnode->next;
529                                }
530                        }
531                        satnode = satnode->next;
532                }
533                tpnode = transponder;
534        }
535
536        scaninfo.fenode = fenode;
537        scaninfo.tpnode = tpnode;
538        scaninfo.scanscreen = scan;
539        scaninfo.listbox = listbox;
540        scaninfo.timeout = timeout;
541        scaninfo.scantype = scantype;
542        scaninfo.orbitalpos = orbitalpos;
543        scaninfo.onlyfree = onlyfree;
544        scaninfo.clear = clear;
545        timernode = addtimer(&doscan, START, 1000, 1, NULL, NULL, NULL);
546
547        while(1)
548        {
549                //satname
550                tmpstr = ostrcat(tmpstr, _("Sat: "), 1, 0);
551                tmpstr = ostrcat(tmpstr, scaninfo.satname, 1, 0);
552                changetext(satname, tmpstr);
553                free(tmpstr); tmpstr = NULL;
554
555                //transpondercount
556                tmpstr = ostrcat(tmpstr, _("Transponder: "), 1, 0);
557                tmpstr = ostrcat(tmpstr, oitoa(scaninfo.tpcount), 1, 1);
558                tmpstr = ostrcat(tmpstr, " / ", 1, 0);
559                tmpstr = ostrcat(tmpstr, oitoa(tpmax), 1, 1);
560                changetext(tpcount, tmpstr);
561                free(tmpstr); tmpstr = NULL;
562
563                //tvcount
564                tmpstr = ostrcat(tmpstr, _("TV: "), 1, 0);
565                tmpstr = ostrcat(tmpstr, oitoa(scaninfo.newtvcount), 1, 1);
566                tmpstr = ostrcat(tmpstr, " / ", 1, 0);
567                tmpstr = ostrcat(tmpstr, oitoa(scaninfo.tvcount), 1, 1);
568                changetext(foundtv, tmpstr);
569                free(tmpstr); tmpstr = NULL;
570
571                //radiocount
572                tmpstr = ostrcat(tmpstr, _("Radio: "), 1, 0);
573                tmpstr = ostrcat(tmpstr, oitoa(scaninfo.newradiocount), 1, 1);
574                tmpstr = ostrcat(tmpstr, " / ", 1, 0);
575                tmpstr = ostrcat(tmpstr, oitoa(scaninfo.radiocount), 1, 1);
576                changetext(foundradio, tmpstr);
577                free(tmpstr); tmpstr = NULL;
578
579                //datacount
580                tmpstr = ostrcat(tmpstr, _("Data: "), 1, 0);
581                tmpstr = ostrcat(tmpstr, oitoa(scaninfo.newdatacount), 1, 1);
582                tmpstr = ostrcat(tmpstr, " / ", 1, 0);
583                tmpstr = ostrcat(tmpstr, oitoa(scaninfo.datacount), 1, 1);
584                changetext(founddata, tmpstr);
585                free(tmpstr); tmpstr = NULL;
586
587                if(tpmax == 0)
588                        progress->progresssize = 100;
589                else
590                        progress->progresssize = (100 / (float)tpmax) * scaninfo.tpcount;
591
592                drawscreen(scan, 0);
593                rcret = waitrc(scan, 1000, 0);
594                if(rcret == getrcconfigint("rcexit", NULL))
595                {
596                        if(timernode != NULL && scaninfo.threadend == 0)
597                        {
598                                timernode->aktion = STOP;
599                                while(i < 3 && scaninfo.threadend == 0)
600                                {
601                                        textbox(_("Message"), _("Wait for channel scan end"), NULL, 0, NULL, 0, NULL, 0, NULL, 0, 600, 200, 3, 0);
602                                        i++;
603                                }
604                        }
605                        break;
606                }
607                if(rcret == getrcconfigint("rcok", NULL))
608                        scanaddchannel(listbox->select, scantype, tpnode);
609                if(rcret == getrcconfigint("rcred", NULL))
610                {
611                        struct skin* lnode = listbox;
612                        long deaktivcol = convertcol("deaktivcol");
613                        while(lnode != NULL)
614                        {
615                                if(lnode->fontcol != deaktivcol && lnode->del == 1)
616                                        scanaddchannel(lnode, scantype, tpnode);
617                                lnode = lnode->next;
618                        }
619                }
620        }
621
622        if(scantype == 0) deltransponder(0);
623        if(clear == 1) delunusedbouquetchannels();
624        delmarkedscreennodes(scan, 1);
625        delownerrc(scan);
626        clearscreen(scan);
627        resetsatscan();
628}
629
630void changescantype(char* scantype, struct skin* scan, struct skin* listbox, struct skin* tuner, struct skin* satellite, struct skin* system, struct skin* frequency, struct skin* inversion, struct skin* symbolrate, struct skin* polarization, struct skin* fec, struct skin* modulation, struct skin* rolloff, struct skin* pilot)
631{
632        struct sat* satnode = sat;
633        struct skin* tmp = NULL;
634        char* tmpstr = NULL, *tmpstr1 = NULL, *tmpnr = NULL;
635        char* feshortname = NULL;
636        int i, orbitalpos = 0;
637
638        if(tuner != NULL) feshortname = tuner->ret;
639
640        tuner->hidden = NO;
641        system->hidden = NO;
642        frequency->hidden = NO;
643        inversion->hidden = NO;
644        symbolrate->hidden = NO;
645        polarization->hidden = NO;
646        fec->hidden = NO;
647        modulation->hidden = NO;
648        rolloff->hidden = NO;
649        pilot->hidden = NO;
650        satellite->hidden = NO;
651        delmarkedscreennodes(scan, 1);
652
653        if(ostrcmp(scantype, "1") == 0 || ostrcmp(scantype, "2") == 0 || ostrcmp(scantype, "3") == 0)
654        {
655                system->hidden = YES;
656                frequency->hidden = YES;
657                inversion->hidden = YES;
658                symbolrate->hidden = YES;
659                polarization->hidden = YES;
660                fec->hidden = YES;
661                modulation->hidden = YES;
662                rolloff->hidden = YES;
663                pilot->hidden = YES;
664        }
665        if(ostrcmp(scantype, "2") == 0 && feshortname != NULL)
666        {
667                satellite->hidden = YES;
668
669                tmpstr = ostrcat(feshortname, "_sat", 0, 0);
670                for(i = 1; i <= status.maxsat; i++)
671                {
672                        tmpnr = oitoa(i);
673                        orbitalpos = getconfigint(tmpstr, tmpnr);
674                        free(tmpnr); tmpnr = NULL;
675
676                        satnode = getsatbyorbitalpos(orbitalpos);
677                        if(satnode != NULL && satnode->fetype == FE_QPSK)
678                        {
679                                tmp = addlistbox(scan, listbox, tmp, 1);
680                                if(tmp != NULL)
681                                {
682                                        tmpstr1 = oitoa(satnode->orbitalpos);
683                                        changename(tmp, tmpstr1);
684                                        free(tmpstr1); tmpstr1 = NULL;
685                                        changetext(tmp, satnode->name);
686                                        tmp->type = CHOICEBOX;
687                                        addchoicebox(tmp, "0", _("no"));
688                                        addchoicebox(tmp, "1", _("yes"));
689                                }
690                        }
691                }
692                free(tmpstr); tmpstr = NULL;
693        }
694        if(ostrcmp(scantype, "3") == 0)
695        {
696                tuner->hidden = YES;
697                satellite->hidden = YES;
698        }
699}
700
701void scanchangesat(struct skin* sat, struct transponder* tpnode, char* feshortname)
702{
703        char* tmpstr = NULL;
704
705        changeinput(sat, NULL);
706        changechoiceboxvalue(sat, NULL);
707        tmpstr = getsatstring(feshortname);
708        changeinput(sat, tmpstr);
709        free(tmpstr); tmpstr = NULL;
710        tmpstr = getorbitalposstring(feshortname);
711        changechoiceboxvalue(sat, tmpstr);
712        free(tmpstr); tmpstr = NULL;
713        if(tpnode != NULL)
714        {
715                tmpstr = oitoa(tpnode->orbitalpos);
716                setchoiceboxselection(sat, tmpstr);
717                free(tmpstr); tmpstr = NULL;
718        }
719}
720
721//flag 0: manual scan
722//flag 1: auto scan
723void screenscanconfig(int flag)
724{
725        int rcret = 0;
726        int iscantype = -1, isat = -1, ifrequency = -1;
727        int iinversion = -1, isymbolrate = -1, ipolarization = -1;
728        int ifec = -1, imodulation = -1, irolloff = -1, ipilot = -1;
729        int isystem = -1, inetworkscan = -1, ionlyfree = -1, iclear = -1;
730        int i = 0, treffer = 0, tunercount = 0;
731        struct skin* scan = getscreen("manualscan");
732        struct skin* listbox = getscreennode(scan, "listbox");
733        struct skin* tuner = getscreennode(scan, "tuner");
734        struct skin* scantype = getscreennode(scan, "scantype");
735        struct skin* sat = getscreennode(scan, "sat");
736        struct skin* system = getscreennode(scan, "system");
737        struct skin* frequency = getscreennode(scan, "frequency");
738        struct skin* inversion = getscreennode(scan, "inversion");
739        struct skin* symbolrate = getscreennode(scan, "symbolrate");
740        struct skin* polarization = getscreennode(scan, "polarization");
741        struct skin* fec = getscreennode(scan, "fec");
742        struct skin* modulation = getscreennode(scan, "modulation");
743        struct skin* rolloff = getscreennode(scan, "rolloff");
744        struct skin* pilot = getscreennode(scan, "pilot");
745        struct skin* networkscan = getscreennode(scan, "networkscan");
746        struct skin* clear = getscreennode(scan, "clear");
747        struct skin* onlyfree = getscreennode(scan, "onlyfree");
748        struct skin* tmp = NULL;
749        char* tmpstr = NULL, *tmpnr = NULL, *feshortname = NULL;
750        struct transponder* tpnode = NULL;
751        struct dvbdev* dvbnode = dvbdev;
752
753        if(status.recording > 0 || status.streaming > 0)
754        {
755                textbox(_("Message"), _("Scan is not allowed if record\nor stream is running !"), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, NULL, 0, 600, 200, 0, 0);
756                return;
757        }
758
759        //del old values
760        changeinput(tuner, NULL);
761        changechoiceboxvalue(tuner, NULL);
762        changeinput(scantype, NULL);
763        changechoiceboxvalue(scantype, NULL);
764        changeinput(sat, NULL);
765        changechoiceboxvalue(sat, NULL);
766        changeinput(system, NULL);
767        changechoiceboxvalue(system, NULL);
768        changeinput(inversion, NULL);
769        changechoiceboxvalue(inversion, NULL);
770        changeinput(polarization, NULL);
771        changechoiceboxvalue(polarization, NULL);
772        changeinput(fec, NULL);
773        changechoiceboxvalue(fec, NULL);
774        changeinput(modulation, NULL);
775        changechoiceboxvalue(modulation, NULL);
776        changeinput(rolloff, NULL);
777        changechoiceboxvalue(rolloff, NULL);
778        changeinput(pilot, NULL);
779        changechoiceboxvalue(pilot, NULL);
780
781        //tuner
782        while(dvbnode != NULL)
783        {
784                if(dvbnode->type == FRONTENDDEV && dvbnode->feinfo != NULL && dvbnode->felock < 1 && dvbnode->feinfo->type == FE_QPSK)
785                {
786                        treffer = 0;
787                        if(dvbnode->feshortname != NULL)
788                        {
789                                tmpstr = ostrcat(dvbnode->feshortname, "_sat", 0, 0);
790                                for(i = 1; i <= status.maxsat; i++)
791                                {
792                                        tmpnr = oitoa(i);
793                                        if(getconfigint(tmpstr, tmpnr) != 0)
794                                        {
795                                                treffer = 1;
796                                                break;
797                                        }
798                                        free(tmpnr); tmpnr = NULL;
799                                }
800                                free(tmpnr); tmpnr = NULL;
801                                free(tmpstr); tmpstr = NULL;
802                        }
803
804                        if(treffer == 0)
805                        {
806                                dvbnode = dvbnode->next;
807                                continue;
808                        }
809
810                        tunercount++;
811                        if(feshortname == NULL) feshortname = dvbnode->feshortname;
812
813                        tmpstr = ostrcat(tmpstr, dvbnode->feinfo->name, 1, 0);
814                        tmpstr = ostrcat(tmpstr, " (", 1, 0);
815                        tmpstr = ostrcat(tmpstr, oitoa(dvbnode->adapter), 1, 1);
816                        tmpstr = ostrcat(tmpstr, "/", 1, 0);
817                        tmpstr = ostrcat(tmpstr, oitoa(dvbnode->devnr), 1, 1);
818                        tmpstr = ostrcat(tmpstr, ")", 1, 0);
819                        addchoicebox(tuner, dvbnode->feshortname, tmpstr);
820                        free(tmpstr); tmpstr = NULL;
821                }
822                dvbnode = dvbnode->next;
823        }
824
825        if(tunercount < 1)
826        {
827                textbox(_("Message"), _("No Tuner configured"), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, NULL, 0, 600, 200, 0, 0);
828                return;
829        }
830
831        rcret = servicestop(status.aktservice, 1, 1);
832        if(rcret == 1) return;
833
834        if(status.aktservice->channel != NULL)
835                tpnode = status.aktservice->channel->transponder;
836
837
838        if(flag == 0)
839        {
840                addchoicebox(scantype, "0", _("Single Transponder"));
841                addchoicebox(scantype, "1", _("Single Sat"));
842                addchoicebox(scantype, "2", _("Multi Sat"));
843                setchoiceboxselection(scantype, "0");
844        }
845        else
846        {
847                addchoicebox(scantype, "3", _("Auto Scan"));
848                setchoiceboxselection(scantype, "3");
849        }
850
851        changescantype(scantype->ret, scan, listbox, tuner, sat, system, frequency, inversion, symbolrate, polarization, fec, modulation, rolloff, pilot);
852
853        //sat
854        scanchangesat(sat, tpnode, feshortname);
855
856        //system
857        tmpstr = transpondergetsystemstr(tpnode, 1);
858        changeinput(system, tmpstr);
859        free(tmpstr); tmpstr = NULL;
860        tmpstr = transpondergetsystemstr(tpnode, 2);
861        changechoiceboxvalue(system, tmpstr);
862        free(tmpstr); tmpstr = NULL;
863        if(tpnode != NULL)
864        {
865                tmpstr = oitoa(tpnode->system);
866                setchoiceboxselection(system, tmpstr);
867                free(tmpstr); tmpstr = NULL;
868        }
869
870        //frequency
871        if(tpnode != NULL)
872                tmpstr = oitoa(tpnode->frequency / 1000);
873        else
874                tmpstr = ostrcat(tmpstr, "00000", 1, 0);
875        changemask(frequency, "00000");
876        changeinput(frequency, tmpstr);
877        free(tmpstr); tmpstr = NULL;
878
879        //inversion
880        tmpstr = transpondergetinversionstr(tpnode, 1);
881        changeinput(inversion, tmpstr);
882        free(tmpstr); tmpstr = NULL;
883        tmpstr = transpondergetinversionstr(tpnode, 2);
884        changechoiceboxvalue(inversion, tmpstr);
885        free(tmpstr); tmpstr = NULL;
886        if(tpnode != NULL)
887        {
888                tmpstr = oitoa(tpnode->inversion);
889                setchoiceboxselection(inversion, tmpstr);
890                free(tmpstr); tmpstr = NULL;
891        }
892
893        //symbolrate
894        if(tpnode != NULL)
895                tmpstr = oitoa(tpnode->symbolrate / 1000);
896        else
897                tmpstr = ostrcat(tmpstr, "00000", 1, 0);
898        changemask(symbolrate, "00000");
899        changeinput(symbolrate, tmpstr);
900        free(tmpstr); tmpstr = NULL;
901
902        //polarization
903        tmpstr = transpondergetpolarizationstr(tpnode, 1);
904        changeinput(polarization, tmpstr);
905        free(tmpstr); tmpstr = NULL;
906        tmpstr = transpondergetpolarizationstr(tpnode, 2);
907        changechoiceboxvalue(polarization, tmpstr);
908        free(tmpstr); tmpstr = NULL;
909        if(tpnode != NULL)
910        {
911                tmpstr = oitoa(tpnode->polarization);
912                setchoiceboxselection(polarization, tmpstr);
913                free(tmpstr); tmpstr = NULL;
914        }
915
916        //fec
917        tmpstr = transpondergetfecstr(tpnode, 1);
918        changeinput(fec, tmpstr);
919        free(tmpstr); tmpstr = NULL;
920        tmpstr = transpondergetfecstr(tpnode, 2);
921        changechoiceboxvalue(fec, tmpstr);
922        free(tmpstr); tmpstr = NULL;
923        if(tpnode != NULL)
924        {
925                tmpstr = oitoa(tpnode->fec);
926                setchoiceboxselection(fec, tmpstr);
927                free(tmpstr); tmpstr = NULL;
928        }
929
930        //modulation
931        tmpstr = transpondergetmodulationstr(tpnode, 1);
932        changeinput(modulation, tmpstr);
933        free(tmpstr); tmpstr = NULL;
934        tmpstr = transpondergetmodulationstr(tpnode, 2);
935        changechoiceboxvalue(modulation, tmpstr);
936        free(tmpstr); tmpstr = NULL;
937        if(tpnode != NULL)
938        {
939                tmpstr = oitoa(tpnode->modulation);
940                setchoiceboxselection(modulation, tmpstr);
941                free(tmpstr); tmpstr = NULL;
942        }
943
944        //rolloff
945        tmpstr = transpondergetrolloffstr(tpnode, 1);
946        changeinput(rolloff, tmpstr);
947        free(tmpstr); tmpstr = NULL;
948        tmpstr = transpondergetrolloffstr(tpnode, 2);
949        changechoiceboxvalue(rolloff, tmpstr);
950        free(tmpstr); tmpstr = NULL;
951        if(tpnode != NULL)
952        {
953                tmpstr = oitoa(tpnode->rolloff);
954                setchoiceboxselection(rolloff, tmpstr);
955                free(tmpstr); tmpstr = NULL;
956        }
957
958        //pilot
959        tmpstr = transpondergetpilotstr(tpnode, 1);
960        changeinput(pilot, tmpstr);
961        free(tmpstr); tmpstr = NULL;
962        tmpstr = transpondergetpilotstr(tpnode, 2);
963        changechoiceboxvalue(pilot, tmpstr);
964        free(tmpstr); tmpstr = NULL;
965        if(tpnode != NULL)
966        {
967                tmpstr = oitoa(tpnode->pilot);
968                setchoiceboxselection(pilot, tmpstr);
969                free(tmpstr); tmpstr = NULL;
970        }
971
972        //networkscan
973        addchoicebox(networkscan, "0", _("no"));
974        addchoicebox(networkscan, "1", _("yes"));
975
976        //clear
977        addchoicebox(clear, "0", _("no"));
978        addchoicebox(clear, "1", _("yes"));
979
980        //only free
981        addchoicebox(onlyfree, "0", _("no"));
982        addchoicebox(onlyfree, "1", _("yes"));
983
984        drawscreen(scan, 0);
985        addscreenrc(scan, listbox);
986
987        tmp = listbox->select;
988        while(1)
989        {
990                addscreenrc(scan, tmp);
991                rcret = waitrc(scan, 0, 0);
992                tmp = listbox->select;
993
994                if(scantype->ret != NULL) iscantype = atoi(scantype->ret);
995                if(sat->ret != NULL) isat = atoi(sat->ret);
996                if(system->ret != NULL) isystem = atoi(system->ret);
997                if(frequency->ret != NULL) ifrequency = atoi(frequency->ret) * 1000;
998                if(inversion->ret != NULL) iinversion = atoi(inversion->ret);
999                if(symbolrate->ret != NULL) isymbolrate = atoi(symbolrate->ret) * 1000;
1000                if(polarization->ret != NULL) ipolarization = atoi(polarization->ret);
1001                if(fec->ret != NULL) ifec = atoi(fec->ret);
1002                if(modulation->ret != NULL) imodulation = atoi(modulation->ret);
1003                if(rolloff->ret != NULL) irolloff = atoi(rolloff->ret);
1004                if(pilot->ret != NULL) ipilot = atoi(pilot->ret);
1005                if(networkscan->ret != NULL) inetworkscan = atoi(networkscan->ret);
1006                if(onlyfree->ret != NULL) ionlyfree = atoi(onlyfree->ret);
1007                if(clear->ret != NULL) iclear = atoi(clear->ret);
1008
1009                if(rcret == getrcconfigint("rcexit", NULL)) break;
1010                if(listbox->select != NULL && ostrcmp(listbox->select->name, "tuner") == 0)
1011                {
1012                        scanchangesat(sat, tpnode, listbox->select->ret);
1013                        changescantype(scantype->ret, scan, listbox, tuner, sat, system, frequency, inversion, symbolrate, polarization, fec, modulation, rolloff, pilot);
1014                        drawscreen(scan, 0);
1015                }
1016                if(listbox->select != NULL && ostrcmp(listbox->select->name, "scantype") == 0)
1017                {
1018                        changescantype(scantype->ret, scan, listbox, tuner, sat, system, frequency, inversion, symbolrate, polarization, fec, modulation, rolloff, pilot);
1019                        drawscreen(scan, 0);
1020
1021                }
1022                if(rcret == getrcconfigint("rcok", NULL))
1023                {
1024                        clearscreen(scan);
1025                        screenscan(scan->child, tuner->ret, iscantype, isat, ifrequency, iinversion, isymbolrate, ipolarization, ifec, imodulation, irolloff, ipilot, inetworkscan, ionlyfree, iclear, isystem, 5000000);
1026                        drawscreen(scan, 0);
1027                }
1028                if(rcret == getrcconfigint("rcred", NULL) && tpnode != NULL && iscantype == 0)
1029                {
1030                        struct transponder* tp1 = createtransponder(0, tpnode->fetype, isat, ifrequency, iinversion, isymbolrate, ipolarization, ifec, imodulation, irolloff, ipilot, isystem);
1031                        copytransponder(tp1, tpnode, 0);
1032                        deltransponder(0);
1033                        textbox(_("Message"), _("Transponder changed"), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, NULL, 0, 600, 200, 5, 0);
1034                        drawscreen(scan, 0);
1035                }
1036        }
1037
1038        delmarkedscreennodes(scan, 1);
1039        delownerrc(scan);
1040        clearscreen(scan);
1041        resetsatscan();
1042        tmpstr = ostrcat(status.lastservice->channellist, NULL, 0, 0);
1043        servicecheckret(servicestart(status.lastservice->channel, tmpstr, NULL, 0), 0);
1044        free(tmpstr); tmpstr = NULL;
1045}
1046
1047#endif
Note: See TracBrowser for help on using the repository browser.