#include "user_server.h" #include "user_nfc.h" #include "user_charge.h" #include "user_elect.h" #include "user_led.h" #include "dip_sw.h" tmosTaskID user_server_task_id = INVALID_TASK_ID; static uint32_t offline_timeout = CAN_OFFLINE_TIMEOUT_DEFAULT / USER_SERVER_INTERVAL; static bool offline_stat = false; static uint8_t can_idx = 0xFF; static key_data_s key_data = { .elect_stat = { .left_key_elect_stat = 0, .right_key_elect_stat = 0, }, .key_stat = { .left_key_stat = 0, .left_charge_stat = 0, .right_key_stat = 0, .right_charge_stat = 0, }, .left_key_id = 0, .right_key_id = 0, }; static can_open_data_s can_open_data; /******************************************************************************* * @函数名称 prvUser_server_dev_type_protocol * @函数说明 设备类型索引解析 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_server_dev_type_protocol(void) { if(can_open_data.subidx == REG_DEV_TYPE_SUBIDX) { if(can_open_data.ins == S_INS_RD) { can_open_data_s s_data; s_data.ins = R_INS_RD_WORD; s_data.idx = REG_DEV_TYPE_IDX; s_data.subidx = REG_DEV_TYPE_SUBIDX; s_data.data[0] = DEV_TYPE; s_data.data[1] = DEV_TYPE >> 8; s_data.data[2] = 0; s_data.data[3] = 0; vUser_can_send_data((uint8_t *)&s_data, 8); } else{ can_open_data_s s_data; s_data.ins = can_open_data.ins; s_data.idx = REG_DEV_TYPE_IDX; s_data.subidx = REG_DEV_TYPE_SUBIDX; memset(s_data.data, 0, 4); vUser_can_send_data((uint8_t *)&s_data, 8); } } } /******************************************************************************* * @函数名称 prvUser_server_version_protocol * @函数说明 版本号索引解析 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_server_version_protocol(void) { if(can_open_data.subidx == REG_VERSION_SUBIDX) { if(can_open_data.ins == S_INS_RD) { can_open_data_s s_data; s_data.ins = R_INS_RD_DWORD; s_data.idx = REG_VERSION_IDX; s_data.subidx = REG_VERSION_SUBIDX; s_data.data[0] = HARDWARE_VERSION; s_data.data[1] = HARDWARE_VERSION >> 8; s_data.data[2] = SOFTWARE_VERSION; s_data.data[3] = SOFTWARE_VERSION >> 8; vUser_can_send_data((uint8_t *)&s_data, 8); } else{ can_open_data_s s_data; s_data.ins = can_open_data.ins; s_data.idx = REG_VERSION_IDX; s_data.subidx = REG_VERSION_SUBIDX; memset(s_data.data, 0, 4); vUser_can_send_data((uint8_t *)&s_data, 8); } } } /******************************************************************************* * @函数名称 prvUser_server_key_stat_protocol * @函数说明 钥匙索引解析 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_server_key_stat_protocol(void) { if(can_open_data.subidx == REG_KEY_STAT_SUBIDX) { if(can_open_data.ins == S_INS_RD) { can_open_data_s s_data; s_data.ins = R_INS_RD_WORD; s_data.idx = REG_KEY_STAT_IDX; s_data.subidx = REG_KEY_STAT_SUBIDX; memset(s_data.data, 0, 4); memcpy(s_data.data,(uint8_t *)&(key_data.key_stat), 2); vUser_can_send_data((uint8_t *)&s_data, 8); } else{ can_open_data_s s_data; s_data.ins = can_open_data.ins; s_data.idx = REG_KEY_STAT_IDX; s_data.subidx = REG_KEY_STAT_SUBIDX; memset(s_data.data, 0, 4); vUser_can_send_data((uint8_t *)&s_data, 8); } } } /******************************************************************************* * @函数名称 prvUser_server_elect_stat_protocol * @函数说明 电磁锁控制索引解析 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_server_elect_stat_protocol(void) { if(can_open_data.subidx == REG_ELECT_STAT_SUBIDX) { if(can_open_data.ins == S_INS_RD) { can_open_data_s s_data; s_data.ins = R_INS_RD_WORD; s_data.idx = REG_ELECT_STAT_IDX; s_data.subidx = REG_ELECT_STAT_SUBIDX; memset(s_data.data, 0, 4); memcpy(s_data.data,(uint8_t *)&(key_data.elect_stat), 2); vUser_can_send_data((uint8_t *)&s_data, 8); } else if(can_open_data.ins == S_INS_WR_WORD) { key_elect_control_s elect; memcpy((uint8_t *)&elect, (uint8_t *)&can_open_data.data, 2); can_open_data_s s_data; s_data.ins = R_INS_WR_SUCC; s_data.idx = REG_ELECT_STAT_IDX; s_data.subidx = REG_ELECT_STAT_SUBIDX; memset(s_data.data, 0, 4); memcpy(s_data.data,(uint8_t *)&elect, 2); vUser_can_send_data((uint8_t *)&s_data, 8); if(elect.left_elect_enable == 1) { set_elect_work_stat(LEFT_IDX, (elect.left_elect_control == 1)?true:false); } if(elect.right_elect_enable == 1) { set_elect_work_stat(RIGHT_IDX, (elect.right_elect_control == 1)?true:false); } if(elect.left_charge_enable == 1) { set_user_charge_Queue((elect.left_charge_control == 1)?CHARGE_QUEUE_LEFT_OPEN:CHARGE_QUEUE_LEFT_CLOSE); } if(elect.right_charge_enable == 1) { set_user_charge_Queue((elect.left_charge_control == 1)?CHARGE_QUEUE_RIGHT_OPEN:CHARGE_QUEUE_RIGHT_CLOSE); } } else{ can_open_data_s s_data; s_data.ins = can_open_data.ins; s_data.idx = REG_ELECT_STAT_IDX; s_data.subidx = REG_ELECT_STAT_SUBIDX; memset(s_data.data, 0, 4); vUser_can_send_data((uint8_t *)&s_data, 8); } } } /******************************************************************************* * @函数名称 prvUser_server_left_key_id_protocol * @函数说明 左边钥匙NFC号索引解析 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_server_left_key_id_protocol(void) { if(can_open_data.subidx == REG_LEFT_KEY_ID_SUBIDX) { if(can_open_data.ins == S_INS_RD) { can_open_data_s s_data; s_data.ins = R_INS_RD_DWORD; s_data.idx = REG_LEFT_KEY_ID_IDX; s_data.subidx = REG_LEFT_KEY_ID_SUBIDX; memcpy(s_data.data,(uint8_t *)&(key_data.left_key_id), 4); vUser_can_send_data((uint8_t *)&s_data, 8); } else{ can_open_data_s s_data; s_data.ins = can_open_data.ins; s_data.idx = REG_LEFT_KEY_ID_IDX; s_data.subidx = REG_LEFT_KEY_ID_SUBIDX; memset(s_data.data, 0, 4); vUser_can_send_data((uint8_t *)&s_data, 8); } } } /******************************************************************************* * @函数名称 prvUser_server_right_key_id_protocol * @函数说明 右边钥匙NFC号索引解析 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_server_right_key_id_protocol(void) { if(can_open_data.subidx == REG_RIGHT_KEY_ID_SUBIDX) { if(can_open_data.ins == S_INS_RD) { can_open_data_s s_data; s_data.ins = R_INS_RD_DWORD; s_data.idx = REG_RIGHT_KEY_ID_IDX; s_data.subidx = REG_RIGHT_KEY_ID_SUBIDX; memset(s_data.data, 0, 4); memcpy(s_data.data,(uint8_t *)&(key_data.right_key_id), 4); vUser_can_send_data((uint8_t *)&s_data, 8); } else{ can_open_data_s s_data; s_data.ins = can_open_data.ins; s_data.idx = REG_RIGHT_KEY_ID_IDX; s_data.subidx = REG_RIGHT_KEY_ID_SUBIDX; memset(s_data.data, 0, 4); vUser_can_send_data((uint8_t *)&s_data, 8); } } } /******************************************************************************* * @函数名称 prvUser_server_can_protocol * @函数说明 can总线协议解析 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_server_can_protocol(void) { bool stat = false; switch(can_open_data.idx) { case REG_DEV_TYPE_IDX:prvUser_server_dev_type_protocol();stat = true;break; case REG_VERSION_IDX:prvUser_server_version_protocol();stat = true;break; case REG_KEY_STAT_IDX:prvUser_server_key_stat_protocol();stat = true;break; case REG_ELECT_STAT_IDX:prvUser_server_elect_stat_protocol();stat = true;break; case REG_LEFT_KEY_ID_IDX:prvUser_server_left_key_id_protocol();stat = true;break; case REG_RIGHT_KEY_ID_IDX:prvUser_server_right_key_id_protocol();stat = true;break; default:break; } if(stat == true) { offline_timeout = CAN_OFFLINE_TIMEOUT_DEFAULT / USER_SERVER_INTERVAL; if(offline_stat == true) { offline_stat = false; vUser_led_set_alarm_view(LED_ALL_ALARM_OFFLINE, false); } } } /******************************************************************************* * @函数名称 ble_action_rst_pro * @函数说明 重启倒计时 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static uint8_t rst_timeout = 5; static void ble_action_rst_pro(void) { if(rst_timeout == 0) { /* Software reset */ NVIC_SystemReset(); } else{ rst_timeout--; PRINT("Restart countdown %d second\n", rst_timeout); } } /******************************************************************************* * @函数名称 prvUser_server_can_offline_check * @函数说明 CAN总线离线检测 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_server_can_offline_check(void) { if(offline_timeout > 0) { if(offline_timeout == 1) { if(offline_stat == false) { offline_stat = true; vUser_led_set_alarm_view(LED_ALL_ALARM_OFFLINE, true); } } offline_timeout--; } } /******************************************************************************* * @函数名称 user_server_task_process_event * @函数说明 task的event处理回调函数,需要在注册task时候,传进去 * @输入参数 task_id:任务ID events:事件 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static uint16_t user_server_task_process_event(uint8_t task_id, uint16_t events) { //event 处理 if(events & (1 << SERVER_QUEUE_TIME)) { prvUser_server_can_offline_check(); return (events ^ (1 << SERVER_QUEUE_TIME)); //异或的方式清除该事件运行标志,并返回未运行的事件标志 } if(events & (1 << SERVER_QUEUE_CAN)) { prvUser_server_can_protocol(); return (events ^ (1 << SERVER_QUEUE_CAN)); //异或的方式清除该事件运行标志,并返回未运行的事件标志 } if(events & (1 < 0) { vUser_led_set_alarm_view(LED_ALL_ALARM_CAN_IDX_ERROR, false); } else{ vUser_led_set_alarm_view(LED_ALL_ALARM_CAN_IDX_ERROR, true); } } } /******************************************************************************* * @函数名称 vUser_server_init * @函数说明 初始化 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ void vUser_server_init(void) { vUser_can_set_recv_data_func(prvUser_can_recv_data_callback); vUser_nfc_set_upload_key_stat_func(prvUser_nfc_upload_card_callback); vUser_elect_set_upload_stat_func(vUser_elect_upload_stat_callback); vUser_charge_set_upload_stat_func(vUser_charge_upload_stat_callback); vDipsw_set_upload_func(prvDipsw_upload_callback); user_server_task_id = TMOS_ProcessEventRegister(user_server_task_process_event); PRINT("user_server_task_id=%d\n", user_server_task_id); }