source: titan/titan/epgscan.h @ 38545

Last change on this file since 38545 was 38545, checked in by Stephan, 8 years ago

shorter epgscan log text

File size: 11.8 KB
Line 
1#ifndef EPGSCAN_H
2#define EPGSCAN_H
3
4void epgscandeltimer()
5{
6        struct rectimer *recnode = rectimer, *prev = rectimer;
7
8        while(recnode != NULL)
9        {
10                prev = recnode;
11                recnode = recnode->next;
12
13                if(prev->status == 4 || prev->status == 5)
14                        delrectimer(prev, 0, 0);
15        }
16
17        writerectimer(getconfig("rectimerfile", NULL), 0);
18}
19
20void epgscancreatetimer()
21{
22        int daylight = 0;
23        struct tm* loctime = NULL;
24        time_t akttime = time(NULL), starttime = 0;
25        char* buf = NULL;
26        struct rectimer *recnode = rectimer, *prev = rectimer;
27
28        if(ostrcmp(getconfig("epg_refreshtime", NULL), "0") == 0)
29                return;
30
31        buf = malloc(12);
32        if(buf == NULL)
33        {
34                err("no memory");
35                return;
36        }
37
38        loctime = olocaltime(&akttime);
39        if(loctime == NULL)
40        {
41                free(buf);
42                return;
43        }
44
45        daylight = loctime->tm_isdst;
46        loctime->tm_sec = 0;
47
48        strftime(buf, MINMALLOC, "%d-%m-%Y ", loctime);
49        buf = ostrcat(buf, getconfig("epg_refreshtime", NULL), 1, 0);
50
51        loctime->tm_isdst = daylight;
52        if(strptime(buf, "%d-%m-%Y %H:%M", loctime) != NULL)
53                starttime = mktime(loctime);
54
55        free(loctime); loctime = NULL;
56        free(buf); buf = NULL;
57        if(starttime < akttime) starttime += 86400;
58
59        if(starttime > akttime)
60        {
61                //check if timer exists
62                while(recnode != NULL)
63                {
64                        prev = recnode;
65                        recnode = recnode->next;
66
67                        if(prev->status == 4 || prev->status == 5)
68                                delrectimer(prev, 0, 0);
69                }
70
71                //add akt epg scan timer
72                buf = ostrcat(buf, "<epgscan begin=", 1, 0);
73                buf = ostrcat(buf, olutoa(starttime - 300), 1, 1);
74                buf = ostrcat(buf, " end=", 1, 0);
75                buf = ostrcat(buf, olutoa(starttime - 300 + 180), 1, 1);
76                buf = ostrcat(buf, " afterevent=", 1, 0);
77                buf = ostrcat(buf, oitoa(getconfigint("epg_afterevent", NULL)), 1, 1);
78                buf = ostrcat(buf, " status=4 timestamp=", 1, 0);
79                buf = ostrcat(buf, gettimestamp(), 1, 1);
80                buf = ostrcat(buf, "></epgscan>", 1, 0);
81                addrectimer(buf);
82                free(buf); buf = NULL;
83
84                //add next epg scan timer
85                buf = ostrcat(buf, "<epgscan begin=", 1, 0);
86                buf = ostrcat(buf, olutoa((starttime + 86400) - 300), 1, 1);
87                buf = ostrcat(buf, " end=", 1, 0);
88                buf = ostrcat(buf, olutoa((starttime + 86400) - 300 + 180), 1, 1);
89                buf = ostrcat(buf, " afterevent=", 1, 0);
90                buf = ostrcat(buf, oitoa(getconfigint("epg_afterevent", NULL)), 1, 1);
91                buf = ostrcat(buf, " status=4 timestamp=", 1, 0);
92                buf = ostrcat(buf, gettimestamp(), 1, 1);
93                buf = ostrcat(buf, "></epgscan>", 1, 0);
94                addrectimer(buf);
95                free(buf); buf = NULL;
96
97                writerectimer(getconfig("rectimerfile", NULL), 0);
98        }
99}
100
101void epgscanlistclearscantime()
102{
103        struct epgscanlist *node = epgscanlist;
104
105        while(node != NULL)
106        {
107                node->scantime = 0;
108                node = node->next;
109        }
110}
111
112struct epgscanlist* getepgscanlistbytransponder(uint64_t transponderid)
113{
114        struct epgscanlist *node = epgscanlist;
115
116        while(node != NULL)
117        {
118                if(node->transponderid == transponderid)
119                        return node;
120
121                node = node->next;
122        }
123        debug(100, "epgscanlist not found (transponderid=%llu)", transponderid);
124        return NULL;
125}
126
127void epgscanlistthread(struct stimerthread* self)
128{
129        int epgdelete = 0, startmode = 0;
130        struct epgscanlist* node = epgscanlist, *tmpepgscannode = NULL;
131        struct dvbdev* fenode = NULL;
132        struct channel* chnode = NULL;
133        char* tmpstr = NULL, *chname = NULL;
134        FILE* fd = NULL;
135
136        debug(400, "epgscan thread start, wait for right time");
137
138        //fd = fopen(EPGSCANLOG, "w");
139        //if(fd == NULL)
140        //{
141        //      perr("can't open %s", EPGSCANLOG);
142        //}
143        //else
144        //      fprintf(fd, "epgscan thread start, wait for right time\n");
145
146        if(status.standby != 0) startmode = 1;
147
148        if(status.standby == 0)
149        {
150                if(status.epglistmode == 0 || status.epglistmode == 2)
151                {
152                        if(fd != NULL) fprintf(fd, "epgscan not configured to scan idle tuner\n");
153                        goto end;
154                }
155        }
156        else if(getconfig("epg_refreshtime", NULL) == NULL)
157        {
158                if(fd != NULL) fprintf(fd, "epgscan not configured to scan in standby\n");
159                goto end;
160        }
161
162        fd = fopen(EPGSCANLOG, "w");
163        if(fd == NULL)
164        {
165                perr("can't open %s", EPGSCANLOG);
166        }
167        else
168                fprintf(fd, "epgscan thread start, wait for right time\n");
169
170        //wait for right time
171        while(self->aktion != STOP && time(NULL) < 1072224000) // 01.01.2004
172                usleep(1 * 1000000);
173
174        debug(400, "epgscan time ok");
175        if(fd != NULL)
176        {
177                tmpstr = ostrcat("epgscan time ok ", gettime(NULL, "%d-%m-%Y %H:%M"), 0, 1);
178                if(tmpstr != NULL) fprintf(fd, "%s\n", tmpstr);
179                free(tmpstr); tmpstr = NULL;
180        }
181
182        if(getconfigint("delepgbeforescan", NULL) == 1)
183        {
184                debug(400, "del epg before scan");
185                if(fd != NULL) fprintf(fd, "del epg before scan\n");
186                resetepg(1);
187                epgdelete = 1;
188        }
189
190        while(node != NULL && self->aktion != STOP)
191        {
192
193                //wait for end recording
194                while(self->aktion != STOP && (status.recording > 0 || status.timeshift > 0))
195                        usleep(1 * 1000000);
196                if(self->aktion == STOP) break;
197
198                chnode = getchannel(node->serviceid, node->transponderid);
199                if(chnode == NULL)
200                {
201                        debug(400, "epgscan channel not found sid=%d, tid=%llu", node->serviceid, node->transponderid);
202                        if(fd != NULL) fprintf(fd, "channel not found sid=%d, tid=%llu\n", node->serviceid, node->transponderid);
203                        node = node->next;
204                        continue;
205                }
206
207                if(chnode->name != NULL)
208                        chname = chnode->name;
209                else
210                        chname = "unknown";
211
212                if(epgdelete == 0 && chnode == status.aktservice->channel)
213                {
214                        debug(400, "epgscan channel same as aktchannel channel=%s sid=%d, tid=%llu", chname, node->serviceid, node->transponderid);
215                        if(fd != NULL) fprintf(fd, "channel same as activ channel channel=%s sid=%d, tid=%llu\n", chname, node->serviceid, node->transponderid);
216                        node = node->next;
217                        continue;
218                }
219
220                tmpepgscannode = getepgscanlistbytransponder(node->transponderid);
221                if(tmpepgscannode != NULL && tmpepgscannode->scantime != 0)
222                {
223                        debug(400, "epgscan transponer already scanned channel=%s tid=%llu", chname, node->transponderid);
224                        if(fd != NULL) fprintf(fd, "transponder already scanned channel=%s tid=%llu\n", chname, node->transponderid);
225                        node = node->next;
226                        continue;
227                }
228
229                if(status.standby > 0)
230                        fenode = fegetfree(chnode->transponder, 0, NULL);
231                else
232                        fenode = fegetfree(chnode->transponder, 2, NULL);
233                if(fenode == NULL || (status.standby == 0 && fenode == status.aktservice->fedev))
234                {
235                        debug(400, "epgscan no free frontend found channel=%s", chname);
236                        if(fd != NULL) fprintf(fd, "no free frontend found channel=%s\n", chname);
237                        node = node->next;
238                        continue;
239                }
240
241                if(fenode->felock == 0)
242                {
243                        //frontend tune
244                        if(fenode->feinfo->type == FE_QPSK)
245                        {
246                                feset(fenode, chnode->transponder);
247                                fetunedvbs(fenode, chnode->transponder);
248                        }
249                        else if(fenode->feinfo->type == FE_QAM)
250                                fetunedvbc(fenode, chnode->transponder);
251                        else if(fenode->feinfo->type == FE_OFDM)
252                                fetunedvbt(fenode, chnode->transponder);
253                        else
254                        {
255                                debug(400, "epgscan unknown frontend channel=%s", chname);
256                                if(fd != NULL) fprintf(fd, "unknown frontend channel=%s\n", chname);
257                                node = node->next;
258                                continue;
259                        }
260
261                        int festatus = fewait(fenode);
262                        if(festatus != 0)
263                        {
264                                debug(400, "epgscan frontend tune failed channel=%s", chname);
265                                if(fd != NULL) fprintf(fd, "frontend tune failed channel=%s\n", chname);
266                                node = node->next;
267                                continue;
268                        }
269
270                        debug(400, "epgscan scanning channel=%s, sid=%d, tid=%llu, frontend=%s", chname, chnode->serviceid, chnode->transponderid, fenode->feshortname);
271                        if(fd != NULL) fprintf(fd, "scanning channel=%s, sid=%d, tid=%llu, frontend=%s\n", chname, chnode->serviceid, chnode->transponderid, fenode->feshortname);
272
273                        if(chnode->transponder != NULL) chnode->transponder->lastepg = 0;
274                        readeit(self, chnode, fenode, 1);
275                        if(getconfigint("mhwepg", NULL) != 0)
276                                readmhw(self, chnode, fenode, 1);
277                        if(getconfigint("mhw2epg", NULL) != 0)
278                                readmhw2(self, chnode, fenode, 1);
279                        if(getconfigint("opentv", NULL) != 0)
280                                readopentv(self, chnode, fenode, 0);
281                        node->scantime = time(NULL);
282                }
283                else
284                {
285                        debug(400, "epgscan frontend locked channel=%s frontend=%s", chname, fenode->feshortname);
286                        if(fd != NULL) fprintf(fd, "frontend locked channel=%s frontend=%s\n", chname, fenode->feshortname);
287                }
288
289                node = node->next;
290        }
291
292        //write only epg
293        writeallconfig(2);
294
295end:
296        epgscanlistclearscantime();
297
298        if(fd != NULL)
299        {
300                fprintf(fd, "epgscan thread end\n");
301                fclose(fd);
302        }
303
304        if(status.standby != 0 && startmode == 1 && getconfig("epg_refreshtime", NULL) != NULL)
305        {
306                int afterevent = getconfigint("epg_afterevent", NULL);
307
308                if(afterevent == 1)
309                {
310                        if(status.recording < 1)
311                                oshutdown(1, 3);
312                }
313        }
314
315        status.epgscanlistthread = NULL;
316        debug(400, "epgscan thread end");
317}
318
319struct epgscanlist* addepgscanlist(char *line, int count, struct epgscanlist* last)
320{
321        //debug(1000, "in");
322        struct epgscanlist *newnode = NULL, *prev = NULL, *node = epgscanlist;
323        int ret = 0;
324
325        newnode = (struct epgscanlist*)calloc(1, sizeof(struct epgscanlist));
326        if(newnode == NULL)
327        {
328                err("no memory");
329                return NULL;
330        }
331
332        status.writeepgscanlist = 1;
333
334        ret = sscanf(line, "%d#%llu", &newnode->serviceid, &newnode->transponderid);
335        if(ret != 2)
336        {
337                if(count > 0)
338                {
339                        err("epgscanlist line %d not ok", count);
340                }
341                else
342                {
343                        err("add epgscanlist");
344                }
345                free(newnode);
346                return NULL;
347        }
348
349        if(getchannel(newnode->serviceid, newnode->transponderid) == NULL)
350        {
351                err("epgscanlist line %d not ok (channel not found)", count);
352                free(newnode);
353                return NULL;
354        }
355
356        if(last == NULL)
357        {
358                while(node != NULL)
359                {
360                        prev = node;
361                        node = node->next;
362                }
363        }
364        else
365        {
366                prev = last;
367                node = last->next;
368        }
369
370        if(prev == NULL)
371                epgscanlist = newnode;
372        else
373        {
374                prev->next = newnode;
375                newnode->prev = prev;
376        }
377        newnode->next = node;
378        if(node != NULL) node->prev = newnode;
379
380        //debug(1000, "out");
381        return newnode;
382}
383
384int readepgscanlist(const char* filename)
385{
386        FILE *fd = NULL;
387        char *fileline = NULL;
388        int linecount = 0, len = 0;
389        struct epgscanlist* last = NULL, *tmplast = NULL;
390
391        fileline = malloc(MINMALLOC);
392        if(fileline == NULL)
393        {
394                err("no memory");
395                return 1;
396        }
397
398        fd = fopen(filename, "r");
399        if(fd == NULL)
400        {
401                perr("can't open %s", filename);
402                free(fileline);
403                return 1;
404        }
405
406        while(fgets(fileline, MINMALLOC, fd) != NULL)
407        {
408                if(fileline[0] == '#' || fileline[0] == '\n')
409                        continue;
410                len = strlen(fileline) - 1;
411                if(len >= 0 && fileline[len] == '\n')
412                        fileline[len] = '\0';
413                len--;
414                if(len >= 0 && fileline[len] == '\r')
415                        fileline[len] = '\0';
416
417                linecount++;
418
419                if(last == NULL) last = tmplast;
420                last = addepgscanlist(fileline, linecount, last);
421                if(last != NULL) tmplast = last;
422        }
423
424        status.writeepgscanlist = 0;
425        free(fileline);
426        fclose(fd);
427        return 0;
428}
429
430int delepgscanlist(int serviceid, uint64_t transponderid)
431{
432        int ret = 1;
433        struct epgscanlist *node = epgscanlist, *prev = epgscanlist;
434
435        while(node != NULL)
436        {
437                if(node->serviceid == serviceid && node->transponderid == transponderid)
438                {
439                        status.writeepgscanlist = 1;
440                        if(node == epgscanlist)
441                        {
442                                epgscanlist = node->next;
443                                if(epgscanlist != NULL)
444                                        epgscanlist->prev = NULL;
445                        }
446                        else
447                        {
448                                prev->next = node->next;
449                                if(node->next != NULL)
450                                        node->next->prev = prev;
451                        }
452
453                        free(node);
454                        node = NULL;
455                        ret = 0;
456                        break;
457                }
458
459                prev = node;
460                node = node->next;
461        }
462        return ret;
463}
464
465struct epgscanlist* getepgscanlist(int serviceid, uint64_t transponderid)
466{
467        struct epgscanlist *node = epgscanlist;
468
469        while(node != NULL)
470        {
471                if(node->serviceid == serviceid && node->transponderid == transponderid)
472                        return node;
473
474                node = node->next;
475        }
476        debug(100, "epgscanlist not found (serviceid=%d, transponderid=%llu)", serviceid, transponderid);
477        return NULL;
478}
479
480void freeepgscanlist()
481{
482        struct epgscanlist *node = epgscanlist, *prev = epgscanlist;
483
484        while(node != NULL)
485        {
486                prev = node;
487                node = node->next;
488                if(prev != NULL)
489                        delepgscanlist(prev->serviceid, prev->transponderid);
490        }
491}
492
493int writeepgscanlist(const char *filename)
494{
495        FILE *fd = NULL;
496        struct epgscanlist *node = epgscanlist;
497        int ret = 0;
498
499        fd = fopen(filename, "w");
500        if(fd == NULL)
501        {
502                perr("can't open %s", filename);
503                return 1;
504        }
505
506        while(node != NULL)
507        {
508                ret = fprintf(fd, "%d#%llu\n", node->serviceid, node->transponderid);
509                if(ret < 0)
510                {
511                        perr("writing file %s", filename);
512                }
513                node = node->next;
514        }
515
516        fclose(fd);
517        return 0;
518}
519
520#endif
Note: See TracBrowser for help on using the repository browser.