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.
446 lines
12 KiB
446 lines
12 KiB
#include "task_screen.h"
|
|
#include "app_config.h"
|
|
#include "../msp/uart/msp_uart1.h"
|
|
#include "../msp_uart1.h"
|
|
#include "debug_drv.h"
|
|
#include "../msp/msp_eeprom.h"
|
|
#include "../msp/uart/msp_uart1.h"
|
|
|
|
S_TASK_SCREEN _s_task_screen;
|
|
|
|
// 实时重量 A5 5A 07 82 02 A1 00 C8 0D D2
|
|
SCRSetValPkg scrSetValPkg =
|
|
{
|
|
0xA5, 0x5A, //帧头
|
|
0x07, //长度
|
|
0x82, //指令
|
|
0x02, 0xA1, //起始地址
|
|
0x00, 0x00, //体重
|
|
0x1C, 0x78, //CRC
|
|
};
|
|
|
|
// 历史重量
|
|
SCRSaveValPkg scrSaveValPkg =
|
|
{
|
|
0xA5, 0x5A, //帧头
|
|
0x2D, //长度
|
|
0x82, //指令
|
|
0x02, 0xB1, //起始地址
|
|
0x00, 0x01, //序号1
|
|
0x00, 0x01, //历史重量1
|
|
0x00, 0x02, //序号2
|
|
0x00, 0x02, //历史重量2
|
|
0x00, 0x03, //序号3
|
|
0x00, 0x03, //历史重量3
|
|
0x00, 0x04, //序号4
|
|
0x00, 0x00, //历史重量4
|
|
0x00, 0x05, //序号5
|
|
0x00, 0x00, //历史重量5
|
|
0x00, 0x06, //序号6
|
|
0x00, 0x00, //历史重量6
|
|
0x00, 0x07, //序号7
|
|
0x00, 0x00, //历史重量7
|
|
0x00, 0x08, //序号8
|
|
0x00, 0x00, //历史重量8
|
|
0x00, 0x09, //序号9
|
|
0x00, 0x00, //历史重量9
|
|
0x00, 0x0A, //序号10
|
|
0x00, 0x00, //历史重量10
|
|
0x97, 0xCE, //CRC
|
|
};
|
|
|
|
//息屏指令
|
|
SCRControlPkg scrPingOffPkg = {
|
|
0xA5, 0x5A,
|
|
0x05, //长度
|
|
0x80, //指令
|
|
0x01, 0x00, //数据
|
|
0x71, 0xB8, // CRC
|
|
};
|
|
|
|
//亮屏指令
|
|
SCRControlPkg scrPingOnPkg = {
|
|
0xA5, 0x5A,
|
|
0x05, //长度
|
|
0x80, //指令
|
|
0x01, 0x30, //数据
|
|
0x71, 0xAC, // CRC
|
|
};
|
|
|
|
//蜂鸣器指令
|
|
// A5 5A 05 80 02 32 F0 9D 0.5s
|
|
// A5 5A 05 80 02 C8 70 DE 2s
|
|
// A5 5A 05 80 02 FF 31 08 2.55s
|
|
SCRControlPkg scrBeepOnPkg = {
|
|
0xA5, 0x5A,
|
|
0x05, //长度
|
|
0x80, //指令
|
|
0x02, 0x32, //数据
|
|
0xF0, 0x9D, // CRC
|
|
};
|
|
|
|
// A5 5A 08 82 07 A0 01 00 00 D8 39 清除图标0
|
|
SCReturnPkg scrPkgIcon0ClearPkg = {
|
|
0xA5, 0x5A,
|
|
0x08, //指令字节长度(不含帧头)
|
|
0x82, //指令
|
|
0x07, 0xA0, //变量存储地址
|
|
0x01, //数据字长度
|
|
0x00,0x00, // 数据内容
|
|
0xD8,0x39, // CRC
|
|
};
|
|
|
|
// A5 5A 08 82 07 A1 01 00 00 D9 C5 清除图标1
|
|
SCReturnPkg scrPkgIcon1ClearPkg = {
|
|
0xA5, 0x5A,
|
|
0x08, //指令字节长度(不含帧头)
|
|
0x82, //指令
|
|
0x07, 0xA1, //变量存储地址
|
|
0x01, //数据字长度
|
|
0x00,0x00, // 数据内容
|
|
0xD9,0xC5, // CRC
|
|
};
|
|
|
|
// A5 5A 08 82 07 A2 01 00 00 D9 81 清除图标2
|
|
SCReturnPkg scrPkgIcon2ClearPkg = {
|
|
0xA5, 0x5A,
|
|
0x08, //指令字节长度(不含帧头)
|
|
0x82, //指令
|
|
0x07, 0xA2, //变量存储地址
|
|
0x01, //数据字长度
|
|
0x00,0x00, // 数据内容
|
|
0xD9,0x81, // CRC
|
|
};
|
|
|
|
// A5 5A 08 82 06 D9 01 00 00 FC A5 清除图标确定
|
|
SCReturnPkg scrPkgIconYClearPkg = {
|
|
0xA5, 0x5A,
|
|
0x08, //指令字节长度(不含帧头)
|
|
0x82, //指令
|
|
0x06, 0xD9, //变量存储地址
|
|
0x01, //数据字长度
|
|
0x00,0x00, // 数据内容
|
|
0xFC,0xA5, // CRC
|
|
};
|
|
|
|
// // A5 5A 08 82 06 D3 01 00 00 FF 7D 清除报警图标
|
|
// SCReturnPkg scrPkgAlarmClearPkg = {
|
|
// 0xA5, 0x5A,
|
|
// 0x08, //指令字节长度(不含帧头)
|
|
// 0x82, //指令
|
|
// 0x06, 0xD3, //变量存储地址
|
|
// 0x01, //数据字长度
|
|
// 0x00,0x00, // 数据内容
|
|
// 0xFF,0x7D, // CRC
|
|
// };
|
|
|
|
// A5 5A 08 82 06 D7 01 00 00 FE 4D 切换单位
|
|
SCReturnPkg scrPkgUnitSwitchPkg = {
|
|
0xA5, 0x5A,
|
|
0x08, //指令字节长度(不含帧头)
|
|
0x82, //指令
|
|
0x06, 0xD7, //变量存储地址
|
|
0x01, //数据字长度
|
|
0x00,0x00, // 数据内容
|
|
0xFE,0x4D, // CRC
|
|
};
|
|
|
|
// A5 5A 08 82 06 D6 01 00 00 FF B1 切换中英文
|
|
SCReturnPkg scrPkgLanguageSwitchPkg = {
|
|
0xA5, 0x5A,
|
|
0x08, //指令字节长度(不含帧头)
|
|
0x82, //指令
|
|
0x06, 0xD6, //变量存储地址
|
|
0x01, //数据字长度
|
|
0x00,0x00, // 数据内容
|
|
0xFF,0xB1, // CRC
|
|
};
|
|
//=============================================
|
|
void L3_task_screen_init(void)
|
|
{
|
|
L1_task_init(&_s_task_screen.task);
|
|
_s_task_screen.power_mode = R.power_mode;
|
|
L3_task_s_go(_s_task_screen, D_task_init);
|
|
}
|
|
|
|
#define D_task_RS485_SEND_BEFORE 0x50
|
|
#define D_task_RS485_SEND 0x51
|
|
#define D_task_RS485_SEND_AFTER 0x52
|
|
#define D_task_RS485_RECV 0x53
|
|
|
|
void L3_task_screen_handler(S_TASK_SCREEN *s)
|
|
{
|
|
// L0_uart1_str("_s_task_screen.task.sh: ");
|
|
// L0_uart1_uchex(_s_task_screen.task.sh);
|
|
// L0_uart1_0d0a();
|
|
TTSS_Task_init():
|
|
L2_task_go(D_task_RS485_SEND_BEFORE);
|
|
//发送前
|
|
TTSS_Task_step(D_task_RS485_SEND_BEFORE):
|
|
//检测功耗模式
|
|
ScreenPingOff_judge();
|
|
|
|
//检测到模式转变
|
|
if(s->power_mode != R.power_mode)
|
|
{
|
|
s->power_mode = R.power_mode;
|
|
if(R.ScrTouch_flag == 0) // if (s->power_mode == POWER_LOW)
|
|
{
|
|
//发送熄屏指令
|
|
L1_uart1_Array((U8 *)&scrPingOffPkg, sizeof(scrPingOffPkg));
|
|
}
|
|
else if(R.ScrTouch_flag == 1)
|
|
{
|
|
//发送亮屏指令
|
|
L1_uart1_Array((U8 *)&scrPingOnPkg, sizeof(scrPingOnPkg));
|
|
}
|
|
}
|
|
if (R.beep == beep_on)
|
|
{
|
|
//发送蜂鸣器指令
|
|
L1_uart1_Array((U8 *)&scrBeepOnPkg, sizeof(scrBeepOnPkg));
|
|
}
|
|
L2_task_go_Tdelay(D_task_RS485_SEND, D_Tdelay_400ms);
|
|
//发送
|
|
TTSS_Task_step(D_task_RS485_SEND):
|
|
if(R.power_mode == POWER_NORMAL)
|
|
{
|
|
//构造pkg
|
|
constructor_scr_pkg();
|
|
//发送pkg
|
|
L1_uart1_Array((U8 *)&scrSetValPkg, sizeof(SCRSetValPkg));
|
|
}
|
|
L2_task_go_Tdelay(D_task_RS485_SEND_BEFORE, D_Tdelay_400ms);
|
|
//发送后
|
|
// TTSS_Task_step(D_task_RS485_SEND_AFTER):
|
|
// L2_task_go_Tdelay(D_task_RS485_SEND, D_Tdelay_100ms);
|
|
|
|
TTSS_Task_end();
|
|
}
|
|
|
|
//构造屏幕协议包
|
|
void constructor_scr_pkg()
|
|
{
|
|
U16 CRC = 0;
|
|
// L0_uart1_str("R.weight.kgx10_out: ");
|
|
// L0_uart1_us(R.weight.kgx10_out);
|
|
// L0_uart1_0d0a();
|
|
if(R.danwei == KG)
|
|
{
|
|
scrSetValPkg.weight_kgx100[0] = (R.weight.kgx10_out * 10) >> 8 & 0xFF;
|
|
scrSetValPkg.weight_kgx100[1] = (R.weight.kgx10_out * 10) >> 0 & 0xFF;
|
|
}
|
|
else if(R.danwei == lb) //1kg = 2.20462262磅
|
|
{
|
|
scrSetValPkg.weight_kgx100[0] = (R.weight.kgx10_out * 22) >> 8 & 0xFF;
|
|
scrSetValPkg.weight_kgx100[1] = (R.weight.kgx10_out * 22) >> 0 & 0xFF;
|
|
}
|
|
|
|
CRC = CRC_16(((U8 *)&scrSetValPkg) + 3, 5);
|
|
scrSetValPkg.crc[1] = CRC;
|
|
scrSetValPkg.crc[0] = CRC >> 8;
|
|
}
|
|
|
|
// 构造历史重量数据协议包
|
|
void constructor_weightsave_pkg()
|
|
{
|
|
U16 CRC = 0;
|
|
U8 i = 0;
|
|
|
|
for (i = 0; i < SCREEN_SAVE_LEN; i++)
|
|
{
|
|
scrSaveValPkg.weight_save[i].save_val[0] = (screen_save_arr[i].kgx100_out ) >> 8;
|
|
scrSaveValPkg.weight_save[i].save_val[1] = screen_save_arr[i].kgx100_out;
|
|
}
|
|
|
|
CRC = CRC_16(((U8 *)&scrSaveValPkg) + 3, 43);
|
|
scrSaveValPkg.crc[1] = CRC;
|
|
scrSaveValPkg.crc[0] = CRC >> 8;
|
|
}
|
|
|
|
// 屏幕回传协议解析 A55A 07 83 0000 01 0222 0000
|
|
// A55A 08 83 06D2 01 0001 3E90
|
|
void parse_screen_pkg()
|
|
{
|
|
SCReturnPkg *p = (SCReturnPkg *) ts_Urec[D_UART1].sp;
|
|
// p->ocr = p->buf[p->num[0] << 8 | p->num[1]];
|
|
L0_uart1_str("ts_Urec[D_UART1].sp = ");
|
|
L1_uart1_Array(p, sizeof(*p));
|
|
L0_uart1_0d0a();
|
|
// L0_uart1_str("sizeof(*p) = ");
|
|
// L0_uart1_ushex(sizeof(*p));
|
|
// L0_uart1_0d0a();
|
|
// L0_uart1_str("sizeof(&p) = ");
|
|
// L0_uart1_ushex(sizeof(&p));
|
|
|
|
if(p->head[0] == 0xA5 && p->head[1] == 0x5A/*count_ocr()*/)
|
|
{
|
|
if(p->cmd == 0x83)
|
|
{
|
|
R.ScrTouch_flag = 1;
|
|
R.power_mode = POWER_NORMAL;
|
|
R.ScrTouch_time = D_sys_now; //2024.9.13 15:04:59
|
|
// 按钮
|
|
if(p->start_addr[0] == 0x06)
|
|
{
|
|
switch (p->start_addr[1])
|
|
{
|
|
case 0xD0://菜单
|
|
break;
|
|
case 0xD1://Home
|
|
if(p->Data[1] == 1)
|
|
{
|
|
//返回键值为1时,代表从校准界面返回,清除图标
|
|
L1_uart1_Array((U8 *)&scrPkgIcon0ClearPkg, sizeof(scrPkgIcon0ClearPkg));
|
|
L1_uart1_Array((U8 *)&scrPkgIcon1ClearPkg, sizeof(scrPkgIcon1ClearPkg));
|
|
L1_uart1_Array((U8 *)&scrPkgIcon2ClearPkg, sizeof(scrPkgIcon2ClearPkg));
|
|
L1_uart1_Array((U8 *)&scrPkgIconYClearPkg, sizeof(scrPkgIconYClearPkg));
|
|
}
|
|
break;
|
|
case 0xD2://清零
|
|
if(p->Data[1] == 1)
|
|
{
|
|
tst_weight.kgx10_zero = tst_weight.kgx10;
|
|
}
|
|
break;
|
|
case 0xD3://离床报警
|
|
R.LeaveForbid_flag ^= 1;// R.LeaveForbid_flag = R.LeaveForbid_flag ^ 1;
|
|
// if(R.LeaveForbid_flag != LeaveForbid_OPEN)
|
|
// {
|
|
// R.LeaveForbid_flag = LeaveForbid_OPEN;
|
|
// L0_uart1_str("LeaveForbid_OPEN!!!");
|
|
// L0_uart1_0d0a();
|
|
// }
|
|
// else if(R.LeaveForbid_flag == LeaveForbid_OPEN)
|
|
// {
|
|
// R.LeaveForbid_flag = LeaveForbid_OFF;
|
|
// L0_uart1_str("LeaveForbid_OFF!!!");
|
|
// L0_uart1_0d0a();
|
|
// }
|
|
break;
|
|
case 0xD4://保存
|
|
if(p->Data[1] == 1)
|
|
{
|
|
// screen_save_push(tst_weight.kgx10);
|
|
screen_save_push(tst_weight.kgx10_out);
|
|
}
|
|
break;
|
|
case 0xD5://校准菜单按钮
|
|
// scrSetValPkg.buf.ui[1] = p->Data[1];
|
|
break;
|
|
case 0xD6://语言切换
|
|
R.Language = (R.Language == Chinese)? English : Chinese;
|
|
if( R.Language == Chinese )
|
|
{
|
|
// 切换回Chinese图标
|
|
L1_uart1_Array((U8 *)&scrPkgLanguageSwitchPkg, sizeof(scrPkgLanguageSwitchPkg));
|
|
}
|
|
break;
|
|
case 0xD7://重量单位切换
|
|
R.danwei = (R.danwei == KG)? lb : KG;
|
|
if( R.danwei == KG )
|
|
{
|
|
// 切换回KG单位图标
|
|
L1_uart1_Array((U8 *)&scrPkgUnitSwitchPkg, sizeof(scrPkgUnitSwitchPkg));
|
|
}
|
|
break;
|
|
case 0xD8://查看历史数据
|
|
// 1.从eeprom中读出数组
|
|
L0_Iap_Read_array(EEPROM_WEIGHT_ADDR, screen_save_arr,sizeof(screen_save_arr));
|
|
// 2.判断头尾
|
|
if(screen_save_arr[0].head[0] != HEAD0 || screen_save_arr[0].head[1] != HEAD1
|
|
|| screen_save_arr[0].tail[0] != TAIL0 || screen_save_arr[0].tail[1] != TAIL1)
|
|
{
|
|
screen_save_init();
|
|
}
|
|
// 3.推送到屏幕
|
|
// 构造pkg
|
|
constructor_weightsave_pkg();
|
|
// 发送pkg
|
|
L1_uart1_Array((U8 *)&scrSaveValPkg, sizeof(scrSaveValPkg));
|
|
break;
|
|
case 0xD9://校准确认
|
|
// ts_weight_SPara.ts_WPoint[pd485->buf[0]].kg = D_2uc_u16(pd485->buf[1],pd485->buf[2]);
|
|
ts_weight_SPara.ts_WPoint[R.calib_index].kg = R.calib_kg_x100 / 10;
|
|
ts_weight_SPara.ts_WPoint[R.calib_index].adc = tst_weight.adc32;//使用当前采样值
|
|
L4_WPoint_out();
|
|
// 写入IAP
|
|
L3_R_2_S();
|
|
L0_Iap_Program_array(D_EEP_BASE,D_struct2U8(S),D_S_LEN);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
// 数据录入(确认键)
|
|
else if(p->start_addr[0] == 0x07)
|
|
{
|
|
switch (p->start_addr[1])
|
|
{
|
|
case 0xA0://校准点
|
|
R.calib_index = 0;
|
|
L0_uart1_str("R.calib_index =");
|
|
L0_uart1_uchex(R.calib_index);
|
|
L0_uart1_0d0a();
|
|
break;
|
|
case 0xA1://校准点
|
|
R.calib_index = 1;
|
|
L0_uart1_str("R.calib_index =");
|
|
L0_uart1_uchex(R.calib_index);
|
|
L0_uart1_0d0a();
|
|
break;
|
|
case 0xA2://校准点
|
|
R.calib_index = 2;
|
|
L0_uart1_str("R.calib_index =");
|
|
L0_uart1_uchex(R.calib_index);
|
|
L0_uart1_0d0a();
|
|
break;
|
|
case 0xA3://校准体重
|
|
R.calib_kg_x100 = (U16)p->Data[0] << 8 | p->Data[1];
|
|
L0_uart1_str("R.calib_kg_x100 = ");
|
|
L0_uart1_ushex(R.calib_kg_x100);
|
|
L0_uart1_0d0a();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
// 亮屏时回传A5 5A 06 81 01 01 40 79 B8
|
|
// 给屏幕发送熄屏指令时,回传 A5 5A 06 81 01 01 00 78 48
|
|
if(p->cmd == 0x81 && p->num_word == 0x40 )
|
|
{
|
|
R.ScrTouch_flag = 1;
|
|
R.power_mode = POWER_NORMAL;
|
|
R.ScrTouch_time = D_sys_now;
|
|
}
|
|
}
|
|
}
|
|
|
|
//CRC校验 查表法
|
|
U16 CRC_16(U8 *pMsg, U16 Len)
|
|
{
|
|
U8 i;
|
|
U16 j;
|
|
U8 uchCRCHi = 0xFF;
|
|
U8 uchCRCLo = 0xFF;
|
|
while (Len--)
|
|
{
|
|
i = uchCRCHi ^ (*pMsg++);
|
|
uchCRCHi = uchCRCLo ^ auchCRCHi[i];
|
|
uchCRCLo = auchCRCLo[i];
|
|
}
|
|
j = (U16)uchCRCHi << 8 | uchCRCLo;
|
|
return j;
|
|
}
|
|
|
|
// 180s无操作 判定函数
|
|
void ScreenPingOff_judge()
|
|
{
|
|
U32 Nowtime = D_sys_now;
|
|
if( Nowtime - R.ScrTouch_time > D_COUNT_JIFFIES(60000)) //180000 180秒 30000 30秒 60000 60秒
|
|
{
|
|
R.ScrTouch_flag = 0;
|
|
R.power_mode = POWER_LOW;
|
|
}
|
|
}
|