2019-05-28 23:56:05 +03:00

290 lines
5.9 KiB
C

#include "iolpc2368.h"
#include "ucos_ii.h"
#include "cpu.h"
#include "app_serv.h"
#include "coin.h"
#include "data.h"
#include "datadesc.h"
#include "modem.h"
#include <stdlib.h>
OS_STK CoinTaskStk[COIN_TASK_STK_SIZE];
void InitImpInput(void);
// 6 ïîñòîâ ìîéêè - 6 êóïþðîïðèåìíèêîâ è 6 ìîíåòîïðèåìíèêîâ
#define COUNT_POST 6
CPU_INT32U CoinImpCounter[COUNT_POST];
CPU_INT32U CashImpCounter[COUNT_POST];
static CPU_INT32U cash_pulse = 5000;
static CPU_INT32U cash_pause = 2000;
static char pend_cash_counter[COUNT_POST] = 0;
static CPU_INT32U pend_cash_timestamp[COUNT_POST];
void SetCashPulseParam(CPU_INT32U pulse, CPU_INT32U pause)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
cash_pulse = pulse * 100;
cash_pause = pause;
OS_EXIT_CRITICAL();
}
void CoinTask(void *p_arg)
{
CPU_INT32U enable_coin;
CPU_INT32U cash_mode;
CPU_INT32U cash_enable;
CPU_INT32U last_cash_count[COUNT_POST];
CPU_INT32U last_cash_time[COUNT_POST];
CPU_INT32U last_settings_time = 0;
while(1)
{
for(int i = 0; i < COUNT_POST; i++)
{
if (OSTimeGet() - last_settings_time > 1000)
{
last_settings_time = OSTimeGet();
GetData(&EnableCoinDesc, &enable_coin, i, DATA_FLAG_DIRECT_INDEX);
GetData(&CashModeDesc, &cash_mode, i, DATA_FLAG_DIRECT_INDEX);
GetData(&EnableValidatorDesc, &cash_enable, i, DATA_FLAG_DIRECT_INDEX);
}
OSTimeDly(1);
if (enable_coin)
{
if (GetCoinCount(i))
{
PostUserEvent(EVENT_COIN_INSERTED);
}
}
else
{
CoinDisable();
GetResetCoinCount(i);
}
if (!cash_enable) {GetResetCashCount(i); continue;}
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
if (pend_cash_counter[i])
{
// èìïóëüñû èíêðåìåíòèðóåì òîëüêî ïîñëå âûäåðæêè ïàóçû
if (OSTimeGet() - pend_cash_timestamp[i] > cash_pause)
{
pend_cash_counter[i] = 0;
CashImpCounter[i]++;
}
}
OS_EXIT_CRITICAL();
if (cash_mode == 1)
{
if (GetCashCount(i))
{
if (last_cash_count[i] == GetCashCount(i))
{
if (labs(OSTimeGet() - last_cash_time[i]) > 500)
{
PostUserEvent(EVENT_CASH_INSERTED);
}
}
else
{
last_cash_count[i] = GetCashCount(i);
last_cash_time[i] = OSTimeGet();
}
}
else
{
last_cash_time[i] = OSTimeGet();
}
}
else
{
GetResetCashCount(i);
}
}
}
}
void CoinDisable(void)
{
}
void CoinEnable(void)
{
}
// ïîëó÷èòü ÷èñëî ìîíåò
CPU_INT32U GetCoinCount(int index)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
CPU_INT32U ctr = CoinImpCounter[index];
OS_EXIT_CRITICAL();
return ctr;
}
// ïîëó÷èòü ÷èñëî ìîíåò è ñáðîñèòü ñ÷åò÷èê
CPU_INT32U GetResetCoinCount(int index)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
CPU_INT32U ctr = CoinImpCounter[index];
CoinImpCounter[index] = 0;
OS_EXIT_CRITICAL();
return ctr;
}
// ïîëó÷èòü ÷èñëî èìïóëüñîâ îò êóïþðíèêà
CPU_INT32U GetCashCount(int index)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
CPU_INT32U ctr = CashImpCounter[index];
OS_EXIT_CRITICAL();
return ctr;
}
// ïîëó÷èòü ÷èñëî èìïóëüñîâ îò êóïþðíèêà è ñáðîñèòü ñ÷åò÷èê
CPU_INT32U GetResetCashCount(int index)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
CPU_INT32U ctr = CashImpCounter[index];
CashImpCounter[index] = 0;
OS_EXIT_CRITICAL();
return ctr;
}
// èíèöèàëèçàöèÿ ìîíåòîïðèåìíèêà
void InitCoin(void)
{
//CoinImpCounter = 0;
//CashImpCounter = 0;
InitImpInput();
OSTaskCreate(CoinTask, (void *)0, (OS_STK *)&CoinTaskStk[COIN_TASK_STK_SIZE-1], COIN_TASK_PRIO);
}
void InputCapture_ISR(void)
{
static CPU_INT32U period = 0;
static CPU_INT32U period_cash = 0;
static CPU_INT32U T3CR = 0;
// íàðàùèâàåì òèêè
T3CR++;
if (FIO0PIN_bit.P0_23)
{ // ïðèøåë çàäíèé ôðîíò
if (((T3CR-period) > COIN_IMP_MIN_LEN)
&& ((T3CR-period) < COIN_IMP_MAX_LEN))
{
//CoinImpCounter++;
}
}
else
{ // ïðèøåë ïåðåäíèé ôðîíò
period = T3CR;
}
if (FIO0PIN_bit.P0_24)
{ // ïðèøåë çàäíèé ôðîíò
CPU_INT32U cr=T3CR;
cr -= period_cash;
if ((cr > (cash_pulse - COIN_IMP_SPAN))
&& (cr < (cash_pulse + COIN_IMP_SPAN)))
{
//pend_cash_counter = 1;
//pend_cash_timestamp = OSTimeGet();
}
}
else
{ // ïðèøåë ïåðåäíèé ôðîíò
period_cash = T3CR;
//pend_cash_counter = 0;
}
}
extern CPU_INT32U BSP_CPU_PclkFreq (CPU_INT08U pclk);
/*
P0.23 MK_P9 IMPULSE OUTPUT (èìïóëüñíûé âûõîä ìîíåòîïðèåìíèêà)
P0.24 MK_P8 INHIBIT (áëîêèðîâêà)
*/
// èíèöèàëèçàöèÿ èìïóëüñíûõ âõîäîâ
void InitImpInput (void)
{
#define INPUT_CAPTURE_FREQ 100000 // ÷àñòîòà òàêòèðîâàíèÿ ÷àñòîòíûõ âõîäîâ
CPU_INT32U pclk_freq;
CPU_INT32U rld_cnts;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
OnChangeCashPulseLen();
OS_ENTER_CRITICAL();
PCONP_bit.PCTIM3 = 1;
PCLKSEL1_bit.PCLK_TIMER3 = 2;
PINSEL1_bit.P0_23 = 0x3;
PINMODE1_bit.P0_23 = 0;
FIO0DIR_bit.P0_23 = 0;
FIO0MASK_bit.P0_23 = 0;
PINSEL1_bit.P0_24 = 0x3;
PINMODE1_bit.P0_24 = 0;
FIO0DIR_bit.P0_24 = 0;
FIO0MASK_bit.P0_24 = 0;
pclk_freq = BSP_CPU_PclkFreq(23);
rld_cnts = pclk_freq / INPUT_CAPTURE_FREQ;
T3CTCR_bit.CTM = 0;
T3CTCR_bit.CIS = 0; // select CAP3.0 input
T3PR = rld_cnts-1;
T3MCR = 0;
T3CCR = 0x00;
T3EMR = 0;
T3TCR = 0x03;
T3TCR = 0x01;
VICINTSELECT &= ~(1 << VIC_TIMER3);
VICVECTADDR27 = (CPU_INT32U)InputCapture_ISR;
VICVECTPRIORITY27 = 10;
VICINTENABLE = (1 << VIC_TIMER3);
T3IR = 0xFF;
OS_EXIT_CRITICAL();
}