source: titan/titan/epgscan.h @ 23799

Last change on this file since 23799 was 23799, checked in by nit, 11 years ago

[titan] cleanup

File size: 11.6 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        //wait for right time
163        while(self->aktion != STOP && time(NULL) < 1072224000) // 01.01.2004
164                usleep(1 * 1000000);
165
166        debug(400, "epgscan time ok");
167        if(fd != NULL)
168        {
169                tmpstr = ostrcat("epgscan time ok ", gettime(NULL, "%d-%m-%Y %H:%M"), 0, 1);
170                if(tmpstr != NULL) fprintf(fd, "%s\n", tmpstr);
171                free(tmpstr); tmpstr = NULL;
172        }
173
174        if(getconfigint("delepgbeforescan", NULL) == 1)
175        {
176                debug(400, "del epg before scan");
177                if(fd != NULL) fprintf(fd, "del epg before scan\n");
178                resetepg(1);
179                epgdelete = 1;
180        }
181
182        while(node != NULL && self->aktion != STOP)
183        {
184                chnode = getchannel(node->serviceid, node->transponderid);
185                if(chnode == NULL)
186                {
187                        debug(400, "epgscan channel not found sid=%d, tid=%llu", node->serviceid, node->transponderid);
188                        if(fd != NULL) fprintf(fd, "epgscan channel not found sid=%d, tid=%llu\n", node->serviceid, node->transponderid);
189                        node = node->next;
190                        continue;
191                }
192
193                if(chnode->name != NULL)
194                        chname = chnode->name;
195                else
196                        chname = "unknown";
197
198                if(epgdelete == 0 && chnode == status.aktservice->channel)
199                {
200                        debug(400, "epgscan channel same as aktchannel channel=%s sid=%d, tid=%llu", chname, node->serviceid, node->transponderid);
201                        if(fd != NULL) fprintf(fd, "epgscan channel same as aktchannel channel=%s sid=%d, tid=%llu\n", chname, node->serviceid, node->transponderid);
202                        node = node->next;
203                        continue;
204                }
205
206                tmpepgscannode = getepgscanlistbytransponder(node->transponderid);
207                if(tmpepgscannode != NULL && tmpepgscannode->scantime != 0)
208                {
209                        debug(400, "epgscan transponer already scanned channel=%s tid=%llu", chname, node->transponderid);
210                        if(fd != NULL) fprintf(fd, "epgscan transponer already scanned channel=%s tid=%llu\n", chname, node->transponderid);
211                        node = node->next;
212                        continue;
213                }
214
215                if(status.standby > 0)
216                        fenode = fegetfree(chnode->transponder, 0, NULL);
217                else
218                        fenode = fegetfree(chnode->transponder, 2, NULL);
219                if(fenode == NULL || (status.standby == 0 && fenode == status.aktservice->fedev))
220                {
221                        debug(400, "epgscan no free frontend found channel=%s", chname);
222                        if(fd != NULL) fprintf(fd, "epgscan no free frontend found channel=%s\n", chname);
223                        node = node->next;
224                        continue;
225                }
226
227                if(fenode->felock == 0)
228                {
229                        //frontend tune
230                        if(fenode->feinfo->type == FE_QPSK)
231                        {
232                                feset(fenode, chnode->transponder);
233                                fetunedvbs(fenode, chnode->transponder);
234                        }
235                        else if(fenode->feinfo->type == FE_QAM)
236                                fetunedvbc(fenode, chnode->transponder);
237                        else if(fenode->feinfo->type == FE_OFDM)
238                                fetunedvbt(fenode, chnode->transponder);
239                        else
240                        {
241                                debug(400, "epgscan unknown frontend channel=%s", chname);
242                                if(fd != NULL) fprintf(fd, "epgscan unknown frontend channel=%s\n", chname);
243                                node = node->next;
244                                continue;
245                        }
246
247                        int festatus = fewait(fenode);
248                        if(festatus != 0)
249                        {
250                                debug(400, "epgscan frontend tune failed channel=%s", chname);
251                                if(fd != NULL) fprintf(fd, "epgscan frontend tune failed channel=%s\n", chname);
252                                node = node->next;
253                                continue;
254                        }
255
256                        debug(400, "epgscan scanning channel=%s, sid=%d, tid=%llu, frontend=%s", chname, chnode->serviceid, chnode->transponderid, fenode->feshortname);
257                        if(fd != NULL) fprintf(fd, "epgscan scanning channel=%s, sid=%d, tid=%llu, frontend=%s\n", chname, chnode->serviceid, chnode->transponderid, fenode->feshortname);
258
259                        if(chnode->transponder != NULL) chnode->transponder->lastepg = 0;
260                        readeit(self, chnode, fenode, 1);
261                        if(getconfigint("mhwepg", NULL) != 0)
262                                readmhw(self, chnode, fenode, 1);
263                        if(getconfigint("mhw2epg", NULL) != 0)
264                                readmhw2(self, chnode, fenode, 1);
265                        if(getconfigint("opentv", NULL) != 0)
266                                readopentv(self, chnode, fenode, 0);
267                        node->scantime = time(NULL);
268                }
269                else
270                {
271                        debug(400, "epgscan frontend locked channel=%s frontend=%s", chname, fenode->feshortname);
272                        if(fd != NULL) fprintf(fd, "epgscan frontend locked channel=%s frontend=%s\n", chname, fenode->feshortname);
273                }
274
275                node = node->next;
276        }
277       
278        //write only epg
279        writeallconfig(2);
280
281end:
282        epgscanlistclearscantime();
283       
284        if(fd != NULL)
285        {
286                fprintf(fd, "epgscan thread end\n");
287                fclose(fd);
288        }
289
290        if(status.standby != 0 && startmode == 1 && getconfig("epg_refreshtime", NULL) != NULL)
291        {
292                int afterevent = getconfigint("epg_afterevent", NULL);
293
294                if(afterevent == 1)
295                {
296                        if(status.recording < 1)
297                                oshutdown(1, 3);
298                }
299        }
300
301        status.epgscanlistthread = NULL;
302        debug(400, "epgscan thread end");
303}
304
305struct epgscanlist* addepgscanlist(char *line, int count, struct epgscanlist* last)
306{
307        //debug(1000, "in");
308        struct epgscanlist *newnode = NULL, *prev = NULL, *node = epgscanlist;
309        int ret = 0;
310
311        newnode = (struct epgscanlist*)calloc(1, sizeof(struct epgscanlist));
312        if(newnode == NULL)
313        {
314                err("no memory");
315                return NULL;
316        }
317
318        status.writeepgscanlist = 1;
319
320        ret = sscanf(line, "%d#%llu", &newnode->serviceid, &newnode->transponderid);
321        if(ret != 2)
322        {
323                if(count > 0)
324                {
325                        err("epgscanlist line %d not ok", count);
326                }
327                else
328                {
329                        err("add epgscanlist");
330                }
331                free(newnode);
332                return NULL;
333        }
334
335        if(getchannel(newnode->serviceid, newnode->transponderid) == NULL)
336        {
337                err("epgscanlist line %d not ok (channel not found)", count);
338                free(newnode);
339                return NULL;
340        }
341
342        if(last == NULL)
343        {
344                while(node != NULL)
345                {
346                        prev = node;
347                        node = node->next;
348                }
349        }
350        else
351        {
352                prev = last;
353                node = last->next;
354        }
355
356        if(prev == NULL)
357                epgscanlist = newnode;
358        else
359        {
360                prev->next = newnode;
361                newnode->prev = prev;
362        }
363        newnode->next = node;
364        if(node != NULL) node->prev = newnode;
365
366        //debug(1000, "out");
367        return newnode;
368}
369
370int readepgscanlist(const char* filename)
371{
372        FILE *fd = NULL;
373        char *fileline = NULL;
374        int linecount = 0, len = 0;
375        struct epgscanlist* last = NULL, *tmplast = NULL;
376
377        fileline = malloc(MINMALLOC);
378        if(fileline == NULL)
379        {
380                err("no memory");
381                return 1;
382        }
383
384        fd = fopen(filename, "r");
385        if(fd == NULL)
386        {
387                perr("can't open %s", filename);
388                free(fileline);
389                return 1;
390        }
391
392        while(fgets(fileline, MINMALLOC, fd) != NULL)
393        {
394                if(fileline[0] == '#' || fileline[0] == '\n')
395                        continue;
396                len = strlen(fileline) - 1;
397                if(len >= 0 && fileline[len] == '\n')
398                        fileline[len] = '\0';
399                len--;
400                if(len >= 0 && fileline[len] == '\r')
401                        fileline[len] = '\0';
402
403                linecount++;
404
405                if(last == NULL) last = tmplast;
406                last = addepgscanlist(fileline, linecount, last);
407                if(last != NULL) tmplast = last;
408        }
409
410        status.writeepgscanlist = 0;
411        free(fileline);
412        fclose(fd);
413        return 0;
414}
415
416int delepgscanlist(int serviceid, uint64_t transponderid)
417{
418        int ret = 1;
419        struct epgscanlist *node = epgscanlist, *prev = epgscanlist;
420
421        while(node != NULL)
422        {
423                if(node->serviceid == serviceid && node->transponderid == transponderid)
424                {
425                        status.writeepgscanlist = 1;
426                        if(node == epgscanlist)
427                        {
428                                epgscanlist = node->next;
429                                if(epgscanlist != NULL)
430                                        epgscanlist->prev = NULL;
431                        }
432                        else
433                        {
434                                prev->next = node->next;
435                                if(node->next != NULL)
436                                        node->next->prev = prev;
437                        }
438
439                        free(node);
440                        node = NULL;
441                        ret = 0;
442                        break;
443                }
444
445                prev = node;
446                node = node->next;
447        }
448        return ret;
449}
450
451struct epgscanlist* getepgscanlist(int serviceid, uint64_t transponderid)
452{
453        struct epgscanlist *node = epgscanlist;
454
455        while(node != NULL)
456        {
457                if(node->serviceid == serviceid && node->transponderid == transponderid)
458                        return node;
459
460                node = node->next;
461        }
462        debug(100, "epgscanlist not found (serviceid=%d, transponderid=%llu)", serviceid, transponderid);
463        return NULL;
464}
465
466void freeepgscanlist()
467{
468        struct epgscanlist *node = epgscanlist, *prev = epgscanlist;
469
470        while(node != NULL)
471        {
472                prev = node;
473                node = node->next;
474                if(prev != NULL)
475                        delepgscanlist(prev->serviceid, prev->transponderid);
476        }
477}
478
479int writeepgscanlist(const char *filename)
480{
481        FILE *fd = NULL;
482        struct epgscanlist *node = epgscanlist;
483        int ret = 0;
484
485        fd = fopen(filename, "w");
486        if(fd == NULL)
487        {
488                perr("can't open %s", filename);
489                return 1;
490        }
491
492        while(node != NULL)
493        {
494                ret = fprintf(fd, "%d#%llu\n", node->serviceid, node->transponderid);
495                if(ret < 0)
496                {
497                        perr("writting file %s", filename);
498                }
499                node = node->next;
500        }
501
502        fclose(fd);
503        return 0;
504}
505
506#endif
Note: See TracBrowser for help on using the repository browser.