📄 os.c
字号:
#include "os.h"
#include "lcd.h"
#include "datetime.h"
#include "ds18b20.h"
#include "keyboard.h"
#include "voice.h"
#include "ctrl.h"
#define OS_STATUS_REDRAW 0x80
#define OS_STATUS_LOOP 0x40
#define OS_STATUS_USERMASK 0x0F
#define SEC_PER_CONVERT 3
#define LOGO_VERSION "TX-Thermo V1.30"
#define LOGO_MAKER "(C)2006 TOT Studio"
BIT os_TempeUnitInF;
//BIT os_EnableVoice[25]; //0~23=hour, 24=alarm
BYTE os_EnableVoice[4]; //0~23=hour, 24=alarm
//////////////////////////////////////////////////////////////////////
//
// “控件”
void osShowProcessing(BYTE line)
{
BYTE i;
lcdTextOut(0,line,"");
for (i=0; i<20; i++)
{
lcdTextAddOut( ((i - g_14HzClock) & 0x08) ? " " : ">" );
}
}
/*
BYTE osShowEdit(BYTE x, BYTE y, char* lpBuf, BYTE szBuf)
// return 0 = esc
// return 1 = ok
// return 2 = over
{
BYTE i,chr,pos,key;
if (szBuf == 0) return 2; // 缓冲区长度不能为零
for (i=0;i<szBuf;i++) lpBuf[i]=' ';
lpBuf[szBuf-1] = 0; // 最后一个字节设为 0
lcdDisplayOnOffControl(1,1,0); // show cursor (BIT d, BIT c, BIT b)
pos=0;
while (pos+1 < szBuf)
{
lcdTextOut(x,y,lpBuf);
lcdTextOut(x+pos,y,""); // set cursor
do{
key = kbdGetKeyPress(); // wait for an input
}while (key >= 16);
switch ( key ) // convert vkey to chr
{
case VKEY_0: chr='0'; break;
case VKEY_1: chr='1'; break;
case VKEY_2: chr='2'; break;
case VKEY_3: chr='3'; break;
case VKEY_4: chr='4'; break;
case VKEY_5: chr='5'; break;
case VKEY_6: chr='6'; break;
case VKEY_7: chr='7'; break;
case VKEY_8: chr='8'; break;
case VKEY_9: chr='9'; break;
case VKEY_UP: chr='U'; break;
case VKEY_DOWN: chr='D'; break;
case VKEY_LEFT: chr='L'; break;
case VKEY_RIGHT: chr='R'; break;
case VKEY_ENTER: chr='E'; break;
case VKEY_CANCEL: chr='C'; break;
default: chr='U';
}
if (('0' <= chr) && (chr <= '9'))
{
//数字
lpBuf[pos] = chr;
pos++;
}
else if (chr == 'E')
{
//确定
pos = szBuf;
}
else if (chr == 'C')
{
//退出
pos = szBuf;
}
else if (chr == 'L')
{
//退格
if (pos>0)
{
pos--;
lpBuf[pos] = ' ';
}
}
}
lcdDisplayOnOffControl(1,0,0); // hide cursor (BIT d, BIT c, BIT b)
if (chr=='C') return 0;
if (chr=='E') return 1;
return 2;
}
*/
//////////////////////////////////////////////////////////////////////
//
// Boot
void osBootLogo()
{
OWBROM searchPtr;
BIT skip = FALSE;
lcdClearDisplay();
lcdTextOut(2,0,LOGO_VERSION);
lcdTextOut(1,1,LOGO_MAKER);
g_1HzClock = 0;
lcdTextOut(0,3,"ESC=Skip ");
owbPreSearchDevices( &searchPtr );
while ( !owbIsSearchEnd(&searchPtr) )
{
if ( owbSearchPath( &searchPtr , OWB_DEVICESEARCH ) )
{
owbCacheSearch();
lcdTextOut(16,3,"x");
lcdUIntOut( owbGetSearchIndex()+1, 3 );
}
osShowProcessing(2);
if ( kbdGetKeyPress()==VKEY_CANCEL )
{
skip = TRUE;
break;
}
}
owbUnpreSearchDevices();
while ((g_1HzClock < 5) && ( !skip ))
{
osShowProcessing(2);
}
}
void osSelectSearchDevice()
{
BYTE key,status,cacheIndex;
OWBROM searchPtr;
status = 1;
cacheIndex = owbGetCacheIndex();
while (status)
{
switch (status)
{
case 1: //show info
lcdClearDisplay();
lcdTextOut(0,0,"Sel & Search Device");
lcdTextOut(0,1,"CurSel/Total=");
lcdUIntOut( owbGetCacheIndex()+1, 3 );
lcdTextAddOut("/");
lcdUIntOut( owbCountDevices(), 3 );
lcdTextOut(0,2,"Select this: ");
lcdTextOut(13,2,"");
lcdUIntOut( cacheIndex+1, 3 );
status = 2;
break;
case 2: //set sel
lcdTextOut(0,3,"UpDn=Sel Ok=Search");
while (1)
{
key = kbdGetKeyPress();
if (key == VKEY_ENTER)
{
status = 3;
break;
}
if (key == VKEY_CANCEL)
{
status = 0;
break;
}
if (key == VKEY_UP)
{
status = 1;
cacheIndex++;
if (cacheIndex >= owbCountDevices()) cacheIndex = 0;
break;
}
if (key == VKEY_DOWN)
{
status = 1;
if (cacheIndex == 0) cacheIndex = owbCountDevices()-1;
else cacheIndex--;
break;
}
}
break;
case 3: //processing
lcdTextOut(0,3,"ESC=Stop ");
owbPreSearchDevices( &searchPtr );
while ( !owbIsSearchEnd(&searchPtr) )
{
if ( owbSearchPath( &searchPtr , OWB_DEVICESEARCH ) )
{
if (owbGetSearchIndex() == cacheIndex)
owbCacheSearch();
lcdTextOut(17,1,"");
lcdUIntOut( owbGetSearchIndex()+1, 3 );
}
osShowProcessing(2);
if ( kbdGetKeyPress()==VKEY_CANCEL ) break;
}
owbUnpreSearchDevices();
status = 1;
break;
default:
status = 0;
}
}
// return UIGT_DESKTOP;
}
void osDesktop(void)
{
BYTE rcv,rt,sec,i,bAlarmSearchCycle;
TEMPE tempe;
DATETIME dtt;
OWBROM rom;
lcdClearDisplay();
rt = UIGT_LOOP;
sec = 0;
bAlarmSearchCycle = 0;
while (rt == UIGT_LOOP)
{
rcv = kbdGetKeyPress();
if (rcv >= 16) // Wireless Control
{
rcv = ctrlGetInputABC();
switch (rcv)
{
case 'A':
rcv = VKEY_0;
break;
case 'B':
rcv = VKEY_3;
break;
case 'C':
rcv = VKEY_4;
break;
default:
rcv = 0xff;
}
}
switch (rcv)
{
case VKEY_0:
vocTime();
vocTempe( &tempe, os_TempeUnitInF );
break;
case VKEY_1:
if (os_EnableVoice[3] & 0x01)
{
os_EnableVoice[3] = 0x00;
lcdTextOut(0,3,"Alarm Disable ");
}
else
{
os_EnableVoice[3] = 0xff;
lcdTextOut(0,3,"Alarm Enable ");
}
break;
case VKEY_2:
os_TempeUnitInF = ~os_TempeUnitInF;
if (os_TempeUnitInF) lcdTextOut(0,3,"Fahrenheit (F) ");
else lcdTextOut(0,3,"Celsius (C) ");
break;
case VKEY_3: // quick search
;
for (i=0;i<8;i++) rom.b[i] = owbGetCacheROM(i);
owbIncRom(&rom,31);
while ( kbdGetKeyPress() != VKEY_CANCEL )
{
if ( owbSearchPath(&rom,OWB_DEVICESEARCH) )
{
owbCacheSearch();
vocSendUInt( owbGetCacheIndex() );
break;
}
if ( owbIsSearchEnd(&rom) )
{
owbPreSearchDevices( &rom );
}
osShowProcessing(2);
}
break;
case VKEY_4: // voice current ROM index
vocSendUInt( owbGetCacheIndex() );
break;
case VKEY_CANCEL:
vocStopAll();
os_EnableVoice[3] = 0x00;
lcdTextOut(0,3," ");
break;
case VKEY_ENTER:
rt = UIGT_MENU;
break;
default:
rcv = 0xff;
}
// 显示时间、温度
dtt = dttGetCurDateTime();
if (dtt.ss != sec)
{
if ((sec % SEC_PER_CONVERT) == 0)
{
owbReadMeasure( &tempe, FALSE );
lcdTextOut(6,1,"");
lcdTempeOut( &tempe, os_TempeUnitInF );
lcdTextOut(0,2,"ROM:");
for (i=0;i<8;i++) lcdHexOut( owbGetCacheROM(i) );
}
//yy-mm-dd
lcdTextOut(0,0,"");
lcdDateOut( &dtt );
//hh:mm:ss
lcdTextAddOut(" ");
lcdTimeOut( &dtt );
sec = dtt.ss;
}
//整点播报
if (g_HourClock)
{
g_HourClock = FALSE;
dtt = dttGetCurDateTime();
if ( owbGetRomBit((OWBROM*)os_EnableVoice,dtt.hh%24) )
{
vocTime();
vocTempe( &tempe, os_TempeUnitInF );
}
}
//alarm search a path
if ( os_EnableVoice[3] & 0x01 )
{
if ( owbIsSearchEnd( &rom ) )
{
// finished
//owbUnpreSearchDevices(); //no needed
owbPreSearchDevices(&rom);
bAlarmSearchCycle++;
bAlarmSearchCycle %= 3;
}
else
{
// unfinished
}
if (bAlarmSearchCycle < 2)
{
//ds
if ( owbSearchPath(&rom,OWB_DEVICESEARCH) )
{
// find a device
owbReadMeasure(&tempe,TRUE);
}
}
else
{
//as
if ( owbSearchPath(&rom,OWB_ALARMSEARCH) )
{
// find a alarm
g_1HzClock = 0;
vocAlarm();
lcdTextOut(0,3,"Alm:");
for (i=0;i<8;i++) lcdHexOut( owbGetSearchROM(i) );
}
}
}
if ((g_1HzClock > 15) && vocIsAlarming())
{
//alarm time out , stop
vocStopAll();
lcdTextOut(0,3," ");
}
}
}
BYTE osMenu()
{
BYTE rt;
lcdClearDisplay();
lcdTextOut(0,0,"1.Sel&Search Device ");
lcdTextOut(0,1,"2.Set Date & Time");
lcdTextOut(0,2,"3.Alarm Setting");
lcdTextOut(0,3,"4.Voice Setting");
rt = UIGT_LOOP;
while (rt == UIGT_LOOP)
{
switch ( kbdGetKeyPress() )
{
case VKEY_CANCEL:
rt = UIGT_DESKTOP;
break;
case VKEY_1:
rt = UIGT_SEL_SER_DEVICE;
break;
case VKEY_2:
rt = UIGT_SET_DATETIME;
break;
case VKEY_3:
rt = UIGT_SET_ALARM;
break;
case VKEY_4:
rt = UIGT_SET_VOICE;
break;
default: ;
}
}
return rt;
}
void osSetDateTime(void)
{
BYTE key,status,unit;
DATETIME dtt;
lcdClearDisplay();
dtt = dttGetCurDateTime();
status = OS_STATUS_LOOP | OS_STATUS_REDRAW;
unit = 1; //年位
while (status & OS_STATUS_LOOP)
{
if (dtt.mo == 0) dtt.mo=12; if (dtt.mo>12) dtt.mo=1;
// dd 在下面进行处理
if (dtt.hh > 24) dtt.hh=23; dtt.hh %= 24;
if (dtt.mi > 60) dtt.mi=59; dtt.mi %= 60;
if (dtt.ss > 60) dtt.ss=59; dtt.ss %= 60;
if (status & OS_STATUS_REDRAW)
{
lcdDisplayOnOffControl(1,0,0); // hide cursor (BIT d, BIT c, BIT b)
status &= (~OS_STATUS_REDRAW);
lcdTextOut(0,0,"Set Date & Time");
lcdTextOut(0,3,"Set with Up/Dn & L/R");
//" 2000-01-01 00:00:00"
lcdTextOut(0,1," ");
lcdDateOut(&dtt);
lcdTextAddOut(" ");
lcdTimeOut(&dtt);
switch (unit)
{
case 1: key = 4; break;
case 2: key = 7; break;
case 3: key = 10; break;
case 4: key = 13; break;
case 5: key = 16; break;
case 6:
default: key = 19;
}
lcdTextOut(key,1,"");
lcdDisplayOnOffControl(1,1,0); // show cursor (BIT d, BIT c, BIT b)
}
key = kbdGetKeyPress();
switch (key)
{
case VKEY_ENTER:
status &= (~OS_STATUS_LOOP);
dttSetCurDateTime( &dtt );
break;
case VKEY_CANCEL:
status &= (~OS_STATUS_LOOP);
break;
case VKEY_UP:
switch (unit)
{
case 1:
dtt.yy++;
break;
case 2:
dtt.mo++;
break;
case 3:
if (dtt.dd==31) dtt.dd=1;
else dtt.dd++;
break;
case 4:
dtt.hh++;
break;
case 5:
dtt.mi++;
break;
case 6:
dtt.ss++;
break;
default:
status |= OS_STATUS_REDRAW;
unit = 1;
}
status |= OS_STATUS_REDRAW;
break;
case VKEY_DOWN:
switch (unit)
{
case 1:
dtt.yy--;
break;
case 2:
dtt.mo--;
break;
case 3:
if (dtt.dd==1) dtt.dd=31;
else dtt.dd--;
break;
case 4:
dtt.hh--;
break;
case 5:
dtt.mi--;
break;
case 6:
dtt.ss--;
break;
default:
status |= OS_STATUS_REDRAW;
unit = 1;
}
status |= OS_STATUS_REDRAW;
break;
case VKEY_LEFT:
unit--;
if (unit<1) unit=6;
status |= OS_STATUS_REDRAW;
break;
case VKEY_RIGHT:
unit++;
if (unit>6) unit=1;
status |= OS_STATUS_REDRAW;
break;
default: ;
}
}
lcdDisplayOnOffControl(1,0,0); // hide cursor (BIT d, BIT c, BIT b)
// return UIGT_DESKTOP;
}
// serveic for osSetAlarm
void SetTempe(TEMPE * pT, BYTE bT)
{
pT->th = (bT>>4) & 0x0f;
if (bT & 0x80) pT->th|=0xf0;
pT->tl = (bT<<4) & 0xf0;
}
//
void osSetAlarm(void)
{
BYTE key,status,tL,tH;
BIT hitTH;
TEMPE tempe;
lcdClearDisplay();
owbReadAlarmValue( &tH, &tL, FALSE );
status = OS_STATUS_LOOP | OS_STATUS_REDRAW;
hitTH = TRUE;
while (status & OS_STATUS_LOOP)
{
if (status & OS_STATUS_REDRAW)
{
status &= (~OS_STATUS_REDRAW);
lcdTextOut(0,0,"Alarm Setting");
lcdTextOut(0,1," TH: ");
SetTempe( &tempe, tH );
lcdTempeOut( &tempe, os_TempeUnitInF );
lcdTextOut(0,2," TL: ");
SetTempe( &tempe, tL );
lcdTempeOut( &tempe, os_TempeUnitInF );
lcdTextOut(0,3,"Set with Up/Dn & L/R");
lcdTextOut( 11, (hitTH)?1:2, "" );
lcdDisplayOnOffControl(1,1,0); // show cursor (BIT d, BIT c, BIT b)
}
key = kbdGetKeyPress();
switch (key)
{
case VKEY_ENTER:
status &= (~OS_STATUS_LOOP);
owbWriteConfig( tH, tL, OWB_DEFAULTCONFIG, FALSE );
break;
case VKEY_CANCEL:
status &= (~OS_STATUS_LOOP);
break;
case VKEY_UP:
if (hitTH) tH++;
else tL++;
status |= OS_STATUS_REDRAW;
break;
case VKEY_DOWN:
if (hitTH) tH--;
else tL--;
status |= OS_STATUS_REDRAW;
break;
case VKEY_LEFT:
case VKEY_RIGHT:
hitTH = ~hitTH;
status |= OS_STATUS_REDRAW;
break;
default: ;
}
}
lcdDisplayOnOffControl(1,0,0); // hide cursor (BIT d, BIT c, BIT b)
}
void osSetVoice(void)
{
BYTE key,status;
BYTE hit,y,i;
BYTE enVoc[4];
lcdClearDisplay();
status = OS_STATUS_LOOP | OS_STATUS_REDRAW;
hit = 24;
for (i=0;i<4;i++) enVoc[i] = os_EnableVoice[i];
while (status & OS_STATUS_LOOP)
{
if (status & OS_STATUS_REDRAW)
{
status &= (~OS_STATUS_REDRAW);
// hit = 0~23 整点报时开关
// hit = 24 警报开关
for (y=1;y<4;y++)
{
i = (hit + y + 23) % 25;
lcdTextOut( 4, y, "");
if (i < 24)
{
lcdUIntOut( i, 2 );
lcdTextAddOut(":00:00");
}
else
{
lcdTextAddOut("Alarm ");
}
lcdTextOut( 14, y, owbGetRomBit((OWBROM*)enVoc,i)?"on ":"off");
}
//"Voice Setting "
//" 23:00:00 on "
//" -> Alarm off "
//" 00:00:00 on "
lcdTextOut(0,0,"Voice Setting");
lcdTextOut(1,2,"->");
}
key = kbdGetKeyPress();
switch (key)
{
case VKEY_ENTER:
for (i=0;i<4;i++) os_EnableVoice[i] = enVoc[i];
status &= (~OS_STATUS_LOOP);
break;
case VKEY_CANCEL:
status &= (~OS_STATUS_LOOP);
break;
case VKEY_UP:
if (hit>0) hit--;
else hit=24;
status |= OS_STATUS_REDRAW;
break;
case VKEY_DOWN:
hit++;
hit%=25;
status |= OS_STATUS_REDRAW;
break;
case VKEY_LEFT:
case VKEY_RIGHT:
if ( owbGetRomBit((OWBROM*)enVoc,hit%25) )
{
owbClrRomBit((OWBROM*)enVoc,hit%25);
}
else
{
owbSetRomBit((OWBROM*)enVoc,hit%25);
}
status |= OS_STATUS_REDRAW;
break;
default: ;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -