static uint8 bill_setup(BILL_SETUP *setup) { uint8 res,i; res = bill_send(MDB_BILL_SETUP,NULL,0x00); if(res != 1) return res; //level = 1 does not support option bits level = 2 supports option bits setup->level = recvbuf[0]; setup->codel = INTEG16(recvbuf[1],recvbuf[2]); setup->scale = INTEG16(recvbuf[3],recvbuf[4]); setup->decimal = recvbuf[5]; setup->rato = setup->scale * 100;//以分为单位 for(i = 0;i < setup->decimal;i++){ setup->rato /= 10; } setup->stkCapacity = INTEG16(recvbuf[6],recvbuf[7]); setup->security = INTEG16(recvbuf[8],recvbuf[9]); setup->escrowFun = (recvbuf[10] == 0) ? 0 : 1; for(i=0;i<16;i++){ if(recvbuf[11+i] == 0xFF) setup->ch[i] = 0; else setup->ch[i] = (uint32)recvbuf[11+i] * setup->rato; } print_bill("bill-setup:level = %d\r\n",setup->level); return 1; }
/********************************************************************************************************* ** Function name: ReadLogAPI ** Descriptions: 从flash读区域交易记录,总交易记录 ** input parameters: ** output parameters: 无 ** Returned value: 1读取成功,0读取失败 *********************************************************************************************************/ uint8_t ReadLogAPI(void) { uint8_t *tp2,buf[512]; uint16_t crc,len; tp2 = (uint8_t *) &LogPara;//交易数据记录 AT45DBReadPage(4040,buf); len = sizeof(LogPara); if(len > 500) return 0; crc = CrcCheck(buf,len); //Trace("LogPara:\r\n crc =%d,buf[crc]=%d type = %d\r\n",crc,INTEG16(buf[len],buf[len + 1]),buf[len + 2]); if((crc == INTEG16(buf[len],buf[len + 1])) && (buf[len + 2] == 0xE0)) { Trace("\r\nLogPara read from flash suc....\r\n"); memcpy(tp2,buf,len); return 1; } //Trace("LogPara read from flash fail....\r\n"); return 0; /* crc = CrcCheck(tp2,sizeof(LogPara)-2); //Trace("\r\n logcrc=%d,%x,%x",sizeof(LogPara)-2,crc/256,crc%256); if( (crc/256 == LogPara.CrcCheck[0])&&(crc%256 == LogPara.CrcCheck[1]) ) { return 1; } else { return 0; } */ }
uint8 BT_recv(uint8 *rdata,uint8 *rlen,uint32 ms) { uint8 index = 0,len = 0,ch; uint16 crc; *rlen = 0; Timer.bentoTimeout = (ms > 200) ? ms / 10 : 20; while(Timer.bentoTimeout){ if(uartIsNotEmpty()){ ch = uartGetCh(); rdata[index++] = ch; if(index == 1){ if(ch != (BT_HEAD + 1)){ index = 0; } } else if(index == 2){ len = ch; } else if(index >= (len + 2)){ crc = CrcCheck(rdata,len); if(crc == INTEG16(rdata[len],rdata[len + 1])){ *rlen = len + 2; return 1; } else return 0; } } msleep(10); } return 0; }
/********************************************************************************************************* ** Function name: read_data ** Descriptions: 读取信息 ** input parameters: ** output parameters: 无 ** Returned value: 无 *********************************************************************************************************/ static unsigned char read_data(void *ptr,unsigned short len,unsigned short addr) { unsigned short crc; unsigned char buf[256] = {0}; if(!ptr || !len || (len > 240)) return 0; readFlash(addr,buf,256); crc = CrcCheck(buf,len); if(crc == INTEG16(buf[len],buf[len + 1])) { memcpy(ptr,buf,len); return 1; } return 0; }
/********************************************************************************************************* ** Function name: readDetailTradeInfo ** Descriptions: 读取交易记录 ** input parameters: 无 ** output parameters: 无 ** Returned value: 无 *********************************************************************************************************/ unsigned char readDetailTradeInfo(DETAIL_TRADE_INFO *stDetail,unsigned short pageNo) { unsigned char buf[ADD_TRADE_PAGE_LEN] = {0}; unsigned short flashPage,crc,len; if(!stDetail || (pageNo > TRADE_MAX_PAGE)) return 0; flashPage = ADD_TRADE_INFO + pageNo * ADD_TRADE_PAGE_LEN; len = sizeof(DETAIL_TRADE_INFO); readFlash(flashPage, buf,ADD_TRADE_PAGE_LEN); crc = CrcCheck(buf,len); if(crc == INTEG16(buf[len],buf[len + 1])) { memcpy((void *)stDetail,buf,len); return 1; } return 0; }
/********************************************************************************************************* ** Function name: ReadDetailTraceAPI ** Descriptions: 从flash读每条明细日志 不用全局变量 ** input parameters: ** output parameters: 无 ** Returned value: 1读取成功,0读取失败 *********************************************************************************************************/ uint8_t ReadDetailTraceAPI(char * detailBuff,uint16_t LogDetailPage) { uint8_t buf[512]; uint16_t crc,len; AT45DBReadPage(LogDetailPage,buf); len = sizeof(LogParaDetail); if(len > 500) return 0; crc = CrcCheck(buf,len); if((buf[len + 2] == 0xE1) && (crc == INTEG16(buf[len],buf[len + 1]))) { //Trace("LogDetailPage read from flash suc....\r\n"); if(detailBuff != NULL) memcpy(detailBuff,buf,len); return 1; } return 0; }
/********************************************************************************************************* ** Function name: HP_check ** Descriptions: hopper设备操作控制函数 ** input parameters: addr:设备的硬件物理地址 ** output parameters: 无 ** Returned value: 1:收到应答;0:应答超时 2 忙 *********************************************************************************************************/ uint8 HP_send_check(ST_HOPPER *hopper) { uint8 res,s; res = HP_send(hopper->addr,HP_QUERY,0x00); if(res == 1){ if(recvbuf[1] == 0x08 && hopper->addr == recvbuf[4]) { s = recvbuf[3]; print_hopper("HP[%d]=%x\r\n",hopper->addr + 1,s); if(s & (0x01U << 1)){ //hopper忙 return 3; } if((s & (0x01U << 2)) || (s & (0x01U << 7))){ //指令错误 return 3; } if(s == 0){ //hopper 正常 hopper->state = HP_STATE_NORMAL; } else{ if((s & (0x01U << 3)) || (s & (0x01U << 5))){ //hopper 缺币 hopper->state = HP_STATE_QUEBI; } if((s & (0x01U << 4)) || (s & (0x01U << 6))){ //hopper 故障 hopper->state = HP_STATE_FAULT; } if(hopper->state != HP_STATE_QUEBI){ hopper->state = HP_STATE_FAULT; } } hopper->lastCount = INTEG16(recvbuf[6], recvbuf[5]); return 1; } return 99; } return 0; }
unsigned char LOG_readId(ST_MAC_SN *macSn) { uint8_t buf[512],i; uint16_t crc,len; AT45DBReadPage(PAGE_MAC_SN,buf); len = sizeof(macSn->id); crc = CrcCheck(buf,len); if((crc == INTEG16(buf[len],buf[len + 1])) && (buf[len + 2] == 0xEA)) { for(i = 0;i < len;i++){ macSn->id[i] = buf[i]; } return 1; } //Trace("LogPara read from flash fail....\r\n"); return 0; }
/********************************************************************************************************* ** Function name: WriteLogDetailAPI ** Descriptions: 从flash读每条明细日志 ** input parameters: ** output parameters: 无 ** Returned value: 1读取成功,0读取失败 *********************************************************************************************************/ uint8_t ReadLogDetailAPI(uint16_t LogDetailPage) { uint8_t *tp1,buf[512]; uint16_t crc,len; tp1 = (uint8_t *) &LogParaDetail;//交易数据记录 AT45DBReadPage(LogDetailPage,buf); len = sizeof(LogParaDetail); if(len > 500) return 0; crc = CrcCheck(buf,len); //Trace("LogDetailPage:\r\n crc =%d,buf[crc]=%d,typr = %d\r\n",crc,INTEG16(buf[len],buf[len + 1]),buf[len + 2]); if((buf[len + 2] == 0xE1) && (crc == INTEG16(buf[len],buf[len + 1]))) { //Trace("LogDetailPage read from flash suc....\r\n"); memcpy(tp1,buf,len); return 1; } //Trace("LogDetailPage read from flash fail...\r\n"); return 0; /* crc = CrcCheck(tp1,sizeof(LogParaDetail)-2); //Trace("\r\n detaillogcrc=%d,%x,%x",sizeof(LogParaDetail)-2,crc/256,crc%256); if( (LogParaDetail.CrcCheck[0]==0)&&(LogParaDetail.CrcCheck[1]==0) ) { return 0; } else { if( (crc/256 == LogParaDetail.CrcCheck[0])&&(crc%256 == LogParaDetail.CrcCheck[1]) ) { return 1; } else { return 0; } } */ }
/********************************************************************************************************* ** Function name: readSystemParaFromFlash ** Descriptions: 从flash中读取系统参数 4个字节读取 ** input parameters: ** output parameters: 无 ** Returned value: 无 *********************************************************************************************************/ unsigned char readSystemParaFromFlash() { unsigned char buf[256] = {0}; unsigned short len = 0,crc; len = (8 + 8 + HOPPER_NUMS) * 4 + sizeof(SYSPara); readFlash(ADD_SYSTEM_PARA, buf,len + 2); crc = CrcCheck(buf,len); if(crc == INTEG16(buf[len],buf[len + 1])) { len = 0; memcpy(stDevValue.BillValue,&buf[len],8 * 4);//纸币器通道面值 len += 8 * 4; memcpy(stDevValue.CoinValue,&buf[len],8 * 4);//硬币器通道面值 len += 8 * 4; memcpy(stDevValue.HpValue,&buf[len],HOPPER_NUMS * 4);//hopper通道面值 len += HOPPER_NUMS * 4; memcpy((unsigned char *)&SYSPara,&buf[len],sizeof(SYSPara)); len += sizeof(SYSPara); return 1; } return 0; }
static void DB_hp_payout_rpt(void) { uint8 in = MT + 1,out = MT + 2; uint8 addr; uint16 nums,changed = 0; addr = recvbuf[out++]; nums = INTEG16(recvbuf[out+0],recvbuf[out+1]); if(MDB_getCoinDispenser() == COIN_DISPENSER_HOPPER){ changed = HP_payout_by_no(addr,nums); } else{ changed = 0; } sendbuf[in++] = MDB_HP_PAYOUT_RPT; sendbuf[in++] = addr; sendbuf[in++] = HUINT16(changed); sendbuf[in++] = LUINT16(changed); DB_package(DB_MT_ACTION_RPT,in); DB_uart1Send(); }
/********************************************************************************************************* ** Function name: HopperAccepter_Handle ** Descriptions: EVB设备操作控制函数 ** input parameters: DeviceCmdType:需要操作控制的设备类型 Address:设备的硬件物理地址 nbuf:操作内容,如Hopper出币操作的出币数量 ** output parameters: 无 ** Returned value: 1:收到应答;0:未收到应答即通讯失败 *********************************************************************************************************/ unsigned char HopperAccepter_Handle(unsigned char DeviceCmdType,unsigned char Address,unsigned char *nbuf) { uint8_t EvbAckMsg[36],i,j; uint8_t MsgHead,MsgType,MsgAdd; uint16_t MsgDate; uint8_t res,DevNum=0; static uint8_t sn=0; //Hopper查询操作指令 if(DeviceCmdType == EVBHANDLE_HPQUERY) { TraceChange("HpAdd=%d\r\n",Address); MsgHead = 0xED; MsgType = EVBHANDLE_HPQUERY; MsgAdd = Address; MsgDate = 0; } else //Hopper出币操作指令 if(DeviceCmdType == EVBHANDLE_HPOUTPUT) { sn++; MsgHead = 0xED; MsgType = EVBHANDLE_HPOUTPUT; MsgAdd = Address; MsgDate = (nbuf[0]<<8)|(nbuf[1]&0x00ff); } for(j=0;j<5;j++) { //发送操作包,并判断应答包 res = EvbConversation(1,MsgHead,sn,MsgType,MsgAdd,MsgDate,EvbAckMsg); if(res == 1) { if(DeviceCmdType == EVBHANDLE_HPOUTPUT && EvbAckMsg[1] == 0x06)//出币命令且返回ACK 6字节 { //if(EvbAckMsg[3] & 0x01)//重包 //{ // sn++; // continue; //} return 1; } else if(DeviceCmdType == EVBHANDLE_HPQUERY && EvbAckMsg[1] == 0x08)//查询命令并返回 状态结果 8字节 { for(i=0;i<3;i++) { if(stEvbHp[i].Add == EvbAckMsg[4]) { DevNum = i; break; } } if(i>=3) return 0; TraceChange("1_EvbAckMsg=%x state=%d\r\n",EvbAckMsg[3],stEvbHp[DevNum].State); if((EvbAckMsg[3]==0x00)||(EvbAckMsg[3]==0x01)) stEvbHp[DevNum].State = 0x00; else if((EvbAckMsg[3]==0x20)||(EvbAckMsg[3]==0x29)) stEvbHp[DevNum].State = 0x02; else if((EvbAckMsg[3]==0x11)||(EvbAckMsg[3]==0x39)||(EvbAckMsg[3]==0x28)||(EvbAckMsg[3]==0x41)) stEvbHp[DevNum].State = 0x03; stEvbHp[DevNum].OutPutCount = INTEG16(EvbAckMsg[6],EvbAckMsg[5]); TraceChange("2_EvbAckMsg=%x state=%d\r\n",EvbAckMsg[3],stEvbHp[DevNum].State); stEvbHp[DevNum].StateChk=EvbAckMsg[3]; return 1; } } else { for(i=0;i<3;i++) { if(stEvbHp[i].Add == MsgAdd) { stEvbHp[i].State = 0x03; stEvbHp[i].StateChk=0x80; break; } } } } return 0; }
/* * Class: com_easivend_evprotocol_VboxProtocol * Method: EV_portRegister * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_easivend_evprotocol_VboxProtocol_VboxReadMsg (JNIEnv *env, jclass cls, jint fd, jint timeout) { jstring msg; char *text = NULL; cJSON *root,*entry,*jsonarr,*jsonobj; VBOX_MSG *vmsg; unsigned char *buf,in,temp8,temp81,textbuf[32],i; vmsg = VBOX_readMsg(fd,(uint32)timeout); root=cJSON_CreateObject(); entry = cJSON_CreateObject(); cJSON_AddItemToObject(root, JSON_HEAD,entry); cJSON_AddNumberToObject(entry,JSON_TYPE,VBOX_TYPE); if(vmsg == NULL){ cJSON_AddNumberToObject(entry,"mt",VBOX_TIMEOUT); } else{ cJSON_AddNumberToObject(entry,"port",vmsg->port); if(vmsg->res == 0){ cJSON_AddNumberToObject(entry,"mt",VBOX_TIMEOUT); } else if(vmsg->res == 1){ cJSON_AddNumberToObject(entry,"mt",vmsg->mt); cJSON_AddNumberToObject(entry,"sn",vmsg->sn); cJSON_AddNumberToObject(entry,"ver",vmsg->ver); cJSON_AddNumberToObject(entry,"F7",vmsg->F7); buf = (unsigned char *)vmsg->recvbuf;in = 5; switch(vmsg->mt){ case VBOX_POLL:case VBOX_ACK_RPT:case VBOX_NAK_RPT: in = 5; break; case VBOX_VMC_SETUP: cJSON_AddNumberToObject(entry,"hd_num",buf[in++]); cJSON_AddNumberToObject(entry,"pos_num",buf[in++]); cJSON_AddNumberToObject(entry,"magic1",INTEG16(buf[in+0],buf[in+1]));in+=2; cJSON_AddNumberToObject(entry,"scale_factor",buf[in++]); cJSON_AddNumberToObject(entry,"decimal_places",buf[in++]); cJSON_AddNumberToObject(entry,"feature",INTEG32(buf[in + 0],buf[in + 1],buf[in + 2],buf[in + 3])); in += 4; break; case VBOX_PAYIN_RPT: cJSON_AddNumberToObject(entry,"dt",buf[in++]); cJSON_AddNumberToObject(entry,"value",INTEG16(buf[in+0],buf[in+1]));in+=2; cJSON_AddNumberToObject(entry,"total_value",INTEG16(buf[in+0],buf[in+1]));in+=2; break; case VBOX_PAYOUT_RPT: cJSON_AddNumberToObject(entry,"device",buf[in++]); cJSON_AddNumberToObject(entry,"value",INTEG16(buf[in+0],buf[in+1]));in+=2; cJSON_AddNumberToObject(entry,"total_value",INTEG16(buf[in+0],buf[in+1]));in+=2; cJSON_AddNumberToObject(entry,"type",buf[in++]); break; case VBOX_VENDOUT_RPT: cJSON_AddNumberToObject(entry,"device",buf[in++]); cJSON_AddNumberToObject(entry,"status",buf[in++]); cJSON_AddNumberToObject(entry,"hd_id",buf[in++]); cJSON_AddNumberToObject(entry,"type",buf[in++]); cJSON_AddNumberToObject(entry,"cost",INTEG16(buf[in+0],buf[in+1]));in+=2; cJSON_AddNumberToObject(entry,"total_value",INTEG16(buf[in+0],buf[in+1]));in+=2; cJSON_AddNumberToObject(entry,"huodao",buf[in++]); break; case VBOX_REQUEST: temp8 = buf[in++]; cJSON_AddNumberToObject(entry,"type",temp8); break; case VBOX_ADMIN_RPT: temp8 = buf[in++]; cJSON_AddNumberToObject(entry,"type",temp8); if(temp8 == 2){ cJSON_AddNumberToObject(entry,"data1",buf[in++]); cJSON_AddNumberToObject(entry,"data2",buf[in++]); } break; case VBOX_ACTION_RPT: temp8 = buf[in++]; cJSON_AddNumberToObject(entry,"action",temp8); if(temp8 == 1){ cJSON_AddNumberToObject(entry,"seconds",buf[in++]); cJSON_AddNumberToObject(entry,"hd_id",buf[in++]); cJSON_AddNumberToObject(entry,"type",buf[in++]); cJSON_AddNumberToObject(entry,"cost",INTEG16(buf[in+0],buf[in+1]));in+=2; cJSON_AddNumberToObject(entry,"total_value",INTEG16(buf[in+0],buf[in+1]));in+=2; } else if(temp8 == 2){ cJSON_AddNumberToObject(entry,"seconds",buf[in++]); cJSON_AddNumberToObject(entry,"value",INTEG16(buf[in+0],buf[in+1]));in+=2; cJSON_AddNumberToObject(entry,"total_value",INTEG16(buf[in+0],buf[in+1]));in+=2; cJSON_AddNumberToObject(entry,"type",buf[in++]); } else if(temp8 == 5){ cJSON_AddNumberToObject(entry,"value",buf[in++]); } break; case VBOX_BUTTON_RPT: temp8 = buf[in++]; cJSON_AddNumberToObject(entry,"type",temp8); if(temp8 == 0 || temp8 == 4){ cJSON_AddNumberToObject(entry,"value",buf[in++]); } else if(temp8 == 1 || temp8 == 2){ cJSON_AddNumberToObject(entry,"device",buf[in++]); cJSON_AddNumberToObject(entry,"value",buf[in++]); } break; case VBOX_STATUS_RPT: temp8 = buf[in++]; cJSON_AddNumberToObject(entry,"check_st",(temp8 >> 6) & 0x03); cJSON_AddNumberToObject(entry,"bv_st",(temp8 >> 4) & 0x03); cJSON_AddNumberToObject(entry,"cc_st",(temp8 >> 2) & 0x03); cJSON_AddNumberToObject(entry,"vmc_st",(temp8 >> 0) & 0x03); cJSON_AddNumberToObject(entry,"post_st",buf[in++]); cJSON_AddNumberToObject(entry,"change",INTEG16(buf[in+0],buf[in+1]));in+=2; cJSON_AddNumberToObject(entry,"tem1",buf[in++]); cJSON_AddNumberToObject(entry,"tem2",buf[in++]); cJSON_AddNumberToObject(entry,"tem3",buf[in++]); cJSON_AddNumberToObject(entry,"tem4",buf[in++]); cJSON_AddNumberToObject(entry,"tem_st",buf[in++]); cJSON_AddNumberToObject(entry,"auto_payout",buf[in++]); break; case VBOX_HUODAO_RPT: cJSON_AddNumberToObject(entry,"device",buf[in++]); temp8 = 5 + 1 + 2; temp8 = vmsg->recvlen > temp8 ?vmsg->recvlen - temp8: 0; cJSON_AddItemToObject(entry,"huodao",jsonarr = cJSON_CreateArray()); for(i = 0;i < temp8;i++){ cJSON_AddItemToArray(jsonarr,jsonobj = cJSON_CreateObject()); cJSON_AddNumberToObject(jsonobj,"no",i + 1); temp81 = buf[in++]; cJSON_AddNumberToObject(jsonobj,"state",(temp81 & (0x01 << 6)) ? 1 : 0); cJSON_AddNumberToObject(jsonobj,"remain",(temp81 & 0x3F)); } break; case VBOX_COST_RPT: cJSON_AddNumberToObject(entry,"device",buf[in++]); cJSON_AddNumberToObject(entry,"value",INTEG16(buf[in+0],buf[in+1]));in+=2; cJSON_AddNumberToObject(entry,"total_value",INTEG16(buf[in+0],buf[in+1]));in+=2; cJSON_AddNumberToObject(entry,"type",buf[in++]); break; case VBOX_INFO_RPT: temp8 = buf[in++]; cJSON_AddNumberToObject(entry,"type",temp8); if(temp8 == 3){ cJSON_AddNumberToObject(entry,"total_value",INTEG16(buf[in+0],buf[in+1]));in+=2; } else if(temp8 == 4){ temp8 = 0; } else if(temp8 == 5){ cJSON_AddNumberToObject(entry,"year",INTEG16(buf[in+0],buf[in+1]));in+=2; cJSON_AddNumberToObject(entry,"month",buf[in++]); cJSON_AddNumberToObject(entry,"day",buf[in++]); cJSON_AddNumberToObject(entry,"hour",buf[in++]); cJSON_AddNumberToObject(entry,"min",buf[in++]); cJSON_AddNumberToObject(entry,"sec",buf[in++]); cJSON_AddNumberToObject(entry,"xq",buf[in++]); } else if(temp8 == 6){ temp8 = 0; } else if(temp8 == 10){ temp8 = 0; cJSON_AddNumberToObject(entry,"device",buf[in++]); temp8 = 5 + 1 + 1 + 2; temp8 = vmsg->recvlen > temp8 ?vmsg->recvlen - temp8: 0; cJSON_AddItemToObject(entry,"sp_id",jsonarr = cJSON_CreateArray()); for(i = 0;i < temp8;i++){ cJSON_AddItemToArray(jsonarr,jsonobj = cJSON_CreateObject()); //cJSON_AddNumberToObject(jsonobj,"no",i + 1); //cJSON_AddNumberToObject(jsonobj,"sp_id",buf[in++]); cJSON_AddNumberToObject(jsonobj,"id",buf[in++]); } } else if(temp8 == 12){ temp8 = 0; cJSON_AddNumberToObject(entry,"device",buf[in++]); temp8 = 5 + 1 + 1 + 2; temp8 = vmsg->recvlen > temp8 ?vmsg->recvlen - temp8: 0; cJSON_AddItemToObject(entry,"sp_price",jsonarr = cJSON_CreateArray()); for(i = 0;i < (temp8 / 2);i++){ cJSON_AddItemToArray(jsonarr,jsonobj = cJSON_CreateObject()); //cJSON_AddNumberToObject(jsonobj,"no",i + 1); //cJSON_AddNumberToObject(jsonobj,"sp_price",INTEG16(buf[in + 0],buf[in + 1]));in += 2; cJSON_AddNumberToObject(jsonobj,"id",INTEG16(buf[in + 0],buf[in + 1]));in += 2; } } else{ temp8 = 0; } break; default:break; } } else{
static unsigned char FS_readStatusRpt(FS_MSG *recv) { uint8 *data; uint8 i,temp; uint16 in = 0; FS_BOX *box; if(recv->data[0] != 0xE0 || recv->data[1] != 0x01 || recv->data[2] != 0x24){ print_fs("\r\nFS_REQ_STATUS:-----------bad recv---------------\r\n"); return 0; } data = recv->data; in = 3; fsBill.errCode = INTEG16(data[in + 0],data[in + 1]); in += 2; fsBill.errAddr= INTEG16(data[in + 0],data[in + 1]); in += 2; fsBill.fw = INTEG16(data[in + 0],data[in + 1]); in += 2; for(i = 0;i < 3;i++){ fsBill.errRegister[i] = data[in++]; } for(i = 0;i < 6;i++){ fsBill.sensorRegister[i] = data[in++]; } for(i = 0;i < 4;i++){ temp = data[in++]; box = &fsBill.box[i]; //box->status = 0; if(temp & (0x01 << 4)){ box->status |= FS_BOX_FALSE_PLACE; } else{ box->status &= ~FS_BOX_FALSE_PLACE; } if(temp & (0x01 << 5)){ box->status |= FS_BOX_REMOVE; } else{ box->status &= ~FS_BOX_REMOVE; } if(temp & (0x01 << 7)){ box->status |= FS_BOX_BILL_LOW; } else{ box->status &= ~FS_BOX_BILL_LOW; } } fsBill.hexSensor = data[in++]; for(i = 0;i < 4;i++){ box = &fsBill.box[i]; box->l = data[in++]; box->w = data[in++]; } for(i = 0;i < 4;i++){ box = &fsBill.box[i]; box->h = data[in++]; } for(i = 0;i < 4;i++){ box = &fsBill.box[i]; box->changed = data[in++]; } print_fs("errCode=%x errAddr=%x fw =%x\r\n",fsBill.errCode,fsBill.errAddr,fsBill.fw); print_fs("errRegister =%x %x %x\r\n",fsBill.errRegister[0],fsBill.errRegister[1],fsBill.errRegister[2]); for(i = 0;i < 4;i++){ box = &fsBill.box[i]; print_fs("\r\nBox[%d]---------------\r\n",i); print_fs("w=%x l=%x h=%x status=%x",box->w,box->l,box->h,box->status); print_fs("\r\n----------------------\r\n"); } fsBill.status &= ~FS_COM_ERR; fsBill.status |= fsBill.errCode & 0xFFFF; return 1; }