不含stm32 底层的代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
MyStm32Code/device/Src/Ramses.c

702 lines
24 KiB

/**
* @file Ramses.c
* @author Chen Jihang (embedded@eseaoptics.com)
* @brief trios公司光谱仪驱动
* @version 1.0
* @date 2023-01-04
*
* @copyright ESEA (c) 2020
*
*/
#include <string.h>
#include <math.h>
#include "Ramses.h"
#include "elog.h"
#include "FreeRTOS.h"
#include "cmsis_os.h"
#include "usart.h"
#if 1
// #include "endian.h"
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
static uint8_t Ramses_SN_command[8] = {0x23, 0x00, 0x08, 0x0B, 0x00, 0x00, 0x00, 0x01};
static uint8_t Ramses_Data_command[8] = {0x23, 0x00, 0x00, 0x80, 0xA8, 0x00, 0x81, 0x01};
static uint8_t Ramses_Set_IT_Auto[8] = {0x23, 0x00, 0x00, 0x30, 0x78, 0x05, 0x00, 0x01};
My_Ramses_TypeDef myramses =
{
Ramses_init,
Ramses_Port,
NULL,
NULL,
NULL,
0,
0,
0,
Uart_Interface_Default, /* 接口类型 0: common, 1: 485 ,2:3160*/
Uart_RSMODE_232, /* mode_232_485 0 commome 1:485*/
Uart_Trans_DMA, /* trans_type0 :polling, 1: IT 2: DMA*/
Uart_Trans_DMA, /* rcv_type 0 :polling, 1: IT 2: DMA*/
Uart_IDLE_IT_ENABLE, /* idle_enable_disable 0 :不启用空闲 , 1: 启用空闲/
NULL, /* pointer huart*/
};
UART_HandleTypeDef *pRamsesUart = &huart2;
#define Ramses_Uart_IRQHandler USART2_IRQHandler
extern volatile uint8_t measure_flag ;
uint8_t Ramses_Rcv_Buf[Ramses_Rcv_Buf_Size] = {0};
uint8_t Ramses_Rcv_Buf_Copy[Ramses_Rcv_Buf_Size] = {0};
Ramses_TypeDef *ramses;
osThreadId_t ramsesHandle;
const osThreadAttr_t RAMSES_attributes = {
.name = "ramses",
.stack_size = 1024,
.priority = (osPriority_t) osPriorityBelowNormal,
};
void Ramses_Uart_IRQHandler(void)
{
uint16_t count = 0;
uint16_t data_length = 0;
if (__HAL_UART_GET_FLAG(pRamsesUart, UART_FLAG_TC) != RESET)
{
log_i("Ramses_ ..huart TC callback ...");
pRamsesUart->gState = HAL_UART_STATE_READY;
__HAL_UART_CLEAR_FLAG(pRamsesUart, UART_FLAG_TC);
}
if (__HAL_UART_GET_FLAG(pRamsesUart, UART_FLAG_IDLE) != RESET)
{
log_i("Ramses_ ..huart IDLE ...");
count = __HAL_DMA_GET_COUNTER( pRamsesUart->hdmarx );
data_length = Ramses_Rcv_Buf_Size - count;
if ( data_length > 0 )
{
// log_i("Ramses_ IDLE.. data_length %d", data_length);
Ramses_copy( ramses, data_length );
// log_i("Oscar_. IDLE..res %02X %d %02X", oscar->uarthelper ->receive_buf[0], oscar->uarthelper ->receive_buf[2], oscar->uarthelper ->receive_buf[data_length-1]);
}
__HAL_UART_CLEAR_IDLEFLAG( pRamsesUart );
}
}
int Ramses_copy(Ramses_TypeDef *ramses ,uint16_t size)
{
// log_i( "Ramses_ idle copy state %d size :%d ", ramses->state,size);
// if ( ramses->state == MODULE_RAMSESE_STATE_CHECK_SENSOR )
// {
__disable_irq();
// memcpy(Ramses_Rcv_Buf_Copy+ramses->size_received, Ramses_Rcv_Buf+ramses->size_received, size);
ramses->size_received = size;
// ramses->size_received = ramses->size_received + size;
// log_i( "Rramses->size_received after %d " , ramses->size_received);
__enable_irq();
// return 0;
// }
return 0;
}
void Ramses_Port ()
{
ramsesHandle = osThreadNew( Ramses_Task, (void*) ( &ramses->state ), &RAMSES_attributes );
}
void Ramses_Task(void * argument)
{
Ramses_clean_data_recved_flag(ramses);
Ramses_clean_ip_recved_flag(ramses);
Ramses_clean_info_recved_flag(ramses);
MODULE_RAMSESE_WORK_STATE *state = argument;
static int err_con=0;
for ( ; ; )
{
/* step-> 1 :get_sn 2: get_ip (积分时间) 3 get_data, 倒过来,可能不一定依据顺序走 */
// log_i( "Ramses_ state %d " , *state );
switch ( *state )
{
case MODULE_RAMSESE_STATE_WAIT:
break;
case MODULE_RAMSESE_STATE_START:
ramses->timebase = osKernelGetTickCount();
// sensor_enable();
*state=MODULE_RAMSESE_STATE_SEND_CMD;
break;
case MODULE_RAMSESE_STATE_SEND_CMD:
if( (osKernelGetTickCount() - ramses->timebase) >=5000){
ramses->timebase = osKernelGetTickCount();
ramses->size_received = 0;
memset( Ramses_Rcv_Buf, 0, sizeof(Ramses_Rcv_Buf) );
Ramses_cmd_get_infomation(ramses,0x80);
__HAL_UART_ENABLE_IT( pRamsesUart, UART_IT_IDLE );
HAL_UART_Receive_DMA( pRamsesUart, Ramses_Rcv_Buf,sizeof(Ramses_Rcv_Buf) );
err_con = 0;
*state = MODULE_RAMSESE_STATE_CHECK_SENSOR;
}
break;
case MODULE_RAMSESE_STATE_CHECK_SENSOR:
log_i( "Ramses_ CHECK_SENSOR %d size_received : %d " , *state , ramses->size_received);
// 判断 size_received 大小进行处理
if( ramses->size_received >=19)
{
Ramses_receive_callback( ramses, Ramses_Rcv_Buf, ramses->size_received) ;
}
if(Ramses_get_serial_number(ramses)!=0xffff){
HAL_UART_DMAStop( pRamsesUart );
ramses->sn=Ramses_get_serial_number( ramses );
log_i( "Ramses_ SN %4X " , ramses->sn);
Ramses_clean_flag(ramses,Ramses_FLAG_MASK_RECVED_INFO);
ramses->error =0;
err_con=0;
log_i("Ramses Get Infomation Succeed");
Ramses_clean_flag( ramses ,Ramses_FLAG_MASK_BUSY|Ramses_FLAG_MASK_RECVED_DATA|Ramses_FLAG_MASK_RECVED_IP);
ramses->size_received = 0;
memset( Ramses_Rcv_Buf, 0, sizeof(Ramses_Rcv_Buf) );
Ramses_cmd_messung( ramses ,0x80);
__HAL_UART_ENABLE_IT( pRamsesUart, UART_IT_IDLE );
HAL_UART_Receive_DMA( pRamsesUart, Ramses_Rcv_Buf,sizeof(Ramses_Rcv_Buf) );
*state=MODULE_RAMSESE_STATE_GET_DATA;
}
if( (osKernelGetTickCount() - ramses->timebase) >=10000){
log_w( "Ramses Get Infomation Failed %d,Retrying...", err_con );
err_con++;
if(err_con>10){
log_e("Ramses Init Error");
// operating_state.plug3_state=0; //TODO?
ramses->error = 1;
*state=MODULE_RAMSESE_STATE_ERROR;
break;
}
ramses->timebase = osKernelGetTickCount();
Ramses_clean_flag( ramses ,Ramses_FLAG_MASK_BUSY);
ramses->size_received = 0;
memset( Ramses_Rcv_Buf, 0, sizeof(Ramses_Rcv_Buf) );
Ramses_cmd_get_infomation(ramses,0x80);
__HAL_UART_ENABLE_IT( pRamsesUart, UART_IT_IDLE );
HAL_UART_Receive_DMA( pRamsesUart, Ramses_Rcv_Buf,sizeof(Ramses_Rcv_Buf) );
*state=MODULE_RAMSESE_STATE_CHECK_SENSOR;
}
break;
case MODULE_RAMSESE_STATE_GET_DATA:
// log_i( "Ramses_ GET_DATA %d size_received : %d " , *state , ramses->size_received);
if( ramses->size_received >=576)
{
log_i( "Ramses_ receive data deal --->>> : %d " , ramses->size_received);
Ramses_receive_callback( ramses, Ramses_Rcv_Buf, ramses->size_received) ;
}
if(Ramses_get_flag( ramses ,Ramses_FLAG_MASK_RECVED_DATA)!=0){
ramses->error = 0;
ramses->flag_ip = Ramses_get_flag( ramses ,Ramses_FLAG_MASK_RECVED_INFO)!=0;
Ramses_clean_flag( ramses ,Ramses_FLAG_MASK_BUSY|Ramses_FLAG_MASK_RECVED_DATA|Ramses_FLAG_MASK_RECVED_IP);
log_i("Ramses Get Data Succeed");
// operating_state.plug3_state=1; //TODO?
err_con=0;
*state=MODULE_RAMSESE_STATE_OK;
}
if( (osKernelGetTickCount() - ramses->timebase) >= 10000 ){
log_w("Ramses Get Data Failed %d,Retrying...",err_con);
err_con++;
if(err_con>=10){
log_e("Ramses Init Error");
// operating_state.plug3_state=0; //TODO?
ramses->error =1;
*state = MODULE_RAMSESE_STATE_ERROR;
break;
}
ramses->timebase = osKernelGetTickCount();
Ramses_clean_flag( ramses ,Ramses_FLAG_MASK_BUSY|Ramses_FLAG_MASK_RECVED_DATA|Ramses_FLAG_MASK_RECVED_IP);
HAL_UART_DMAStop( pRamsesUart );
ramses->size_received = 0;
memset( Ramses_Rcv_Buf, 0, sizeof(Ramses_Rcv_Buf) );
Ramses_cmd_messung( ramses ,0x80);
__HAL_UART_ENABLE_IT( pRamsesUart, UART_IT_IDLE );
HAL_UART_Receive_DMA( pRamsesUart, Ramses_Rcv_Buf,sizeof(Ramses_Rcv_Buf) );
}
break;
case MODULE_RAMSESE_STATE_OK:
break;
case MODULE_RAMSESE_STATE_ERROR:
break;
case MODULE_RAMSESE_STATE_STOP:
break;
default:
*state=MODULE_RAMSESE_STATE_WAIT;
break;
}
osDelay(80 );
}
}
/**
* @brief 初始化
*
* @param trios_ramses 设备描述符
* @param send_obj 发送函数的第一个参数
* @param send_fun 发送函数
* @return struct trios_ramses* 成功:设备描述符 失败:NULL
*/
int Ramses_init( )
{
ramses = (Ramses_TypeDef *)malloc(sizeof(Ramses_TypeDef));
/* 设置超时*/
Ramses_Set_Timeout(ramses, 9000);
// set paras;
ramses->state = MODULE_RAMSESE_STATE_WAIT;
ramses->flag = 0;
ramses->timebase = 0;
ramses->timeout_ms = 9000;
ramses->status = Uart_Status_Ready;
ramses->send_flag = 0;
// ramses->command_seq = 4;
ramses->step = 2;
ramses->size_received = 0;
ramses->sn = 0xffff;
return 0;
}
/**
* @brief 向传感器发送命令
*
* @param trios_ramses 设备描述符
* @param dev_id 设备ID
* @param module_id 模块ID
* @param instruction 指令
* @param parameter1 参数1
* @param parameter2 参数2
* @return int
*/
int Ramses_send_cmd(Ramses_TypeDef *ramses,uint16_t dev_id,uint8_t module_id,uint8_t instruction,uint8_t parameter1,uint8_t parameter2)
{
int i=0;
ramses->cmd_buf[i++]=0x23;
ramses->cmd_buf[i++]=(dev_id>>8)&0x0f;
ramses->cmd_buf[i++]=dev_id&0xff;
ramses->cmd_buf[i++]=module_id;
ramses->cmd_buf[i++]=instruction;
ramses->cmd_buf[i++]=parameter1;
ramses->cmd_buf[i++]=parameter2;
ramses->cmd_buf[i++]=0x01;
HAL_UART_Transmit_DMA( pRamsesUart, ramses->cmd_buf, i );
// HAL_UARTEx_ReceiveToIdle_DMA( )
// ramses->send_fun(ramses->send_class,ramses->cmd_buf,i);
return 0;
}
/**
* @brief 测量
*
* @param trios_ramses 设备描述符
* @return int 成功:0 失败:负值
*/
int Ramses_cmd_messung(Ramses_TypeDef *ramses,uint8_t module_id)
{
if((ramses->flag&Ramses_FLAG_MASK_BUSY)!=0 || (ramses->flag&Ramses_FLAG_MASK_RECVED_DATA)!=0){
return -2;
}
ramses->flag|=Ramses_FLAG_MASK_BUSY;
return Ramses_send_cmd(ramses,0x0000,module_id,0xa8,0x00,0x81);
}
/**
* @brief 设置积分时间
*
* @param trios_ramses 设备描述符
* @param integration_time 积分时间
* @return int 成功:0 失败:负值
*/
int Ramses_cmd_set_integration_time(Ramses_TypeDef *ramses,enum trios_integration_time integration_time)
{
if((ramses->flag&Ramses_FLAG_MASK_BUSY)!=0){
return -2;
}
if(integration_time<0 || integration_time>0x0c){
return -1;
}
return Ramses_send_cmd(ramses,0x0000,0x30,0x78,0x05,integration_time);
}
/**
* @brief 获取模块信息
*
* @param trios_ramses 设备描述符
* @param module_id 模块ID
* @return int 成功:0 失败:负值
*/
int Ramses_cmd_get_infomation(Ramses_TypeDef *ramses,uint8_t module_id)
{
log_w(" Ramses_cmd_get_infomation .... %d ",ramses->flag&Ramses_FLAG_MASK_BUSY);
if((ramses->flag&Ramses_FLAG_MASK_BUSY)!=0){
return -2;
}
ramses->flag|=Ramses_FLAG_MASK_BUSY;
return Ramses_send_cmd(ramses,0x0000,module_id,0xb0,0x00,0x00);
}
/**
* @brief 获取IP头原始数据
*
* @param trios_ramses 设备描述符
* @param buf 缓冲区
* @param size 缓冲区大小
* @return uint32_t 成功:数据大小 失败:负值
*/
uint32_t Ramses_get_ip_raw(Ramses_TypeDef *ramses,uint8_t *buf,uint32_t size)
{
if(size<Ramses_IP_SIZE){
return -1;
}
if((ramses->flag&Ramses_FLAG_MASK_RECVED_IP)==0){
return -2;
}
memcpy(buf,ramses->ip.raw,Ramses_IP_SIZE);
return Ramses_IP_SIZE;
}
/**
* @brief 获取光谱原始数据
*
* @param trios_ramses 设备描述符
* @param buf 缓冲区
* @param size 缓冲区大小
* @return uint32_t 成功:数据大小 失败:负值
*/
uint32_t Ramses_get_data_raw(Ramses_TypeDef *ramses,uint8_t *buf,uint32_t size)
{
int i;
if(size<Ramses_DATA_SIZE*Ramses_DATA_NUM){
return 0;
}
if((ramses->flag&Ramses_FLAG_MASK_RECVED_DATA)==0){
return 0;
}
for(i=0;i<Ramses_DATA_NUM;i++){
memcpy(&buf[i*Ramses_DATA_SIZE],ramses->data[i].raw,Ramses_DATA_SIZE);
}
return i*Ramses_DATA_SIZE;
}
/**
* @brief 获取转换后的光谱数据
*
* @param trios_ramses 设备描述符
* @param data 数据缓冲区
* @param num 缓冲区长度
* @return uint32_t 成功:数据长度 失败:0xffffffff
*/
uint32_t Ramses_get_data(Ramses_TypeDef *ramses,int16_t *data,uint32_t num)
{
int i;
int j;
uint8_t endian_mask;
// endian_mask=endian_get_local_endian_mask(ENDIAN_MASK_LITTLE_ENDIAN);
if(num<(Ramses_DATA_SIZE-8)*Ramses_DATA_NUM/2)
{
return 0;
}
if((ramses->flag&Ramses_FLAG_MASK_RECVED_DATA)==0){
return 0;
}
for(i=0,j=0;i<Ramses_DATA_NUM;i++){
// if(endian_write(endian_mask,ENDIAN_WIDTH_MASK_2BYTE,&((uint8_t*)data)[j],ramses->data[i].data,ramses->data[i].data_size)!=0){
// Ramses_clean_data_recved_flag(trios_ramses);
// return 0xffffffff;
// }
// j+=ramses->data[i].data_size;
}
return j/2;
}
/**
* @brief 获取X轴倾斜角度
*
* @param trios_ramses 设备描述符
* @param incl_xgain 标定数据
* @param incl_xoffset 标定数据
* @return double 成功:X轴倾角 失败:NAN
*/
double Ramses_get_x_inclination_angle(Ramses_TypeDef *ramses,double incl_xgain,double incl_xoffset)
{
if((ramses->flag&Ramses_FLAG_MASK_RECVED_IP)==0){
return NAN;
}
return (ramses->ip.data[4]-incl_xoffset)*incl_xgain;
}
/**
* @brief 获取Y轴倾斜角度
*
* @param trios_ramses 设备描述符
* @param incl_ygain 标定数据
* @param incl_yoffset 标定数据
* @return double 成功:Y轴倾角 失败:NAN
*/
double Ramses_get_y_inclination_angle(Ramses_TypeDef *ramses,double incl_ygain,double incl_yoffset)
{
if((ramses->flag&Ramses_FLAG_MASK_RECVED_IP)==0){
return NAN;
}
return (ramses->ip.data[5]-incl_yoffset)*incl_ygain;
}
/**
* @brief 获取设备倾角
*
* @param x_inclination_angle X轴倾角
* @param y_inclination_angle Y轴倾角
* @return double 成功:设备倾角 失败:NAN
*/
double Ramses_get_inclination_angle(double x_inclination_angle,double y_inclination_angle)
{
if(x_inclination_angle==NAN || y_inclination_angle==NAN){
return NAN;
}
return atan(sqrt(pow(tan(x_inclination_angle*M_PI/180),2)+pow(tan(y_inclination_angle*M_PI/180),2)));
}
/**
* @brief 获取压力
*
* @param trios_ramses 设备描述符
* @param incl_kref 标定数据
* @param incl_kbg 标定数据
* @param press_gain 标定数据
* @param press_surface_bar 标定数据
* @param press_sens_mv_bar_1ma 标定数据
* @param press_sens_mv_bar_4ma 标定数据
* @return double 压力
*/
double Ramses_get_pressure(Ramses_TypeDef *ramses,double incl_kref,double incl_kbg,double press_gain,double press_surface_bar,double press_sens_mv_bar_1ma,double press_sens_mv_bar_4ma)
{
uint16_t npress;
uint16_t nbg;
uint16_t nrefh;
uint16_t nrefl;
double noffset;
double press_sens;
double vpress_v;
double p_bar;
if((ramses->flag&Ramses_FLAG_MASK_RECVED_IP)==0){
return NAN;
}
npress=((uint16_t)ramses->ip.data[7]<<8)+ramses->ip.data[6];
nbg=((uint16_t)ramses->ip.data[11]<<8)+ramses->ip.data[10];
nrefh=((uint16_t)ramses->ip.data[13]<<8)+ramses->ip.data[12];
nrefl=((uint16_t)ramses->ip.data[15]<<8)+ramses->ip.data[14];
noffset=nrefl-(incl_kref*(nrefh-nrefl));
vpress_v=incl_kbg*(npress-noffset)/(nbg-noffset);
press_sens=(press_sens_mv_bar_4ma<=0?press_sens_mv_bar_1ma:press_sens_mv_bar_4ma);
p_bar=1000.0*vpress_v/(press_sens*press_gain);
return p_bar-1.021;
}
/**
* @brief 获取深度(米)
*
* @param pressure 压力
* @return double 成功:深度 失败:NAN
*/
double Ramses_get_depth_m(double pressure)
{
if(pressure==NAN){
return NAN;
}
return pressure*10;
}
/**
* @brief 获取设备序列号
*
* @param trios_ramses 设备描述符
* @return uint16_t 成功:设备序列号 失败:0xffff
*/
uint16_t Ramses_get_serial_number(Ramses_TypeDef *ramses)
{
if((ramses->flag&Ramses_FLAG_MASK_RECVED_INFO)==0){
return 0xffff;
}
return ramses->infomation.serial_number;
}
/**
* @brief 清除指定标志位
*
* @param trios_ramses 设备描述符
* @param mask 掩码
*/
void Ramses_clean_flag(Ramses_TypeDef *ramses,uint8_t mask)
{
ramses->flag&=~mask;
}
/**
* @brief 获取指定标志位
*
* @param trios_ramses 设备描述符
* @param mask 掩码
* @return uint8_t 标志位
*/
uint8_t Ramses_get_flag(Ramses_TypeDef *ramses,uint8_t mask)
{
return ramses->flag&mask;
}
/**
* @brief 传感器消息解码
*
* @param trios_ramses 设备描述符
* @param buf 接收到的数据缓冲区
* @param size 接收到的数据长度
*/
void Ramses_receive_callback(Ramses_TypeDef *ramses,uint8_t *buf,uint32_t size)
{
int i;
for(i=0;i<size;i++){
if(ramses->recv_buf_p==0 && buf[i]!=0x23){ // 已经过滤 开始的0x13 0x11
continue;
}
if(ramses->recv_flag_40==1){
if(buf[i]==0x64){
ramses->recv_buf[ramses->recv_buf_p++]=0x40;
}
else if(buf[i]==0x65){
ramses->recv_buf[ramses->recv_buf_p++]=0x23;
}
else if(buf[i]==0x66){
ramses->recv_buf[ramses->recv_buf_p++]=0x11;
}
else if(buf[i]==0x67){
ramses->recv_buf[ramses->recv_buf_p++]=0x13;
}
else{
ramses->data_index=0;
ramses->recv_flag_40=0;
ramses->recv_buf_p=0;
continue;
}
ramses->recv_flag_40=0;
}
else if(buf[i]==0x40){
ramses->recv_flag_40=1;
}
else{ // == 0x23 切换 recv_buf 数组下标
ramses->recv_buf[ramses->recv_buf_p++]=buf[i];
}
if(ramses->recv_buf_p>7 && ramses->recv_buf_p==8+(2<<(ramses->recv_buf[1]>>5))){
if(ramses->recv_buf[4]==0xff){ // 0xff 表征 SN信息帧
if(ramses->recv_buf_p!=Ramses_INFO_SIZE){
ramses->recv_flag_40=0;
ramses->recv_buf_p=0;
continue;
}
ramses->infomation.dev_id=((uint16_t)ramses->recv_buf[1]<<8)+ramses->recv_buf[2];
ramses->infomation.module_id=ramses->recv_buf[3];
ramses->infomation.serial_number=((uint16_t)ramses->recv_buf[8]<<8)+ramses->recv_buf[7];
ramses->infomation.firmware_number[0]=ramses->recv_buf[10];
ramses->infomation.firmware_number[1]=ramses->recv_buf[9];
memcpy(ramses->infomation.individual_information,&ramses->recv_buf[7],Ramses_INFO_SIZE-12);
ramses->recv_buf_p=0;
ramses->flag|=Ramses_FLAG_MASK_RECVED_INFO;
ramses->flag&=~Ramses_FLAG_MASK_BUSY;
}
else if(ramses->recv_buf[4]==0xfe){ // 0xfe错误
ramses->data_index=0;
ramses->recv_flag_40=0;
ramses->recv_buf_p=0;
continue;
}
else{
if(ramses->recv_buf[3]==0x80 || ramses->recv_buf[3]==0x30 || ramses->recv_buf[3]==0x00){
// log_i(".... 0x80 0x 30 0x00");
if((ramses->flag&Ramses_FLAG_MASK_RECVED_DATA)!=0){
ramses->data_index=0;
ramses->recv_flag_40=0;
ramses->recv_buf_p=0;
continue;
}
if(ramses->recv_buf_p!=Ramses_DATA_SIZE){
ramses->recv_flag_40=0;
ramses->recv_buf_p=0;
continue;
}
if(ramses->recv_buf[4]!=Ramses_DATA_NUM-1-ramses->data_index){
ramses->data_index=0;
ramses->recv_flag_40=0;
ramses->recv_buf_p=0;
continue;
}
memcpy(ramses->data[ramses->data_index].raw,ramses->recv_buf,Ramses_DATA_SIZE);
ramses->data[ramses->data_index].dev_id=((uint16_t)ramses->recv_buf[1]<<8)+ramses->recv_buf[2];
ramses->data[ramses->data_index].module_id=ramses->recv_buf[3];
ramses->data[ramses->data_index].framebyte=ramses->recv_buf[4];
ramses->data[ramses->data_index].data=&ramses->data[ramses->data_index].raw[7];
ramses->data[ramses->data_index].data_size=Ramses_DATA_SIZE-8;
ramses->data_index++;
ramses->recv_buf_p=0;
if(ramses->data_index==Ramses_DATA_NUM){
ramses->data_index=0;
ramses->flag|=Ramses_FLAG_MASK_RECVED_DATA;
ramses->flag&=~Ramses_FLAG_MASK_BUSY;
}
}
else if(ramses->recv_buf[3]==0x20){
if((ramses->flag&Ramses_FLAG_MASK_RECVED_IP)!=0){
ramses->data_index=0;
ramses->recv_flag_40=0;
ramses->recv_buf_p=0;
continue;
}
if(ramses->recv_buf_p!=Ramses_IP_SIZE){
ramses->recv_flag_40=0;
ramses->recv_buf_p=0;
continue;
}
memcpy(ramses->ip.raw,ramses->recv_buf,Ramses_IP_SIZE);
ramses->ip.dev_id=((uint16_t)ramses->recv_buf[1]<<8)+ramses->recv_buf[2];
ramses->ip.module_id=ramses->recv_buf[3];
ramses->ip.framebyte=ramses->recv_buf[4];
ramses->ip.data=&ramses->ip.raw[7];
ramses->ip.data_size=Ramses_IP_SIZE-8;
ramses->recv_buf_p=0;
ramses->flag|=Ramses_FLAG_MASK_RECVED_IP;
}
else{
ramses->data_index=0;
ramses->recv_flag_40=0;
ramses->recv_buf_p=0;
continue;
}
}
}
}
return;
}
Ramses_Set_Timeout(Ramses_TypeDef *ramses, uint16_t timeout_ms )
{
ramses->timebase = osKernelGetTickCount();
ramses->timeout_enable = 1;
}
Ramses_Get_Timeout( Ramses_TypeDef *ramses )
{
if ((osKernelGetTickCount() - ramses->timebase) > ramses->timeout_ms)
return 1;
return 0;
}
void Ramses_Set_State (Ramses_TypeDef *ramses, MODULE_RAMSESE_WORK_STATE state)
{
ramses->state = state;
}
#endif