#include "main.h" #include "upper_computer.h" #include "mbcrc.h" #include "string.h" #include "stdlib.h" #include "ir_nec.h" #include "time.h" #include "uart.h" #include "master_slave_inter.h" UC_RECV_PARA_T __attribute__((aligned(4))) uc_recv_para_g = {.uc_recv_flag = RESET}; // UC_PROTOCOL_HEAD_T uc_protocol_head_g; __IO static UC_LOGIN_STATUS uc_login_state_g = UC_UNKNOWN; // µÇ¼״̬ __IO uint8_t uc_return_flag_g = 0; // ½á¹û±ê־λ __IO static ErrorStatus_STM32 uc_rw_result_g = ERROR_1; // ¶Áд½á¹û static uint16_t local_random_code_g = 0; ///*Ëæ»úÂë¹¹Ôì*/ // uint16_t Upper_ComputerRandomCreated(void) //{ // srand(HAL_GetTick()); // return (rand() % 100) << 8 | (rand() % 100); // } /*ÉÏλ»úȨÏÞ»ñµÃ*/ uint16_t Upper_ComputerPermissionsGet(uint8_t data) { /*¸ù¾Ý109ÉÏλ»úЭÒéÉèÖÃV0.1¿ÉÖª*/ switch (data) { case 1: return UC_NORMAL_USER; case 2: return UC_POWER_USER; case 3: return UC_ADMIN_USER; case 100: return UC_SUPERUSER; default: break; } return UC_NORMAL_USER; } /*·µ»Ø½á¹ûУÑé·¢ËÍ*/ void Upper_ComputerResultCrcSend(uint8_t *pResultData, struct uc_protocol_head *uc_protocol_head_p) { uint16_t send_crc_check = 0, len = uc_protocol_head_p->data_field_length + UC_PROTOCOL_HEAD_LENGTH; __IO uint16_t bswap_16_temp[4]; bswap_16_temp[0] = BSWAP_16(uc_protocol_head_p->plant_number); bswap_16_temp[1] = BSWAP_16(uc_protocol_head_p->protocol_ver); bswap_16_temp[2] = BSWAP_16(uc_protocol_head_p->random_number); bswap_16_temp[3] = BSWAP_16(uc_protocol_head_p->data_field_length); memcpy(&pResultData[3], (uint16_t *)bswap_16_temp, sizeof(uint16_t) * 3); memcpy(&pResultData[10], (uint16_t *)&bswap_16_temp[3], sizeof(uint16_t)); send_crc_check = usMBCRC16(0xFFFF, pResultData, len); pResultData[len] = send_crc_check >> 8; // ¸ßλ pResultData[len + 1] = send_crc_check; IR_SEND_NORMAL(pResultData, len + 2); } /*µÇ¼½á¹û·µ»Ø´¦Àí*/ void Upper_ComputerLoginResultHandler(UC_LOGIN_STATUS result_state, uint8_t *pResultData, struct uc_protocol_head *uc_protocol_head_p) { /*¹¹ÔìÖ¡Í·½á¹¹Ìå*/ uc_protocol_head_p->random_number = local_random_code_g = UC_RANDOM_CREATED; // ¹¹ÔìËæ»úÂë uc_protocol_head_p->data_field_length = 1; /*°ÑÖ¡Í·½á¹¹ÌåÊý¾Ý¿½±´µ½·¢ËÍÊý×é*/ memcpy(pResultData, uc_protocol_head_p, UC_PROTOCOL_HEAD_LENGTH); /*¹¹ÔìÊý¾ÝÓò*/ pResultData[UC_PROTOCOL_HEAD_LENGTH] = result_state; } /*µÇ¼½ÓÊÕ´¦Àí*/ UC_LOGIN_STATUS Upper_ComputerLoginRecvHandler(struct uc_protocol_head *uc_protocol_head_p) { UC_PLANT_NUM plant_array[] = {UC_GENERAL, UC_IDEA_CREATED, UC_ENN, UC_GOLD_CARD}; // ³§¼ÒÊý×éÔªËØ¸öÊý uint8_t plant_array_num = sizeof(plant_array) >> 1; // µÈ¼ÛÓÚ / 2£¨²âÊÔµÃenumÀàÐÍÊÇËæ×űäÁ¿´óС¶ø¸Ä±äµÄ£¬È磺0x11¾ÍÒ»¸ö×Ö½Ú£¬0x222¾ÍÁ½¸ö×Ö½Ú£¬ // ËùÒÔsizeof(UC_PLANT_NUM) == 2£© for (uint8_t i = 0; i < plant_array_num; i++) { if (uc_protocol_head_p->plant_number == plant_array[i]) // ÓÐЧ³§¼Ò´úÂë break; if (i == plant_array_num - 1) return UC_PLANT_NUM_ERR; } // if(uc_protocol_head_p->protocol_ver != UC_PASSWORD) // return UC_PASSWORD_ERR; __SYS_DELAY_SEC_TIME_SET_(sys_active_time, UC_ACTIVE_TIME); // ÉèÖü¤»îʱ¼ä return UC_OK; } static uint8_t uc_temp_result_buffer[8][255] = {0}; /*·µ»ØÊý¾ÝÅäÖÃ*/ void Upper_Computer_ResultConfig(uint8_t *pSuccess_flag, uint8_t cmd_code) { if (*pSuccess_flag) // ½ÓÊÕÊý¾Ý½âÎö½á¹û³É¹¦ { *pSuccess_flag = 0; switch (cmd_code) // ¿ØÖÆÂë { case UC_CMD_LOGIN: Upper_ComputerLoginResultHandler(uc_login_state_g, &uc_temp_result_buffer[0][0], &uc_recv_para_g.uc_recv_buf_union.uc_protocol_head_s); break; case UC_CMD_EXIT: break; case UC_CMD_WRITE: case UC_CMD_IAP: Upper_ComputerWriteResultProcess(uc_rw_result_g, &uc_temp_result_buffer[0][0], &uc_recv_para_g.uc_recv_buf_union); break; case UC_CMD_READ: Upper_ComputerReadResultProcess(uc_rw_result_g, &uc_temp_result_buffer[0][0], &uc_recv_para_g.uc_recv_buf_union); break; case UC_CMD_GET_LOG_RECENT: break; case UC_CMD_GET_LOG_TIME: Upper_ComputerLogResultProcess(uc_rw_result_g, &uc_temp_result_buffer[0][0], &uc_recv_para_g.uc_recv_buf_union, &uc_send_log_para_g); break; default: break; } Upper_ComputerResultCrcSend(&uc_temp_result_buffer[0][0], &uc_recv_para_g.uc_recv_buf_union.uc_protocol_head_s); memset(uc_recv_para_g.uc_recv_buf_union.uc_recv_buf, 0, uc_recv_para_g.uc_recv_length); // Ó¦´ðÍêºóÇå¿Õ½ÓÊÕ // memset(uc_temp_result_buffer, 0, sizeof(uc_temp_result_buffer)); } } void Upper_ComputerCommProcess(UC_RECV_PARA_T *uc_rec_para_p) { IR_Uart5_Rx_DMA_CH5_Check(); /*½ÓÊÕÊý¾Ý·µ»ØÅäÖÃ*/ Upper_Computer_ResultConfig((uint8_t *)&uc_return_flag_g, uc_rec_para_p->uc_recv_buf_union.uc_protocol_head_s.cmd_code); // ½ÓÊÕÊý¾Ý±ê־λ if (uc_rec_para_p->uc_recv_flag) { uc_rec_para_p->uc_recv_flag = RESET; uint16_t ex_crc_len = uc_rec_para_p->uc_recv_length - 2; uint16_t recv_crc_check = uc_rec_para_p->uc_recv_buf_union.uc_recv_buf[ex_crc_len] << 8 | uc_rec_para_p->uc_recv_buf_union.uc_recv_buf[ex_crc_len + 1]; // ½ÓÊÕÊý¾ÝcrcÑéÖ¤£¨ÑéÖ¤Êý¾ÝÊÇ·ñÍêÕû£© if (recv_crc_check == usMBCRC16(0xFFFF, uc_rec_para_p->uc_recv_buf_union.uc_recv_buf, ex_crc_len)) { uc_return_flag_g = 1; // ·µ»Ø±ê־룬±íʾ½ÓÊÕÊý¾ÝÍêÕû£¬¿ÉÒÔ·µ»ØÊý¾Ý uc_rw_result_g = ERROR_1; // ½á¹û״̬Ïȸø´íÎó£¬ÕýÈ·µÄ»°ÔÙ¸³ÓèÕýÈ·¡£ /*Õë¶ÔÖ¡Í·µÄ´óС¶Ëת»»*/ uc_rec_para_p->uc_recv_buf_union.uc_protocol_head_s.plant_number = BSWAP_16(uc_rec_para_p->uc_recv_buf_union.uc_protocol_head_s.plant_number); uc_rec_para_p->uc_recv_buf_union.uc_protocol_head_s.protocol_ver = BSWAP_16(uc_rec_para_p->uc_recv_buf_union.uc_protocol_head_s.protocol_ver); uc_rec_para_p->uc_recv_buf_union.uc_protocol_head_s.random_number = BSWAP_16(uc_rec_para_p->uc_recv_buf_union.uc_protocol_head_s.random_number); uc_rec_para_p->uc_recv_buf_union.uc_protocol_head_s.data_field_length = BSWAP_16(uc_rec_para_p->uc_recv_buf_union.uc_protocol_head_s.data_field_length); uint16_t uc_table_id = uc_rec_para_p->uc_recv_buf_union.uc_recv_buf[UC_PROTOCOL_HEAD_LENGTH] << 8 | uc_rec_para_p->uc_recv_buf_union.uc_recv_buf[UC_PROTOCOL_HEAD_LENGTH + 1]; switch (uc_rec_para_p->uc_recv_buf_union.uc_recv_buf[9]) // ¿ØÖÆÂë { case UC_CMD_LOGIN: uc_login_state_g = Upper_ComputerLoginRecvHandler(&uc_recv_para_g.uc_recv_buf_union.uc_protocol_head_s); break; case UC_CMD_EXIT: local_random_code_g = 0; __SYS_DELAY_SEC_TIME_SET_(sys_active_time, SYS_WAKE_UP_TIME); break; case UC_CMD_WRITE: // µÇ¼³É¹¦ÇÒÔÚ¼¤»î״̬ÇÒËæ»úÂëÏàͬ if (uc_login_state_g == UC_OK && local_random_code_g == uc_rec_para_p->uc_recv_buf_union.uc_protocol_head_s.random_number) { uc_rw_result_g = Upper_ComputerWriteProcess(Upper_ComputerPermissionsGet(uc_rec_para_p->uc_recv_buf_union.uc_recv_buf[2]), uc_table_id, &uc_rec_para_p->uc_recv_buf_union.uc_recv_buf[UC_PROTOCOL_HEAD_LENGTH + UC_DATA_TABLE_BYTES_LENGTH]); __SYS_DELAY_SEC_TIME_SET_(sys_active_time, UC_ACTIVE_TIME); // ÖØÖü¤»îʱ¼ä } break; case UC_CMD_READ: if (uc_login_state_g == UC_OK && local_random_code_g == uc_rec_para_p->uc_recv_buf_union.uc_protocol_head_s.random_number) { uc_rw_result_g = Upper_ComputerReadProcess(Upper_ComputerPermissionsGet(uc_rec_para_p->uc_recv_buf_union.uc_recv_buf[2]), uc_table_id, &uc_temp_result_buffer[0][UC_PROTOCOL_HEAD_LENGTH + UC_DATA_TABLE_BYTES_LENGTH]); __SYS_DELAY_SEC_TIME_SET_(sys_active_time, UC_ACTIVE_TIME); // ÖØÖü¤»îʱ¼ä } break; case UC_CMD_GET_LOG_RECENT: // °´×î½ü break; case UC_CMD_GET_LOG_TIME: // °´Ê±¼ä if (uc_login_state_g == UC_OK && local_random_code_g == uc_rec_para_p->uc_recv_buf_union.uc_protocol_head_s.random_number) { uc_rw_result_g = Upper_ComputerLogProcess(Upper_ComputerPermissionsGet(uc_rec_para_p->uc_recv_buf_union.uc_recv_buf[2]), &uc_rec_para_p->uc_recv_buf_union.uc_recv_buf[UC_PROTOCOL_HEAD_LENGTH], &uc_temp_result_buffer[0][UC_PROTOCOL_HEAD_LENGTH + UC_DATA_TABLE_BYTES_LENGTH + UC_LOG_NUM_AND_FLAG_LENGTH]); __SYS_DELAY_SEC_TIME_SET_(sys_active_time, UC_ACTIVE_TIME); // ÖØÖü¤»îʱ¼ä } break; case UC_CMD_IAP: uc_rw_result_g = Upper_ComputerIapProcess(uc_table_id, &uc_rec_para_p->uc_recv_buf_union.uc_recv_buf[UC_PROTOCOL_HEAD_LENGTH + UC_DATA_TABLE_BYTES_LENGTH]); __SYS_DELAY_SEC_TIME_SET_(sys_active_time, UC_ACTIVE_TIME); // ÖØÖü¤»îʱ¼ä break; default: break; } } } }