Files

228 lines
6.6 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "LoRa.h"
/**
* @brief LoRa发送节点ID数据包封装函数。
* @note LoRa在定点模式下执行节点间通信的主要函数。
* @param ucNodeId 节点ID如Node1也就是D1等等。
* @retval None
*/
void vLoRaConnectionPkt(uint8_t ucNodeId)
{
if (ucNodeId == xLoRaNode1Config.ucLoRaNode1Identifier)
{
/* code */
vUsartSendArray(USART3, (uint8_t *)&xLoRaNode1Config, 3);
}
else if (ucNodeId == xLoRaNode2Config.ucLoRaNode2Identifier)
{
/* code */
vUsartSendArray(USART3, (uint8_t *)&xLoRaNode2Config, 3);
}
else
{
/* code */
vUsartSendArray(USART3, (uint8_t *)&xLoRaGateConfig, 3);
}
}
/**
* @brief LoRa发送节点ID数据包封装函数。
* @note 通过发送节点ID以声明自己是什么节点。
* @param ucNodeId 节点ID如Node1也就是D1等等。
* @retval None
*/
void vLoRaToGateIdPkt(uint8_t ucNodeId)
{
if (ucNodeId == xLoRaNode1Config.ucLoRaNode1Identifier)
{
/* code */
vUsartSendArray(USART3, (uint8_t *)&xLoRaNode1Config.ucLoRaNode1Identifier, 1);
} else if (ucNodeId == xLoRaNode2Config.ucLoRaNode2Identifier)
{
/* code */
vUsartSendArray(USART3, (uint8_t *)&xLoRaNode2Config.ucLoRaNode2Identifier, 1);
}
}
/**
* @brief LoRa发送传感器ID数据包封装函数。
* @note 通过发送传感器ID以声明自己是什么传感器。
* @param ucSensorId 传感器ID如DHT11温湿度传感器也就是ucIdDht11等等。
* @retval None
*/
void vLoRaToGateSenIdPkt(uint8_t ucSensorId)
{
if (ucSensorId == xLoRaSensorID.ucIdDht11)
{
/* code */
vUsartSendArray(USART3, (uint8_t *)&xLoRaSensorID.ucIdDht11, 1);
} else if (ucSensorId == xLoRaSensorID.ucIdMq2)
{
/* code */
vUsartSendArray(USART3, (uint8_t *)&xLoRaSensorID.ucIdMq2, 1);
} else if (ucSensorId == xLoRaSensorID.ucIdFire)
{
/* code */
vUsartSendArray(USART3, (uint8_t *)&xLoRaSensorID.ucIdFire, 1);
} else if (ucSensorId == xLoRaSensorID.ucIdLight)
{
/* code */
vUsartSendArray(USART3, (uint8_t *)&xLoRaSensorID.ucIdLight, 1);
}
}
/**
* @brief LoRa发送执行器ID数据包封装函数。
* @note 通过发送执行器ID以声明自己是什么执行器。
* @param ucExeId 执行器ID如LED灯也就是ucIdLed等等。
* @retval None
*/
void vLoRaToGateExeIdPkt(uint8_t ucExeId)
{
if (ucExeId == xLoRaExecutorID.ucIdLed)
{
/* code */
vUsartSendArray(USART3, (uint8_t *)&xLoRaExecutorID.ucIdLed, 1);
} else if (ucExeId == xLoRaExecutorID.ucIdFan)
{
/* code */
vUsartSendArray(USART3, (uint8_t *)&xLoRaExecutorID.ucIdFan, 1);
} else if (ucExeId == xLoRaExecutorID.ucIdHumidifier)
{
/* code */
vUsartSendArray(USART3, (uint8_t *)&xLoRaExecutorID.ucIdHumidifier, 1);
} else if (ucExeId == xLoRaExecutorID.ucIdBuzzer)
{
/* code */
vUsartSendArray(USART3, (uint8_t *)&xLoRaExecutorID.ucIdBuzzer, 1);
} else if (ucExeId == xLoRaExecutorID.ucIdServo)
{
/* code */
vUsartSendArray(USART3, (uint8_t *)&xLoRaExecutorID.ucIdServo, 1);
}
}
/**
* @brief LoRa节点接收返回数据封装函数。
* @note 通过从串口消息队列接收什么数据判断是什么指令。
* @param *pucData 接收到的数据。
* @retval eLoRaMsgRecStatus 枚举包括节点ID、传感器ID、执行器ID和开关指令。
*/
eLoRaMsgRecStatus xLoRaMessageReceived(uint8_t *pucData)
{
switch (*pucData)
{
case 0xD1:
/* code */
return statusNode1;
case 0xD2:
return statusNode2;
case 0xFA:
return statusExeLed;
case 0xFB:
return statusExeFan;
case 0xFC:
return statusExeHumidifier;
case 0xFD:
return statusExeBuzzer;
case 0xFE:
return statusExeServo;
case 0x01:
return statusExeOn;
case 0x00:
return statusExeOff;
default:
return null;
}
}
/**
* @brief LoRa节点处理返回数据封装函数。
* @note 通过LoRa节点接收返回数据封装函数判断是什么指令并细化处理可减少代码复杂度。该API可直接被其他函数调用。
* @param ucDataRecNodeId 要判断的节点ID。
* @param ucDataRecExeId 要判断的执行器ID。
* @param ucDataRecExeStatus 要判断的传感器ID。
* @retval eLoRaMsgRecStatus 枚举包括节点ID、传感器ID、执行器ID和开关指令。
*/
eLoRaMsgRecStatus xLoRaMsgProcess(uint8_t ucDataRecNodeId, uint8_t ucDataRecExeId, uint8_t ucDataRecExeStatus)
{
switch (xLoRaMessageReceived(&ucDataRecNodeId))
{
case statusNode1:
/* code */
while (xLoRaMessageReceived(&ucDataRecExeStatus) == statusExeOn)
{
/* code */
if (xLoRaMessageReceived(&ucDataRecExeId) == statusExeLed)
{
/* code */
return statusLedOn;
} else if (xLoRaMessageReceived(&ucDataRecExeId) == statusExeFan)
{
/* code */
return statusFanOn;
} else if (xLoRaMessageReceived(&ucDataRecExeId) == statusExeHumidifier)
{
/* code */
return statusHumidifierOn;
}
}
while (xLoRaMessageReceived(&ucDataRecExeStatus) == statusExeOff)
{
/* code */
if (xLoRaMessageReceived(&ucDataRecExeId) == statusExeLed)
{
/* code */
return statusLedOff;
} else if (xLoRaMessageReceived(&ucDataRecExeId) == statusExeFan)
{
/* code */
return statusFanOff;
} else if (xLoRaMessageReceived(&ucDataRecExeId) == statusExeHumidifier)
{
/* code */
return statusHumidifierOff;
}
}
case statusNode2:
while (xLoRaMessageReceived(&ucDataRecExeStatus) == statusExeOn)
{
/* code */
if (xLoRaMessageReceived(&ucDataRecExeId) == statusExeBuzzer)
{
/* code */
return statusBuzzerOn;
} else if (xLoRaMessageReceived(&ucDataRecExeId) == statusExeServo)
{
/* code */
return statusServoOn;
}
}
while (xLoRaMessageReceived(&ucDataRecExeStatus) == statusExeOff)
{
/* code */
if (xLoRaMessageReceived(&ucDataRecExeId) == statusExeBuzzer)
{
/* code */
return statusBuzzerOff;
} else if (xLoRaMessageReceived(&ucDataRecExeId) == statusExeServo)
{
/* code */
return statusServoOff;
}
}
default:
return null;
}
}