#include "user_server.h" #include "user_nfc.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 lock_data_s lock_data = { .lock_stat = 0, .elect_stat = 0, .lock_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 = R_INS_WR_FAIL; 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 = R_INS_WR_FAIL; 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_lock_stat_protocol * @函数说明 挂锁索引解析 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_server_lock_stat_protocol(void) { if(can_open_data.subidx == REG_LOCK_STAT_SUBIDX) { if(can_open_data.ins == S_INS_RD) { can_open_data_s s_data; s_data.ins = R_INS_RD_BYTE; s_data.idx = REG_LOCK_STAT_IDX; s_data.subidx = REG_LOCK_STAT_SUBIDX; memset(s_data.data, 0, 4); memcpy(s_data.data,(uint8_t *)&(lock_data.lock_stat), 1); vUser_can_send_data((uint8_t *)&s_data, 8); } else{ can_open_data_s s_data; s_data.ins = R_INS_WR_FAIL; s_data.idx = REG_LOCK_STAT_IDX; s_data.subidx = REG_LOCK_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 *)&(lock_data.elect_stat), 2); vUser_can_send_data((uint8_t *)&s_data, 8); } else if(can_open_data.ins == S_INS_WR_WORD) { uint16_t temp = 0; memcpy((uint8_t *)&temp, (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 *)&temp, 2); vUser_can_send_data((uint8_t *)&s_data, 8); for(int i = 0; i < LOCK_COUNT; i++) { if((temp & (1 << (i + 8))) != 0) { if((temp & (1 << i)) != 0) { set_elect_work_stat(i, true); } else{ set_elect_work_stat(i, false); } } } } else{ can_open_data_s s_data; s_data.ins = R_INS_WR_FAIL; 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_lock_id_protocol * @函数说明 挂锁NFC号索引解析 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_server_lock_id_protocol(void) { if(can_open_data.subidx == REG_LOCK_01_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_LOCK_ID_IDX; s_data.subidx = REG_LOCK_01_ID_SUBIDX; memset(s_data.data, 0, 4); s_data.data[0] = lock_data.lock_id[0][3]; s_data.data[1] = lock_data.lock_id[0][2]; s_data.data[2] = lock_data.lock_id[0][1]; s_data.data[3] = lock_data.lock_id[0][0]; vUser_can_send_data((uint8_t *)&s_data, 8); } else{ can_open_data_s s_data; s_data.ins = R_INS_WR_FAIL; s_data.idx = REG_LOCK_ID_IDX; s_data.subidx = REG_LOCK_01_ID_SUBIDX; memset(s_data.data, 0, 4); vUser_can_send_data((uint8_t *)&s_data, 8); } } else if(can_open_data.subidx == REG_LOCK_02_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_LOCK_ID_IDX; s_data.subidx = REG_LOCK_02_ID_SUBIDX; memset(s_data.data, 0, 4); s_data.data[0] = lock_data.lock_id[1][3]; s_data.data[1] = lock_data.lock_id[1][2]; s_data.data[2] = lock_data.lock_id[1][1]; s_data.data[3] = lock_data.lock_id[1][0]; vUser_can_send_data((uint8_t *)&s_data, 8); } else{ can_open_data_s s_data; s_data.ins = R_INS_WR_FAIL; s_data.idx = REG_LOCK_ID_IDX; s_data.subidx = REG_LOCK_02_ID_SUBIDX; memset(s_data.data, 0, 4); vUser_can_send_data((uint8_t *)&s_data, 8); } } else if(can_open_data.subidx == REG_LOCK_03_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_LOCK_ID_IDX; s_data.subidx = REG_LOCK_03_ID_SUBIDX; memset(s_data.data, 0, 4); s_data.data[0] = lock_data.lock_id[2][3]; s_data.data[1] = lock_data.lock_id[2][2]; s_data.data[2] = lock_data.lock_id[2][1]; s_data.data[3] = lock_data.lock_id[2][0]; vUser_can_send_data((uint8_t *)&s_data, 8); } else{ can_open_data_s s_data; s_data.ins = R_INS_WR_FAIL; s_data.idx = REG_LOCK_ID_IDX; s_data.subidx = REG_LOCK_03_ID_SUBIDX; memset(s_data.data, 0, 4); vUser_can_send_data((uint8_t *)&s_data, 8); } } else if(can_open_data.subidx == REG_LOCK_04_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_LOCK_ID_IDX; s_data.subidx = REG_LOCK_04_ID_SUBIDX; memset(s_data.data, 0, 4); s_data.data[0] = lock_data.lock_id[3][3]; s_data.data[1] = lock_data.lock_id[3][2]; s_data.data[2] = lock_data.lock_id[3][1]; s_data.data[3] = lock_data.lock_id[3][0]; vUser_can_send_data((uint8_t *)&s_data, 8); } else{ can_open_data_s s_data; s_data.ins = R_INS_WR_FAIL; s_data.idx = REG_LOCK_ID_IDX; s_data.subidx = REG_LOCK_04_ID_SUBIDX; memset(s_data.data, 0, 4); vUser_can_send_data((uint8_t *)&s_data, 8); } } else if(can_open_data.subidx == REG_LOCK_05_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_LOCK_ID_IDX; s_data.subidx = REG_LOCK_05_ID_SUBIDX; memset(s_data.data, 0, 4); s_data.data[0] = lock_data.lock_id[4][3]; s_data.data[1] = lock_data.lock_id[4][2]; s_data.data[2] = lock_data.lock_id[4][1]; s_data.data[3] = lock_data.lock_id[4][0]; vUser_can_send_data((uint8_t *)&s_data, 8); } else{ can_open_data_s s_data; s_data.ins = R_INS_WR_FAIL; s_data.idx = REG_LOCK_ID_IDX; s_data.subidx = REG_LOCK_05_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_LOCK_STAT_IDX:{ prvUser_server_lock_stat_protocol(); stat = true; }break; case REG_ELECT_STAT_IDX:{ prvUser_server_elect_stat_protocol(); stat = true; }break; case REG_LOCK_ID_IDX:{ prvUser_server_lock_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); 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); }