BOOL COsakiParser::OnDataFrame(DATASTREAM *pStream, BYTE *pszBuffer, int nLength, void *pCallData) { ONDEMANDPARAM *pOndemand = (ONDEMANDPARAM *)pCallData; OSAKI_OPTION_TBL *pOsakiOptionTbl; int nIndex = pOndemand->nIndex; unsigned long long int value; XDEBUG(" OSAKI response payload : %d\r\n", nLength); XDUMP((const char *)pszBuffer, nLength, TRUE); if(!pOndemand) return TRUE; pOsakiOptionTbl = &((OSAKI_OPTION_TBL *)pOndemand->pOndemandCallData)[nIndex]; if(pOsakiOptionTbl->nStatus == 0 && pOsakiOptionTbl->szDesc == NULL) return TRUE; switch(pOsakiOptionTbl->nStatus) { case IDX_REQ_PULSE: // Current Pulse value = AsciiToInt(pszBuffer + nLength - 7, 7); XDEBUG(" OSAKI Power : %ld KWh\r\n", value); pOndemand->nCurPulse = (UINT) value; break; case IDX_REQ_RELAY_STATUS: // Current Pulse value = AsciiToInt(pszBuffer + 12, 2); XDEBUG(" Relay : %ld\r\n", value); switch((BYTE)value) { case 0x00: pOndemand->nEnergyLevel = ENERGY_LEVEL_MAX; break; case 0x01: pOndemand->nEnergyLevel = ENERGY_LEVEL_MIN; break; default: pOndemand->nEnergyLevel = ENERGY_LEVEL_UNDEFINED; break; } /** Energy Level Update */ m_pEndDeviceList->SetEnergyLevel(&pOndemand->id, pOndemand->nEnergyLevel, 0); XDEBUG(" ENERGY LEVEL : %d\r\n", pOndemand->nEnergyLevel); break; } // Event signal m_Locker.Lock(); pOndemand->bReply = TRUE; pOndemand->nIndex ++; m_Locker.Unlock(); SetEvent(pOndemand->hEvent); return CIec21DataStream::OnDataFrame(pStream, pszBuffer, nLength, pCallData); }
int SgTransmmit::RY_3KwPdmData(unsigned char *data, DevMonitorDataPtr data_ptr, int nDataLen, int &runstate) { if(data[2]!=0x10) return RE_CMDACK; DataInfo dainfo; int nbase=4; char data1=AsciiToInt(data[nbase+6]); char data2=AsciiToInt(data[nbase+7]); char data3=AsciiToInt(data[nbase+8]); char data4=AsciiToInt(data[nbase+9]); char data5=AsciiToInt(data[nbase+10]); char data6=AsciiToInt(data[nbase+11]); dainfo.bType = false; dainfo.fValue = (((data2&0x0F)<<4)|(data1&0x0F))*0.01+(((((((data6&0x0F)<<4)|(data5&0x0F))<<4)|(data4&0x0F))<<4)|(data3&0x0F)); data_ptr->mValues[0] = dainfo; data1=AsciiToInt(data[nbase+12]); data2=AsciiToInt(data[nbase+13]); data3=AsciiToInt(data[nbase+14]); data4=AsciiToInt(data[nbase+15]); data5=AsciiToInt(data[nbase+16]); data6=AsciiToInt(data[nbase+17]); dainfo.fValue = (((data2&0x0F)<<4)|(data1&0x0F))*0.01+(((((((data6&0x0F)<<4)|(data5&0x0F))<<4)|(data4&0x0F))<<4)|(data3&0x0F)); data_ptr->mValues[1] = dainfo; if(data_ptr->mValues[0].fValue>data_ptr->mValues[1].fValue) { dainfo.fValue = sqrt((data_ptr->mValues[0].fValue+data_ptr->mValues[1].fValue)/(data_ptr->mValues[0].fValue-data_ptr->mValues[1].fValue)); } else{ dainfo.fValue = 0; } data_ptr->mValues[2] = dainfo; data1=AsciiToInt(data[nbase]); data2=AsciiToInt(data[nbase+1]); data3=AsciiToInt(data[nbase+2]); data4=AsciiToInt(data[nbase+3]); data5=AsciiToInt(data[nbase+4]); data6=AsciiToInt(data[nbase+5]); dainfo.fValue = (((data2&0x0F)<<4)|(data1&0x0F))*0.01+(((((((data6&0x0F)<<4)|(data5&0x0F))<<4)|(data4&0x0F))<<4)|(data3&0x0F)); data_ptr->mValues[3] = dainfo; for(int i=0;i<5;++i) { data1=AsciiToInt(data[nbase+18+6*i]); data2=AsciiToInt(data[nbase+19+6*i]); data3=AsciiToInt(data[nbase+20+6*i]); data4=AsciiToInt(data[nbase+21+6*i]); data5=AsciiToInt(data[nbase+22+6*i]); data6=AsciiToInt(data[nbase+23+6*i]); dainfo.fValue = (((data2&0x0F)<<4)|(data1&0x0F))*0.01+(((((((data6&0x0F)<<4)|(data5&0x0F))<<4)|(data4&0x0F))<<4)|(data3&0x0F)); data_ptr->mValues[4+i] = dainfo; } for(int j=0;j<2;++j) { data3=AsciiToInt(data[nbase+48+4*j]); data4=AsciiToInt(data[nbase+49+4*j]); data5=AsciiToInt(data[nbase+50+4*j]); data6=AsciiToInt(data[nbase+51+4*j]); dainfo.fValue = ((((((data6&0x0F)<<4)|(data5&0x0F))<<4)|(data4&0x0F))<<4)|(data3&0x0F); data_ptr->mValues[9+j] = dainfo; } dainfo.bType = true; for(int k=0;k<3;++k) { data1=AsciiToInt(data[nbase+56+k]); for(int i=0;i<4;++i) { dainfo.fValue = (Getbit(data1,i)==0 ? 1:0); data_ptr->mValues[11+k*4+i] = dainfo; } } return RE_SUCCESS; }