MS-DTU/Anjiehui7_TTS_ST_V2.4_LOCAL/User/display.c

735 lines
13 KiB
C
Raw 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 "includes.h"
// 显示一个8段码
// pos: Fld1为0~3从左到右真值表1~4)Fld2为4~6真值表5~7
// Fld3为7~9真值表8~10Fld4为10~12真值表11~13)
void Disp_DispChar(u8 pos, char c)
{
if(pos == 0)
HT1621_WriteChar(c, 301, 291, 293, 304, 303, 302, 292);
else if(pos == 1)
HT1621_WriteChar(c, 281, 271, 273, 284, 283, 282, 272);
else if(pos == 2)
HT1621_WriteChar(c, 261, 251, 253, 264, 263, 262, 252);
else if(pos == 3)
HT1621_WriteChar(c, 241, 231, 233, 244, 243, 242, 232);
else if(pos == 4)
HT1621_WriteChar(c, 94, 93, 92, 91, 82, 84, 83);
else if(pos == 5)
HT1621_WriteChar(c, 114, 113, 112, 111, 102, 104, 103);
else if(pos == 6)
HT1621_WriteChar(c, 134, 133, 132, 131, 122, 124, 123);
else if(pos == 7)
HT1621_WriteChar(c, 164, 163, 162, 161, 152, 154, 153);
else if(pos == 8)
HT1621_WriteChar(c, 184, 183, 182, 181, 172, 174, 173);
else if(pos == 9)
HT1621_WriteChar(c, 204, 203, 202, 201, 192, 194, 193);
else if(pos == 10)
HT1621_WriteChar(c, 24, 23, 22, 21, 12, 14, 13);
else if(pos == 11)
HT1621_WriteChar(c, 44, 43, 42, 41, 32, 34, 33);
else if(pos == 12)
HT1621_WriteChar(c, 64, 63, 62, 61, 52, 54, 53);
}
// 显示差压数据
void Disp_Fld1Text(s8 *text)
{
u8 len = strlen(text), i = 0, c;
if(len < 4) // 千位
c = ' ';
else
c = text[i++];
Disp_DispChar(0, c);
if(len < 3) // 百位
c = ' ';
else
c = text[i++];
Disp_DispChar(1, c);
if(len < 2) // 十位
c = ' ';
else
c = text[i++];
Disp_DispChar(2, c);
if(len < 1) // 个位
c = ' ';
else
c = text[i++];
Disp_DispChar(3, c);
}
// 显示小数点
void Disp_Fld1PointOn(u8 pos)
{
Disp_Fld1PointOff();
if(pos == 1) // 小数点1位
HT1621_WriteBuf(254, 1);
else if(pos == 2) // 小数点2位
HT1621_WriteBuf(274, 1);
else if(pos == 3) // 小数点3位
HT1621_WriteBuf(294, 1);
}
void Disp_Fld1PointOff()
{
HT1621_WriteBuf(254, 0);
HT1621_WriteBuf(274, 0);
HT1621_WriteBuf(294, 0);
}
// 显示x10
void Disp_Fld1MultiOn()
{
HT1621_WriteBuf(143, 1);
}
void Disp_Fld1MultiOff()
{
HT1621_WriteBuf(143, 0);
}
// 显示温度/压力数据
void Disp_Fld2Text(s8 *text)
{
u8 len = strlen(text), i = 0, c;
// 符号位
if(len < 4)
HT1621_WriteBuf(81, 0);
else
{
HT1621_WriteBuf(81, 1);
i++;
}
if(len < 3) // 百位
c = ' ';
else
c = text[i++];
Disp_DispChar(4, c);
if(len < 2) // 十位
c = ' ';
else
c = text[i++];
Disp_DispChar(5, c);
if(len < 1) // 个位
c = ' ';
else
c = text[i++];
Disp_DispChar(6, c);
}
// 显示小数点
void Disp_Fld2PointOn(u8 pos)
{
Disp_Fld2PointOff();
if(pos == 1)
HT1621_WriteBuf(121, 1);
else if(pos == 2)
HT1621_WriteBuf(101, 1);
}
void Disp_Fld2PointOff()
{
HT1621_WriteBuf(121, 0);
HT1621_WriteBuf(101, 0);
}
// 显示单位
void Disp_Fld2UnitOn(TPresTempUnit unit)
{
Disp_Fld2UnitOff();
if(unit == UNIT_PT_C)
HT1621_WriteBuf(142, 1);
else if(unit == UNIT_PT_MPA)
HT1621_WriteBuf(141, 1);
}
void Disp_Fld2UnitOff()
{
HT1621_WriteBuf(142, 0);
HT1621_WriteBuf(141, 0);
}
// 显示温度/压力数据
void Disp_Fld3Text(s8 *text)
{
u8 len = strlen(text), i = 0, c;
// 符号位
if(len < 4)
HT1621_WriteBuf(151, 0);
else
{
HT1621_WriteBuf(151, 1);
i++;
}
if(len < 3) // 百位
c = ' ';
else
c = text[i++];
Disp_DispChar(7, c);
if(len < 2) // 十位
c = ' ';
else
c = text[i++];
Disp_DispChar(8, c);
if(len < 1) // 个位
c = ' ';
else
c = text[i++];
Disp_DispChar(9, c);
}
// 显示小数点
void Disp_Fld3PointOn(u8 pos)
{
Disp_Fld3PointOff();
if(pos == 1)
HT1621_WriteBuf(191, 1);
else if(pos == 2)
HT1621_WriteBuf(171, 1);
}
void Disp_Fld3PointOff()
{
HT1621_WriteBuf(191, 0);
HT1621_WriteBuf(171, 0);
}
// 显示单位
void Disp_Fld3UnitOn(TPresTempUnit unit)
{
Disp_Fld3UnitOff();
if(unit == UNIT_PT_C)
HT1621_WriteBuf(212, 1);
else if(unit == UNIT_PT_MPA)
HT1621_WriteBuf(211, 1);
}
void Disp_Fld3UnitOff()
{
HT1621_WriteBuf(212, 0);
HT1621_WriteBuf(211, 0);
}
// 显示真空/温度/压力数据
void Disp_Fld4Text(s8 *text)
{
u8 len = strlen(text), i = 0, c;
// 符号位
if(len < 4)
HT1621_WriteBuf(11, 0);
else
{
HT1621_WriteBuf(11, 1);
i++;
}
if(len < 3) // 百位
c = ' ';
else
c = text[i++];
Disp_DispChar(10, c);
if(len < 2) // 十位
c = ' ';
else
c = text[i++];
Disp_DispChar(11, c);
if(len < 1) // 个位
c = ' ';
else
c = text[i++];
Disp_DispChar(12, c);
}
// 显示小数点
void Disp_Fld4PointOn(u8 pos)
{
Disp_Fld4PointOff();
if(pos == 1)
HT1621_WriteBuf(51, 1);
else if(pos == 2)
HT1621_WriteBuf(31, 1);
}
void Disp_Fld4PointOff()
{
HT1621_WriteBuf(51, 0);
HT1621_WriteBuf(31, 0);
}
// 显示单位
void Disp_Fld4UnitOn(TPresTempVacuUnit unit)
{
Disp_Fld4UnitOff();
if(unit == UNIT_PTV_C)
HT1621_WriteBuf(73, 1);
else if(unit == UNIT_PTV_MPA)
{
HT1621_WriteBuf(71, 1);
HT1621_WriteBuf(72, 1);
}
else if(unit == UNIT_PTV_PA)
HT1621_WriteBuf(72, 1);
}
void Disp_Fld4UnitOff()
{
HT1621_WriteBuf(73, 0);
HT1621_WriteBuf(71, 0);
HT1621_WriteBuf(72, 0);
}
// 差压显示切换
void Disp_SwitchDiffUnit(TFld1Mode mode, TDiffUnit unit)
{
HT1621_WriteBuf(144, 0); // kPa
HT1621_WriteBuf(213, 0); // ℃
HT1621_WriteBuf(214, 0); // Pa
HT1621_WriteBuf(234, 0); // M
HT1621_WriteBuf(224, 0); // %
HT1621_WriteBuf(223, 0); // m3
HT1621_WriteBuf(222, 0); // t
HT1621_WriteBuf(221, 0); // mmH2O
if(mode == MODE_DIFF)
{
if(unit == UNIT_MMH2O)
HT1621_WriteBuf(221, 1);
else if(unit == UNIT_KPA)
HT1621_WriteBuf(144, 1);
else if(unit == UNIT_KG)
HT1621_WriteBuf(222, 1); // t
else if(unit == UNIT_L)
HT1621_WriteBuf(223, 1); // m3
else // 百分比%
HT1621_WriteBuf(224, 1);
}
else if(mode == MODE_PRES)
{
HT1621_WriteBuf(234, 1); // M
HT1621_WriteBuf(214, 1); // Pa
}
else if(mode == MODE_TEMP)
HT1621_WriteBuf(213, 1); // ℃
else if(mode == MODE_VACU)
HT1621_WriteBuf(214, 1); // Pa
}
// 显示液源
void Disp_SwitchSource(TDispSource src)
{
HT1621_WriteBuf(74, 0);
HT1621_WriteBuf(364, 0);
HT1621_WriteBuf(314, 0);
HT1621_WriteBuf(313, 0);
HT1621_WriteBuf(312, 0);
HT1621_WriteBuf(311, 0);
if(src == SOURCE_LNG)
HT1621_WriteBuf(74, 1);
else if(src == SOURCE_O2)
HT1621_WriteBuf(364, 1);
else if(src == SOURCE_N2)
HT1621_WriteBuf(314, 1);
else if(src == SOURCE_AR)
HT1621_WriteBuf(313, 1);
else if(src == SOURCE_CO2)
HT1621_WriteBuf(312, 1);
else if(src == SOURCE_H2)
HT1621_WriteBuf(311, 1);
}
void Disp_WriteNeedle(u8 val)
{
HT1621_WriteBuf(363, val >= 1);
HT1621_WriteBuf(362, val >= 2);
HT1621_WriteBuf(361, val >= 3);
HT1621_WriteBuf(351, val >= 4);
HT1621_WriteBuf(352, val >= 5);
HT1621_WriteBuf(353, val >= 6);
HT1621_WriteBuf(354, val >= 7);
HT1621_WriteBuf(344, val >= 8);
HT1621_WriteBuf(343, val >= 9);
HT1621_WriteBuf(342, val >= 10);
}
// 写电量数据
void Disp_WriteBattery(u8 val)
{
HT1621_WriteBuf(323, val >= 1);
HT1621_WriteBuf(322, val >= 2);
HT1621_WriteBuf(321, val >= 3);
}
// 写信号强度
void Disp_WriteStrength(u8 val)
{
HT1621_WriteBuf(334, 1);
HT1621_WriteBuf(333, val >= 1);
HT1621_WriteBuf(332, val >= 2);
HT1621_WriteBuf(331, val >= 3);
HT1621_WriteBuf(341, val >= 4);
}
// 写通讯状态
void Disp_WriteCommunication(u8 val)
{
HT1621_WriteBuf(334, val == 0);
}
// 写告警状态
void Disp_WriteAlarm(u8 val)
{
}
// 写错误状态
void Disp_WriteError(u8 val)
{
}
// 写充装状态
void Disp_WriteFill(u8 val)
{
}
// 写充电状态
void Disp_WritePower(u8 val)
{
HT1621_WriteBuf(324, val != 0);
}
// 写RF状态
void Disp_WriteRF(u8 val)
{
}
// 写GPS状态
void Disp_WriteGPS(u8 val)
{
}
// 清屏
void Disp_Clear()
{
memset(&VideoBuf, 0, sizeof(VideoBuf));
}
// 设置闪烁
void Disp_SetBlinkVisible(u8 visible)
{
VideoBuf.blink_visible = visible;
}
void Disp_Fld1Blink(u8 blink)
{
VideoBuf.fld1_blink = blink;
}
void Disp_Fld2Blink(u8 blink)
{
VideoBuf.fld2_blink = blink;
}
void Disp_Fld3Blink(u8 blink)
{
VideoBuf.fld3_blink = blink;
}
void Disp_Fld4Blink(u8 blink)
{
VideoBuf.fld4_blink = blink;
}
void Disp_BatteryBlink(u8 blink)
{
VideoBuf.battery_blink = blink;
}
// ********************************************
// 以下为窗口界面实现
// ********************************************
// 设置焦点显示
void Disp_SetCursor(u8 pos, u8 width)
{
VideoBuf.cursor_pos = pos;
VideoBuf.cursor_width = width;
}
void Disp_ClearCursor()
{
VideoBuf.cursor_pos = 0;
VideoBuf.cursor_width = 0;
}
// 选择框函数
// 刷新显示
void SelectBox_Refresh(TSelectBox *pBox)
{
u8 i;
for(i = 0; i < strlen(pBox->items[pBox->idx]) && i < pBox->width; i++)
Disp_DispChar(pBox->pos + i, pBox->items[pBox->idx][i]);
for(; i < pBox->width; i++)
Disp_DispChar(pBox->pos + i, ' ');
}
// 创建选择框
void SelectBox_Create(TSelectBox *pBox, u8 pos, u8 width, u8 count, const char items[][5], u8 idx)
{
u8 i;
memset(pBox, 0, sizeof(TSelectBox));
pBox->pos = pos;
pBox->width = width;
pBox->count = count;
for(i = 0; i < count; i++)
strcpy(pBox->items[i], items[i]);
pBox->idx = idx;
// 刷新显示
SelectBox_Refresh(pBox);
}
// 设置只读属性
void SelectBox_ReadOnly(TSelectBox *pBox)
{
pBox->read_only = 1;
}
// 设置隐藏属性
void SelectBox_Hide(TSelectBox *pBox)
{
pBox->hide = 1;
}
// 选择框处理按键
u8 SelectBox_OnKey(TSelectBox *pBox, u8 key)
{
u8 idx = pBox->idx;
if(key == KEY_FUNC)
return key; // 留给上一级处理
if(key == KEY_UP)
{
if(!pBox->read_only)
{
if(pBox->idx == pBox->count - 1)
pBox->idx = 0;
else
pBox->idx++;
}
}
else if(key == KEY_DOWN)
{
if(!pBox->read_only)
{
if(pBox->idx == 0)
pBox->idx = pBox->count - 1;
else
pBox->idx--;
}
}
// 刷新显示
if(idx != pBox->idx)
SelectBox_Refresh(pBox);
return KEY_INVALID; // 已处理
}
// 选择框获得焦点
void SelectBox_SetFocus(TSelectBox *pBox)
{
Disp_SetCursor(pBox->pos, pBox->width);
}
// 编辑框函数
// 刷新显示
void EditBox_Refresh(TEditBox *pEdit)
{
u8 i, j;
for(i = pEdit->left_idx, j = 0; i < strlen(pEdit->text) && i < pEdit->len && j < pEdit->width; i++, j++)
Disp_DispChar(pEdit->pos + j, pEdit->text[i]);
for(; j < pEdit->width; j++)
Disp_DispChar(pEdit->pos + j, ' ');
}
// 创建编辑框
void EditBox_Create(TEditBox *pEdit, u8 pos, u8 width, u8 len, char *text)
{
memset(pEdit, 0, sizeof(TEditBox));
pEdit->pos = pos;
pEdit->width = width;
pEdit->len = len;
strcpy(pEdit->text, text);
pEdit->left_idx = 0;
pEdit->curr_idx = 0;
pEdit->read_only = 0;
// 刷新显示
EditBox_Refresh(pEdit);
}
// 设置只读属性
void EditBox_ReadOnly(TEditBox *pEdit)
{
pEdit->read_only = 1;
}
// 设置隐藏属性
void EditBox_Hide(TEditBox *pEdit)
{
pEdit->hide = 1;
}
// 编辑框处理按键
u8 EditBox_OnKey(TEditBox *pEdit, u8 key)
{
u8 idx = pEdit->curr_idx;
u8 c = pEdit->text[idx];
if(key == KEY_FUNC)
return key; // 跳出EditBox留给上一级处理
if(key == KEY_UP)
{
if(!pEdit->read_only)
{
if(pEdit->curr_idx == 0 && (pEdit->text[pEdit->curr_idx] == '+' || pEdit->text[pEdit->curr_idx] == '-'))
{
if(pEdit->text[pEdit->curr_idx] == '+')
pEdit->text[pEdit->curr_idx] = '-';
else
pEdit->text[pEdit->curr_idx] = '+';
}
else if(pEdit->text[pEdit->curr_idx] == '9' || !isdigit(pEdit->text[pEdit->curr_idx]))
pEdit->text[pEdit->curr_idx] = '0';
else
pEdit->text[pEdit->curr_idx]++;
}
}
else if(key == KEY_DOWN)
{
if(!pEdit->read_only)
{
if(pEdit->curr_idx == 0 && (pEdit->text[pEdit->curr_idx] == '+' || pEdit->text[pEdit->curr_idx] == '-'))
{
if(pEdit->text[pEdit->curr_idx] == '+')
pEdit->text[pEdit->curr_idx] = '-';
else
pEdit->text[pEdit->curr_idx] = '+';
}
else if(pEdit->text[pEdit->curr_idx] == '0' || !isdigit(pEdit->text[pEdit->curr_idx]))
pEdit->text[pEdit->curr_idx] = '9';
else
pEdit->text[pEdit->curr_idx]--;
}
}
else if(key == KEY_SET)
{
// 光标移动
if(pEdit->curr_idx == pEdit->len - 1)
{
pEdit->curr_idx = 0;
pEdit->left_idx = 0;
}
else
{
pEdit->curr_idx++;
// 处理滚动
if(pEdit->curr_idx >= pEdit->left_idx + pEdit->width)
pEdit->left_idx++;
}
// 设置光标
Disp_SetCursor(pEdit->pos + (pEdit->curr_idx - pEdit->left_idx), 1);
}
// 刷新显示
if(idx != pEdit->curr_idx || c != pEdit->text[pEdit->curr_idx])
EditBox_Refresh(pEdit);
return KEY_INVALID; // 已处理
}
// 编辑框获得焦点
void EditBox_SetFocus(TEditBox *pEdit)
{
pEdit->left_idx = 0;
pEdit->curr_idx = 0;
Disp_SetCursor(pEdit->pos, 1);
}
// 按钮函数
// 刷新显示
void Button_Refresh(TButton *pButton)
{
u8 i;
for(i = 0; i < strlen(pButton->caption) && i < pButton->width; i++)
Disp_DispChar(pButton->pos + i, pButton->caption[i]);
for(; i < pButton->width; i++)
Disp_DispChar(pButton->pos + i, ' ');
}
// 创建按钮
void Button_Create(TButton *pButton, u8 pos, u8 width, char *caption)
{
memset(pButton, 0, sizeof(TButton));
pButton->pos = pos;
pButton->width = width;
strcpy(pButton->caption, caption);
}
// 设置隐藏属性
void Button_Hide(TButton *pButton)
{
pButton->hide = 1;
}
// 按钮处理按键
u8 Button_OnKey(TButton *pButton, u8 key)
{
if(key == KEY_FUNC)
return key; // 跳出Button留给上一级处理
if(key == KEY_SET)
return key; // 执行,留给上一级处理
return KEY_INVALID; // 已处理
}
// 按钮获得焦点
void Button_SetFocus(TButton *pButton)
{
Disp_SetCursor(pButton->pos, pButton->width);
}