|
|
|
#include "oscar.h"
|
|
|
|
|
|
|
|
osThreadId_t Oscar_Handle;
|
|
|
|
const osThreadAttr_t Oscar_attributes = {
|
|
|
|
.name = "OSCAR",
|
|
|
|
.stack_size = 1024,
|
|
|
|
.priority = (osPriority_t)osPriorityBelowNormal,
|
|
|
|
};
|
|
|
|
|
|
|
|
// 事件
|
|
|
|
osEventFlagsId_t Oscar_EventHandle;
|
|
|
|
const osEventFlagsAttr_t Oscar_Event_attributes = {
|
|
|
|
.name = "Oscar_Event"};
|
|
|
|
|
|
|
|
extern UART_HandleTypeDef huart1;
|
|
|
|
UART_HandleTypeDef *pOscarUart = &huart1;
|
|
|
|
|
|
|
|
uint8_t Oscar_SN_Command[8] = {0x01, 0x03, 0x00, 0x0A, 0x00, 0x05, 0xA5, 0xCB};
|
|
|
|
|
|
|
|
static uint8_t Oscar_Wavelength_Trans_Buf[2][8] = {
|
|
|
|
//01 03 08 36 00 7A 26 47 (2102 122)
|
|
|
|
//01 03 08 B0 00 7A C7 AE (2224 122)
|
|
|
|
{0x01, 0x03, 0x08, 0x36, 0x00, 0x7A, 0x26, 0x47},
|
|
|
|
{0x01, 0x03, 0x08, 0xB0, 0x00, 0x7A, 0xC7, 0xAE}};
|
|
|
|
static uint8_t Oscar_Data_Trans_Buf[2][8] = {
|
|
|
|
// 01 03 0A 36 00 7A 27 FF (2614 122)
|
|
|
|
// 01 03 0A B0 00 7A C6 16 (2736 122)
|
|
|
|
{0x01, 0x03, 0x0A, 0x36, 0x00, 0x7A, 0x27, 0xFF},
|
|
|
|
{0x01, 0x03, 0x0A, 0xB0, 0x00, 0x7A, 0xC6, 0x16}};
|
|
|
|
uint8_t Oscar_sn_buf[15] = {0};
|
|
|
|
|
|
|
|
// uint8_t Oscar_TEST_BUF[8] ={0x01, 0x03, 0x00, 0x00, 0x00, 0x04, 0x44, 0x09};
|
|
|
|
// uint8_t Oscar_TEST_BUF2[8] ={0x01, 0x03, 0x00, 0x00, 0x00, 0x04, 0x44, 0x09};
|
|
|
|
// uint8_t Oscar_TRANS_BUF[8] ={0x01, 0x03, 0x00, 0x00, 0x00, 0x04, 0x44, 0x09};
|
|
|
|
uint8_t Oscar_RCV_BUF[1024] = {0};
|
|
|
|
|
|
|
|
UART_HELPER_TypeDef *Oscar_uart_helper;
|
|
|
|
|
|
|
|
Oscar_TypeDef oscar = {
|
|
|
|
Oscar_Init,
|
|
|
|
Oscar_Port,
|
|
|
|
Oscar_Test,
|
|
|
|
Oscar_Start,
|
|
|
|
Oscar_Stop,
|
|
|
|
NULL,
|
|
|
|
0, // state
|
|
|
|
0, // data_ok
|
|
|
|
{0}, // buf
|
|
|
|
0, // size_received
|
|
|
|
0, // time base
|
|
|
|
1000, // timeout ticks, 1000ms = 1S
|
|
|
|
0, // event_flag
|
|
|
|
0, // wavelength_ok
|
|
|
|
NULL, // transRecord[3]
|
|
|
|
};
|
|
|
|
|
|
|
|
int Oscar_Init()
|
|
|
|
{
|
|
|
|
Oscar_uart_helper = UART_HELPER_Init();
|
|
|
|
|
|
|
|
if (Oscar_uart_helper == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
// TODO 接口
|
|
|
|
UART_HELPER_Set_Huart(Oscar_uart_helper, pOscarUart);
|
|
|
|
UART_HELPER_Set_Interface_Type(Oscar_uart_helper, Uart_Interface_Max3160_485);
|
|
|
|
|
|
|
|
// 传输
|
|
|
|
UART_HELPER_Setup_Trans_mode(Oscar_uart_helper, Uart_Trans_DMA);
|
|
|
|
// UART_HELPER_Setup_Rcv_mode( Oscar_uart_helper, Uart_Trans_IT );
|
|
|
|
UART_HELPER_Set_enable_idle(Oscar_uart_helper, Uart_IDLE_IT_ENABLE);
|
|
|
|
|
|
|
|
// 回调GPIO 操作 数据操作
|
|
|
|
UART_HELPER_Set_trans_GPIO(Oscar_uart_helper, Oscar_Trans_GPIO); // enbale rcv
|
|
|
|
UART_HELPER_Set_trans_cplt_GPIO(Oscar_uart_helper, Oscar_Trans_Cplt_GPIO);
|
|
|
|
|
|
|
|
UART_HELPER_Set_Callback(Oscar_uart_helper, &oscar, Oscar_CallBack);
|
|
|
|
|
|
|
|
// 设置 Buf, 如果启用消息队列,不启用trans_buf
|
|
|
|
UART_HELPER_Set_Rcv_Buf(Oscar_uart_helper, Oscar_RCV_BUF, sizeof(Oscar_RCV_BUF));
|
|
|
|
// UART_HELPER_Set_Trans_Buf(Oscar_uart_helper, Oscar_SN_Command, sizeof(Oscar_SN_Command));
|
|
|
|
|
|
|
|
// GPIO 操作
|
|
|
|
switch (Oscar_uart_helper->interface_type)
|
|
|
|
{
|
|
|
|
case Uart_Interface_Default:
|
|
|
|
break;
|
|
|
|
case Uart_Interface_485:
|
|
|
|
usart6_send_enable();
|
|
|
|
break;
|
|
|
|
case Uart_Interface_Max3160_232:
|
|
|
|
Oscar_MAX3160_232();
|
|
|
|
break;
|
|
|
|
case Uart_Interface_Max3160_485:
|
|
|
|
max3160_485_receive_mode();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
oscar.state = Oscar_State_Waiting;
|
|
|
|
oscar.timebase_ticks = osKernelGetTickCount();
|
|
|
|
|
|
|
|
// TODO enable trans queue
|
|
|
|
// 最大队列数 8, 消息类型, 值传递(内含的buf为指针,如何包含大空间的buf,可选择指针传递 )
|
|
|
|
oscar.transQueue = osMessageQueueNew(8, sizeof(Record_Trans_Rcv_TypeDef), NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Oscar_Port()
|
|
|
|
{
|
|
|
|
Oscar_Handle = osThreadNew(Oscar_Task, NULL, &Oscar_attributes);
|
|
|
|
// Oscar_EventHandle = osEventFlagsNew( &Oscar_Event_attributes );
|
|
|
|
}
|
|
|
|
|
|
|
|
int Oscar_Test()
|
|
|
|
{
|
|
|
|
// 装载要发送的消息队列
|
|
|
|
oscar.transRecord[0].size = sizeof(Oscar_SN_Command);
|
|
|
|
oscar.transRecord[0].buf = Oscar_SN_Command;
|
|
|
|
|
|
|
|
// log_i( " oscar.transRecord[0] buf %d, addr %d " , oscar.transRecord[0].buf[0], oscar.transRecord[0].buf );
|
|
|
|
// log_i( " Oscar_TEST_BUF buf %d, addr %d " ,Oscar_TEST_BUF[0], Oscar_TEST_BUF );
|
|
|
|
osMessageQueuePut(oscar.transQueue, (void *)&oscar.transRecord[0], 0, osWaitForever);
|
|
|
|
// 改变操作状态
|
|
|
|
oscar.state = Oscar_State_Test; // 操作状态
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Oscar_Wavelength()
|
|
|
|
{
|
|
|
|
// 装载要发送的消息队列 , 注意队列大小及
|
|
|
|
oscar.transRecord[0].size = sizeof(Oscar_SN_Command);
|
|
|
|
oscar.transRecord[0].buf = Oscar_Wavelength_Trans_Buf[0];
|
|
|
|
osMessageQueuePut(oscar.transQueue, (void *)&oscar.transRecord[0], 0, osWaitForever);
|
|
|
|
|
|
|
|
oscar.transRecord[1].size = sizeof(Oscar_SN_Command);
|
|
|
|
oscar.transRecord[1].buf = Oscar_Wavelength_Trans_Buf[1];
|
|
|
|
osMessageQueuePut(oscar.transQueue, (void *)&oscar.transRecord[1], 0, osWaitForever);
|
|
|
|
|
|
|
|
// oscar.state = Oscar_State_Get_WAVELENGTH; // 操作状态
|
|
|
|
// osEventFlagsSet( Oscar_EventHandle, Oscar_Event_Get_Data ); // 事件
|
|
|
|
}
|
|
|
|
|
|
|
|
void Oscar_Start()
|
|
|
|
{
|
|
|
|
// 装载要发送的消息队列 , 注意队列大小及
|
|
|
|
oscar.transRecord[0].size = sizeof(Oscar_SN_Command);
|
|
|
|
oscar.transRecord[0].buf = Oscar_Data_Trans_Buf[0];
|
|
|
|
osMessageQueuePut(oscar.transQueue, (void *)&oscar.transRecord[0], 0, osWaitForever);
|
|
|
|
|
|
|
|
oscar.transRecord[1].size = sizeof(Oscar_SN_Command);
|
|
|
|
oscar.transRecord[1].buf = Oscar_Data_Trans_Buf[1];
|
|
|
|
osMessageQueuePut(oscar.transQueue, (void *)&oscar.transRecord[1], 0, osWaitForever);
|
|
|
|
|
|
|
|
oscar.state = Oscar_State_Get_DATA; // 操作状态
|
|
|
|
// osEventFlagsSet( Oscar_EventHandle, Oscar_Event_Get_Data ); // 事件
|
|
|
|
}
|
|
|
|
|
|
|
|
void Oscar_Stop()
|
|
|
|
{
|
|
|
|
oscar.state = Oscar_State_Stop;
|
|
|
|
// TODO stop task?
|
|
|
|
}
|
|
|
|
|
|
|
|
void Oscar_Task()
|
|
|
|
{
|
|
|
|
// log_i( " ph tran mode : %d ", oscar.->trans_mode );
|
|
|
|
// memset( Oscar_RCV_Buf, 0, 2*Oscar_Rcv_Buf_Size ); /* ph*3 ph *2 否则内存泄漏 */
|
|
|
|
oscar.event_flag = 0;
|
|
|
|
uint64_t ticks;
|
|
|
|
int err_con = 0;
|
|
|
|
int st;
|
|
|
|
Record_Trans_Rcv_TypeDef msgQueue; // 消息队列
|
|
|
|
int queue_seq = 0; // 队列的计数
|
|
|
|
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
switch (oscar.state)
|
|
|
|
{
|
|
|
|
case Oscar_State_Waiting:
|
|
|
|
log_d(" Viper task..... : %d %d ", oscar.state, oscar.state);
|
|
|
|
osDelay(20);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Oscar_State_Test:
|
|
|
|
// log_i( " temp test..... : %d QueueGetCount %d " , oscar.state , osMessageQueueGetCount(oscar.transQueue) );
|
|
|
|
if (osMessageQueueGetCount(oscar.transQueue) == 0)
|
|
|
|
{
|
|
|
|
oscar.state = Oscar_State_Error;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
// 取队列 值传递, 第三个参数为NULL 否则为消息长度
|
|
|
|
osMessageQueueGet( oscar.transQueue, &msgQueue, sizeof(Record_Trans_Rcv_TypeDef), osWaitForever );
|
|
|
|
// log_i( " msgQueue %d %d " , msgQueue.size, msgQueue.buf );
|
|
|
|
// log_i( " msgQueue %d " , Oscar_TEST_BUF );
|
|
|
|
oscar.state = Oscar_State_Test_Start;
|
|
|
|
continue;
|
|
|
|
|
|
|
|
case Oscar_State_Test_Start:
|
|
|
|
// log_i( " temp Oscar_State_Test_Start..... : %d %d " , oscar.state , oscar.state );
|
|
|
|
ticks = osKernelGetTickCount();
|
|
|
|
UART_HELPER_Set_Trans_Buf(Oscar_uart_helper, msgQueue.buf, msgQueue.size);
|
|
|
|
// HAL_UARTEx_ReceiveToIdle_DMA(&huart1, Oscar_RCV_BUF,1024);
|
|
|
|
Oscar_Receive();
|
|
|
|
Oscar_Transmit();
|
|
|
|
oscar.state = Oscar_State_SN_Getting;
|
|
|
|
continue;
|
|
|
|
|
|
|
|
case Oscar_State_SN_Getting:
|
|
|
|
log_d( " Oscar_ State_SN_Getting..... : %d %d " , oscar.state , oscar.state );
|
|
|
|
if ( (osKernelGetTickCount() - ticks) > 2000 )
|
|
|
|
{
|
|
|
|
log_d( " Oscar_ State_SN_Getting -> retry: %d " , err_con++ );
|
|
|
|
// err_con++;
|
|
|
|
if (err_con > 5)
|
|
|
|
{
|
|
|
|
log_w(" Oscar_ testing ******** error ");
|
|
|
|
oscar.state = Oscar_State_Error;
|
|
|
|
}
|
|
|
|
oscar.state = Oscar_State_Test_Start; // 重新发送取出来的队列
|
|
|
|
}
|
|
|
|
osDelay(200);
|
|
|
|
continue;
|
|
|
|
|
|
|
|
case Oscar_State_SN_OK:
|
|
|
|
// SN 数据 拷贝
|
|
|
|
memcpy( oscar.oscarsn_buf , oscar.result_buf, oscar.size_received );
|
|
|
|
log_i("Oscar_ SN : %c %c %c %c"
|
|
|
|
, oscar.oscarsn_buf[9] , oscar.oscarsn_buf[10], oscar.oscarsn_buf[11], oscar.oscarsn_buf[12] );
|
|
|
|
|
|
|
|
// 获得序列号 状态OK
|
|
|
|
osEventFlagsSet(Oscar_EventHandle, Oscar_Event_Ready);
|
|
|
|
|
|
|
|
// TODO 判断队列是否有元素
|
|
|
|
if (osMessageQueueGetCount(oscar.transQueue) == 0)
|
|
|
|
{
|
|
|
|
oscar.state = Oscar_State_Get_WAVELENGTH;
|
|
|
|
// TODO 停止DMA
|
|
|
|
if (Oscar_uart_helper->rcv_mode == Uart_Trans_DMA)
|
|
|
|
{
|
|
|
|
HAL_UART_DMAStop(Oscar_uart_helper->huart);
|
|
|
|
}
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
osMessageQueueGet(oscar.transQueue, &msgQueue, sizeof(Record_Trans_Rcv_TypeDef), osWaitForever);
|
|
|
|
// osEventFlagsClear( Oscar_EventHandle, Oscar_Event_Test_OK );
|
|
|
|
oscar.state = Oscar_State_Test_Start;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Oscar_State_Get_WAVELENGTH:
|
|
|
|
log_i(" get wavelenth ..... ");
|
|
|
|
if (oscar.wavelength_ok == 1)
|
|
|
|
{
|
|
|
|
oscar.state = Oscar_State_Ready;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
Oscar_Wavelength();
|
|
|
|
oscar.state = Oscar_State_Get_DATA;
|
|
|
|
osDelay(1);
|
|
|
|
continue;
|
|
|
|
|
|
|
|
case Oscar_State_Ready:
|
|
|
|
// log_d( " Oscar_ State_Ready ..... " );
|
|
|
|
osDelay(1);
|
|
|
|
continue;
|
|
|
|
|
|
|
|
case Oscar_State_Get_DATA:
|
|
|
|
log_i(" Oscar_ State_Get_DATA ..... ");
|
|
|
|
oscar.data_ok = 0;
|
|
|
|
oscar.size_received = 0;
|
|
|
|
memset( oscar.result_buf, 0, sizeof(oscar.result_buf) );
|
|
|
|
osEventFlagsClear(Oscar_EventHandle, Oscar_Event_Get_Data);
|
|
|
|
|
|
|
|
// 队列是否有值
|
|
|
|
if (osMessageQueueGetCount(oscar.transQueue) == 0)
|
|
|
|
{
|
|
|
|
oscar.state = Oscar_State_Error;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
osMessageQueueGet(oscar.transQueue, &msgQueue, sizeof(Record_Trans_Rcv_TypeDef), osWaitForever);
|
|
|
|
|
|
|
|
oscar.state = Oscar_State_Get_DATA_Trans;
|
|
|
|
continue;
|
|
|
|
case Oscar_State_Get_DATA_Trans:
|
|
|
|
log_i(" Oscar_ State_Get_DATA Trans ..... ");
|
|
|
|
ticks = osKernelGetTickCount();
|
|
|
|
UART_HELPER_Set_Trans_Buf(Oscar_uart_helper, msgQueue.buf, msgQueue.size);
|
|
|
|
Oscar_Receive();
|
|
|
|
Oscar_Transmit();
|
|
|
|
oscar.state = Oscar_State_Get_DATA_Wait;
|
|
|
|
continue;
|
|
|
|
case Oscar_State_Get_DATA_Wait:
|
|
|
|
if (osKernelGetTickCount() - ticks > 2000)
|
|
|
|
{
|
|
|
|
err_con++;
|
|
|
|
if (err_con > 3)
|
|
|
|
{
|
|
|
|
log_w(" Oscar_ wait ....... error ");
|
|
|
|
oscar.state = Oscar_State_Error;
|
|
|
|
}
|
|
|
|
oscar.state = Oscar_State_Get_DATA_Trans;
|
|
|
|
}
|
|
|
|
osDelay(1);
|
|
|
|
continue;
|
|
|
|
|
|
|
|
case Oscar_State_Get_DATA_OK:
|
|
|
|
log_d(" Oscar_ one_measurement data ok ... ");
|
|
|
|
oscar.data_ok = 0;
|
|
|
|
oscar.state = Oscar_State_Get_DATA_Check;
|
|
|
|
continue;
|
|
|
|
|
|
|
|
case Oscar_State_Get_DATA_Check:
|
|
|
|
log_d(" Oscar_ data check ******** ");
|
|
|
|
|
|
|
|
// validate
|
|
|
|
if ( Oscar_Validate() != 1 )
|
|
|
|
{
|
|
|
|
oscar.state = Oscar_State_Error;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (oscar.wavelength_ok == 0)
|
|
|
|
{
|
|
|
|
// WL 数据 拷贝
|
|
|
|
memcpy( oscar.Oscar_Wavelength_Buf[queue_seq], oscar.result_buf, oscar.size_received );
|
|
|
|
oscar.state = Oscar_State_Get_Queue_MSG;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (oscar.wavelength_ok == 1)
|
|
|
|
{
|
|
|
|
// DATA 数据 拷贝
|
|
|
|
memcpy( oscar.Oscar_Data_Buf[queue_seq], oscar.result_buf, oscar.size_received );
|
|
|
|
oscar.state = Oscar_State_Get_Queue_MSG;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
osDelay(10);
|
|
|
|
continue;
|
|
|
|
|
|
|
|
case Oscar_State_Get_Queue_MSG:
|
|
|
|
log_d(" Oscar_ State_Get_Queue_MSG ........ msg queue count: %d msg_seq %d",
|
|
|
|
osMessageQueueGetCount(oscar.transQueue), queue_seq);
|
|
|
|
// 处理DMA 相关事宜 ---DMA
|
|
|
|
|
|
|
|
// 队列是否有值
|
|
|
|
if (osMessageQueueGetCount(oscar.transQueue) > 0)
|
|
|
|
{
|
|
|
|
log_d(" Queue_MSG count>0 ........ ");
|
|
|
|
queue_seq++;
|
|
|
|
oscar.state = Oscar_State_Get_DATA;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
queue_seq = 0;
|
|
|
|
oscar.state = Oscar_State_Ready;
|
|
|
|
continue;
|
|
|
|
|
|
|
|
case Oscar_State_Stop:
|
|
|
|
// log_d(" Oscar_ state stop ..... ");
|
|
|
|
osDelay(10);
|
|
|
|
continue;
|
|
|
|
|
|
|
|
case Oscar_State_Timeout:
|
|
|
|
log_e(" Oscar_ timeout ..... ");
|
|
|
|
oscar.state = Oscar_State_Waiting;
|
|
|
|
// TODO 停止DMA
|
|
|
|
if ( Oscar_uart_helper->rcv_mode == Uart_Trans_DMA )
|
|
|
|
{
|
|
|
|
HAL_UART_DMAStop( Oscar_uart_helper->huart );
|
|
|
|
}
|
|
|
|
osDelay(5);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Oscar_State_Error:
|
|
|
|
log_e(" Oscar_ error ..... ");
|
|
|
|
oscar.state = Oscar_State_Waiting;
|
|
|
|
// TODO 停止DMA
|
|
|
|
if ( Oscar_uart_helper->rcv_mode == Uart_Trans_DMA )
|
|
|
|
{
|
|
|
|
HAL_UART_DMAStop( Oscar_uart_helper->huart );
|
|
|
|
}
|
|
|
|
osDelay(5);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
osDelay(20);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Oscar_Trans_GPIO(void)
|
|
|
|
{
|
|
|
|
// HAL_GPIO_WritePin(R_W_GPIO_Port,R_W_Pin, SET);
|
|
|
|
// HAL_GPIO_WritePin(NULL,0, SET);
|
|
|
|
HAL_GPIO_WritePin(SEL_232_485_GPIO_Port, SEL_232_485_Pin, SET);
|
|
|
|
HAL_GPIO_WritePin(HDPLX_GPIO_Port, HDPLX_Pin, RESET);
|
|
|
|
HAL_GPIO_WritePin(DE485_GPIO_Port, DE485_Pin, SET);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Oscar_Trans_Cplt_GPIO(void)
|
|
|
|
{
|
|
|
|
// HAL_GPIO_WritePin(R_W_GPIO_Port,R_W_Pin, RESET);
|
|
|
|
// HAL_GPIO_WritePin(NULL,0, RESET);
|
|
|
|
HAL_GPIO_WritePin(SEL_232_485_GPIO_Port, SEL_232_485_Pin, SET);
|
|
|
|
HAL_GPIO_WritePin(HDPLX_GPIO_Port, HDPLX_Pin, SET);
|
|
|
|
HAL_GPIO_WritePin(DE485_GPIO_Port, DE485_Pin, RESET);
|
|
|
|
}
|
|
|
|
|
|
|
|
int Oscar_Transmit()
|
|
|
|
{
|
|
|
|
// TODO 结合队列
|
|
|
|
oscar.size_received = 0;
|
|
|
|
if (Oscar_uart_helper->transferring == 0)
|
|
|
|
{
|
|
|
|
return UART_HELPER_Trans(Oscar_uart_helper, Oscar_uart_helper->trans_record->buf, Oscar_uart_helper->trans_record->size);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int Oscar_Receive()
|
|
|
|
{
|
|
|
|
return UART_HELPER_Start_Rcv(Oscar_uart_helper, Oscar_uart_helper->rcv_buf, Oscar_uart_helper->rcv_size);
|
|
|
|
// return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Oscar_Set_Timeout_ms(uint64_t ms_ticks)
|
|
|
|
{
|
|
|
|
oscar.timeout_ticks = ms_ticks;
|
|
|
|
}
|
|
|
|
|
|
|
|
int Oscar_Validate()
|
|
|
|
{
|
|
|
|
return CRC16_Check(oscar.result_buf ,oscar.size_received);
|
|
|
|
}
|
|
|
|
|
|
|
|
int Oscar_CallBack(Oscar_TypeDef *pOscar, uint8_t *buf, uint16_t size)
|
|
|
|
{
|
|
|
|
log_d(" Oscar_CallBack -- state %d size %d", oscar.state, size);
|
|
|
|
|
|
|
|
uint16_t size_tmp;
|
|
|
|
size_tmp = size;
|
|
|
|
switch (oscar.state)
|
|
|
|
{
|
|
|
|
case Oscar_State_SN_Getting:
|
|
|
|
if (size == 0) return 0;
|
|
|
|
|
|
|
|
// 添加数据
|
|
|
|
if ( (size + oscar.size_received) >= sizeof(oscar.result_buf) )
|
|
|
|
{
|
|
|
|
size_tmp = sizeof(oscar.result_buf) - oscar.size_received;
|
|
|
|
}
|
|
|
|
// // log_d(" copy sn %d %d ", size,size_tmp);
|
|
|
|
memcpy((uint32_t)(oscar.result_buf + oscar.size_received), Oscar_uart_helper->rcv_buf, size_tmp);
|
|
|
|
oscar.size_received += size_tmp;
|
|
|
|
|
|
|
|
// Modbus 最小长度5
|
|
|
|
if ( oscar.size_received < 5 ) return 0;
|
|
|
|
|
|
|
|
// Modbus 长度校验
|
|
|
|
if ( oscar.size_received == ( oscar.result_buf[2] + 5 ) )
|
|
|
|
{
|
|
|
|
oscar.state++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Oscar_State_Get_DATA_Wait:
|
|
|
|
if ( size == 0 ) return 0;
|
|
|
|
|
|
|
|
// 添加数据
|
|
|
|
if ( (size + oscar.size_received) >= sizeof(oscar.result_buf) )
|
|
|
|
{
|
|
|
|
size_tmp = sizeof(oscar.result_buf) - oscar.size_received;
|
|
|
|
}
|
|
|
|
memcpy((uint32_t)(oscar.result_buf + oscar.size_received), Oscar_uart_helper->rcv_buf, size_tmp);
|
|
|
|
oscar.size_received += size_tmp;;
|
|
|
|
|
|
|
|
// Modbus 最小长度5
|
|
|
|
if (oscar.size_received<5) return 0;
|
|
|
|
|
|
|
|
// Modbus 长度校验
|
|
|
|
if ( oscar.size_received == ( oscar.result_buf[2] + 5 ) )
|
|
|
|
{
|
|
|
|
oscar.state++;
|
|
|
|
}
|
|
|
|
|
|
|
|
// if (Oscar_uart_helper->enable_idle_it == 0)
|
|
|
|
// {
|
|
|
|
// // Modbus 长度校验,拷贝数据?
|
|
|
|
// if (oscar.size_received == (oscar.result_buf[2] + 5))
|
|
|
|
// {
|
|
|
|
// oscar.state++;
|
|
|
|
// }
|
|
|
|
// return 0;
|
|
|
|
// }
|
|
|
|
// if (Oscar_uart_helper->enable_idle_it == 1)
|
|
|
|
// {
|
|
|
|
// // 长度校验,拷贝数据?
|
|
|
|
// if (oscar.size_received == (oscar.result_buf[2] + 5))
|
|
|
|
// {
|
|
|
|
// oscar.state++;
|
|
|
|
// }
|
|
|
|
// return 0;
|
|
|
|
// }
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// void Oscar_Set_Interface( Oscar_TypeDef *ph, UartInterface_TypeDef * interface )
|
|
|
|
// {
|
|
|
|
// UartHelper_Set_Interface( oscar.uarthelper, interface );
|
|
|
|
// }
|
|
|
|
// void Oscar_Set_Huart( Oscar_TypeDef *ph, UART_HandleTypeDef * huart )
|
|
|
|
// {
|
|
|
|
// oscar.uarthelper->huart = huart;
|
|
|
|
// // UartHelper_Set_Huart( oscar.uarthelper, huart );
|
|
|
|
// }
|
|
|
|
// void Oscar_Set_Interface_Type( Oscar_TypeDef *ph, Uart_Interface_Type_Typedef interface_type )
|
|
|
|
// {
|
|
|
|
// oscar.interface_type = interface_type;
|
|
|
|
// oscar.uarthelper->interface_type = interface_type;
|
|
|
|
// UartInterface_Setup_Interface_type( oscar.uarthelper->interface ,oscar.interface_type);
|
|
|
|
// }
|