Moyka/PROJECT/app/modem_task.c
dimoniche f74fdcceac первый коммит
первый коммит
2019-05-27 23:42:26 +03:00

692 lines
21 KiB
C

#include <includes.h>
#include "journal.h"
#include "modem.h"
#include "modem_task.h"
#include "data.h"
#include "datadesc.h"
#include "time.h"
OS_STK ModemTaskStk[MODEM_TASK_STK_SIZE];
OS_EVENT *ModemQuery = NULL;
void *ModemTbl[MODEM_QUERY_LEN];
static int index;
static CPU_INT32U enable_journals;
#define STAT_STR_NUM 17
static void GetChannelStatStr(char* str, int ch)
{
CPU_INT32U val;
GetData(&CounterChannelMoneyDesc, &val, ch, DATA_FLAG_DIRECT_INDEX);
sprintf(&str[strlen(str)], "| %2d | %11d ", ch+1, val);
GetData(&CounterChannelRunDesc, &val, ch, DATA_FLAG_DIRECT_INDEX);
sprintf(&str[strlen(str)], "| %7d | ", val);
GetData(&CounterChannelTimeDesc, &val, ch, DATA_FLAG_DIRECT_INDEX);
PrintSecToHourMinSec(&str[strlen(str)], val);
sprintf(&str[strlen(str)], "\r\n");
}
static void GetChannelStatStrLong(char* str, int ch)
{
CPU_INT32U val;
GetData(&CounterChannelMoneyLongDesc, &val, ch, DATA_FLAG_DIRECT_INDEX);
sprintf(&str[strlen(str)], "| %2d | %11d ", ch+1, val);
GetData(&CounterChannelRunLongDesc, &val, ch, DATA_FLAG_DIRECT_INDEX);
sprintf(&str[strlen(str)], "| %7d | ", val);
GetData(&CounterChannelTimeLongDesc, &val, ch, DATA_FLAG_DIRECT_INDEX);
PrintSecToHourMinSec(&str[strlen(str)], val);
sprintf(&str[strlen(str)], "\r\n");
}
extern CPU_INT32U BillNominals[24];
static int GetEmailStr(char *str)
{
if (index < STAT_STR_NUM)
{
str[0] = 0;
if (index == 0)
{
// çàãîëîâîê
TRTC_Data rtc;
RTC_ReadTime(&rtc);
sprintf(str, "Systemnoe vremya: ");
PrintRTCDateTimeString(&str[strlen(str)], &rtc);
sprintf(&str[strlen(str)], "\r\n\r\n-------------------------------------------------------------\r\nStatistika obshaya. Korotkie schetchiki.\r\n-------------------------------------------------------------\r\n");
}
else if (index == 1)
{
CPU_INT32U val;
// îáùèå ñ÷åò÷èêè
sprintf(str, "| Vsego deneg, rub. | Vsego seansov | Vsego narabotka h:m:s \r\n");
GetData(&CounterMoneyDesc, &val, 0, DATA_FLAG_SYSTEM_INDEX);
sprintf(&str[strlen(str)], "| %16d ", val);
GetData(&CounterRunDesc, &val, 0, DATA_FLAG_SYSTEM_INDEX);
sprintf(&str[strlen(str)], "| %12d | ", val);
GetData(&CounterTimeDesc, &val, 0, DATA_FLAG_SYSTEM_INDEX);
PrintSecToHourMinSec(&str[strlen(str)], val);
sprintf(&str[strlen(str)], "\r\n");
}
else if (index == 2)
{
sprintf(&str[strlen(str)], "\r\n-------------------------------------------------------------\r\nStatistika obshaya. Dlinnye schetchiki\r\n-------------------------------------------------------------\r\n");
}
else if (index == 3)
{
CPU_INT32U val;
// íåîáíóëÿåìûå ñ÷åò÷èêè
sprintf(str, "| Vsego deneg, rub. | Vsego seansov | Vsego narabotka h:m:s \r\n");
GetData(&CounterLongMoneyDesc, &val, 0, DATA_FLAG_SYSTEM_INDEX);
sprintf(&str[strlen(str)], "| %16d ", val);
GetData(&CounterLongRunDesc, &val, 0, DATA_FLAG_SYSTEM_INDEX);
sprintf(&str[strlen(str)], "| %12d | ", val);
GetData(&CounterLongTimeDesc, &val, 0, DATA_FLAG_SYSTEM_INDEX);
PrintSecToHourMinSec(&str[strlen(str)], val);
sprintf(&str[strlen(str)], "\r\n");
}
else if (index == 4)
{
sprintf(str, "\r\n-------------------------------------------------------------\r\nStatistika po kanalam. Korotkie schetchiki.\r\n-------------------------------------------------------------\r\n");
sprintf(&str[strlen(str)], "| Kanal | Deneg, rub. | Seansov | Narabotka h:m:s\r\n");
}
else if (index == 5)
{
int i;
for (i = 0; i < 3; i++)
{
GetChannelStatStr(&str[strlen(str)], i);
}
}
else if (index == 6)
{
int i;
for (i = 3; i < 6; i++)
{
GetChannelStatStr(&str[strlen(str)], i);
}
}
else if (index == 7)
{
int i;
for (i = 6; i < 10; i++)
{
GetChannelStatStr(&str[strlen(str)], i);
}
}
else if (index == 8)
{
sprintf(str, "\r\n-------------------------------------------------------------\r\nStatistika po kanalam. Dlinnye schetchiki.\r\n-------------------------------------------------------------\r\n");
sprintf(&str[strlen(str)], "| Kanal | Deneg, rub. | Seansov | Narabotka h:m:s\r\n");
}
else if (index == 9)
{
int i;
for (i = 0; i < 3; i++)
{
GetChannelStatStrLong(&str[strlen(str)], i);
}
}
else if (index == 10)
{
int i;
for (i = 3; i < 6; i++)
{
GetChannelStatStrLong(&str[strlen(str)], i);
}
}
else if (index == 11)
{
int i;
for (i = 6; i < 10; i++)
{
GetChannelStatStrLong(&str[strlen(str)], i);
}
}
else if (index == 12)
{
CPU_INT32U val;
// âïå÷àòàåì ÷èñëî êóïþð â êóïþðíèêå
sprintf(str, "\r\n-------------------------------------------------------------\r\nKupuropriemnik.\r\n-------------------------------------------------------------\r\n");
GetData(&BillCounterDesc, &val, 0, DATA_FLAG_SYSTEM_INDEX);
if (!val)
{
// êóïþðíèê ïóñò
sprintf(&str[strlen(str)], "Kupuropriemnik pust.\r\n\r\n");
index++;
index++;
}
else
{
sprintf(&str[strlen(str)], "| Nominal, rub. | Kolichestvo\r\n");
}
}
else if (index == 13)
{
int i;
str[0] = 0;
for (i = 0; i < 6; i++)
{
CPU_INT32U val;
GetData(&BillnomCountersDesc, &val, i, DATA_FLAG_DIRECT_INDEX);
if (val)
{
sprintf(&str[strlen(str)], "| %13d | %11d \r\n", BillNominals[i], val);
}
val = strlen(str);
}
}
else if (index == 14)
{
int i;
str[0] = 0;
for (i = 6; i < 12; i++)
{
CPU_INT32U val;
GetData(&BillnomCountersDesc, &val, i, DATA_FLAG_DIRECT_INDEX);
if (val)
{
sprintf(&str[strlen(str)], "| %13d | %11d \r\n", BillNominals[i], val);
}
}
}
else if (index == 15)
{
int i;
str[0] = 0;
for (i = 12; i < 18; i++)
{
CPU_INT32U val;
GetData(&BillnomCountersDesc, &val, i, DATA_FLAG_DIRECT_INDEX);
if (val)
{
sprintf(&str[strlen(str)], "| %13d | %11d \r\n", BillNominals[i], val);
}
}
}
else if (index == 16)
{
int i;
str[0] = 0;
for (i = 18; i < 24; i++)
{
CPU_INT32U val;
GetData(&BillnomCountersDesc, &val, i, DATA_FLAG_DIRECT_INDEX);
if (val)
{
sprintf(&str[strlen(str)], "| %13d | %11d \r\n", BillNominals[i], val);
}
}
}
index++;
return 0;
}
else if (index < STAT_STR_NUM+EVENT_RECORDS_COUNT)
{
TEventRecord record;
if (enable_journals == 0) return -1;
GetEventRecord(&record, index-STAT_STR_NUM);
str[0] = 0;
if ((index-STAT_STR_NUM) == 0)
{
sprintf(str, "\r\n-------------------------------------------------------------\r\nZhurnal sobytiy\r\n-------------------------------------------------------------\r\n");
}
if (record.time == 0x00000000)
{
index++;
return 0;
}
PrintEventJournalRecordEng(&str[strlen(str)], &record);
index++;
return 0;
}
return -1;
}
/// îòïðàâêà e-mail ñî ñ÷åò÷èêàìè è æóðíàëàìè
int SendStatistics(void)
{
CPU_INT32U dev_id;
char theme[48];
index = 0;
// íàäî ëè îòïðàâëÿòü æóðíàëû
GetData(&EnableEmailJournalSendDesc, &enable_journals, 0, DATA_FLAG_SYSTEM_INDEX);
// id óñòðîéñòâà óêàæåì â òåìå
GetData(&DeviceIDDesc, &dev_id, 0, DATA_FLAG_SYSTEM_INDEX);
sprintf(theme, "Report from solarium device id %d.", dev_id);
return ModemSendEmail(theme, GetEmailStr);
}
// âûåìêà íîâîãî çàäàíèÿ äëÿ ìîäåìà
static int GetModemTask(int* event)
{
CPU_INT08U err = 0;
int evt = (int)OSQPend(ModemQuery, 1, &err);
if (err != 0) return 0;
*event = evt;
return 1;
}
int GetTestText(char *str)
{
if (index == 0)
{
index++;
sprintf(str, "Test message from solarium.");
return 0;
}
return -1;
}
// îòïðàâêà òåñòîâîãî ñîîáùåíèÿ
int SendTest(void)
{
CPU_INT32U dev_id;
char theme[48];
GetData(&DeviceIDDesc, &dev_id, 0, DATA_FLAG_SYSTEM_INDEX);
sprintf(theme, "Test message. Device id %d.", dev_id);
index = 0;
return ModemSendEmail(theme, GetTestText);
}
static CPU_INT32U incas_money;
static CPU_INT32U incas_time;
int GetIncasText(char *str)
{
if (index == 0)
{
// çàãîëîâîê
TRTC_Data rtc;
Sec2Date(&rtc, incas_time);
sprintf(str, "Vremya incassacii: ");
PrintRTCDateTimeString(&str[strlen(str)], &rtc);
sprintf(&str[strlen(str)], "\r\n\r\nSumma %d rub.\r\n", incas_money);
}
else if (index == 1)
{
CPU_INT32U val;
// âïå÷àòàåì ÷èñëî êóïþð â êóïþðíèêå
val = incas_common_bill_counter;
if (!val)
{
// êóïþðíèê ïóñò
sprintf(&str[strlen(str)], "Kupuropriemnik byl pust.\r\n\r\n");
index=100;
}
else
{
sprintf(str, "\r\n-------------------------------------------------------------\r\nKupuropriemnik.\r\n-------------------------------------------------------------\r\n");
sprintf(&str[strlen(str)], "| Nominal, rub. | Kolichestvo\r\n");
}
}
else if (index == 2)
{
int i;
str[0] = 0;
for (i = 0; i < 6; i++)
{
CPU_INT32U val;
val = incas_bill_nom_counter[i];
if (val)
{
sprintf(&str[strlen(str)], "| %13d | %11d \r\n", BillNominals[i], val);
}
val = strlen(str);
}
}
else if (index == 3)
{
int i;
str[0] = 0;
for (i = 6; i < 12; i++)
{
CPU_INT32U val;
val = incas_bill_nom_counter[i];
if (val)
{
sprintf(&str[strlen(str)], "| %13d | %11d \r\n", BillNominals[i], val);
}
}
}
else if (index == 4)
{
int i;
str[0] = 0;
for (i = 12; i < 18; i++)
{
CPU_INT32U val;
val = incas_bill_nom_counter[i];
if (val)
{
sprintf(&str[strlen(str)], "| %13d | %11d \r\n", BillNominals[i], val);
}
}
}
else if (index == 5)
{
int i;
str[0] = 0;
for (i = 18; i < 24; i++)
{
CPU_INT32U val;
val = incas_bill_nom_counter[i];
if (val)
{
sprintf(&str[strlen(str)], "| %13d | %11d \r\n", BillNominals[i], val);
}
}
}
else
{
return -1;
}
index++;
return 0;
}
// îòïðàâêà ñîîáùåíèÿ îá èíêàññàöèè
int SendIncas(void)
{
CPU_INT32U dev_id;
char theme[48];
GetData(&DeviceIDDesc, &dev_id, 0, DATA_FLAG_SYSTEM_INDEX);
sprintf(theme, "Incassation. Device id %d.", dev_id);
index = 0;
return ModemSendEmail(theme, GetIncasText);
}
// ñïèñîê âîçìîæíûõ èíòåðâàëîâ îòïðàâêè
const int send_period_list[7] = {0, 1, 2, 4, 8, 12, 24};
// ãëîáàëüíûé ñòàòóñ ìîäåìà
CPU_INT32U modem_status = 0;
// ïðîâåðêà, â îäíîì ëè ïåðèîäå íàõîäÿòñÿ äâà âðåìåíè
int SamePeriod(CPU_INT32U time1, CPU_INT32U time2, CPU_INT08U period)
{
TRTC_Data rtc1, rtc2;
CPU_INT08U hour1, hour2;
Sec2Date(&rtc1, time1);
Sec2Date(&rtc2, time2);
if ((rtc1.year != rtc2.year) || (rtc1.mon != rtc2.mon) || (rtc1.date != rtc2.date))
{
// äàòà íå ñîâïàäàåò - òî÷íî ðàçíûé ÷àñîâîé ïåðèîä
return 0;
}
// time1 - òåêóùåå âðåìÿ
// îïðåäåëèì âðåìÿ íà÷àëà òåêóùåãî ïåðèîäà
hour1 = rtc1.hour - (rtc1.hour % period);
// îïðåäåëèì âðåìÿ íà÷àëà ïåðèîäà â ïîñëåäíåì âðåìåíè îòïðàâêè
hour2 = rtc2.hour - (rtc2.hour % period);
if (hour1 != hour2)
{
return 0;
}
return 1;
}
#define MODEM_REPEAT_NUM 3
static CPU_INT32U last_stat_send_time;
// çàäà÷à ñåðâåðà ìîäåìà
void ModemTask(void *p_arg)
{
int task;
int send_res, send_ctr, repeat_ctr;
while (1)
{
CPU_INT32U en = 0;
OSTimeDly(100);
if (!IsModemValid())
{
GetData(&EnableModemDesc, &en, 0, DATA_FLAG_SYSTEM_INDEX);
if (en)
{
if (!IsModemConn())
{
modem_status = 2;
}
else if (!IsModemConf())
{
modem_status = 1;
}
// ïîïûòàåìñÿ ïåðåïîäêëþ÷èòü ìîäåì
if (InitModem() != 0)
{
SetErrorFlag(ERROR_MODEM_CONN);
}
else
{
ClrErrorFlag(ERROR_MODEM_CONN);
}
}
else
{
modem_status = 0;
}
continue;
}
modem_status = 0;
GetData(&EnableModemDesc, &en, 0, DATA_FLAG_SYSTEM_INDEX);
if (!en)
{
ResetModemValid();
continue;
}
if (GetModemTask(&task))
{
// ðàçáåðåì çàäàíèå
switch (task)
{
case MODEM_TASK_SEND_INCAS:
{
CPU_INT32U temp;
GetData(&IncasSendFlagDesc, &temp, 0, DATA_FLAG_SYSTEM_INDEX);
if (temp != INCAS_SEND_FLAG)
{
break;
}
GetData(&IncasMoneyDesc, &incas_money, 0, DATA_FLAG_SYSTEM_INDEX);
GetData(&IncasTimeDesc, &incas_time, 0, DATA_FLAG_SYSTEM_INDEX);
repeat_ctr = 0;
while (repeat_ctr < MODEM_REPEAT_NUM)
{
send_ctr = 0;
while (send_ctr < 3)
{
send_res = SendIncas();
if (send_res == 0) break;
OSTimeDly(1000);
send_ctr++;
}
if (send_ctr < 3)
{
break;
}
else
{
// íå îòïðàâèëîñü - ïåðåèíèöèàëèçèðóåì ìîäåì
InitModem();
}
repeat_ctr++;
}
if (repeat_ctr >= MODEM_REPEAT_NUM)
{
// òî÷íî îøèáêà ìîäåìà
SaveEventRecord(0, JOURNAL_EVENT_EMAIL_FAIL, 0);
// åù¸ ðàç çàïîñòèì, ÷òîáû îòïðàâëÿòü, ïîêà íå îòïðàâèòñÿ
PostModemTask(MODEM_TASK_SEND_INCAS);
}
else
{
temp = 0;
SetData(&IncasSendFlagDesc, &temp, 0, DATA_FLAG_SYSTEM_INDEX);
SetData(&IncasMoneyDesc, &temp, 0, DATA_FLAG_SYSTEM_INDEX);
SetData(&IncasTimeDesc, &temp, 0, DATA_FLAG_SYSTEM_INDEX);
SaveEventRecord(0, JOURNAL_EVENT_EMAIL_OK, 0);
}
}
break;
case MODEM_TASK_SEND_STATISTICS:
repeat_ctr = 0;
while (repeat_ctr < MODEM_REPEAT_NUM)
{
send_ctr = 0;
while (send_ctr < 3)
{
send_res = SendStatistics();
if (send_res == 0) break;
OSTimeDly(1000);
send_ctr++;
}
if (send_ctr < 3)
{
break;
}
else
{
// íå îòïðàâèëîñü - ïåðåèíèöèàëèçèðóåì ìîäåì
InitModem();
}
repeat_ctr++;
}
if (repeat_ctr >= MODEM_REPEAT_NUM)
{
// òî÷íî îøèáêà ìîäåìà
SaveEventRecord(0, JOURNAL_EVENT_EMAIL_FAIL, 0);
// åù¸ ðàç çàñïîñòèì, ÷òîáû îòïðàâëÿòü, ïîêà íå îòïðàâèòñÿ
// íå íàäî - ñàìî çàïîñòèòñÿ, ò.ê. âðåìÿ ìû åù¸ íå ñîõðàíèëè
//PostModemTask(MODEM_TASK_SEND_STATISTICS);
}
else
{
SaveEventRecord(0, JOURNAL_EVENT_EMAIL_OK, 0);
ClearCounters();
SetData(&LastEmailSendTime, &last_stat_send_time, 0, DATA_FLAG_SYSTEM_INDEX);
}
break;
case MODEM_TASK_SEND_TEST_MSG:
repeat_ctr = 0;
while (repeat_ctr < 3)
{
send_ctr = 0;
while (send_ctr < 3)
{
send_res = SendTest();
if (send_res == 0) break;
OSTimeDly(1000);
send_ctr++;
}
if (send_ctr < 3)
{
break;
}
else
{
// íå îòïðàâèëîñü - ïåðåèíèöèàëèçèðóåì ìîäåì
InitModem();
}
repeat_ctr++;
}
if (repeat_ctr >= 3)
{
// òî÷íî îøèáêà ìîäåìà, çàáèâàåì íà îòïðàâêó
SaveEventRecord(0, JOURNAL_EVENT_EMAIL_FAIL, 0);
}
else
{
SaveEventRecord(0, JOURNAL_EVENT_EMAIL_OK, 0);
}
break;
case MODEM_TASK_RECONNECT:
// ïîïûòàåìñÿ ïåðåïîäêëþ÷èòü ìîäåì
InitModem();
break;
}
}
else
{
CPU_INT32U send_time, send_hour, send_minute;
CPU_INT32U last_send_time, sec;
TRTC_Data rtc_1, rtc_2;
OSTimeDly(MODEM_TASK_DELAY);
// ïîñìîòðèì òåêóùåå âðåìÿ
GetData(&SystemTimeDesc, &sec, 0, DATA_FLAG_SYSTEM_INDEX);
GetData(&StatSendHourMinDesc, &send_time, 0, DATA_FLAG_SYSTEM_INDEX);
send_hour = send_time / 60;
send_minute = send_time % 60;
// ïðî÷èòàåì ïîñëåäíåå âðåìÿ îòïðàâêè
GetData(&LastEmailSendTime, &last_send_time, 0, DATA_FLAG_SYSTEM_INDEX);
Sec2Date(&rtc_1, sec);
Sec2Date(&rtc_2, last_send_time);
// çàïîñòèì êîìàíäó, åñëè â òåêóùåì ïåðèîäå åù¸ íå îòïðàâëÿëîñü
// îòïðàâëÿåòñÿ âñåãäà ðàç â ñóòêè â 9.10
if ((rtc_1.hour >= send_hour) && (rtc_1.min >= send_minute) && ((rtc_2.date != rtc_1.date) || (rtc_2.year != rtc_1.year) || (rtc_2.mon != rtc_1.mon)))
{
PostModemTask(MODEM_TASK_SEND_STATISTICS);
last_stat_send_time = sec;
//SetData(&LastEmailSendTime, &last_stat_send_time, 0, DATA_FLAG_SYSTEM_INDEX);
// ïîñëåäíåå âðåìÿ îòïðàâêè óñòàíîâèì ïîòîì, òîëüêî â ñëó÷àå óñïåøíîé îòïðàâêè
}
}
}
}
// ïîñòàíîâêà íîâîé çàäà÷è â î÷åðåäü çàäà÷ ìîäåìà
void PostModemTask(int new_task)
{
OSQPost(ModemQuery, (void *)new_task);
}