MoistureSoftware/Source/HMI.c

917 lines
40 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 "APPDEF.H"
#include "stdio.h"
#include "string.h"
#include "math.h"
uint8_t pageNum = 13;
extern void DataPrint(uint8_t *buf, uint8_t len);
extern uint8_t DataInbuf[60u];
extern osSemaphoreId semDataBack;
extern float Temperature;
//
struct Pset Set;
uint8_t DataLogValue[100]; // 当前数据记录
//
uint8_t MaxWeight;
uint8_t MaxTemp;
float Resolution;
float ResolutionWater;
float StartWeight = 0;
float StopWeight = 0;
float WaterPercent = 0.0f;
float WeightOld = 0.0f;
uint16_t CountNochange = 0;
uint16_t CountDelay = 0;
uint8_t SCount = 0;
uint16_t SRange = 100;
float DisData = 0;
uint8_t NameBuf[40];
uint8_t startTime[20];
bool Finisflag = false;
//
void FM24DataCRC()
{
FM24_Read(RW_Set, (uint8_t *)&Set, sizeof(Set));
FM24_Read(RW_Set, (uint8_t *)&Set, sizeof(Set));
FM24_Read(CalibrateWeight2Set, (uint8_t *)&CalibrateWeight2, sizeof(CalibrateWeight2));
if (CalibrateWeight2.WeightSlope < 0.0000001) {
CalibrateWeight2.WeightSlope = 0.0000001;
}
if ((CRCHead != Set.CRC_Head) || (CRCEnd != Set.CRC_Tail)) { // 如果EEPROM中的数据未初始化或异常则重新写入默认值
Set.CRC_Head = CRCHead;
Set.AutoTimeStop = 60; // 60秒
Set.AutoWeightChange = 5; // 5mg
Set.TempSet = 105; // 105℃
Set.TimeStop = 5; // 5分钟
Set.AutoStyle = 0; // 停机方式 自动停机
Set.FastStyle = 0; // 干燥模式 快速
Set.FilterQ = 5; // 滤波器信任度
Set.SensorQ = 2; // 传感器信任度
Set.HoldTime = 5; // 稳定时间 5秒
Set.RuBianLiang = 6; // 蠕变量
Set.RuBianTime = 8; // 蠕变时间
Set.ZeroTrack = 0; // 零点跟踪
Set.TempDelta = 0; // 校准温度差
Set.WeightSet = 0; // 校准重量
Set.BaudRate = 9600; // 波特率
Set.SW0 = false; // 自定义开关1
Set.SW1 = false; // 自定义开关2
Set.SW2 = false; // 自定义开关3
Set.PercentChange = false; // 默认显示含水量
sprintf((char *)Set.Title, "测试结果"); // 标题
sprintf((char *)Set.TitleOne, "山东云唐智能科技有限公司"); // 标题1
sprintf((char *)Set.TitleTwo, ""); // 标题2
sprintf((char *)Set.TitleThree, ""); // 标题3
sprintf((char *)Set.UserName, "实验室"); // 用户名
sprintf((char *)Set.UserPwd, "123456"); // 密码
Set.CRC_Tail = CRCEnd;
// FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
CalibrateWeight2.WeightSlope = 0.0000818f;
CalibrateWeight2.WeightZero = 745430;
// FM24_Write(CalibrateWeight2Set, (uint8_t *)&CalibrateWeight2, sizeof(CalibrateWeight2));
}
}
//bool t17Dis = false;
//uint16_t t17DisCount =0;
bool t18Dis = false;
uint16_t t18DisCount =0;
osSemaphoreId semDataChange;
void DataUnpack(const void *p_arg)
{
static uint8_t buf[150]__attribute__((at(0x20000000 + 0x1000)));
osSemaphoreDef(semDataChange);
semDataChange = osSemaphoreCreate(osSemaphore(semDataChange), 0);
uint8_t i, j;
for (;;) //
{
osSemaphoreWait(semDataBack, osWaitForever);
switch ((DataInbuf[1] << 8) | (DataInbuf[2])) // 页面控件ID
{
case 0x0002: // 开始按钮
if (weightChanging) {
sprintf((char *)buf, "play 1,3,0\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
// sprintf((char *)buf, "t17.txt=\"传感器不稳定\"\xFF\xFF\xFF\0");
// DataPrint(buf, strlen((const char *)buf));
// t17Dis = true;
// t17DisCount =0;
break;
}
if (WeightData2 < 1) {
sprintf((char *)buf, "play 1,6,0\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
// sprintf((char *)buf, "t17.txt=\"样品重量过轻\"\xFF\xFF\xFF\0");
// DataPrint(buf, strlen((const char *)buf));
// t17Dis = true;
// t17DisCount =0;
break;
}
if (WeightData2 > MaxWeight) {
sprintf((char *)buf, "play 1,7,0\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
// sprintf((char *)buf, "t17.txt=\"样品重量过重\"\xFF\xFF\xFF\0");
// DataPrint(buf, strlen((const char *)buf));
// t17Dis = true;
// t17DisCount =0;
break;
}
if (SafeCheck())
{ // 请关闭加热仓
sprintf((char *)buf, "play 1,8,0\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
// sprintf((char *)buf, "t17.txt=\"请关闭加热仓\"\xFF\xFF\xFF\0");
// DataPrint(buf, strlen((const char *)buf));
// t17Dis = true;
// t17DisCount =0;
break;
}
sprintf((char *)buf, "play 1,5,0\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
osDelay(100);
pageNum = 1;
sprintf((char *)startTime, "%04d-%02d-%02d %02d:%02d", (DataInbuf[4] << 8 | DataInbuf[3]), DataInbuf[5], DataInbuf[6], DataInbuf[7], DataInbuf[8]);
for (i = 0; i < strlen((const char *)(&DataInbuf[9])) - 1; i++) {
NameBuf[i] = DataInbuf[i + 9];
}
break;
case 0x0016: // 定时停机时间
{
uint16_t TimeSt = DataInbuf[3] + (DataInbuf[4] << 8);
if (TimeSt == 0) {
Set.TimeStop = 1;
} else if (TimeSt > 99) {
Set.TimeStop = 99;
} else {
Set.TimeStop = TimeSt;
}
sprintf((char *)buf, "main.n0.val=%d\xFF\xFF\xFF\0", Set.TimeStop);
DataPrint(buf, strlen((const char *)buf));
}
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0017: // 干燥温度
{
uint16_t TempSe = DataInbuf[3] + (DataInbuf[4] << 8);
if (TempSe < 40) {
Set.TempSet = 40;
} else if (TempSe > MaxTemp) {
Set.TempSet = MaxTemp;
} else {
Set.TempSet = TempSe;
}
sprintf((char *)buf, "main.n1.val=%d\xFF\xFF\xFF\0", Set.TempSet);
DataPrint(buf, strlen((const char *)buf));
}
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0014: // 称重调零
i = 0;
osDelay(100);
sprintf((char *)buf, "tsw b1,0\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
do {
i++;
if (fabs(CalibrateWeight2.WeightZero - ADvalue2filter) > 10) {
CalibrateWeight2.WeightZero = ADvalue2filter;
osDelay(600);
} else {
sprintf((char *)buf, "t18.txt=\"调零成功\"\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
t18Dis = true;
t18DisCount =0;
break;
}
} while (i < 12);
if( i >= 12)
{
sprintf((char *)buf, "t18.txt=\"调零失败\"\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
t18Dis = true;
t18DisCount =0;
}
sprintf((char *)buf, "tsw b1,1\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
FM24_Write(CalibrateWeight2Set, (uint8_t *)&CalibrateWeight2, sizeof(CalibrateWeight2));
break;
case 0x0022: // 停机方式
Set.AutoStyle = DataInbuf[3];
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0023: // 干燥模式
Set.FastStyle = DataInbuf[3];
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0101: // 停止/返回按钮
if ((Set.AutoStyle == 1) && (!Finisflag)) {
Finisflag = true;
} else {
Finisflag = false;
pageNum = 0;
}
break;
case 0x0129: // 保存
sprintf((char *)buf, "DataDeal.DataLog.insert(\"%s^%s^%.3fg^%.3fg^%.2f%%^%.2f%%\")\xFF\xFF\xFF\0", NameBuf, startTime, StartWeight, StopWeight, WaterPercent, 100.0f - WaterPercent);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "RunPage.t8.txt=\"保存成功!\"\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
break;
case 0x012A: // 打印
sprintf((char *)buf, "/****************************/\r\n %s\r\n\0", Set.Title);
USART2Print(buf, strlen((const char *)buf));
if (Set.SW0) {
sprintf((char *)buf, " %s\r\n\0", Set.TitleOne);
USART2Print(buf, strlen((const char *)buf));
}
if (Set.SW1) {
sprintf((char *)buf, " %s\r\n\0", Set.TitleTwo);
USART2Print(buf, strlen((const char *)buf));
}
if (Set.SW2) {
sprintf((char *)buf, " %s\r\n\0", Set.TitleThree);
USART2Print(buf, strlen((const char *)buf));
}
sprintf((char *)buf, " 样品名:%s\r\n 测试时间:%s\r\n 起始重量:%.3fg\r\n 结束重量: %.3fg\r\n 含水量: %.2f%% \r\n 含固量: %.2f%%\r\n \0", NameBuf, startTime, StartWeight, StopWeight, WaterPercent, 100.0f - WaterPercent);
USART2Print(buf, strlen((const char *)buf));
sprintf((char *)buf, "/****************************/\r\n\r\n\r\n\r\n \0");
USART2Print(buf, strlen((const char *)buf));
break;
case 0x012B: // 查询
break;
case 0x012C://含固量含水量
Set.PercentChange = !Set.PercentChange;
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0201: // 称重设置
sprintf((char *)buf, "page WeightSet\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
pageNum = 3;
sprintf((char *)buf, "WeightSet.cb5.val=%d\xFF\xFF\xFF\0", Set.FilterQ);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "WeightSet.cb4.val=%d\xFF\xFF\xFF\0", Set.RuBianLiang);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "WeightSet.cb3.val=%d\xFF\xFF\xFF\0", Set.SensorQ);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "WeightSet.cb2.val=%d\xFF\xFF\xFF\0", Set.RuBianTime);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "WeightSet.cb1.val=%d\xFF\xFF\xFF\0", Set.HoldTime);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "WeightSet.cb0.val=%d\xFF\xFF\xFF\0", Set.ZeroTrack);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "WeightSet.n0.val=%d\xFF\xFF\xFF\0", Set.AutoTimeStop);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "WeightSet.n1.val=%d\xFF\xFF\xFF\0", Set.AutoWeightChange);
DataPrint(buf, strlen((const char *)buf));
break;
case 0x0202: // 标定设置
pageNum = 4;
break;
case 0x0203: // 打印设置
pageNum = 5;
break;
case 0x0206: // 系统设置
pageNum = 8;
sprintf((char *)buf, "SysSet.t14.txt=\"%s\"\xFF\xFF\xFF\0", Set.UserName);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "SysSet.t0.txt=\"\"\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
break;
case 0x0207: // 返回
pageNum = 0;
break;
case 0x030C: // 滤波器信任度
Set.FilterQ = DataInbuf[3];
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x030A: // 传感器信任度
Set.SensorQ = DataInbuf[3];
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0308: // 稳定时间
Set.HoldTime = DataInbuf[3];
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x030B: // 蠕变量
Set.RuBianLiang = DataInbuf[3];
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0309: // 蠕变时间
Set.RuBianTime = DataInbuf[3];
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0307: // 零点跟踪
Set.ZeroTrack = DataInbuf[3];
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0301: // 自动停机时间
if(DataInbuf[3] <= 5)
{
Set.AutoTimeStop = 5;
}
else
if(DataInbuf[3] > 120)
{
Set.AutoTimeStop = 120;
}
else
{
Set.AutoTimeStop = DataInbuf[3];
}
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0302: // 自动停机重量
if(DataInbuf[3] <= 5)
{
Set.AutoWeightChange = 5;
}
else
if(DataInbuf[3] > 200)
{
Set.AutoWeightChange = 200;
}
else
{
Set.AutoWeightChange = DataInbuf[3];
}
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0310: // 返回
pageNum = 2;
break;
case 0x0401:
Set.TempDelta = (DataInbuf[3] + (DataInbuf[4] << 8)) / 10.0f - (Temperature - Set.TempDelta);
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0403:
CalibrateWeight2.WeightSlope = ((DataInbuf[3] + (DataInbuf[4] << 8) + (DataInbuf[5] << 16) + (DataInbuf[6] << 24)) / 10000.0f) / ((int32_t)ADvalue2filter - (int32_t)CalibrateWeight2.WeightZero);
FM24_Write(CalibrateWeight2Set, (uint8_t *)&CalibrateWeight2, sizeof(CalibrateWeight2));
break;
case 0x0406:
CalibrateWeight2.WeightZero = ADvalue2filter;
break;
case 0x040A: // 返回
pageNum = 2;
break;
case 0x0501:
for (i = 0; i < strlen((const char *)(&DataInbuf[3])) - 1; i++) {
Set.Title[i] = DataInbuf[i + 3];
}
Set.Title[i] = '\0';
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0502:
for (i = 0; i < strlen((const char *)(&DataInbuf[3])) - 1; i++) {
Set.TitleOne[i] = DataInbuf[i + 3];
}
Set.TitleOne[i] = '\0';
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0503:
for (i = 0; i < strlen((const char *)(&DataInbuf[3])) - 1; i++) {
Set.TitleTwo[i] = DataInbuf[i + 3];
}
Set.TitleTwo[i] = '\0';
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0504:
for (i = 0; i < strlen((const char *)(&DataInbuf[3])) - 1; i++) {
Set.TitleThree[i] = DataInbuf[i + 3];
}
Set.TitleThree[i] = '\0';
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0506:
Set.SW0 = DataInbuf[3];
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0507:
switch(DataInbuf[3] + (DataInbuf[4] << 8) + (DataInbuf[5] << 16) + (DataInbuf[6] << 24) )
{
case 0:
Set.BaudRate = 1200;
break;
case 1:
Set.BaudRate = 2400;
break;
case 2:
Set.BaudRate = 4800;
break;
case 3:
Set.BaudRate = 9600;
break;
case 4:
Set.BaudRate = 19200;
break;
case 5:
Set.BaudRate = 38400;
break;
case 6:
Set.BaudRate = 57600;
break;
case 7:
default:
Set.BaudRate = 115200;
break;
}
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
BIOS_USART2_Init(Set.BaudRate);
break;
case 0x0512:
Set.SW1 = DataInbuf[3];
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x0513:
Set.SW2 = DataInbuf[3];
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
break;
case 0x050E: // 返回
pageNum = 2;
break;
case 0x0704:
// 打印
for (i = 0; i < strlen((const char *)(&DataInbuf[3])) - 1; i++) {
DataLogValue[i] = DataInbuf[i + 3];
}
uint8_t NameBufSelect[30];
uint8_t startTimeSelect[30];
uint8_t StartWeightSelect[20];
uint8_t StopWeightSelect[20];
uint8_t WaterPercentSelect[20];
uint8_t WaterPercentSelect_1[20];
i = 0;
j = 0;
do {
NameBufSelect[j++] = DataLogValue[i++];
} while (DataLogValue[i] != '^');
i++;
j = 0;
do {
startTimeSelect[j++] = DataLogValue[i++];
} while (DataLogValue[i] != '^');
i++;
j = 0;
do {
StartWeightSelect[j++] = DataLogValue[i++];
} while (DataLogValue[i] != '^');
i++;
j = 0;
do {
StopWeightSelect[j++] = DataLogValue[i++];
} while (DataLogValue[i] != '^');
i++;
j = 0;
do {
WaterPercentSelect[j++] = DataLogValue[i++];
} while (DataLogValue[i] != '^');
i++;
j = 0;
do {
WaterPercentSelect_1[j++] = DataLogValue[i++];
} while (i < strlen((const char *)DataLogValue));
sprintf((char *)buf, "/****************************/\r\n %s\r\n\0", Set.Title);
USART2Print(buf, strlen((const char *)buf));
osDelay(200);
if (Set.SW0) {
sprintf((char *)buf, " %s\r\n\0", Set.TitleOne);
USART2Print(buf, strlen((const char *)buf));
osDelay(200);
}
if (Set.SW1) {
sprintf((char *)buf, " %s\r\n\0", Set.TitleTwo);
USART2Print(buf, strlen((const char *)buf));
osDelay(200);
}
if (Set.SW2) {
sprintf((char *)buf, " %s\r\n\0", Set.TitleThree);
USART2Print(buf, strlen((const char *)buf));
osDelay(200);
}
sprintf((char *)buf, " 样品名:%s\r\n 测试时间:%s\r\n 起始重量:%s\r\n 结束重量: %s\r\n 含水量: %s \r\n 含固量: %s\r\n \0", NameBufSelect, startTimeSelect, StartWeightSelect, StopWeightSelect, WaterPercentSelect, WaterPercentSelect_1 );
USART2Print(buf, strlen((const char *)buf));
osDelay(200);
sprintf((char *)buf, "/****************************/\r\n\r\n\r\n\r\n \0");
USART2Print(buf, strlen((const char *)buf));
break;
case 0x0801:
sprintf((char *)buf, "page SysSet\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
break;
case 0x0802:
sprintf((char *)buf, "page VL\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
break;
case 0x0803:
sprintf((char *)buf, "page About\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
break;
case 0x0809:
j = 0;
uint8_t NameBuf[16];
uint8_t PwdBuf[16];
i = 3;
do {
NameBuf[j++] = DataInbuf[i++];
} while (DataInbuf[i] != '^');
j = 0;
i++;
do {
PwdBuf[j++] = DataInbuf[i++];
} while (i < strlen((const char *)DataInbuf) - 1);
if ((strcmp((const char *)NameBuf, (const char *)Set.UserName) == 0) && (strcmp((const char *)PwdBuf, (const char *)Set.UserPwd) == 0)) {
sprintf((char *)buf, "UserLogIn.t14.txt=%s\xFF\xFF\xFF\0", NameBuf);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "UserLogIn.t0.txt=\"\"\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "UserLogIn.t3.txt=\"\"\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "page UserLogIn\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
pageNum = 9;
} else {
sprintf((char *)buf, "play 1,1,0\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
}
break;
case 0x0909:
j = 0;
i = 3;
do {
NameBuf[j++] = DataInbuf[i++];
} while (DataInbuf[i] != '^');
j = 0;
i++;
do {
PwdBuf[j++] = DataInbuf[i++];
} while (i < strlen((const char *)DataInbuf) - 1);
strcpy((char *)Set.UserName, (const char *)NameBuf);
strcpy((char *)Set.UserPwd, (const char *)PwdBuf);
FM24_Write(RW_Set, (uint8_t *)&Set, sizeof(Set));
case 0x0C00:
pageNum = 0;
break;
case 0x0C01:
sprintf((char *)buf, "LogIn.t14.txt=\"%s\"\xFF\xFF\xFF\0", Set.UserName);
DataPrint(buf, strlen((const char *)buf));
break;
case 0x0D05:
j = 0;
i = 3;
do {
NameBuf[j++] = DataInbuf[i++];
} while (DataInbuf[i] != '^');
j = 0;
i++;
do {
PwdBuf[j++] = DataInbuf[i++];
} while (i < strlen((const char *)DataInbuf) - 1);
if ((strcmp((const char *)NameBuf, (const char *)Set.UserName) == 0) && (strcmp((const char *)PwdBuf, (const char *)Set.UserPwd) == 0)) {
sprintf((char *)buf, "page main\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
pageNum = 0;
} else {
sprintf((char *)buf, "play 1,1,0\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
}
default:
break;
}
osSemaphoreRelease(semDataChange);
}
}
#include "math.h"
extern float OutputMax; uint32_t LastTick, lostTick;
uint8_t Err = 0;
void Moisturing(const void *p_arg)
{
static uint8_t buf[150]__attribute__((at(0x20000000 + 0x1200)));
uint8_t TempRefresh = 0;
uint16_t SRangeTemp = 100;
bool PercentChg = Set.PercentChange;
FM24DataCRC();
osDelay(1000);
CalibrateWeight2.WeightZero = ADvalue2filter;
BIOS_USART2_Init(Set.BaudRate);
float WeightDataS = 0;
sprintf((char *)buf, "main.t6.txt=\"Max=%dg D=%1.3fg\"\xFF\xFF\xFF\0", MaxWeight, Resolution);
DataPrint(buf, strlen((const char *)buf));
osDelay(300);
sprintf((char *)buf, "RunPage.t6.txt=\"Max=%dg D=%1.3fg\"\xFF\xFF\xFF\0", MaxWeight, Resolution);
DataPrint(buf, strlen((const char *)buf));
for (;;) {
if (pageNum == 0) // 主界面
{
sprintf((char *)buf, "main.cb1.val=%d\xFF\xFF\xFF\0", Set.FastStyle);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "main.n1.val=%d\xFF\xFF\xFF\0", Set.TempSet);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "main.cb0.val=%d\xFF\xFF\xFF\0", Set.AutoStyle);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "main.n0.val=%d\xFF\xFF\xFF\0", Set.TimeStop);
DataPrint(buf, strlen((const char *)buf));
WeightDataS = (float)(((int32_t)((WeightData2+Resolution / 2) / Resolution)) * Resolution);
if (WeightDataS <= MaxWeight) {
sprintf((char *)buf, "main.t0.txt=\"%3.3f\"\xFF\xFF\xFF\0", WeightDataS);
} else {
sprintf((char *)buf, "main.t0.txt=\"---.---\"\xFF\xFF\xFF\0");
}
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "main.t5.txt=\"%s\"\xFF\xFF\xFF\0", Set.UserName);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "main.t12.txt=\"%3.0f\"\xFF\xFF\xFF\0", Temperature);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "page main\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
while (pageNum == 0) {
// if(t17Dis == true)
// {
// if(t17DisCount ++ > 5)
// {
// t17Dis = false;
// t17DisCount = 0;
// sprintf((char *)buf, "t17.txt=\" \"\xFF\xFF\xFF\0");
// DataPrint(buf, strlen((const char *)buf));
// osDelay(100);
// }
// }
// else
// {
// t17DisCount = 0;
// }
if(t18Dis == true)
{
if(t18DisCount ++ > 5)
{
t18Dis = false;
t18DisCount = 0;
sprintf((char *)buf, "t18.txt=\" \"\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
osDelay(100);
}
}
else
{
t18DisCount = 0;
}
WeightDataS = (float)(((int32_t)((WeightData2+Resolution / 2) / Resolution)) * Resolution);
if (WeightDataS <= MaxWeight) {
sprintf((char *)buf, "main.t0.txt=\"%3.3f\"\xFF\xFF\xFF\0", WeightDataS);
} else {
sprintf((char *)buf, "main.t0.txt=\"---.---\"\xFF\xFF\xFF\0");
}
DataPrint(buf, strlen((const char *)buf));
if (TempRefresh++ > 3) {
TempRefresh = 0;
sprintf((char *)buf, "main.t12.txt=\"%3.0f\"\xFF\xFF\xFF\0", Temperature);
DataPrint(buf, strlen((const char *)buf));
}
osSemaphoreWait(semDataChange, 300);
}
}
if (pageNum == 1) // 运行界面
{
CountDelay = 0;
CountNochange = 0;
WeightDataS = (float)(((int32_t)((WeightData2+Resolution / 2) / Resolution)) * Resolution);
StartWeight = WeightDataS;
switch (Set.FastStyle) {
case 0:
OutputMax = 1;
break;
case 1:
OutputMax = 0.75;
break;
case 2:
OutputMax = 0.5;
break;
default:
break;
}
sprintf((char *)buf, "RunPage.t7.txt=\"%s\"\xFF\xFF\xFF\0", Set.PercentChange?"含固量":"含水量");
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "RunPage.t5.txt=\"%s\"\xFF\xFF\xFF\0", Set.UserName);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "RunPage.t14.txt=\"%s\"\xFF\xFF\xFF\0", NameBuf);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "RunPage.cb0.val=%d\xFF\xFF\xFF\0", Set.FastStyle);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "RunPage.n2.val=%d\xFF\xFF\xFF\0", Set.TempSet);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "RunPage.cb1.val=%d\xFF\xFF\xFF\0", Set.AutoStyle);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "RunPage.n3.val=%d\xFF\xFF\xFF\0", Set.TimeStop);
DataPrint(buf, strlen((const char *)buf));
if (SafeCheck()) { // 请关闭加热仓
sprintf((char *)buf, "play 1,8,0\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
do {
osDelay(300);
} while ((SafeCheck()) && (pageNum == 1));
}
Pump_OutCmd(true);
osSemaphoreWait(semDataChange, 800);
sprintf((char *)buf, "cle s0.id,0\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "page RunPage\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "cle s0.id,0\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "va0.val=0\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "tm0.en=1\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
DisData = WeightOld = WeightDataS;
// 定间隔延时
const uint32_t oneTick = osKernelSysTickMicroSec(1000u); // 微秒计时 oneTick 1ms
LastTick = osKernelSysTick();
// osDelay(60000);
// lostTick = (osKernelSysTick() - LastTick)/oneTick;
do {
if (SafeCheck()) { // 请关闭加热仓
sprintf((char *)buf, "play 1,8,0\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
Pump_OutCmd(false);
do {
osDelay(300);
} while ((SafeCheck()) && (pageNum == 1));
Pump_OutCmd(true);
}
// 计算已经逝去的tick计时单位
lostTick = (uint32_t)(osKernelSysTick() + oneTick / 2 - LastTick) / oneTick;
// 计算余下需要的延时周期(设定间隔时间300ms)
if (lostTick < 300u) {
osDelay(300u - lostTick);
LastTick = osKernelSysTick();
} else { // 已经逝去的时间超过设定的间隔,重新计算时间起点后少量延时。
osDelay(30);
LastTick = osKernelSysTick();
}
StopWeight = DisData;
switch (Set.AutoStyle) {
case 0: // 自动模式
if (CountNochange++ > Set.AutoTimeStop * (1000 / 300)) // 当计数器大于设定时间时,停止加热
{
Finisflag = true;
}
break;
case 1: // 手动模式
break;
case 2: // 定时模式
if (CountDelay++ > Set.TimeStop * 60 * (1000 / 300)) // 当计数器大于设定时间时,停止加热)
{
Finisflag = true;
}
break;
default:
break;
}
if (Finisflag) {
sprintf((char *)buf, "RunPage.tm0.en=0\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
Pump_OutCmd(false);
sprintf((char *)buf, "RunPage.t8.txt=\"测试已完成!\"\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "play 1,4,0\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "tsw b0,1\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "tsw b3,1\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "tsw b1,1\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
do {
osSemaphoreWait(semDataChange, osWaitForever);
} while (pageNum == 1);
}
WeightDataS = (float)(((int32_t)((WeightData2 + Resolution / 2) / Resolution)) * Resolution);
if( WeightData2 >= 0)
{
if (WeightOld - WeightDataS > Resolution) // 当重量变化大于0.001g时,更新数据 (只能减不能加)
{
DisData = WeightDataS;
}
if (WeightOld - WeightDataS > Set.AutoWeightChange / 1000) // 当重量变化大于x.xxxg时计数器清零
{
CountNochange = 0;
DisData = WeightOld = WeightDataS;
}
if (StartWeight != 0) {
WaterPercent = (float)(((uint32_t)(((StartWeight - DisData) / StartWeight * 100.0f) / ResolutionWater)) * ResolutionWater);
}
}
sprintf((char *)buf, "RunPage.t0.txt=\"%3.3f\"\xFF\xFF\xFF\0", DisData);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "RunPage.t12.txt=\"%3.0f\"\xFF\xFF\xFF\0", Temperature);
DataPrint(buf, strlen((const char *)buf));
if( PercentChg != Set.PercentChange )
{
PercentChg = Set.PercentChange;
sprintf((char *)buf, "RunPage.t7.txt=\"%s\"\xFF\xFF\xFF\0", Set.PercentChange?"含固量":"含水量");
DataPrint(buf, strlen((const char *)buf));
}
sprintf((char *)buf, "RunPage.t17.txt=\"%2.2f%%\"\xFF\xFF\xFF\0", Set.PercentChange?100.0f-WaterPercent:WaterPercent);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "RunPage.j0.val=%d\xFF\xFF\xFF\0", (uint8_t)WaterPercent);
DataPrint(buf, strlen((const char *)buf));
if (SCount++ >= 3) {
SCount = 0;
if (WaterPercent <= 38.0f) {
SRangeTemp = 200;
}
if (WaterPercent > 38.0f && WaterPercent < 76.0f) {
SRangeTemp = 100;
}
if (WaterPercent > 76.0f) {
SRangeTemp = 70;
}
if (SRangeTemp != SRange) {
SRange = SRangeTemp;
sprintf((char *)buf, "s0.dis=%d\xFF\xFF\xFF\0", SRange);
DataPrint(buf, strlen((const char *)buf));
}
sprintf((char *)buf, "add s0.id,0,%d\xFF\xFF\xFF\0", (uint8_t)(WaterPercent / 100.0f * 255));
DataPrint(buf, strlen((const char *)buf));
}
} while (pageNum == 1);
sprintf((char *)buf, "tm0.en=0\xFF\xFF\xFF\0");
DataPrint(buf, strlen((const char *)buf));
Pump_OutCmd(false);
}
if (pageNum == 3) // 称重设置
{
if(osSemaphoreWait(semDataChange, 300) > 0)
{
osDelay(50);
sprintf((char *)buf, "WeightSet.cb5.val=%d\xFF\xFF\xFF\0", Set.FilterQ);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "WeightSet.cb4.val=%d\xFF\xFF\xFF\0", Set.RuBianLiang);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "WeightSet.cb3.val=%d\xFF\xFF\xFF\0", Set.SensorQ);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "WeightSet.cb2.val=%d\xFF\xFF\xFF\0", Set.RuBianTime);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "WeightSet.cb1.val=%d\xFF\xFF\xFF\0", Set.HoldTime);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "WeightSet.cb0.val=%d\xFF\xFF\xFF\0", Set.ZeroTrack);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "WeightSet.n0.val=%d\xFF\xFF\xFF\0", Set.AutoTimeStop);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "WeightSet.n1.val=%d\xFF\xFF\xFF\0", Set.AutoWeightChange);
DataPrint(buf, strlen((const char *)buf));
}
}
if (pageNum == 4) // 校准设置
{
sprintf((char *)buf, "Calibration.t8.txt=\"%3.4f\"\xFF\xFF\xFF\0", WeightData2);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "Calibration.t6.txt=\"%3.0f\"\xFF\xFF\xFF\0", Temperature);
DataPrint(buf, strlen((const char *)buf));
osSemaphoreWait(semDataChange, 300);
}
if (pageNum == 5) // 打印设置
{
sprintf((char *)buf, "Print.cb0.txt=\"%d\"\xFF\xFF\xFF\0", Set.BaudRate);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "Print.bt0.val=%d\xFF\xFF\xFF\0", Set.SW0 ? 1 : 0);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "Print.bt1.val=%d\xFF\xFF\xFF\0", Set.SW1 ? 1 : 0);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "Print.bt2.val=%d\xFF\xFF\xFF\0", Set.SW2 ? 1 : 0);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "Print.t5.txt=\"%s\"\xFF\xFF\xFF\0", Set.Title);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "Print.t6.txt=\"%s\"\xFF\xFF\xFF\0", Set.TitleOne);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "Print.t7.txt=\"%s\"\xFF\xFF\xFF\0", Set.TitleTwo);
DataPrint(buf, strlen((const char *)buf));
sprintf((char *)buf, "Print.t8.txt=\"%s\"\xFF\xFF\xFF\0", Set.TitleThree);
DataPrint(buf, strlen((const char *)buf));
osSemaphoreWait(semDataChange, 300);
}
if (pageNum == 6) // 数据记录
{
osSemaphoreWait(semDataChange, 300);
}
}
}
osThreadDef(Moisturing, osPriorityNormal, 1, 0);
void MoisturingRun()
{
osThreadCreate(osThread(Moisturing), NULL);
}
osThreadDef(DataUnpack, osPriorityNormal, 1, 0);
void HMICMDInit()
{
osThreadCreate(osThread(DataUnpack), NULL);
MoisturingRun();
}