2025-01-15 03:06:29 +00:00
|
|
|
|
#include "rain.h"
|
|
|
|
|
#include "gpio.h"
|
2025-01-15 04:14:07 +00:00
|
|
|
|
#include "main.h"
|
|
|
|
|
#include "cmsis_os.h"
|
|
|
|
|
#include "anemometer_dev.h"
|
2025-01-15 03:06:29 +00:00
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
void rainLightPowerOn(void)
|
|
|
|
|
{
|
|
|
|
|
HAL_GPIO_WritePin(GPIO_RAIN_PWR_CTRL_GPIO_Port, GPIO_RAIN_PWR_CTRL_Pin, GPIO_PIN_SET);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//<2F>ص<EFBFBD>
|
|
|
|
|
void rainLightPowerOff(void)
|
|
|
|
|
{
|
|
|
|
|
HAL_GPIO_WritePin(GPIO_RAIN_PWR_CTRL_GPIO_Port, GPIO_RAIN_PWR_CTRL_Pin, GPIO_PIN_RESET);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EEA3AC><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʮ<EFBFBD><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
|
|
|
|
void getRainData(void)
|
|
|
|
|
{
|
2025-02-27 06:49:36 +00:00
|
|
|
|
uint8_t getRainDataCmd[] = {0x01, 0x03, 0x00, 0x03, 0x00, 0x01, 0x74, 0x0A};
|
2025-01-15 03:06:29 +00:00
|
|
|
|
uart_dev_write(g_rain_uart_handle, getRainDataCmd, sizeof(getRainDataCmd));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
void clearRainData(void)
|
|
|
|
|
{
|
2025-02-27 06:49:36 +00:00
|
|
|
|
uint8_t getRainDataCmd[] = {0x01, 0x06, 0x01, 0x05, 0x00, 0x00, 0x98, 0x37};
|
2025-01-15 03:06:29 +00:00
|
|
|
|
uart_dev_write(g_rain_uart_handle, getRainDataCmd, sizeof(getRainDataCmd));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EEA3AC><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD><D5A3>ĸ<EFBFBD><C4B8>ֽ<EFBFBD>
|
|
|
|
|
void getLightData(void)
|
|
|
|
|
{
|
2025-02-27 06:49:36 +00:00
|
|
|
|
uint8_t getRainDataCmd[] = {0x01, 0x03, 0x00, 0x05, 0x00, 0x02, 0xD4, 0x0A};
|
2025-01-15 03:06:29 +00:00
|
|
|
|
uart_dev_write(g_rain_uart_handle, getRainDataCmd, sizeof(getRainDataCmd));
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-15 04:14:07 +00:00
|
|
|
|
//ͬʱ<CDAC><CAB1>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EEA3AC><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD><D5A3>ĸ<EFBFBD><C4B8>ֽڣ<D6BD>ʮ<EFBFBD><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
|
|
|
|
void getLightRainData(void)
|
|
|
|
|
{
|
2025-02-27 06:49:36 +00:00
|
|
|
|
uint8_t getRainDataCmd[] = {0x01, 0x03, 0x00, 0x03, 0x00, 0x04, 0xB4, 0x09};
|
2025-01-15 04:14:07 +00:00
|
|
|
|
uart_dev_write(g_rain_uart_handle, getRainDataCmd, sizeof(getRainDataCmd));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*/
|
|
|
|
|
static int read_rain_pack(device_handle uart_handle,u_int8_t *buff, u_int32_t buff_size)
|
|
|
|
|
{
|
|
|
|
|
u_int32_t offset = 0;
|
|
|
|
|
char c = 0;
|
|
|
|
|
|
|
|
|
|
unsigned char new_buff[50];
|
|
|
|
|
buff_size--; //Ԥ<><D4A4>һ<EFBFBD><D2BB>'\0'λ<><CEBB>
|
|
|
|
|
|
|
|
|
|
for (int offset = 0; offset < buff_size;)
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ȡ
|
|
|
|
|
c = uart_dev_in_char(uart_handle);
|
|
|
|
|
buff[offset++] = c;
|
|
|
|
|
|
|
|
|
|
// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>Ƿ<EFBFBD><C7B7>ǵ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ǵ<EFBFBD>ַ<EFBFBD>ٿ<EFBFBD>ʼ<EFBFBD><CABC>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
|
|
|
|
if(offset == sizeof(unsigned char))
|
|
|
|
|
{
|
|
|
|
|
if(buff[0] != 0x01)
|
|
|
|
|
{
|
|
|
|
|
memcpy(buff, buff + 1, offset - 1);
|
|
|
|
|
offset--;
|
|
|
|
|
buff_size--;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// <20>жϹ<D0B6><CFB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һλ
|
|
|
|
|
else if(buff[1] != 0x06 && buff[1] != 0x03)
|
|
|
|
|
{
|
|
|
|
|
memcpy(buff, buff + 1, offset - 1);
|
|
|
|
|
offset--;
|
|
|
|
|
buff_size--;
|
|
|
|
|
}
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
else if (buff[1] == 0x03 && buff[2] == 0x02 && offset == 7)
|
|
|
|
|
{
|
|
|
|
|
return offset;
|
|
|
|
|
}
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
else if (buff[1] == 0x03 && buff[2] == 0x04 && offset == 9)
|
|
|
|
|
{
|
|
|
|
|
return offset;
|
|
|
|
|
}
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
else if (buff[1] == 0x03 && buff[2] == 0x08 && offset == 13)
|
|
|
|
|
{
|
|
|
|
|
return offset;
|
|
|
|
|
}
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
else if (buff[1] == 0x06 & offset == 8)
|
|
|
|
|
{
|
|
|
|
|
return offset;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*/
|
|
|
|
|
static void processLightData(u_int8_t *pMsg)
|
|
|
|
|
{
|
|
|
|
|
uint32_t lightVal = pMsg[0]<<24|pMsg[1]<<16|pMsg[2]<<8|pMsg[3];
|
|
|
|
|
g_stMcs_Para.lightIntensity = lightVal;
|
|
|
|
|
// term_printf("lightVal:%d", lightVal);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*/
|
|
|
|
|
static void processRainData(u_int8_t *pMsg)
|
|
|
|
|
{
|
|
|
|
|
uint32_t rainVal = pMsg[0]<<8|pMsg[1];
|
|
|
|
|
g_stMcs_Para.precipitation = rainVal;
|
|
|
|
|
// term_printf("lightVal:%d", rainVal);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*/
|
|
|
|
|
static void processLightRainData(u_int8_t *lightMsg, u_int8_t *rainMsg)
|
|
|
|
|
{
|
|
|
|
|
uint32_t rainVal = rainMsg[0]<<8|rainMsg[1];
|
|
|
|
|
uint32_t lightVal = lightMsg[0]<<24|lightMsg[1]<<16|lightMsg[2]<<8|lightMsg[3];
|
|
|
|
|
g_stMcs_Para.precipitation = rainVal;
|
|
|
|
|
g_stMcs_Para.lightIntensity = lightVal;
|
|
|
|
|
// term_printf("lightVal:%d", rainVal);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*/
|
|
|
|
|
static void process0RainData(u_int8_t *pMsg)
|
2025-01-15 03:06:29 +00:00
|
|
|
|
{
|
|
|
|
|
|
2025-01-15 04:14:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief modbus crc16<EFBFBD>㷨
|
|
|
|
|
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*/
|
|
|
|
|
static unsigned short CRC16(unsigned char *arr_buff, unsigned char len)
|
|
|
|
|
{
|
|
|
|
|
unsigned short crc=0xFFFF;
|
|
|
|
|
unsigned char i, j;
|
|
|
|
|
for ( j=0; j<len; j++){
|
|
|
|
|
crc=crc ^*arr_buff++;
|
|
|
|
|
for ( i=0; i<8; i++){
|
|
|
|
|
if( ( crc&0x0001) >0){
|
|
|
|
|
crc=crc>>1;
|
|
|
|
|
crc=crc^ 0xa001;
|
|
|
|
|
}else{
|
|
|
|
|
crc=crc>>1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return crc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*/
|
|
|
|
|
#define RAIN_BUFF_CRC16(x) ((x[MsgLen - 2]) | (x[MsgLen - 1] << 8))
|
|
|
|
|
static void rainMsgHandler(device_handle device, u_int8_t *pMsg, u_int32_t MsgLen)
|
|
|
|
|
{
|
|
|
|
|
if(CRC16(pMsg, MsgLen-2) != RAIN_BUFF_CRC16(pMsg))
|
|
|
|
|
{
|
|
|
|
|
// term_printf("CRC<52><43><EFBFBD><EFBFBD>");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if((pMsg[1] != 0x03) && (pMsg[1] != 0x06))
|
|
|
|
|
{
|
|
|
|
|
// term_printf("<22><><EFBFBD><EFBFBD><EFBFBD>벻<EFBFBD><EBB2BB>");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
uint8_t msgData[4] = {0};
|
|
|
|
|
switch(MsgLen)
|
|
|
|
|
{
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
case 7:
|
|
|
|
|
msgData[0] = pMsg[3];
|
|
|
|
|
msgData[1] = pMsg[4];
|
|
|
|
|
processRainData(msgData);
|
|
|
|
|
break;
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
case 8:
|
|
|
|
|
msgData[0] = pMsg[4];
|
|
|
|
|
msgData[1] = pMsg[5];
|
|
|
|
|
process0RainData(msgData);
|
|
|
|
|
break;
|
|
|
|
|
//<2F><><EFBFBD>ݹ<EFBFBD><DDB9><EFBFBD>
|
|
|
|
|
case 9:
|
|
|
|
|
msgData[0] = pMsg[3];
|
|
|
|
|
msgData[1] = pMsg[4];
|
|
|
|
|
msgData[2] = pMsg[5];
|
|
|
|
|
msgData[3] = pMsg[6];
|
|
|
|
|
processLightData(msgData);
|
|
|
|
|
break;
|
|
|
|
|
//<2F><><EFBFBD>ݹ<EFBFBD><DDB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
case 13:
|
2025-02-27 06:49:36 +00:00
|
|
|
|
msgData[0] = pMsg[7];
|
2025-01-15 04:14:07 +00:00
|
|
|
|
msgData[1] = pMsg[8];
|
|
|
|
|
msgData[2] = pMsg[9];
|
|
|
|
|
msgData[3] = pMsg[10];
|
|
|
|
|
uint8_t rainMsg[] = {pMsg[3], pMsg[4]};//<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
processLightRainData(msgData, rainMsg);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*/
|
|
|
|
|
static u_int8_t rs485_buff[20]={0x00};
|
|
|
|
|
void readProcessRainData(device_handle device)
|
|
|
|
|
{
|
|
|
|
|
if(uart_dev_char_present(device))
|
|
|
|
|
{
|
|
|
|
|
osDelay(20);
|
|
|
|
|
memset(rs485_buff,0,sizeof(rs485_buff));
|
|
|
|
|
int ret = read_rain_pack(device, rs485_buff, sizeof(rs485_buff));
|
|
|
|
|
if(ret > 0)
|
|
|
|
|
{
|
|
|
|
|
rainMsgHandler(device, rs485_buff, ret);
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-01-15 03:06:29 +00:00
|
|
|
|
}
|