#include "task_bedalarm.h" #include "app_config.h" #include "../msp/uart/msp_uart1.h" #include "../bsp/TTSSbsp/bsp_config.h" S_TASK_Bed_ALARM _s_task_bed_alarm; // A5 5A 08 82 06 D3 01 00 00 FF 7D 清除报警图标 SCRSetPkg scrPkgAlarmClearPkg = { 0xA5, 0x5A, 0x08, //指令字节长度(不含帧头) 0x82, //指令 0x06, 0xD3, //变量存储地址 0x01, //数据字长度 0x00,0x00, // 数据内容 0xFF,0x7D, // CRC }; //============================================= void L3_task_bed_alarm_init(void) { L1_task_init(&_s_task_bed_alarm.task); _s_task_bed_alarm.mode_flag = R.LeaveForbid_flag; L3_task_s_go(_s_task_bed_alarm,D_task_init); } #define D_task_JUDGE 0x50 #define D_task_ALARM_DELETE 0x51 // _____beep-on_____模式开_____beep-off___ // 离床作为主体,beep为辅 _____模式关_____/ \____模式关___ void L3_task_bed_alarm_handler(S_TASK_Bed_ALARM *s) { TTSS_Task_init(): L2_task_go(D_task_JUDGE); //判定是否触发报警 TTSS_Task_step(D_task_JUDGE): //模式开启情况下,蜂鸣器不响的时候 if(R.LeaveForbid_flag == LeaveForbid_OPEN && R.beep == beep_off) { // R.weight.differ = R.Weight_Ref - D_get_weight(); R.weight.differ = R.Weight_Ref - R.weight.kgx10_out; //只用输出值来判断 // 检测到体重变化超10kg if( R.weight.differ > 50) // 50 5kg 100 10kg { R.beep = beep_on; L0_uart1_str("Enter Alarm->"); L0_uart1_0d0a(); R.beep_startime = D_sys_now; } } //模式开启情况下,蜂鸣器响的时候 if (R.LeaveForbid_flag == LeaveForbid_OPEN && R.beep == beep_on) { // 检测到时间超时 if (D_sys_now - R.beep_startime > D_COUNT_JIFFIES(30000)) { R.beep = beep_off; L0_uart1_str("Overtime!! Quit Alarm ->"); L0_uart1_0d0a(); R.Weight_Ref = 0; R.beep_startime = 0; R.LeaveForbid_flag = LeaveForbid_OFF; //A5 5A 08 83 06 D3 01 00 00 FE AC解除报警时,清除图标 L1_uart1_Array((U8 *)&scrPkgAlarmClearPkg, sizeof(scrPkgAlarmClearPkg)); } } // 模式标志为关闭 if (R.LeaveForbid_flag == LeaveForbid_OFF) { // 而上一刻的是打开,说明是手动解除报警 if (_s_task_bed_alarm.mode_flag == LeaveForbid_OPEN) { if (R.beep == beep_on) { R.beep = beep_off; L0_uart1_str("Manually dismiss! Quit Alarm ->"); } L0_uart1_str("Manually dismiss mode!!"); L0_uart1_0d0a(); R.Weight_Ref = 0; R.beep_startime = 0; L1_uart1_Array((U8 *)&scrPkgAlarmClearPkg, sizeof(scrPkgAlarmClearPkg)); } } // 模式标志为打开 else if (R.LeaveForbid_flag == LeaveForbid_OPEN) { // 而上一刻的是关闭,说明是手动打开了模式 if (_s_task_bed_alarm.mode_flag == LeaveForbid_OFF) { // R.Weight_Ref = D_get_weight();//记录下参考重量(计算出的实际重量值) R.Weight_Ref = R.weight.kgx10_out;//记录下参考重量(计算出的实际重量值) L0_uart1_str("LeaveForbid_OPEN!!!"); L0_uart1_0d0a(); } } _s_task_bed_alarm.mode_flag = R.LeaveForbid_flag; TTSS_Task_end(); } /* R.weight.differ = R.Weight_Ref - R.weight.kgx10_out; if(R.LeaveForbid_flag == LeaveForbid_OPEN) { //触发报警 //取绝对值abs(); if( R.weight.differ > 50 ) //&& R.beep != beep_on R.weight.differ { L0_uart1_str("R.weight.differ:"); L0_uart1_ushex(R.weight.differ); L0_uart1_0d0a(); L0_uart1_str("R.Weight_Ref:"); L0_uart1_ushex(R.Weight_Ref); L0_uart1_0d0a(); R.beep = beep_on; // D_LED1_ON(); L0_uart1_str("Enter Alarm->"); L0_uart1_0d0a(); R.beep_startime = D_sys_now; L2_task_go_Tdelay(D_task_ALARM_DELETE, D_Tdelay_200ms); } //未触发报警 } else { L2_task_go_Tdelay(D_task_ALARM_JUDGE, D_Tdelay_200ms); } //判定是否解除报警 TTSS_Task_step(D_task_ALARM_DELETE): //超时解除 if(D_sys_now - R.beep_startime > D_COUNT_JIFFIES(30000)) //5000 5秒 30000 30秒 { R.beep = beep_off; L0_uart1_str("Overtime!! Jump Alarm ->"); L0_uart1_0d0a(); // D_LED1_OFF(); R.beep_startime = 0; R.LeaveForbid_flag = LeaveForbid_OFF; //A5 5A 08 83 06 D3 01 00 00 FE AC解除报警时,清除图标 // L1_uart1_Array((U8 *)&scrPkgAlarmClearPkg, sizeof(scrPkgAlarmClearPkg)); L2_task_go_Tdelay(D_task_ALARM_JUDGE, D_Tdelay_200ms); } else if(R.LeaveForbid_flag == LeaveForbid_OFF) { R.beep = beep_off; L0_uart1_str("Manually dismiss!! Jump Alarm->"); L0_uart1_0d0a(); // D_LED1_OFF(); R.beep_startime = 0; // R.LeaveForbid_flag = LeaveForbid_OFF; //A5 5A 08 83 06 D3 01 00 00 FE AC解除报警时,清除图标 // L1_uart1_Array((U8 *)&scrPkgAlarmClearPkg, sizeof(scrPkgAlarmClearPkg)); L2_task_go_Tdelay(D_task_ALARM_JUDGE, D_Tdelay_200ms); } else L2_task_go_Tdelay(D_task_ALARM_DELETE, D_Tdelay_200ms); * */