|
|
|
#include "PH.h"
|
|
|
|
|
|
|
|
osThreadId_t PH_Handle;
|
|
|
|
const osThreadAttr_t PH_attributes = {
|
|
|
|
.name = "PH",
|
|
|
|
.stack_size = 1024,
|
|
|
|
.priority = (osPriority_t) osPriorityBelowNormal,
|
|
|
|
};
|
|
|
|
|
|
|
|
// 事件
|
|
|
|
osEventFlagsId_t PH_EventHandle;
|
|
|
|
const osEventFlagsAttr_t PH_Event_attributes = {
|
|
|
|
.name = "PH_Event"
|
|
|
|
};
|
|
|
|
|
|
|
|
extern UART_HandleTypeDef huart3;
|
|
|
|
UART_HandleTypeDef *pPHUart = &huart3;
|
|
|
|
|
|
|
|
uint8_t PH_TEST_BUF[8] ={0x01, 0x03, 0x00, 0x00, 0x00, 0x04, 0x44, 0x09};
|
|
|
|
uint8_t PH_TRANS_BUF[8] ={0x01, 0x03, 0x00, 0x00, 0x00, 0x04, 0x44, 0x09};
|
|
|
|
uint8_t PH_RCV_BUF[13] ={0};
|
|
|
|
|
|
|
|
UART_HELPER_TypeDef *ph_uart_helper;
|
|
|
|
|
|
|
|
PH_TypeDef ph ={
|
|
|
|
PH_Init,
|
|
|
|
PH_Port,
|
|
|
|
PH_Test,
|
|
|
|
PH_Start,
|
|
|
|
PH_Stop,
|
|
|
|
NULL,
|
|
|
|
0, // state
|
|
|
|
0, // data_ok
|
|
|
|
{0}, // buf
|
|
|
|
0, // size_received
|
|
|
|
0, // time base
|
|
|
|
1000, // timeout ticks, 1000ms = 1S
|
|
|
|
0, // event_flag
|
|
|
|
};
|
|
|
|
|
|
|
|
int PH_Init( )
|
|
|
|
{
|
|
|
|
ph_uart_helper = UART_HELPER_Init( );
|
|
|
|
|
|
|
|
if (ph_uart_helper ==NULL) return -1;
|
|
|
|
|
|
|
|
// TODO 接口
|
|
|
|
UART_HELPER_Set_Huart( ph_uart_helper, pPHUart );
|
|
|
|
UART_HELPER_Set_Interface_Type(ph_uart_helper, Uart_Interface_Max3160_485);
|
|
|
|
|
|
|
|
// 传输
|
|
|
|
UART_HELPER_Setup_Trans_mode( ph_uart_helper, Uart_Trans_DMA);
|
|
|
|
// UART_HELPER_Setup_Rcv_mode( ph_uart_helper, Uart_Trans_IT );
|
|
|
|
UART_HELPER_Set_enable_idle( ph_uart_helper, Uart_IDLE_IT_ENABLE);
|
|
|
|
|
|
|
|
// 回调GPIO 操作 数据操作
|
|
|
|
UART_HELPER_Set_trans_GPIO( ph_uart_helper, PH_Trans_GPIO ); // enbale rcv
|
|
|
|
UART_HELPER_Set_trans_cplt_GPIO( ph_uart_helper, PH_Trans_Cplt_GPIO );
|
|
|
|
|
|
|
|
UART_HELPER_Set_Callback( ph_uart_helper,&ph, PH_CallBack );
|
|
|
|
|
|
|
|
// 设置 Buf
|
|
|
|
UART_HELPER_Set_Rcv_Buf(ph_uart_helper, PH_RCV_BUF, sizeof(PH_RCV_BUF));
|
|
|
|
UART_HELPER_Set_Trans_Buf( ph_uart_helper, PH_TRANS_BUF, sizeof(PH_TRANS_BUF) );
|
|
|
|
|
|
|
|
// GPIO 操作
|
|
|
|
switch (ph_uart_helper->interface_type)
|
|
|
|
{
|
|
|
|
case Uart_Interface_Default:
|
|
|
|
break;
|
|
|
|
case Uart_Interface_485:
|
|
|
|
usart6_send_enable();
|
|
|
|
break;
|
|
|
|
case Uart_Interface_Max3160_232:
|
|
|
|
PH_MAX3160_232();
|
|
|
|
break;
|
|
|
|
case Uart_Interface_Max3160_485:
|
|
|
|
max3160_485_receive_mode();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
ph.state = PH_State_Waiting;
|
|
|
|
ph.timebase_ticks = osKernelGetTickCount( );
|
|
|
|
}
|
|
|
|
|
|
|
|
void PH_Port( )
|
|
|
|
{
|
|
|
|
PH_Handle = osThreadNew( PH_Task, NULL, &PH_attributes );
|
|
|
|
// PH_EventHandle = osEventFlagsNew(&PH_Event_attributes);
|
|
|
|
}
|
|
|
|
|
|
|
|
int PH_Test( )
|
|
|
|
{
|
|
|
|
ph.state = PH_State_Test; // 操作状态
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void PH_Start( )
|
|
|
|
{
|
|
|
|
ph.state = PH_State_Get_DATA; // 操作状态
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void PH_Stop( )
|
|
|
|
{
|
|
|
|
ph.state = PH_State_Stop;
|
|
|
|
// TODO stop task?
|
|
|
|
}
|
|
|
|
|
|
|
|
void PH_Task( )
|
|
|
|
{
|
|
|
|
// memset( PH_RCV_Buf, 0, 2*PH_Rcv_Buf_Size ); /* ph*3 ph *2 否则内存泄漏 */
|
|
|
|
ph.event_flag = 0;
|
|
|
|
uint64_t ticks;
|
|
|
|
int err_con = 0;
|
|
|
|
int st;
|
|
|
|
for ( ; ; )
|
|
|
|
{
|
|
|
|
switch (ph.state)
|
|
|
|
{
|
|
|
|
case PH_State_Waiting:
|
|
|
|
log_i( " ph task..... : %d %d " , ph.state , ph.state );
|
|
|
|
osDelay(20);
|
|
|
|
break;
|
|
|
|
case PH_State_Test:
|
|
|
|
ph.state = PH_State_Test_Start;
|
|
|
|
continue;
|
|
|
|
case PH_State_Test_Start:
|
|
|
|
UART_HELPER_Set_Trans_Buf( ph_uart_helper, PH_TEST_BUF, sizeof(PH_TEST_BUF) );
|
|
|
|
PH_Receive();
|
|
|
|
PH_Transmit();
|
|
|
|
ticks = osKernelGetTickCount();
|
|
|
|
err_con = 0;
|
|
|
|
ph.state = PH_State_Testing;
|
|
|
|
continue;
|
|
|
|
case PH_State_Testing:
|
|
|
|
if ( osKernelGetTickCount() - ticks > 2000 )
|
|
|
|
{
|
|
|
|
err_con++;
|
|
|
|
if( err_con >3)
|
|
|
|
{
|
|
|
|
log_w( " PH testing ******** error " );
|
|
|
|
ph.state = PH_State_Error;
|
|
|
|
}
|
|
|
|
ph.state = PH_State_Test;
|
|
|
|
}
|
|
|
|
osDelay(1);
|
|
|
|
continue;
|
|
|
|
case PH_State_Test_OK:
|
|
|
|
log_i( " ph test ok..... : %d %d " , ph.state , ph.state );
|
|
|
|
ph.state = PH_State_Ready;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case PH_State_Ready:
|
|
|
|
osDelay(1);
|
|
|
|
continue;
|
|
|
|
case PH_State_Get_DATA:
|
|
|
|
ph.data_ok = 0 ;
|
|
|
|
ph.size_received = 0 ;
|
|
|
|
memset( ph.result_buf, 0, sizeof(ph.result_buf) );
|
|
|
|
UART_HELPER_Set_Trans_Buf( ph_uart_helper, PH_TRANS_BUF, sizeof(PH_TRANS_BUF) );
|
|
|
|
PH_Receive();
|
|
|
|
PH_Transmit();
|
|
|
|
ticks = osKernelGetTickCount();
|
|
|
|
err_con = 0;
|
|
|
|
ph.state = PH_State_Get_DATA_Wait;
|
|
|
|
continue;
|
|
|
|
case PH_State_Get_DATA_Wait:
|
|
|
|
if ( osKernelGetTickCount() - ticks > 2000 )
|
|
|
|
{
|
|
|
|
err_con++;
|
|
|
|
if( err_con >3)
|
|
|
|
{
|
|
|
|
log_w( " PH testing ******** error " );
|
|
|
|
ph.state = PH_State_Error;
|
|
|
|
}
|
|
|
|
ph.state = PH_State_Get_DATA;
|
|
|
|
}
|
|
|
|
osDelay(1);
|
|
|
|
continue;
|
|
|
|
case PH_State_Get_DATA_OK:
|
|
|
|
log_w( " PH data ok ******** " );
|
|
|
|
// TODO 停止DMA
|
|
|
|
if (ph_uart_helper->rcv_mode == Uart_Trans_DMA)
|
|
|
|
{
|
|
|
|
HAL_UART_DMAStop( ph_uart_helper->huart );
|
|
|
|
}
|
|
|
|
ph.data_ok = 1 ;
|
|
|
|
ph.state = PH_Statee_Get_DATA_Check ;
|
|
|
|
continue;
|
|
|
|
case PH_Statee_Get_DATA_Check:
|
|
|
|
log_w( " PH data check ******** " );
|
|
|
|
if(PH_Validate( )== 0)
|
|
|
|
{
|
|
|
|
ph.state = PH_State_Stop;
|
|
|
|
}else{
|
|
|
|
ph.state = PH_State_Error;
|
|
|
|
}
|
|
|
|
|
|
|
|
osDelay(10);
|
|
|
|
continue;
|
|
|
|
case PH_State_Stop:
|
|
|
|
log_d(" ph stop, aftetr deal, change to ready....");
|
|
|
|
osDelay(10);
|
|
|
|
continue;
|
|
|
|
|
|
|
|
case PH_State_Timeout:
|
|
|
|
log_e( " pH timeout ..... " );
|
|
|
|
ph.state = PH_State_Waiting ;
|
|
|
|
// TODO 停止DMA
|
|
|
|
if (ph_uart_helper->rcv_mode == Uart_Trans_DMA)
|
|
|
|
{
|
|
|
|
HAL_UART_DMAStop( ph_uart_helper->huart );
|
|
|
|
}
|
|
|
|
osDelay(5);
|
|
|
|
break;
|
|
|
|
case PH_State_Error:
|
|
|
|
log_e( " pH error ..... " );
|
|
|
|
ph.state = PH_State_Waiting ;
|
|
|
|
// TODO 停止DMA
|
|
|
|
if (ph_uart_helper->rcv_mode == Uart_Trans_DMA)
|
|
|
|
{
|
|
|
|
HAL_UART_DMAStop( ph_uart_helper->huart );
|
|
|
|
}
|
|
|
|
osDelay(5);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
osDelay(20);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void PH_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 PH_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 PH_Transmit()
|
|
|
|
{
|
|
|
|
// TODO 结合队列
|
|
|
|
ph.size_received =0;
|
|
|
|
if( ph_uart_helper->transferring == 0)
|
|
|
|
{
|
|
|
|
return UART_HELPER_Trans(ph_uart_helper, ph_uart_helper->trans_record->buf, ph_uart_helper->trans_record->size );
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int PH_Receive()
|
|
|
|
{
|
|
|
|
return UART_HELPER_Start_Rcv(ph_uart_helper, ph_uart_helper->rcv_buf, ph_uart_helper->rcv_size);
|
|
|
|
// return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void PH_Set_Timeout_ms( uint64_t ms_ticks )
|
|
|
|
{
|
|
|
|
ph.timeout_ticks = ms_ticks;
|
|
|
|
}
|
|
|
|
|
|
|
|
int PH_Validate( )
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int PH_CallBack( PH_TypeDef *pPH, uint8_t *buf, uint16_t size )
|
|
|
|
{
|
|
|
|
log_i( " PH_CallBack -- state %d " , ph.state);
|
|
|
|
uint16_t size_tmp;
|
|
|
|
size_tmp =size;
|
|
|
|
switch (ph.state)
|
|
|
|
{
|
|
|
|
case PH_State_Testing:
|
|
|
|
if (size>0)
|
|
|
|
{
|
|
|
|
ph.state++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case PH_State_Get_DATA_Wait:
|
|
|
|
if (size == 0) return 0;
|
|
|
|
if ((size + ph.size_received) >= sizeof(ph.result_buf) )
|
|
|
|
{
|
|
|
|
size_tmp = sizeof(ph.result_buf) - ph.size_received;
|
|
|
|
}
|
|
|
|
memcpy( (uint32_t)(ph.result_buf+ph.size_received), ph_uart_helper->rcv_buf,size_tmp);
|
|
|
|
ph.size_received += size_tmp;
|
|
|
|
|
|
|
|
if ( ph_uart_helper->enable_idle_it == 0 )
|
|
|
|
{
|
|
|
|
// Modbus 长度校验,拷贝数据?
|
|
|
|
if( ph.size_received == ( ph.result_buf[2]+ 5 ) )
|
|
|
|
{
|
|
|
|
ph.state++;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if ( ph_uart_helper->enable_idle_it == 1 )
|
|
|
|
{
|
|
|
|
// 长度校验,拷贝数据?
|
|
|
|
if( ph.size_received == ( ph.result_buf[2]+ 5 ) )
|
|
|
|
{
|
|
|
|
ph.state++;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// CRCValue = HAL_CRC_Calculate(&hcrc, (uint32_t *)dataBuffer, BUFFER_SIZE);
|
|
|
|
|
|
|
|
// void PH_Set_Interface( PH_TypeDef *ph, UartInterface_TypeDef * interface )
|
|
|
|
// {
|
|
|
|
// UartHelper_Set_Interface( ph.uarthelper, interface );
|
|
|
|
// }
|
|
|
|
// void PH_Set_Huart( PH_TypeDef *ph, UART_HandleTypeDef * huart )
|
|
|
|
// {
|
|
|
|
// ph.uarthelper->huart = huart;
|
|
|
|
// // UartHelper_Set_Huart( ph.uarthelper, huart );
|
|
|
|
// }
|
|
|
|
// void PH_Set_Interface_Type( PH_TypeDef *ph, Uart_Interface_Type_Typedef interface_type )
|
|
|
|
// {
|
|
|
|
// ph.interface_type = interface_type;
|
|
|
|
// ph.uarthelper->interface_type = interface_type;
|
|
|
|
// UartInterface_Setup_Interface_type( ph.uarthelper->interface ,ph.interface_type);
|
|
|
|
// }
|