269 lines
6.0 KiB
C
Executable File
269 lines
6.0 KiB
C
Executable File
#define MODULE_LOG_PREFIX "lcd"
|
|
|
|
#include "globals.h"
|
|
|
|
#ifdef LCDSUPPORT
|
|
/*
|
|
* module-lcd.c
|
|
*
|
|
* Created on: 24.05.2011
|
|
* Author: alno
|
|
*/
|
|
|
|
#include "module-cccam.h"
|
|
#include "oscam-client.h"
|
|
#include "oscam-files.h"
|
|
#include "oscam-string.h"
|
|
#include "oscam-time.h"
|
|
|
|
static int8_t running;
|
|
int32_t seconds, secs, fullmins, mins, hours, days, fullhours;
|
|
|
|
static void refresh_lcd_file(void)
|
|
{
|
|
char targetfile[256];
|
|
char temp_file[256];
|
|
char channame[CS_SERVICENAME_SIZE];
|
|
|
|
set_thread_name(__func__);
|
|
|
|
if(cfg.lcd_output_path == NULL)
|
|
{
|
|
get_tmp_dir_filename(targetfile, sizeof(targetfile), "oscam.lcd");
|
|
get_tmp_dir_filename(temp_file, sizeof(temp_file), "oscam.lcd.tmp");
|
|
}
|
|
else
|
|
{
|
|
snprintf(targetfile, sizeof(targetfile), "%s%s", cfg.lcd_output_path, "/oscam.lcd");
|
|
snprintf(temp_file, sizeof(temp_file), "%s%s.tmp", cfg.lcd_output_path, "/oscam.lcd");
|
|
}
|
|
|
|
int8_t iscccam = 0;
|
|
fullhours = 0;
|
|
fullmins = 0;
|
|
seconds = 0;
|
|
hours = 0;
|
|
mins = 0;
|
|
secs = 0;
|
|
days = 0;
|
|
time_t now;
|
|
|
|
while(running)
|
|
{
|
|
now = time((time_t *)0);
|
|
int16_t idx = 0, count_r = 0, count_p = 0, count_u = 0;
|
|
FILE *fpsave;
|
|
|
|
if((fpsave = fopen(temp_file, "w")))
|
|
{
|
|
|
|
idx = 0;
|
|
int16_t i;
|
|
char *type;
|
|
char *label;
|
|
char *status;
|
|
|
|
// Statuslines start
|
|
secs = 0;
|
|
fullmins = 0;
|
|
mins = 0;
|
|
fullhours = 0;
|
|
hours = 0;
|
|
days = 0;
|
|
|
|
seconds = now - first_client->login;
|
|
secs = seconds % 60;
|
|
if(seconds > 60)
|
|
{
|
|
fullmins = seconds / 60;
|
|
mins = fullmins % 60;
|
|
if(fullmins > 60)
|
|
{
|
|
fullhours = fullmins / 60;
|
|
hours = fullhours % 24;
|
|
days = fullhours / 24;
|
|
}
|
|
}
|
|
|
|
fprintf(fpsave, "Version: %s\n", CS_VERSION);
|
|
if(days == 0)
|
|
{ fprintf(fpsave, "up: %02d:%02d:%02d\n", hours, mins, secs); }
|
|
else
|
|
{ fprintf(fpsave, "up: %02dd %02d:%02d:%02d\n", days, hours, mins, secs); }
|
|
fprintf(fpsave, "totals: %d/%d/%d/%d/%d/%d\n", first_client->cwfound, first_client->cwnot, first_client->cwignored, first_client->cwtout, first_client->cwcache, first_client->cwtun);
|
|
fprintf(fpsave, "uptime: %d\n", seconds);
|
|
// Statuslines end
|
|
|
|
// Readertable head
|
|
fprintf(fpsave, "Typ| Label | Idle | w | s | b | e | St\n");
|
|
fprintf(fpsave, "---+------------+--------------+---+---+---+---+----\n");
|
|
|
|
struct s_client *cl;
|
|
|
|
// Reader/Proxy table start
|
|
for(i = 0, cl = first_client; cl ; cl = cl->next, i++)
|
|
{
|
|
|
|
if((cl->typ == 'r' || cl->typ == 'p') && ((now - cl->last) < 20 || !cfg.lcd_hide_idle))
|
|
{
|
|
type = "";
|
|
label = "";
|
|
status = "OFF";
|
|
secs = 0;
|
|
fullmins = 0;
|
|
mins = 0;
|
|
fullhours = 0;
|
|
hours = 0;
|
|
days = 0;
|
|
|
|
seconds = now - cl->last;
|
|
|
|
if(cl->typ == 'r')
|
|
{
|
|
type = "R";
|
|
idx = count_r;
|
|
label = cl->reader->label;
|
|
if(cl->reader->card_status == CARD_INSERTED)
|
|
{ status = "OK"; }
|
|
count_r++;
|
|
}
|
|
|
|
else if(cl->typ == 'p')
|
|
{
|
|
type = "P";
|
|
iscccam = strncmp(client_get_proto(cl), "cccam", 5) == 0;
|
|
idx = count_p;
|
|
label = cl->reader->label;
|
|
|
|
if(cl->reader->card_status == CARD_INSERTED)
|
|
{ status = "CON"; }
|
|
|
|
count_p++;
|
|
}
|
|
|
|
|
|
secs = seconds % 60;
|
|
if(seconds > 60)
|
|
{
|
|
fullmins = seconds / 60;
|
|
mins = fullmins % 60;
|
|
if(fullmins > 60)
|
|
{
|
|
fullhours = fullmins / 60;
|
|
hours = fullhours % 24;
|
|
days = fullhours / 24;
|
|
}
|
|
}
|
|
|
|
uint16_t written = 0, skipped = 0, blocked = 0, error = 0;
|
|
|
|
char emmtext[16] = " ";
|
|
if(cl->typ == 'r' || !iscccam)
|
|
{
|
|
for(i = 0; i < 4; i++)
|
|
{
|
|
error += cl->reader->emmerror[i];
|
|
blocked += cl->reader->emmblocked[i];
|
|
skipped += cl->reader->emmskipped[i];
|
|
written += cl->reader->emmwritten[i];
|
|
}
|
|
snprintf(emmtext, 16, "%3d|%3d|%3d|%3d",
|
|
written > 999 ? 999 : written,
|
|
skipped > 999 ? 999 : skipped,
|
|
blocked > 999 ? 999 : blocked,
|
|
error > 999 ? 999 : error);
|
|
}
|
|
else if(cl->typ == 'p' && iscccam)
|
|
{
|
|
if(!cccam_snprintf_cards_stat(cl, emmtext, 16))
|
|
{ snprintf(emmtext, 16, " No cards "); }
|
|
}
|
|
|
|
if(days == 0)
|
|
{
|
|
fprintf(fpsave, "%s%d | %-10.10s | %02d:%02d:%02d |%s| %s\n",
|
|
type, idx, label, hours, mins,
|
|
secs, emmtext, status);
|
|
}
|
|
else
|
|
{
|
|
fprintf(fpsave, "%s%d | %-10.10s |% 3dd %02d:%02d:%02d |%s| %s\n",
|
|
type, idx, label, days, hours, mins,
|
|
secs, emmtext, status);
|
|
}
|
|
}
|
|
}
|
|
|
|
fprintf(fpsave, "---+------------+--------------+---+---+---+--++----\n");
|
|
// Reader/Proxy table end
|
|
|
|
|
|
// Usertable start
|
|
fprintf(fpsave, "Typ| Label | Channel | Time\n");
|
|
fprintf(fpsave, "---+------------+-----------------------------+-----\n");
|
|
|
|
/*
|
|
//Testclient
|
|
fprintf(fpsave,"%s%d | %-10.10s | %-10.10s:%-17.17s| % 4d\n",
|
|
"U",
|
|
1,
|
|
"test",
|
|
"Sky De",
|
|
"Discovery Channel",
|
|
568);
|
|
|
|
*/
|
|
|
|
for(i = 0, cl = first_client; cl ; cl = cl->next, i++)
|
|
{
|
|
|
|
seconds = now - cl->lastecm;
|
|
|
|
if(cl->typ == 'c' && seconds < 15)
|
|
{
|
|
type = "U";
|
|
idx = count_u;
|
|
label = cl->account->usr;
|
|
count_u++;
|
|
|
|
get_servicename(cl, cl->last_srvid, cl->last_provid, cl->last_caid, channame, sizeof(channame));
|
|
fprintf(fpsave, "%s%d | %-10.10s | %-10.10s:%-17.17s| % 4d\n",
|
|
type,
|
|
idx,
|
|
label,
|
|
get_cl_lastprovidername(cl),
|
|
cl->last_srvidptr && cl->last_srvidptr->name ? cl->last_srvidptr->name : "",
|
|
cl->cwlastresptime);
|
|
|
|
}
|
|
}
|
|
fprintf(fpsave, "---+------------+-----------------------------+-----\n");
|
|
// Usertable end
|
|
fclose(fpsave);
|
|
}
|
|
|
|
cs_sleepms(cfg.lcd_write_intervall * 1000);
|
|
|
|
if(rename(temp_file, targetfile) < 0)
|
|
{ cs_log("An error occured while writing oscam.lcd file %s.", targetfile); }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void lcd_thread_start(void)
|
|
{
|
|
if(cfg.enablelcd)
|
|
{
|
|
running = 1;
|
|
start_thread("LCD", (void *) &refresh_lcd_file, NULL, NULL, 1, 1);
|
|
}
|
|
}
|
|
|
|
void lcd_thread_stop(void)
|
|
{
|
|
running = 0;
|
|
}
|
|
|
|
#endif
|