예제 #1
0
 // ////////////////////////////////////////////////////////////////////
 // 全局函数:bool EndBatch()
 //
 // 返回: bool : 成功返回1,失败返回0
 // 参数: 无
 // 功能:
 // 0.数据块标识登记是否有申请?
 // 1.发送命令到Commbox
 // 2.接受结果信息
 // 3.如超时接到数据,或返回错误信息
 // 4.修改命令缓冲区信息
 // 5.清除登记
 // ////////////////////////////////////////////////////////////////////
 public boolean endBatch() {
   int times = D.REPLAYTIMES;
   getShared().isDoNow = true;
   Buffer buff = getShared().buff;
   byte[] cmdTemp = getShared().cmdTemp;
   if (buff.id == D.NULLADD) {
     // 数据块标识登记是否有申请?
     getShared().lastError = D.NOAPPLICATBUFF;
     return false;
   }
   if ((cmdTemp[1] & 0xFF) == 0x01) {
     buff.id = D.NULLADD;
     getShared().lastError = D.NOADDDATA;
     return false;
   }
   while ((times--) > 0) {
     try {
       if (times == 0) {
         buff.id = D.NULLADD;
         return false;
       }
       if (!checkIdle()
           || (getPort().write(getShared().cmdTemp, 0, (cmdTemp[1] & 0xFF) + 3)
               != (getShared().cmdTemp[1] & 0xFF) + 3)) {
         continue;
       } else if (sendOk(20 * ((cmdTemp[1] & 0xFF) + 10))) {
         break;
       }
       if (!stopNow(true)) {
         buff.id = D.NULLADD;
         return false;
       }
     } catch (IOException e) {
       continue;
     }
   }
   Information info = getShared().info;
   if (buff.id == D.LINKBLOCK) {
     buff.add[D.LINKBLOCK] = (byte) (info.cmdBuffLen - (cmdTemp[1] & 0xFF));
   } else {
     buff.add[buff.id] = buff.add[D.SWAPBLOCK];
     buff.used[buff.usedNum] = (byte) (buff.id);
     buff.usedNum++;
     buff.add[D.SWAPBLOCK] = (byte) ((buff.add[D.SWAPBLOCK] & 0xFF) + (cmdTemp[1] & 0xFF));
   }
   buff.id = D.NULLADD;
   return true;
 }
예제 #2
0
 // ////////////////////////////////////////////////////////////////////
 // 静态函数:
 // BYTE AddToBuff(BYTE commandword ,BYTE length,char * data)
 // 向已申请的新数据缓冲区块填入命令
 //
 // 返回: 下一命令的块内地址
 // 参数: commandword 操作命令字
 // length 要写入数据的长度
 // data 写入的数据
 // 功能:
 // 0.数据块标识登记是否有申请?
 // 1.检查是否有足够的空间存储?
 // 2.检查命令的合法性,是否为缓冲区命令?
 // 3.写入命令
 // 4.计算校验
 // ////////////////////////////////////////////////////////////////////
 public boolean addToBuff(int commandWord, int offset, int count, byte... data) {
   byte[] cmdTemp = getShared().cmdTemp;
   int dataLength = cmdTemp[1] & 0xFF;
   int checksum = cmdTemp[dataLength + 2] & 0xFF;
   getShared().nextAddress = dataLength + count + 1;
   Buffer buffer = getShared().buff;
   if (buffer.id == D.NULLADD) {
     // 数据块标识登记是否有申请?
     getShared().lastError = D.NOAPPLICATBUFF;
     getShared().isDoNow = true;
     return false;
   }
   if (buffer.size() < getShared().nextAddress) {
     // 检查是否有足够的空间存储?
     getShared().lastError = D.BUFFFLOW;
     getShared().isDoNow = true;
     return false;
   }
   if (commandWord < getD().RESET
       && commandWord != D.CLR_LINK
       && commandWord != D.DO_BAT_00
       && commandWord != D.D0_BAT
       && commandWord != D.D0_BAT_FOR
       && commandWord != getD().WR_DATA) {
     // 是否为缓冲区命令?
     if ((count <= D.CMD_DATALEN) || (commandWord == getD().SEND_DATA && count < D.SEND_LEN)) {
       // 是否合法命令?
       if (commandWord == getD().SEND_DATA && getBoxVer() > 0x400) {
         // 增加发送长命令
         cmdTemp[dataLength + 2] = (byte) (D.SEND_CMD);
         checksum += D.SEND_CMD;
         dataLength++;
         cmdTemp[dataLength + 2] = (byte) (commandWord + count);
         if (count > 0) {
           int temp = cmdTemp[dataLength + 2] & 0xFF;
           cmdTemp[dataLength + 2] = (byte) (temp - 1);
         }
         checksum += cmdTemp[dataLength + 2] & 0xFF;
         dataLength++;
         for (int i = 0; i < count; i++, dataLength++) {
           cmdTemp[dataLength + 2] = data[i];
           checksum += data[i] & 0xFF;
         }
         cmdTemp[1] = (byte) (dataLength);
         cmdTemp[dataLength + 2] = (byte) (checksum + count + 2);
         getShared().nextAddress++;
       } else {
         cmdTemp[dataLength + 2] = (byte) (commandWord + count);
         if (count > 0) {
           int temp = cmdTemp[dataLength + 2];
           cmdTemp[dataLength + 2] = (byte) (temp - 1);
         }
         checksum += cmdTemp[dataLength + 2] & 0xFF;
         dataLength++;
         for (int i = 0; i < count; i++, dataLength++) {
           cmdTemp[dataLength + 2] = data[i];
           checksum += data[i] & 0xFF;
         }
         cmdTemp[1] = (byte) (dataLength);
         cmdTemp[dataLength + 2] = (byte) (checksum + count + 1);
         getShared().nextAddress++; // Ogilvy Xu add.
       }
       return true;
     }
     getShared().lastError = D.ILLIGICAL_LEN;
     getShared().isDoNow = true;
     return false;
   }
   getShared().lastError = D.UNBUFF_CMD;
   getShared().isDoNow = true;
   return false;
 }