c
#include <stdint.h>
#include <stdbool.h>
// 设备状态结构体
typedef struct {
uint8_t workingState; // 工作状态
uint8_t wifiStatus; // WIFI状态
uint8_t hotTankStatus; // 热胆状态
uint16_t rawWaterTDS; // 原水TDS值
uint16_t pureWaterTDS; // 纯水TDS值
uint8_t pacCartridgeLife; // PAC滤芯寿命剩余值
uint8_t roCartridgeLife; // RO滤芯寿命剩余值
uint16_t customFlow; // 自定义出水流量
uint8_t customTemperature; // 自定义出水温度值
uint8_t faultDisplay; // 故障显示寄存器
uint8_t tapStatus; // 龙头状态
uint8_t temperatureSetting; // 定温出水温度
uint8_t customTempSetting; // 自定义定温出水温度值
uint8_t flowSetting; // 定量出水流量值
uint16_t customFlowSetting; // 自定义出水流量
bool keyStates[8]; // 按键状态
uint8_t hotTankStatusResponse; // 热胆状态(响应包中的状态)
} DeviceData;
// 全局设备数据实例
DeviceData deviceData = {
.workingState = 0x00, // 默认为上电状态
.wifiStatus = 0x00, // 默认为WIFI已连接
.hotTankStatus = 0x00, // 默认为热胆无操作
.rawWaterTDS = 0, // 默认原水TDS值为0
.pureWaterTDS = 0, // 默认纯水TDS值为0
.pacCartridgeLife = 100, // 默认PAC滤芯寿命为100%
.roCartridgeLife = 100, // 默认RO滤芯寿命为100%
.customFlow = 100, // 默认自定义出水流量为100mL
.customTemperature = 0xFF, // 默认为固定出水温度模式
.faultDisplay = 0x00, // 默认无故障
.tapStatus = 0x00, // 默认龙头关闭
.temperatureSetting = 0x00, // 默认常温水25℃
.customTempSetting = 0, // 默认自定义温度为0
.flowSetting = 0x01, // 默认定量出水流量为100mL
.customFlowSetting = 100, // 默认自定义出水流量为100mL
.keyStates = {false}, // 默认所有按键未按下
.hotTankStatusResponse = 0x00 // 默认热胆无操作
};
// 更新设备状态
void updateDeviceData(const DeviceData *newData) {
// 更新设备状态结构体中的数据
deviceData.workingState = newData->workingState;
deviceData.wifiStatus = newData->wifiStatus;
deviceData.hotTankStatus = newData->hotTankStatus;
deviceData.rawWaterTDS = newData->rawWaterTDS;
deviceData.pureWaterTDS = newData->pureWaterTDS;
deviceData.pacCartridgeLife = newData->pacCartridgeLife;
deviceData.roCartridgeLife = newData->roCartridgeLife;
deviceData.customFlow = newData->customFlow;
deviceData.customTemperature = newData->customTemperature;
deviceData.faultDisplay = newData->faultDisplay;
deviceData.tapStatus = newData->tapStatus;
deviceData.temperatureSetting = newData->temperatureSetting;
deviceData.customTempSetting = newData->customTempSetting;
deviceData.flowSetting = newData->flowSetting;
deviceData.customFlowSetting = newData->customFlowSetting;
for (int i = 0; i < 8; ++i) {
deviceData.keyStates[i] = newData->keyStates[i];
}
deviceData.hotTankStatusResponse = newData->hotTankStatusResponse;
}
// 获取设备状态
DeviceData getDeviceData() {
return deviceData;
}
// 计算校验和
uint8_t calculateChecksum(uint8_t *data, size_t length) {
uint8_t sum = 0;
// 循环计算校验和
for (size_t i = 0; i < length; ++i) {
sum += data[i];
}
return sum;
}
// 构建从主板到水龙头的指令包
void buildMainboardCommand(uint8_t *commandBuffer, const DeviceData *data) {
// 初始化包头
commandBuffer[0] = 0xAA;
commandBuffer[1] = 0xA8;
commandBuffer[2] = 0x15; // 包长度
// 设置工作状态
commandBuffer[3] = data->workingState;
// 设置WIFI状态
commandBuffer[4] = data->wifiStatus;
// 设置热胆状态
commandBuffer[5] = data->hotTankStatus;
// 设置原水TDS值
commandBuffer[6] = (data->rawWaterTDS >> 8) & 0xFF;
commandBuffer[7] = data->rawWaterTDS & 0xFF;
// 设置纯水TDS值
commandBuffer[8] = (data->pureWaterTDS >> 8) & 0xFF;
commandBuffer[9] = data->pureWaterTDS & 0xFF;
// 设置PAC滤芯寿命
commandBuffer[10] = data->pacCartridgeLife;
// 设置RO滤芯寿命
commandBuffer[11] = data->roCartridgeLife;
// 设置自定义出水流量
commandBuffer[12] = (data->customFlow >> 8) & 0xFF;
commandBuffer[13] = data->customFlow & 0xFF;
// 设置自定义出水温度
commandBuffer[14] = data->customTemperature;
// 设置预留字段
commandBuffer[15] = 0x00;
commandBuffer[16] = 0x00;
commandBuffer[17] = 0x00;
commandBuffer[18] = 0x00;
commandBuffer[19] = 0x00;
commandBuffer[20] = 0x00;
commandBuffer[21] = 0x00;
// 设置故障显示寄存器
commandBuffer[22] = data->faultDisplay;
// 设置校验和
uint8_t checksum = calculateChecksum(commandBuffer + 2, 21);
commandBuffer[23] = checksum;
}
// 构建从水龙头到主板的状态响应包
void buildTapResponse(uint8_t *responseBuffer, const DeviceData *data) {
// 初始化包头
responseBuffer[0] = 0xA6;
responseBuffer[1] = 0x55;
responseBuffer[2] = 0x15; // 包长度
// 设置龙头状态
responseBuffer[3] = data->tapStatus;
// 设置定温出水温度
responseBuffer[4] = data->temperatureSetting;
// 设置自定义定温出水温度值
responseBuffer[5] = data->customTempSetting;
// 设置定量出水流量值
responseBuffer[6] = (data->flowSetting >> 8) & 0xFF;
responseBuffer[7] = data->flowSetting & 0xFF;
// 设置自定义出水流量
responseBuffer[8] = (data->customFlowSetting >> 8) & 0xFF;
responseBuffer[9] = data->customFlowSetting & 0xFF;
// 设置按键状态
uint8_t keyState = 0;
// 循环设置按键状态
for (int i = 0; i < 8; ++i) {
keyState |= (data->keyStates[i] ? 1 : 0) << (7 - i);
}
responseBuffer[10] = keyState;
// 设置热胆状态
responseBuffer[11] = data->hotTankStatusResponse;
// 设置预留字段
responseBuffer[12] = 0x00;
responseBuffer[13] = 0x00;
responseBuffer[14] = 0x00;
responseBuffer[15] = 0x00;
responseBuffer[16] = 0x00;
responseBuffer[17] = 0x00;
responseBuffer[18] = 0x00;
responseBuffer[19] = 0x00;
responseBuffer[20] = 0x00;
responseBuffer[21] = 0x00;
// 设置校验和
uint8_t checksum = calculateChecksum(responseBuffer + 2, 21);
responseBuffer[22] = checksum;
}
// 用例:更新设备数据并构建指令包
int main() {
// 创建新的设备数据
DeviceData newData = {
.workingState = 0x01, // 日常待机状态
.wifiStatus = 0x01, // WIFI连接中
.hotTankStatus = 0x02, // 热胆补水已完成
.rawWaterTDS = 200, // 原水TDS值为200
.pureWaterTDS = 50, // 纯水TDS值为50
.pacCartridgeLife = 80, // PAC滤芯寿命为80%
.roCartridgeLife = 90, // RO滤芯寿命为90%
.customFlow = 500, // 自定义出水流量为500mL
.customTemperature = 0x02, // 自定义出水温度为65℃
.faultDisplay = 0x00, // 无故障
.tapStatus = 0x02, // 纯水打开(常温出水)
.temperatureSetting = 0x02, // 泡发水65℃
.customTempSetting = 65, // 自定义温度为65℃
.flowSetting = 0x03, // 定量出水流量为500mL
.customFlowSetting = 500, // 自定义出水流量为500mL
.keyStates = {true, false, true, false, true, false, true, false}, // 按键状态
.hotTankStatusResponse = 0x02 // 热胆补水已完成
};
// 更新设备数据
updateDeviceData(&newData);
// 获取设备数据
DeviceData currentData = getDeviceData();
// 构建主控指令包
uint8_t mainboardCommand[24];
buildMainboardCommand(mainboardCommand, ¤tData);
// 构建水龙头响应包
uint8_t tapResponse[24];
buildTapResponse(tapResponse, ¤tData);
// 打印指令包内容(此处仅为示例,实际应用中应替换为实际的发送逻辑)
printf("Mainboard Command:\n");
for (int i = 0; i < sizeof(mainboardCommand); ++i) {
printf("%02X ", mainboardCommand[i]);
}
printf("\n");
printf("Tap Response:\n");
for (int i = 0; i < sizeof(tapResponse); ++i) {
printf("%02X ", tapResponse[i]);
}
printf("\n");
return 0;
}
在这个示例中,我们首先定义了一个 DeviceData
结构体,并且创建了一个全局变量 deviceData
来保存设备的状态。接着,我们定义了 updateDeviceData
和 getDeviceData
函数来更新和获取设备数据。最后,在 main
函数中,我们创建了一个新的设备数据实例 newData
,更新了全局变量 deviceData
,并通过 buildMainboardCommand
和 buildTapResponse
函数构建了相应的指令包和响应包。
这个用例展示了如何使用这些函数来更新设备状态,并根据最新的状态信息生成通讯数据包。在实际应用中,你可能需要将生成的数据包发送到串口或其他通信端口。