⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os.c

📁 这是广西大学生设计大赛的源码
💻 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 + -