数据采集器

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include "C:/Compiler/INCLUDE/8000lib.h"
#include "C:/Compiler/INCLUDE/8xTcpip.h"
#include "C:/Compiler/INCLUDE/UCOS.H"


//*** 時間參數 ***-
#define DT_LongMonthTime 1
#define DT_LongDate      2

//*** 音效和背光設定 ***//
#define SND_None   0 // 不播放音效
#define SND_Error  1 // 錯誤
#define SND_Succ   2 // 作業成功
#define BlackLight 1 //背光
// ????
#define SND_Scan   4 // 掃描條碼
#define SND_Save   3 // 儲存
#define SND_Warn   5 // 警告

//*** 本專案所需變數 ***//
int g_checkFd;
int g_inFd;       // 儲位資料表
int g_inventFd;   // 盤點資料表
int g_pickFd;     // 撿貨資料表
int g_outFd;      // 出貨資料表
int g_carryInFd;  // 設備攜入
int g_carryOutFd; // 設備攜出

#define WorkID_Max   20 // 單次下載資料內可用的單號最大數量
#define WorkID_Len   16 // 工單
#define BoxNO_Len    16 // 箱號
#define PosNO_Len    12 // 儲位編號
#define VenNO_Len     1 // 廠商編號(Vendor)
#define Flag_Len      1 // 狀態
#define DT_Len       19 // 日期與時間
#define DevNO_Len    12 // 設備(Device)財編

int iBlack;      //表s_black的地址
int iHead;       //表head的地址
int iOperation;  //表 Operation的地址
int iUpload;     //表UPload的地址
// 資料庫欄位長度
#define Check_Len   (WorkID_Len + 1 + BoxNO_Len + 1 + PosNO_Len + 1 + DT_Len + 1 + DT_Len + 1 + Flag_Len)   // 進貨 : 驗貨 + 入庫資料表 : 88 Byte
//                                                                    驗貨時間     入庫時間     箱號是否不存在                
#define In_Len      (WorkID_Len + 1 + BoxNO_Len + 1 + PosNO_Len + 1 + DT_Len) // 儲位資料表 : 63
#define Pick_Len    (WorkID_Len + 1 + BoxNO_Len + 1 + DT_Len + 1 + DT_Len + 1 + Flag_Len)                   // 出貨 : 撿貨 + 出貨資料表 : 75
//                                                    撿貨時間     出貨時間     箱號是否不存在                
#define Out_Len     (WorkID_Len + 1 + BoxNO_Len + 1 + VenNO_Len + 1 + DT_Len) // 儲位資料表 : 55
#define Invent_Len  (PosNO_Len  + 1 + BoxNO_Len + 1 + DT_Len + 1 + PosNO_Len  + 1 + Flag_Len)                 // 盤點資料表 : 64
//儲位  箱號  盤點日期 新儲位  # : 移轉 ; * : 新增不存在
// 設備攜入/出
#define Carry_Len   (PosNO_Len + 1 + DevNO_Len + 1 + DT_Len)

// 其他
#define Buffer_Max_Size 256
#define Config_File "Config"

//****************************************************
// 名稱 : _StrRight
// 功能 : 重字符串中重右邊開始獲取几位信息
// 參數 : [in/out] dst  : 轉換地
//        [in]     src  : 源地
//        [in]     len  : 獲取長度
//****************************************************
void _StrRight(char* dst, char *src, int len)
{
 int offset = strlen(src) - len;
    if(strlen(src)<len)
    return;
 memset(dst, '/0', strlen(dst));
 memcpy(dst, &src[offset], len);
}
//****************************************************
// 名稱 : _StrNo
// 功能 : 重字符串中重左邊開始獲取几位信息
// 參數 : [in/out] dst  : 轉換地
//        [in]     src  : 源地
//        [in]     len  : 獲取長度
//****************************************************
void _StrLeftLen(char* dst, char *src, int offset,int len)
{
    int maxLen = offset+ len;
    if(strlen(src)<maxLen)
    return;
 memset(dst, '/0', strlen(dst));
 memcpy(dst, &src[offset], len);
}
//****************************************************
// 名稱 : _StrNo
// 功能 : 重字符串中重右邊開始獲取几位信息
// 參數 : [in/out] dst  : 轉換地
//        [in]     src  : 源地
//        [in]    offset: 偏移量      
//        [in]     len  : 獲取長度
//****************************************************
void _StrRightLen(char* dst, char *src, int offset,int len)
{
    int maxLen =strlen(src)-offset;
    if(strlen(src)<len&&strlen(src)<offset&&strlen(src)<maxLen+len)
    return;
 memset(dst, '/0', strlen(dst));
 memcpy(dst, &src[maxLen], len);
}
//*******************************************************************************************
// [名稱] _FlashScreen
// [用途] 閃爍畫面
//*******************************************************************************************
void _FlashScreen()
{
 int i ;
 clr_scr() ;
 clr_rect(0,0,100,64);
 SetCursor(0) ;

 for(i = 0 ; i <= 15 ; i += 5)
 {
  fill_rect(0,0+i,128,5) ;        //填滿矩形區域
  fill_rect(0,57-i,128,5) ;
  fill_rect(0,62,128,2) ;
  OSTimeDly(10) ;
 } 
}
//*******************************************************************************************
// [名稱] _PlaySound
// [用途] 播放聲音
// [參數] sndType [in]: 聲音種類
//*******************************************************************************************
void _PlaySound(int sndType)
{
 int sndError[14]   = { 5, 10, 10, 10, 15, 10, 20, 10, 25, 10, 30, 10, 0, 0};
 int sndWarn[12]    = {35, 10, 30, 10, 35, 10, 35,  5, 35,  5,  0,  0};
 int sndSuccess[12] = {30, 20, 30, 20, 25, 20, 20, 15, 15, 15,  0,  0};
 int sndSave[4]     = {16,  5,  0,  0}; 
 int sndScan[4]     = {30, 10,  0,  0};

 switch(sndType)
 { 
  case SND_None : break;
  case SND_Error: on_beeper(sndError);    break;
  case SND_Succ : on_beeper(sndSuccess);  break; 
  case SND_Save : on_beeper(sndSave);     break; // SND_Save
  case SND_Scan : on_beeper(sndScan);     break; 
  case SND_Warn : on_beeper(sndWarn);     break;    
 }
}
//******************************************************************
// 名稱 : _AddOneChar
// 功能 : 在來源字串最後填入一各字
// 參數 : [in/out] data : 字串
//        [in]     len  : 字串陣列長度
//        [in]     key  : 填入字元
//******************************************************************
void _AddOneChar(char *data, int dataLen, char key)
{
 int len = strlen(data);
 if(len < dataLen)
  data[len] = key; 
}
//******************************************************************
// 名稱 : _BackOneChar
// 功能 : 消除字串最後一各字
// 參數 : [in/out] data) : 字串
//******************************************************************
void _BackOneChar(char *data)
{
 int len = strlen(data);
 if(len > 0)
  data[len - 1] = '/0';
}
//******************************************************************
// 名稱 : _GetDateTime
// 功能 : 取得日期字串
// 參數 : [in]     style     : 指定日期格式
//        [in/out] pDateTime : 回傳日期
//******************************************************************
void _GetDateTime(int style, char *pDateTime)
{
 char currTime[16];
 get_time(currTime);
 if(style == DT_LongMonthTime)  // 08.11 17:27:30
 {
  memmove(pDateTime,      currTime + 4, 2); // MM
  pDateTime[2]  = '.';
  memmove(pDateTime + 3,  currTime + 6, 2); // DD
  pDateTime[5]  = ' ';
  memmove(pDateTime + 6,  currTime + 8, 2); // HH
  pDateTime[8]  = ':';
  memmove(pDateTime + 9,  currTime + 10, 2); // MM
  pDateTime[11] = ':';
  memmove(pDateTime + 12, currTime + 12, 2); // SS
  pDateTime[14] = '/0';
 }
 else if(style == DT_LongDate) // 2006/08/11
 {
  memcpy(pDateTime, currTime, 4);
  pDateTime[4] = '/';
  memcpy(pDateTime + 5, currTime + 4, 2);
  pDateTime[7] = '/';
  memcpy(pDateTime + 8, currTime + 6, 2);
  pDateTime[10] = '/0';
 }
 else if(style == 5) //格式: YYYY/MM/DD hh:mm:ss
 {
  memcpy(pDateTime, currTime, 4);
  pDateTime[4]  = '/';
  memcpy(pDateTime +  5, currTime + 4, 2);
  pDateTime[7]  = '/';
  memcpy(pDateTime +  8, currTime + 6, 2);
  pDateTime[10] = ' ';
  memcpy(pDateTime + 11, currTime + 8, 2);
  pDateTime[13] = ':';
  memcpy(pDateTime + 14, currTime + 10, 2);
  pDateTime[16] = ':';
  memcpy(pDateTime + 17, currTime + 12, 2);
  pDateTime[19] = '/0'; 
 }
}
//******************************************************************
// 名稱 : _ShowSingleMsg
// 功能 : 顯示單行訊息
// 參數 : [in] x         : X軸座標
//        [in] y         : Y軸座標
//        [in] clearScr  : 0 - 不清除螢幕 ; 1 - 清除螢幕
//        [in] delayTime : 延遲時間
//        [in] sndType   : 音效種類, 0 - 不撥放音效
//        [in] msg       : 顯示內容
//******************************************************************
void _ShowSingleMsg(int x, int y, int clearScr, int delayTime, int sndType, char *msg)
{
 SetCursor(0);
 if(clearScr == 1)
  clr_scr();
 gotoxy(x, y);
 puts(msg);
 _PlaySound(sndType);
 if(delayTime > 0)
  OSTimeDly(delayTime);
}
//******************************************************************
// 名稱 : _GetMnuIdx
// 功能 : 取得選單第幾項,one base
// 參數 : [in] mnuNo  : 選單數量
//        [in] mnuIdx : 選單目前點選項目
//        [in] key    : 輸入字元,KEY_UP、KEY_DOWN、'1'、'9'
// 回傳 : 按下數字或上下鍵後的項目數字
//******************************************************************
int _GetMnuIdx(int mnuNo, int mnuIdx, char key)
{
 char keyStr[2];
 int  keyNo;
 keyStr[0] = key;
 keyStr[1] = '/0';
 
 if(key == KEY_UP)
 {
  if(mnuIdx == 1)
   return mnuNo;
  else
   return --mnuIdx;
 }
 else if(key == KEY_DOWN)
 {
  if(mnuIdx == mnuNo)
   return 1;
  else
   return ++mnuIdx;
 }
 
 keyNo = atoi(keyStr);
 return keyNo;
}

int _Inquire(char * title1, char * title2, char * select1, char *select2)
{
 char key;
 SetVideoMode(VIDEO_NORMAL);
 SetFont(FONT_6X12);
 SetCursor(0);
 clr_scr();
 gotoxy(0, 0);
 puts(title1);
 gotoxy(0, 1);
 puts(title2);
 gotoxy(0, 2);
 puts(select1);
 gotoxy(0, 3);
 puts(select2);
 _PlaySound(SND_Warn);
 while(1)
 {
  key = getchar();
  if(key == '1')
   return 1;
  if(key == '2')
   return 2;
 }
 
}
//******************************************************************
// 名稱 : _StrPad
// 功能 : 將字符指定位置加上指定字符
// 參數 : [in/out] data : 目的地字串陣列
//        [in]     int  : 指定偏移位置
//        [in]     int  : 指定轉換長度
//        [in]     dstLen  : 指定要轉換的字符
//******************************************************************
void _StrPad(char* data, int offset, int len, char key)
{
 int upperBound = len - 2;
 for( ; offset <= upperBound ; offset++)
  data[offset] = key;
 data[len - 1] = '/0';
}
//******************************************************************
// 名稱 : _GetScanData
// 功能 : 取得掃瞄器讀取的字串
// 參數 : [in/out] dstData : 目的地字串陣列
//        [in]     dstLen  : 字串陣列長度
//******************************************************************
void _GetScanData(char *data, int dataLen)
{
 memset(data, '/0', dataLen);
 memcpy(data, CodeBuf, dataLen); // 避免拷貝到 CodeBuf '/0'之後的字元
 _StrPad(data, strlen(data), dataLen, '/0');
 _PlaySound(SND_Scan);
}
//******************************************************************
// 名稱 : _IntToStr
// 功能 : 將int型轉換成string型
// 參數 : [in] value : 目的地字串陣列
//        [in/out]     strValue  : 字符的地址
//******************************************************************
void _IntToStr(long value, char *strValue)
{
 int a = 0; // 萬位
 int b = 0; // 千位
 int c = 0; // 百位
 int d = 0; // 十位
 int e = 0; // 個位
 int index = 0;
 
 if(value > 9999)
 {
  a = value / 10000;
  b = (value - 10000 * a) / 1000;
  c = (value - (10000 * a + 1000 * b))/ 100;
  d = (value - (10000 * a + 1000 * b + 100 * c))/ 10;
  e = (value - (10000 * a + 1000 * b + 100 * c + 10 * d))/ 1;
 }
 else if(value > 999)
 {
  b = value / 1000;
  c = (value - (10000 * a + 1000 * b))/ 100;
  d = (value - (10000 * a + 1000 * b + 100 * c))/ 10;
  e = (value - (10000 * a + 1000 * b + 100 * c + 10 * d))/ 1;  
 }
 else if(value > 99)
 {
  c = value / 100;
  d = (value - (10000 * a + 1000 * b + 100 * c))/ 10;
  e = (value - (10000 * a + 1000 * b + 100 * c + 10 * d))/ 1;  
 }
 else if(value > 9)
 {
  d = value / 10;
  e = (value - (10000 * a + 1000 * b + 100 * c + 10 * d))/ 1;  
 }
 else
  e = value;
 if(a > 0)
 {
  strValue[index] = 48 + a;
  index++;
 }
 if(b >0)
 {
  strValue[index] = 48 + b;
  index++;
 }
 if(b==0&&a>0)
 {
  strValue[index] = 48 + b;
  index++;
    }
 if(c > 0)
 {
  strValue[index] = 48 + c;
  index++;
 }
 if(c==0&&(b>0||a>0)) 
 {
     strValue[index] = 48 + c;
  index++; 
 }
 if(d > 0)
 {
  strValue[index] = 48 + d;
  index++;
 }
 if(d==0&&(b>0||a>0||c>0))
 {
  strValue[index] = 48 + d;
  index++;
 }
 if(e >= 0)
 {
  strValue[index] = 48 + e;
  index++;
 }
 strValue[index] = '/0';  
}
//******************************************************************
// 名稱 : _IntToStr
// 功能 : 將int型轉換成string型
// 參數 : [in] value : 目的地字串陣列
//        [in/out]     strValue  : 字符的地址
//******************************************************************
void _IntToFormatStr(long value, char *strValue)
{
 
 int b = 0; // 千位
 int c = 0; // 百位
 int d = 0; // 十位
 int e = 0; // 個位 
    b = (value ) / 1000;
    c = (value - (1000 * b))/ 100;
    d = (value - (1000 * b + 100 * c))/ 10;
    e = (value - (1000 * b + 100 * c + 10 * d))/ 1;
  strValue[0] = 48 + b;
  strValue[1] = 48 + c; 
  strValue[2] = 48 + d;
     strValue[3] = 48 + e;
  
}

void _CreateMaterialTable_black(int flag)
{
 // 建立物料資料表,一共有4個
 close_DBF(iBlack);
 if(flag == 1)
  remove("BLACK");
 if(access("BLACK") == 0)
 { 
  iBlack = create_DBF("BLACK",30);
  create_index(iBlack, 1, 0,30);
 }
 else
 {
  iBlack = open_DBF("BLACK");
 } 
}
void _CreateMaterialTable_Head(int flag)
{
 // 建立物料資料表,一共有4個
 close_DBF(iHead);
 if(flag == 1)
  remove("Head");
 if(access("Head") == 0)
 { 
  iHead = create_DBF("Head",19);
  create_index(iHead, 1,0, 11);
 }
 else
 {  
  iHead = open_DBF("Head");
 } 
}
void _CreateMaterialTable_Operation(int flag)
{
 // 建立物料資料表,一共有4個
 close_DBF(iOperation);
 if(flag == 1)
  remove("Operation");
 if(access("Operation") == 0)
 {   
  iOperation = create_DBF("Operation",21);
  create_index(iOperation, 1, 0, 11);
 }
 else
 {
  iOperation = open_DBF("Operation");
 } 
}
void _CreateMaterialTable_Upload(int flag)
{
 // 建立物料資料表,一共有4個
 close_DBF(iUpload);
 if(flag == 1)
  remove("Upload");
 if(access("Upload") == 0)
 {   
  iUpload = create_DBF("Upload",49);
  create_index(iUpload, 1, 0, 30);
 }
 else
 {
  iUpload = open_DBF("Upload");
 } 
}
void DeleteDatabase()
{
 _CreateMaterialTable_black(1);
 _CreateMaterialTable_Head(1);
 _CreateMaterialTable_Operation(1);
 _CreateMaterialTable_Upload(1);
}
void CreateDatabase()
{
 _CreateMaterialTable_black(2);
 _CreateMaterialTable_Head(2);
 _CreateMaterialTable_Operation(2);
 _CreateMaterialTable_Upload(2);
}

int _ReadCom(char *buff, char firstChar)
{
 char ch;
 char key;
 int index = 1;
 memset(buff, '/0', 256);
 buff[0] = firstChar;
 while(read_com(1, &ch) == 1)
 { 
  key = getchar();
  if(key == KEY_ESC)
   return 0;
  buff[index] = ch;
  index++;
 }
 clr_scr();
 gotoxy(0, 1);
 puts(buff);
 //OSTimeDly(50);
 return 1; 
}
//
//
//

/*** 專案專屬函式 ***/
void Upload()
{
 char ch;
 int  dateCount;
 int  progress = 0;
 int  indexUpload= 0;
 int  indexHead=0;
 int  indexOperation=0;
 int  count;
 int  countUpload;
 int  countHead;
 int  countOperation;
 int  retval;
 char buff[256];  
 char tmpStr[256];
 char key;
 char strValue[7];
 
 close_com(1);
 clear_com(1);
 SetCommType(1, 2);
 open_com(1, BAUD_115200 | DATA_BIT8 | PARITY_NONE | HANDSHAKE_NONE);
 _ShowSingleMsg(0, 2, 1, 0, SND_None, (char *)"wait..");

 // 資料筆數
 countUpload = member_in_DBF(iUpload);
 countHead =member_in_DBF(iHead);
 countOperation =member_in_DBF(iOperation);
 if(countUpload == 0)
 {
  _ShowSingleMsg(0, 2, 1, 300, SND_Error, (char *)"no data Upload");
  return;
 }
 while(1)
 {
  key = getchar();
  if(key == KEY_ESC)
  {
   _ShowSingleMsg(0, 2, 1, 300, SND_Error, (char *)" worry");
   while (!com_eot(1)); /* wait till prior transmission completed */
   write_com(1, "break/r");
   break;
  }
  gotoxy(0, 1);
  if(progress == 0)
   puts("wait..");
  else if(progress == 1)
   puts("wait....");
  else if(progress == 2)
   puts("wait......");
  else if(progress == 3)
   puts("wait........");
  OSTimeDly(10);
  clr_scr();
  progress++;
  if(progress > 3)
   progress = 0;
  // receive 
  if(read_com(1, &ch) == 0)
   continue; 
  else if(_ReadCom(buff, ch) == 0)
  {
   _ShowSingleMsg(0, 2, 1, 300, SND_Error, (char *)"worry");
   while (!com_eot(1)); /* wait till prior transmission completed */
   write_com(1, "break/r");
   break;
  }  
  memset(tmpStr, '/0', 256);
  memcpy(tmpStr, buff, 5);
  if(strcmp(tmpStr, "start") == 0)
  {
   memset(tmpStr, '/0', 256);
   memset(strValue, '/0', 7);
   dateCount=countUpload+countHead+countOperation;
   _IntToStr(dateCount, strValue);
   strcpy(tmpStr, "UpLoad");
   strcat(tmpStr, strValue);
   strcat(tmpStr, " 筆紀錄");
   _ShowSingleMsg(0, 2, 1, 100, SND_None, tmpStr);
   while (!com_eot(1)); /* wait till prior transmission completed */
   memset(tmpStr, '/0', 256);
   strcpy(tmpStr, "rec!!");
   strcat(tmpStr, strValue);
   strcat(tmpStr, (char *)"/r"); // 2006/09/01 測試 IrLib.dll ReadIrCom() 需要 /r 當結束字元
   write_com(1, tmpStr);
  }
  else if(strcmp(tmpStr, "next!") == 0)
  {
   if(indexUpload>=countUpload)
   {
    while (!com_eot(1)); /* wait till prior transmission completed */
    write_com(1, "end!!/r"); // 2006/09/01 測試 IrLib.dll ReadIrCom() 需要 /r 當結束字元
    _ShowSingleMsg(2, 2, 1, 300, SND_Succ, (char *)"UpLoad is over");
    break;
   }
            else if(indexOperation<countOperation) 
   { 
    if (indexOperation==0)
        lseek_DBF(iOperation,1,0,1);
       else
        lseek_DBF(iOperation,1,1,0);
       get_member(iOperation,1,buff);
          indexOperation++;
           strcpy(tmpStr,"data!1");
   }
   else if(indexHead<countHead) 
   { 
    if (indexHead==0)
        lseek_DBF(iHead,1,0,1);
       else
        lseek_DBF(iHead,1,1,0);
       get_member(iHead,1,buff);
          indexHead++;
           strcpy(tmpStr,"data!2");
      }
      else if(indexUpload<countUpload) 
   { 
    if (indexUpload==0)
        lseek_DBF(iUpload,1,0,1);
       else
        lseek_DBF(iUpload,1,1,0);
       get_member(iUpload,1,buff);
          indexUpload++;
           strcpy(tmpStr,"data!3");
      }
   while (!com_eot(1)); /* wait till prior transmission completed */
   strcat (tmpStr,buff);
      strcat(tmpStr, (char *)"/r"); // 2006/09/01 測試 IrLib.dll ReadIrCom() 需要 /r 當結束字元
   write_com(1, tmpStr); 
   filelength(iUpload);
  } 
 }
 
 close_com(1);
}
//******************************************************************
// 名稱 : _VerifyLowBound
// 功能 : 檢驗欄位字串是否為零
// 參數 : [in] data : 字串
//        [in] fieldName : 欄位名稱
// 回傳 : 0 - 字串長度為零 ; 1 - 字串長度大於1
//******************************************************************
int _VerifyLowBound(char *data, char * fieldName)
{
 char msg[17];
 memset(msg, '/0', 17);
 strcpy(msg, fieldName);
 strcat(msg, "長度為零");
 if(strlen(data) == 0)
 {
  _ShowSingleMsg(0, 3, 1, 200, SND_Error, msg);
  return 0;
 }
 else
  return 1;
}
//
// Add the Data to DataBase
//

void _AddInsertData(char* tmpStr)
{
     char dst[31];
     int len =30;
     memset(dst,'/0',31);
  
     if(strlen(tmpStr)<30||strlen(tmpStr)>250)
     {
        return; 
     }
     if(strlen(tmpStr)>=30)
     {             
       memcpy(dst, tmpStr, len);
    add_member(iBlack, dst);
     }
     if(strlen(tmpStr)>=60)
     {
       memcpy(dst,tmpStr+30, len);
    add_member(iBlack, dst);
     }
     if(strlen(tmpStr)>=90)
     {
       memcpy(dst,tmpStr+60, len);
    add_member(iBlack, dst);
     }
     if(strlen(tmpStr)>=120)
     {
      memcpy(dst,tmpStr+90, len);
    add_member(iBlack, dst); 
     }
     if(strlen(tmpStr)>=150)
     {
       memcpy(dst,tmpStr+120, len);
    add_member(iBlack, dst);
     }
     if(strlen(tmpStr)>=180)
     {
      memcpy(dst,tmpStr+150, len);
    add_member(iBlack, dst);
     }
      if(strlen(tmpStr)>=210)
     {
       memcpy(dst,tmpStr+180, len);
    add_member(iBlack, dst);
     }
      if(strlen(tmpStr)>=220)
     {
       memcpy(dst,tmpStr+210, len);
    add_member(iBlack, dst);
     }
}
//
//  get the data into diffrent table
//
void _GetDataToTable(char* strTemp,char* strTableNo)
{
 if(strcmp(strTableNo,"data!1")==0)
 {
  _AddInsertData(strTemp);
 }
 if(strcmp(strTableNo,"data!2")==0)
    {
     add_member(iHead, strTemp);
    }
    if(strcmp(strTableNo,"data!3")==0)
 {
  add_member(iOperation, strTemp);
 }   
}
///
void Download()
{
 char ch;
 int  progress = 0;
 int  index    = 0;
 int  count    = 10;
 char buff[256];
 char tmpStr[256];
 char key;
 int  retval;
 char table_no;
 int  dataCount=0;
 char strCount[5];
    char strTableNo[256];

 retval = _Inquire((char *)"old data will delete", (char *)"", (char *)"1.NO AND OUT",(char *)"2.YES");
 if(retval == 1)
  return;
 else
   DeleteDatabase();
 close_com(1);
 clear_com(1);
 SetCommType(1, 2);
 open_com(1, BAUD_115200 | DATA_BIT8 | PARITY_NONE | HANDSHAKE_NONE);
 _ShowSingleMsg(0, 2, 1, 0, SND_None, (char *)"wait data..");
  
 while(1)
 {
  key = getchar();
  if(key == KEY_ESC)
  {
   _ShowSingleMsg(0, 2, 1, 300, SND_Error, (char *)"worry");
   while (!com_eot(1)); /* wait till prior transmission completed */
   write_com(1, "break/n");
   break;
  }
  gotoxy(0, 1);
  if(progress == 0)
   puts("wait..");
  else if(progress == 1)
   puts("wait....");
  else if(progress == 2)
   puts("wait......");
  else if(progress == 3)
   puts("wait........");
  OSTimeDly(10);
  clr_scr();
  progress++;
  if(progress > 3)
   progress = 0;
  // receive 
  if(read_com(1, &ch) == 0)
   continue; 
  else if(_ReadCom(buff, ch) == 0)
  {
   _ShowSingleMsg(0, 2, 1, 300, SND_Error, (char *)"worry");
   while (!com_eot(1)); /* wait till prior transmission completed */
   write_com(1, "break/r");
   break;
  }  
  memset(tmpStr, '/0', 256);
  memcpy(strTableNo,buff,6);
  memcpy(tmpStr, buff, 5);
  if(strcmp(tmpStr, "start") == 0)
  {
   memset(tmpStr, '/0', 256);
   memcpy(tmpStr, buff + 5, strlen(buff) - 5);  // 資料筆數
   count = atoi(tmpStr);
   strcat(tmpStr, "bit data");   
   _ShowSingleMsg(0, 2, 1, 100, SND_None, tmpStr);
   while (!com_eot(1)); /* wait till prior transmission completed */
   write_com(1, "next!/r");
  }
  else if(strcmp(tmpStr, "data!") == 0)
  {    
   _StrRight(tmpStr, buff, strlen(buff) - 6);
   table_no=tmpStr[0];   
      _GetDataToTable(tmpStr,strTableNo);
    
      dataCount=member_in_DBF(iBlack);        
            _IntToStr(dataCount,strCount);
   //_ShowSingleMsg(0, 2, 1, 10, SND_None, tmpStr);
   _ShowSingleMsg(0, 2, 1, 40, SND_None, strCount);
   while (!com_eot(1)); /* wait till prior transmission completed */
   write_com(1, "next!/r");
  }
  else if(strcmp(tmpStr, "end!!") == 0)
  {
            dataCount=member_in_DBF(iOperation); 
            _IntToStr(dataCount,strCount);
   _ShowSingleMsg(2, 2, 1, 500, SND_Succ, strCount);
   break;
  } 
 }
 close_com(1);
}

//
//
//
void main_Draw(int mnuIdx)
{
 char *mnuItems[6] = {"1Collect",
                         "2DownLoad",
                      "3UpLoad",
                      "4BlackLight",
                      "5UserSetDate",
                      "6UserSetTime"};
                     
 SetVideoMode(VIDEO_NORMAL);
 SetFont(FONT_6X8);
 SetCursor(0);
 clr_scr();
 
 if(mnuIdx <= 10)
 {
  gotoxy(0, 0);
  puts(mnuItems[0]);
  gotoxy(0, 1);
  puts(mnuItems[1]); 
  gotoxy(0, 2);
  puts(mnuItems[2]);
  gotoxy(0, 3);
  puts(mnuItems[3]);
  gotoxy(0, 4);
  puts(mnuItems[4]);     
  gotoxy(0, 5);
  puts(mnuItems[5]);  
  //gotoxy(0, 1);
  //puts(mnuItems[6]);  
 }
 SetVideoMode(VIDEO_REVERSE);
    if((mnuIdx == 1))
  gotoxy(0, 0);
 else if((mnuIdx == 2) || (mnuIdx == 7))
  gotoxy(0, 1);
 else if((mnuIdx == 3) || (mnuIdx == 8))
  gotoxy(0, 2);
 else if((mnuIdx == 4) || (mnuIdx == 9))
  gotoxy(0, 3);
 else if((mnuIdx == 5) || (mnuIdx == 10))
  gotoxy(0, 4);   
 else if((mnuIdx == 6))
  gotoxy(0, 5); 
 puts(mnuItems[mnuIdx - 1]);
 SetVideoMode(VIDEO_NORMAL);
}

//
//
//
void _CheckDataDraw(char* machSn,char* machPlaceNo,int mnuIdx)
{
    char *mnuItems[3] = {"Items:",
                         "R/Q:",
                      "R/C:"};
    char tempMachPlaceNo[20];
    char tempStr[31];
    char machQty[5];
    char machThisQty[5];
    clr_scr();

    memset(tempMachPlaceNo,'/0',20);
    memset(tempStr, '/0',31);
    memset(machQty,'/0',5);
    if(has_member(iHead,1,machPlaceNo))
    {
     get_member(iHead,1,tempMachPlaceNo);  
     _StrLeftLen(machThisQty,tempMachPlaceNo,11,4);
     gotoxy(5,6);
     puts(tempMachPlaceNo+15); 
     gotoxy(10,6);
     puts(machThisQty);
    }
    get_member(iOperation,1,tempStr);  
    _StrLeftLen(machQty,tempStr,13,4);                  
    SetVideoMode(VIDEO_NORMAL);                   
    SetFont(FONT_6X8);

 SetCursor(0);
 
    gotoxy(0, 0);
 puts(mnuItems[0]);
 gotoxy(0, 1);
 puts(machSn);  
 gotoxy(0,6);
 puts(mnuItems[1]);
 
 gotoxy(9,6);
    puts("/");
 gotoxy(0,7);  
 puts(mnuItems[2]);
    gotoxy(5,7); 
    puts(tempStr+17);
    gotoxy(9,7);
    puts("/");
    gotoxy(10,7);
    puts(machQty);
 SetCursor(1);
 if(strlen(machSn)>16)
  gotoxy(strlen(machSn),1);
 else
  gotoxy(strlen(machSn)-16,2);
}
//
//
//
void _CheckDataIsRight(char* machSn,char* tempMachPlaceNo)
{
 int mnuIdx  = 2;   
 int intMachNumber;     //機台要求數量
    int machQtyNumber;     //機台實際數
    int  len=30;
    char key;
    char machNo[7];        //物品類號
    char machPlace[6];     //機台產地
    char machNumber[5];    //機台數量
    char tempMachSn[31];   //臨時物品序號
    char tempStr[31];
    char machQty[5];       //機台實際數字符型
    char sysDate[15];      //獲取系統時間
    char tempSnAddDate[45];//將序號和時間向加
    char machPlaceNo[12];
    char machLength[3];
    char tempOperation[22];
    char tempLength[3];
   
 InitScanner1();
 memset(machNo, '/0',  7);
 memset(machPlace, '/0',  6);
 memset(machNumber, '/0',  5);
 memset(tempMachSn,'/0',31);
 memset(tempStr, '/0',  31);
 memset(machQty, '/0',  5);
 memset(sysDate,'/0',15);
 memset(tempSnAddDate,'/0',45);
 memset(machPlaceNo,'/0',12);
 memset(machLength,'/0',3);
 memset(tempOperation,'/0',22);
 memset(tempLength,'/0',3);
 
 
    //_StrRightLen(machNo,machSn,8,6);
 if(strlen(machSn)<31&&strlen(machSn)>18)
    {
     
     _IntToStr(strlen(machSn),tempLength);
     get_member(iOperation,1,tempOperation);
     memcpy(machLength,tempOperation+11,2);
     _StrRightLen(machNo,machSn,8,6); 
     _StrLeftLen(machPlace,machSn,2,5); 
     memcpy(machPlaceNo,machPlace,5);
     memcpy(machPlaceNo+5,machNo,6);
     memcpy(tempMachSn,machSn,strlen(machSn));
     _StrPad(tempMachSn,strlen(tempMachSn),31,32);
  } 
  if(strlen(machSn)<19)
  {
        _ShowSingleMsg(2, 2, 1, 200, SND_Error,(char *) "Length < 19");        
     }  
     else if(strlen(machSn)>30)
     {
     _ShowSingleMsg(2, 2, 1, 200, SND_Error,(char *) "Length > 30");        
  }
  else if(strcmp(tempLength,machLength))
  {
   _ShowSingleMsg(2, 2, 1, 200, SND_Error,(char *) "Length  worry"); 
  } 
  else if(has_member(iUpload,1,tempMachSn))
     {
        _ShowSingleMsg(2, 2, 1, 200, SND_Error,(char *) "has been check"); 
     } 
  else if(has_member (iBlack, 1,tempMachSn))
     {
        _ShowSingleMsg(2, 2, 1, 200, SND_Error,(char *) " in blackname"); 
     }                
     else if(!has_member(iHead, 1,machPlaceNo))
     {
        _ShowSingleMsg(2, 2, 1, 200, SND_Error,(char *) "don't has this thing"); 
     }             
     else if(has_member(iHead, 1, machPlaceNo))
     {
        get_member(iHead, 1, tempStr);
        _StrRight(machNumber,tempStr,4);
        _StrLeftLen(machQty,tempStr,11,4);
        machQtyNumber=atoi(machQty);
        intMachNumber=atoi(machNumber);
        if(machQtyNumber<=intMachNumber)
        {        
             _ShowSingleMsg(2, 2, 1, 200, SND_Error,(char *) "thing has full");
        }
        else
        {    
    intMachNumber+= 1;
    _IntToFormatStr(intMachNumber,machNumber);
    memcpy(tempStr+15,machNumber,4);
    update_member(iHead,1,tempStr);
    get_member(iOperation,1,tempStr);                                                   
    _StrRight(machQty,tempStr, 4);
    _StrLeftLen(machNumber,tempStr,13,4);               
    machQtyNumber=atoi(machQty);
    intMachNumber=atoi(machNumber);
         
    if(intMachNumber>machQtyNumber)
    {     
     machQtyNumber+= 1;
     _IntToFormatStr(machQtyNumber,machQty);

     memcpy(tempStr+17,machQty,4);
     update_member(iOperation,1,tempStr);
     get_time(sysDate);
     memcpy(tempSnAddDate,tempMachSn,strlen(tempMachSn));
     memcpy(tempSnAddDate+30,sysDate,14);          
     add_member(iUpload,tempSnAddDate);
     _ShowSingleMsg(2, 2, 1, 200, SND_Succ,(char *) "Add Success");
     }
     else
     {
      _ShowSingleMsg(2, 2, 1, 200, SND_Error,(char *) "count has full");
     }        
    }
   }   
   memcpy(tempMachPlaceNo,machPlaceNo,11);                            
   _CheckDataDraw(machSn,machPlaceNo,mnuIdx);                        
}
//************************************************
// GetKeyData() : User set time.
//************************************************

void UserSetDate()
{
 int  pos,xpos,ypos,iday,ibeep[4] = {20,10, 0, 0};
    int  jump[2]={5,8};
    char sbuf[15],stime[15],date[8],timeTemp[11],key; 
   
    pos=0;
    xpos=1;
    ypos=2;
    clr_scr();
    dis_alpha();
    memset(timeTemp,'/0',11);
    memset(stime,'/0',15);
    get_time(stime);
    memcpy(timeTemp,stime,4);
    memset(timeTemp+4,'-',1);
    memcpy(timeTemp+5,stime+4,2);
    memset(timeTemp+7,'-',1);
    memcpy(timeTemp+8,stime+6,2);

    sbuf[0] = 0;
    SetCursor (1);
    gotoxy (xpos, ypos);
    puts(timeTemp);  
    gotoxy(1,2);
   while(1)
   {
    key = getchar();
        if((key >= '0') && (key <= '9'))
        {         
         gotoxy (xpos, ypos); 
         putchar (key);
         sbuf[pos]=key;
         xpos++;
         pos++;
         if(xpos==5||xpos==8)
         {
          xpos++;          
         }
         gotoxy(xpos,ypos);
         if (pos >= 8)
         {                           
          memcpy(stime,sbuf,8);
          if(set_time(stime))
          {                
           on_beeper(ibeep);
           clr_scr();        
           return;
          }
          else
          {
           _ShowSingleMsg(2, 2, 1, 200, SND_Error,(char *) "SetDate Err");
           return;     
          }        
         }        
  }
  if(key==KEY_ESC)
  {
   return; 
  }
 }                                  
}
//******************************************************************
// 設置系統時間
//******************************************************************
void UserSetTime()
{
    int  pos,xpos,ypos,iday,ibeep[4] = {20,10, 0, 0};
    int  jump[2]={5,8};
    char sbuf[6],stime[15],date[8],timeTemp[6],key; 
   
    pos=0;
    xpos=1;
    ypos=2;
    clr_scr();
    dis_alpha();
    memset(sbuf,'/0',6);
    memset(timeTemp,'/0',6);
    memset(stime,'/0',15);
    get_time(stime);
    memcpy(timeTemp,stime+8,2);
    memset(timeTemp+2,':',1);
    memcpy(timeTemp+3,stime+10,2);

    sbuf[0] = 0;
    SetCursor (1);
    gotoxy (xpos, ypos);
    puts(timeTemp);  
    gotoxy(1,2);
   while(1)
   {
    key = getchar();
        if((key >= '0') && (key <= '9'))
        {         
         gotoxy (xpos, ypos); 
         putchar (key);
         sbuf[pos]=key;
         xpos++;
         pos++;
         if(xpos==3)
         {
          xpos++;          
         }
         gotoxy(xpos,ypos);
         if (pos >= 4)
         {                           
          memcpy(stime+8,sbuf,4);
          if(set_time(stime))
          {                
           on_beeper(ibeep);
           clr_scr();        
           return;
          }
          else
          {
           _ShowSingleMsg(2, 2, 1, 200, SND_Error,(char *) "SetTime Err");
           return;     
          }        
         }        
  }
  if(key==KEY_ESC)
  {
   return; 
  }
 }                                       
}
//-------------------------------------------------------------------------//
//******************************************************************
//  設置背靜燈光
//******************************************************************
void BlackLight()
{
 int retval=1;
    retval = _Inquire((char *)"Black Light", (char *)"", (char *)"1.NO",(char *)"2.OFF");
 if(retval == 1)
    lcd_backlit (1);
 else
    lcd_backlit (0);
    return;
}

//******************************************************************
//  核查
//******************************************************************
void CheckData()
{
 int mnuNo   = 1;
 int mnuIdx  = 2;
 char key;
    int  len=30;
 char machSn[31];     // 物品序號
    char machPlaceNo[12];   //物品地址和種類
    char tempMachPlaceNo[12];
    char saveKey;
    
 InitScanner1();
 memset(machSn, '/0',31);
 memset(machPlaceNo,'/0',12);
 memset(tempMachPlaceNo,'/0',12);
 _CheckDataDraw(machSn,tempMachPlaceNo,mnuIdx); 
 
 while(1)
 {
     key=getchar();
  if(Decode())
  {        
     _GetScanData(machSn, len); 
     _CheckDataIsRight(machSn,tempMachPlaceNo);       
  } 
  else if(key == KEY_ESC)
  {
   HaltScanner1();
   return;
  }
  else if(key == KEY_ALPHA)
  {   
     en_alpha(8000);
        }
  else if(key == KEY_CR)
  {   
     _CheckDataIsRight(machSn,tempMachPlaceNo);
        }
        else if(key >= '#' && key <= 'z')
        {
       _AddOneChar(machSn, len, key);
       _CheckDataDraw(machSn,tempMachPlaceNo, mnuIdx); 
        }
        else if(key == KEY_BS)
        {
       _BackOneChar(machSn); 
       _CheckDataDraw(machSn,tempMachPlaceNo,mnuIdx);
        }
   } 
}

//******************************************************************
// 程式進入點
//******************************************************************
void main(void)
{
 int mnuNo   = 6;
 int mnuIdx  = 1;
 char key;
 CreateDatabase();
 main_Draw(mnuIdx);
 while(1)
 {
  key = getchar();
  if((key == KEY_UP) || (key == KEY_DOWN) || ((key >= '1') && (key <= '6')))
  {
   mnuIdx = _GetMnuIdx(mnuNo, mnuIdx, key);
   main_Draw(mnuIdx);
  }
  else if(key == KEY_CR)
  {
   switch(mnuIdx)
   {     
                case 1 : CheckData();   break;  //
    case 2 : Download();    break;    //
    case 3 : Upload();      break;    //
    case 4 : BlackLight();  break;    //
    case 5 : UserSetDate(); break;    //
    case 6 : UserSetTime(); break;    //
   }
      main_Draw(mnuIdx);
  }
 }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值