#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;
|
}
|
}
|
}
|
}
|