平车主控板(运维板)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

424 lines
11 KiB

#include "app_common.h"
#include "../clib/md5.h"
#include "../msp/uart0.h"
#include "../msp/uart2.h"
#include "../app/app_task_gm35.h"
#include "../app/app_paraid.h"
#include "../app/app_task_relay.h"
//0xFF+0xFE+2+20+1+21 `0xFF``0xFE`00``2A``simno,salt
#define LEN_GPRS_TCP_PKG_AT_SIGNIN 46
#define LEN_GPRS_TCP_DATA_ACK 8
struct printer_maintenance_global G;
TS_PH3_ccmodbus_ack ccmodbus_ack;
U8 ccmodbus_len = 0;
vU8 gprsTcpPkg_Signin[LEN_GPRS_TCP_PKG_AT_SIGNIN] = {0xFF,0xFE,0x0,0x2A};
vU8 gprsdataack[LEN_GPRS_TCP_DATA_ACK] = {0xFF,0xFE,0x0,0x4,0x11,0x95,0x8F,0xCD};
void Lu_register_init()
{
U8 i = 0;
G.total_weight = 0;
G.rfid = 0;
for(i=0;i<MD_SLAVER_INFO_MAX;i++)
{
G.slaver_info[i].mask = 0;
}
G.slaver_info[0].slaver = 0x11;
G.slaver_info[0].oper = MODBUS_OPER_READ;
G.slaver_info[0].reg = 0x02;
G.slaver_info[0].regnum = 0x02;
G.slaver_info[0].mask = 2; //0->无效 1:暂时有效 2->永久有效
G.slaver_info[1].slaver = 0x12;
G.slaver_info[1].oper = MODBUS_OPER_WRITE_M;
G.slaver_info[1].reg = 0x02;
G.slaver_info[1].regnum = 0x02;
G.slaver_info[1].bytes = 4;
G.slaver_info[1].buf = (U8*)&G.total_weight;
G.slaver_info[1].mask = 0;
G.slaver_info[2].slaver = 0x12;
G.slaver_info[2].oper = MODBUS_OPER_WRITE_M;
G.slaver_info[2].reg = 0x04;
G.slaver_info[2].regnum = 0x01;
G.slaver_info[2].bytes = 2;
G.slaver_info[2].buf = (U8*)&G.rfid;
G.slaver_info[2].mask = 0;
G.slaver_info[3].slaver = 0x13;
G.slaver_info[3].oper = MODBUS_OPER_WRITE_M;
G.slaver_info[3].reg = 0x02;
G.slaver_info[3].regnum = 0x02;
G.slaver_info[3].bytes = 4;
G.slaver_info[3].buf = (U8*)&G.total_weight;
G.slaver_info[3].mask = 0;
G.slaver_info[4].slaver = 0x13;
G.slaver_info[4].oper = MODBUS_OPER_WRITE_M;
G.slaver_info[4].reg = 0x04;
G.slaver_info[4].regnum = 0x01;
G.slaver_info[4].bytes = 2;
G.slaver_info[4].buf = (U8*)&G.rfid;
G.slaver_info[4].mask = 0;
#if 0
for(i = 0; i < PAPER_BOX_NUM; i++)
{
G.paperCalibs[i].num0 = 0;
G.paperCalibs[i].angle0 = 0x23F0;
G.paperCalibs[i].num1 = 400;
G.paperCalibs[i].angle1 = 0x20C4;
G.currentSensorVal[i] = 0;
G.papers[i].version = APP_VERSION_HEX;
G.papers[i].LowPower = 0x00;
G.papers[i].cameraNotWorking = 0x00;
G.papers[i].cameraIndex = 0x00;
G.papers[i].paperNum = 0x00;
}
G.boardstatus.a9RecvDataInterval = 0;
G.boardstatus.a9Status = 0;
G.boardstatus.wdtStatus = 0;
G.lastResetToISPCmdTimeInSeconds = 0;
//G.irthreshold[0] = 7;
//G.irthreshold[1] = 5;
G.runmode = MODE_RUN;
//G.runmode = DEBUG_IR;
//G.runmode = DEBUG_A9;
//G.runmode = DEBUG_CAMER;
#endif
}
#if 0
U16 L2_paper_count(U8 index, U32 angle)
{
S32 x1,y1,x2,y2,x,paper;
//y = (x-x1) * (y2-y1) / (x2-x1) + y1
x1 = G.paperCalibs[index].angle0;
y1 = G.paperCalibs[index].num0;
x2 = G.paperCalibs[index].angle1;
y2 = G.paperCalibs[index].num1;
x = angle;
paper = (S16)(1.0 * (x-x1) * (y2-y1) / (x2-x1) + y1);
if(paper > 0x1FF)
{
paper = 0x1FF;
}
if(paper < 0)
{
paper = ~paper + 1;
paper |= 1<<9;
}
else
{
paper &= ~(1<<9);
}
paper &= 0x3FF;
return paper;
}
static void resetToIsp()
{
if(s_nos_tick.t_1s < G.lastResetToISPCmdTimeInSeconds)
{
//isp
IAP_CONTR = 0x60;
//disable wdt
}
else
{
G.lastResetToISPCmdTimeInSeconds = s_nos_tick.t_1s + 2; //2s(1s-2s)
}
}
U8 L2_constructor_ccmodbus_ack(TS_PH3_ccmodbus_ack *pccmodbus, U8 addr, U8 oper, U8 *buf, U8 len)
{
pccmodbus->filter1 = 0xFF;
pccmodbus->filter2 = 0xFE;
pccmodbus->num0 = (len + 4) >> 8 & 0xFF;
pccmodbus->num1 = (len + 4) >> 0 & 0xFF;
pccmodbus->addr = addr;
pccmodbus->oper = oper;
byte_copy_uc((U8*)&pccmodbus->buf, buf, len);
crc16(pccmodbus->crc, &pccmodbus->addr, len + 2);
pccmodbus->buf[len] = pccmodbus->crc[1];
pccmodbus->buf[len+1] = pccmodbus->crc[0];
return len + 6 + 2;
}
int L2_ph3_common_send(U8 dst, void *buf, U8 len)
{
switch(dst)
{
case ADDR_UPPER:
L0_uart0_sendArray(buf,len);
break;
case ADDR_SERVER:
L3_gm35_send(buf, len);
L0_uart0_uc('S');
break;
default:
break;
}
return 0;
}
void L2_do_uart_report(void)
{
TS_Printer_Report report_ack;
byte_copy_uc(&report_ack.papers[0],&G.papers[0],3);
byte_copy_uc(&report_ack.papers[1],&G.papers[1],3);
byte_copy_uc(&report_ack.boardstatus,&G.boardstatus,3);
report_ack.ir = 0;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_UPPER, OPER_REPORT, (U8 *)&report_ack, sizeof(report_ack));
L2_ph3_common_send(ADDR_UPPER,(U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L2_gprs_send_signin_pkg(void)
{
libc_memcpy(gprsTcpPkg_Signin+4,G.ccid,20);
gprsTcpPkg_Signin[24] = ',';
libc_memcpy(gprsTcpPkg_Signin+25,G.ccid_passwd,21);
L2_ph3_common_send(ADDR_SERVER,(U8 *)&gprsTcpPkg_Signin,LEN_GPRS_TCP_PKG_AT_SIGNIN);
}
void L2_gprs_send_ack_pkg(void)
{
L2_ph3_common_send(ADDR_SERVER,(U8 *)&gprsdataack,LEN_GPRS_TCP_DATA_ACK);
}
void L2_gprs_send_heart_pkg(void)
{
TS_gprs_heart gprs_heart;
gprs_heart.version = APP_VERSION_HEX;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_SERVER, OPER_GPRS_HEART, (U8 *)&gprs_heart, sizeof(gprs_heart));
L2_ph3_common_send(ADDR_SERVER,(U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L2_gprs_send_report_pkg(void)
{
TS_Printer_Report report_ack;
byte_copy_uc(&report_ack.papers[0],&G.papers[0],3);
byte_copy_uc(&report_ack.papers[1],&G.papers[1],3);
byte_copy_uc(&report_ack.boardstatus,&G.boardstatus,3);
report_ack.ir = 0;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_SERVER, OPER_GPRS_REPORT, (U8 *)&report_ack, sizeof(report_ack));
L2_ph3_common_send(ADDR_SERVER,(U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L2_do_angle_setid(U8 *buf)
{
TS_Angle_SetId *ts_angle_setid = (TS_Angle_SetId*)buf;
TS_PH1A_DAT ph1a;
ph1a.filter = D_HETU_FXA;
ph1a.id = SLAVER_ID_N;
ph1a.oper = OPER_ANGLE_SET_ID;
ph1a.xaxis[0] = ts_angle_setid->id;
ph1a.xaxis[1] = ts_angle_setid->id;
ph1a.yaxis[0] = ts_angle_setid->id;
ph1a.yaxis[1] = ts_angle_setid->id;
ph1a.zaxis[0] = ts_angle_setid->id;
ph1a.zaxis[1] = ts_angle_setid->id;
L0_uart2_sendArray(&ph1a,sizeof(TS_PH1A_DAT));
}
void L2_do_angle_setid_ack(U8 id)
{
TS_Angle_SetId ts_setid_ack;
ts_setid_ack.id = id;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_UPPER, OPER_SET_485_ID, (U8 *)&ts_setid_ack, sizeof(ts_setid_ack));
L0_uart0_sendArray((U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L2_do_paper_count(U8 *buf)
{
TS_Paper_Count_Ack paper_count_ack;
TS_Paper_Count *ts_paper = (TS_Paper_Count*)buf;
U16 num = 0;
if(ts_paper->no >= PAPER_BOX_NUM)
{
L0_uart0_uc('x');
return;
}
num = L2_paper_count(ts_paper->no,G.currentSensorVal[ts_paper->no]);
paper_count_ack.no = ts_paper->no;
paper_count_ack.num[0] = num >> 8 & 0xFF;
paper_count_ack.num[1] = num >> 0 & 0xFF;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_UPPER, OPER_PAPER_COUNT, (U8 *)&paper_count_ack, sizeof(paper_count_ack));
L0_uart0_sendArray((U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L2_do_calib_read(U8 *buf)
{
TS_Paper_Upper_calib_ack upper_calib_ack;
TS_Paper_Upper_Calib_Read *ts_calib = (TS_Paper_Upper_Calib_Read*)buf;
if(ts_calib->no >= PAPER_BOX_NUM)
{
L0_uart0_uc('x');
return;
}
upper_calib_ack.num0 = G.paperCalibs[ts_calib->no].num0;
upper_calib_ack.angle0 = G.paperCalibs[ts_calib->no].angle0;
upper_calib_ack.num1 = G.paperCalibs[ts_calib->no].num1;
upper_calib_ack.angle1 = G.paperCalibs[ts_calib->no].angle1;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_UPPER, OPER_CALIB_READ, (U8 *)&upper_calib_ack, sizeof(upper_calib_ack));
L0_uart0_sendArray((U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L2_do_calib(U8 *buf)
{
TS_Paper_Upper_calib_ack upper_calib_ack;
TS_Paper_Upper_Calib *ts_calib = (TS_Paper_Upper_Calib*)buf;
if(ts_calib->no >= PAPER_BOX_NUM || ts_calib->point >= 2)
{
L0_uart0_uc('x');
return;
}
switch(ts_calib->point)
{
case 0:
{
G.paperCalibs[ts_calib->no].num0 = (U16)(ts_calib->paperNum0) << 8 | ts_calib->paperNum1;
G.paperCalibs[ts_calib->no].angle0 = G.currentSensorVal[ts_calib->no];
break;
}
case 1:
{
G.paperCalibs[ts_calib->no].num1 = (U16)(ts_calib->paperNum0) << 8 | ts_calib->paperNum1;
G.paperCalibs[ts_calib->no].angle1 = G.currentSensorVal[ts_calib->no];
break;
}
}
L3_flash_write_page0(); //??Flash
upper_calib_ack.num0 = G.paperCalibs[ts_calib->no].num0;
upper_calib_ack.angle0 = G.paperCalibs[ts_calib->no].angle0;
upper_calib_ack.num1 = G.paperCalibs[ts_calib->no].num1;
upper_calib_ack.angle1 = G.paperCalibs[ts_calib->no].angle1;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_UPPER, OPER_CALIB, (U8 *)&upper_calib_ack, sizeof(upper_calib_ack));
L0_uart0_sendArray((U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L2_do_calib_enter(void)
{
G.runmode = MODE_PAPER_CALIB;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_UPPER, OPER_CALIB_MODE, NULL, 0 );
L0_uart0_sendArray((U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L2_do_calib_leave(void)
{
G.runmode = MODE_RUN;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_UPPER, OPER_CALIB_LEAVE, NULL, 0 );
L0_uart0_sendArray((U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L3_protocol_handler_uart0_fun(TS_PH3_ccmodbus *p,U8 from) //0?????��??????????????��a9
{
switch(p->oper)
{
case OPER_CALIB_MODE:
L2_do_calib_enter();
break;
case OPER_CALIB_LEAVE:
L2_do_calib_leave();
break;
case OPER_CALIB:
L2_do_calib(p->buf);
break;
case OPER_CALIB_READ:
L2_do_calib_read(p->buf);
break;
case OPER_PAPER_COUNT:
L2_do_paper_count(p->buf);
break;
case OPER_SET_485_ID:
L2_do_angle_setid(p->buf);
break;
case OPER_RELAY:
L2_do_relay(p->buf);
if(from == 1)
{
L0_uart0_uc('R');
L0_uart0_uchex(p->buf[0]);
L0_uart0_uchex(p->buf[1]);
g_at_send_status.ack_flag = 1; //???��???????????
}
break;
case OPER_ISP: //ResetToISP???????��??????��???
L0_uart0_uc('P');
resetToIsp();
break;
case 0x00: //????��?
L0_uart0_uc('H');
break;
case 0x99: //?��?????��????
G.runmode = p->buf[1] & 0x0F;
Lc_print_buf("Version: %s\r\n",APP_VERSION);
Lc_delay_ms(700);// 2000--7s
break;
default:
break;
};
}
void L3_protocol_handler_uart4_fun(U8 *pPara,U8 from)
{
from = 0;
if(StrStartsWith(pPara,"OK")) //module ok
{
g_at_send_status.module_ok = 1;
}
else if(StrStartsWith(pPara,"+CCID")) //sim ok
{
L0_uart0_uc('s');
libc_memcpy(G.ccid,pPara+7,20);
getPwd(G.ccid, G.ccid_passwd);
g_at_send_status.sim_ok = 1;
}
else if(StrStartsWith(pPara,"+CREG: 1,1")) //net ok
{
L0_uart0_uc('n');
g_at_send_status.net_ok = 1;
}
else if(StrStartsWith(pPara,"+CGATT:1")) //gprs ok
{
L0_uart0_uc('g');
g_at_send_status.gprs_ok = 1;
}
else if(StrStartsWith(pPara,"CONNECT OK") || StrStartsWith(pPara,"STATE:CONNECT OK")) //conn ok
{ //ALREAY CONNECT??????????????��???????????????????????��????????????????????��?��???????
if(g_at_send_status.conn_ok == 0)
{
L0_uart0_uc('c');
g_at_send_status.conn_ok = 1;
}
}
else if(StrStartsWith(pPara,"CLOSE") || StrStartsWith(pPara,"STATE:CLOSED")) //conn close //CLOSE OK / CLOSED
{
if(g_at_send_status.conn_ok == 1)
{
L0_uart0_uc('d');
g_at_send_status.conn_ok = 0;
g_at_send_status.tcp_close_stmp = s_nos_tick.t_1s;
}
}
}
#endif