/*********************************************************************** * CheckSumMappedFile (IMAGEHLP.@) */ PIMAGE_NT_HEADERS WINAPI CheckSumMappedFile( LPVOID BaseAddress, DWORD FileLength, LPDWORD HeaderSum, LPDWORD CheckSum) { PIMAGE_NT_HEADERS Header; DWORD CalcSum; DWORD HdrSum; FIXME("(%p, %ld, %p, %p): stub\n", BaseAddress, FileLength, HeaderSum, CheckSum ); CalcSum = (DWORD)CalcCheckSum(0, BaseAddress, (FileLength + 1) / sizeof(WORD)); Header = RtlImageNtHeader(BaseAddress); HdrSum = Header->OptionalHeader.CheckSum; /* Subtract image checksum from calculated checksum. */ /* fix low word of checksum */ if (LOWORD(CalcSum) >= LOWORD(HdrSum)) { CalcSum -= LOWORD(HdrSum); } else { CalcSum = ((LOWORD(CalcSum) - LOWORD(HdrSum)) & 0xFFFF) - 1; } /* fix high word of checksum */ if (LOWORD(CalcSum) >= HIWORD(HdrSum)) { CalcSum -= HIWORD(HdrSum); } else { CalcSum = ((LOWORD(CalcSum) - HIWORD(HdrSum)) & 0xFFFF) - 1; } /* add file length */ CalcSum += FileLength; *CheckSum = CalcSum; *HeaderSum = Header->OptionalHeader.CheckSum; return Header; }
//방범설정요청(isSecurityOn: TRUE=방범설정, FALSE=방범해제) void CWallPadKcm::RequestSecuritySet(BOOL isSecurityOn) { KCM_PACKET packet = {0,}; if( (m_packet.opcode != KCM_OP_SECURITY_ON) && (m_packet.opcode != KCM_OP_SECURITY_OFF) ) { m_nRetry = 0; } if(m_nRetry < 3) { packet.preamble = KCM_PRE; packet.hd = KCM_HD; packet.cc = KCM_CC_ACK_IS | m_nRetry++; packet.pcnt = 0; packet.adh = KCM_DEV_WALLPAD; //0x01 packet.adl = 0; packet.ash = KCM_DEV_USS; //0x54 packet.asl = 0; packet.opcode = (isSecurityOn) ? KCM_OP_SECURITY_ON : KCM_OP_SECURITY_OFF; //ON=0x11, OFF=0x12 packet.data[0] = (isSecurityOn) ? 2 : 0; //D0: U보안 0=사용안함, 1=U보안사용대기, 2=사용 packet.data[1] = (isSecurityOn) ? 1 : 0; //D1: 가스차단여부 0=차단안함, 1=차단 packet.data[2] = (isSecurityOn) ? 1 : 0; //D2: 전등차단여부 0=차단안함, 1=차단 packet.data[3] = (isSecurityOn) ? 3 : 3; //D3: 난방차단여부 0=차단안함, 1=난방OFF, 2=외출 packet.data[4] = (isSecurityOn) ? 3 : 3; //D4: 대기전력차단 0=차단안함, 1=차단 packet.data[5] = (isSecurityOn) ? 1 : 0; //D5: 엘리베이터호출 0=호출안함, 1=차단 packet.fcc = CalcCheckSum((UCHAR *)&packet.hd, 16); packet.eot = KCM_EOT; if(Write((UCHAR*)&packet, sizeof(KCM_PACKET)) > 0) { g_timer.SetTimer(RESPONSE_TIMER, 1, NULL, "Response Timer"); } } else { m_nRetry = 0; g_timer.KillTimer(RESPONSE_TIMER); g_message.SendMessage(MSG_TIMER_EVENT, RETRY_TIMEOUT); } }
//주차위치정보요청 void CWallPadKcm::RequestParkingInfo() { KCM_PACKET packet = {0,}; /* gandy 2015-03-30 */ //if( (m_packet.opcode != KCM_OP_BATCH_REQ) && !CHK_FLAG(m_packet.data[0], KCM_BATCH_REQ_PARKING) ) if (m_packet.opcode != KCM_OP_PARKING_INFO_REQ) { m_nRetry = 0; } if(m_nRetry < 3) { packet.preamble = KCM_PRE; packet.hd = KCM_HD; packet.cc = KCM_CC_ACK_IS | m_nRetry++; packet.pcnt = 0; packet.adh = KCM_DEV_WALLPAD; //0x01 packet.adl = 0; packet.ash = KCM_DEV_MTM; //0x53 packet.asl = 0; //packet.opcode = KCM_OP_BATCH_REQ; //0x00 packet.opcode = KCM_OP_PARKING_INFO_REQ; //0x00 //packet.data[0] = KCM_BATCH_REQ_PARKING; //0x02 packet.data[0] = 0; packet.fcc = CalcCheckSum((UCHAR *)&packet.hd, 16); packet.eot = KCM_EOT; if(Write((UCHAR*)&packet, sizeof(KCM_PACKET)) > 0) { g_timer.SetTimer(RESPONSE_TIMER, 1, NULL, "Response Timer"); } } else { m_nRetry = 0; g_timer.KillTimer(RESPONSE_TIMER); g_message.SendMessage(MSG_TIMER_EVENT, RETRY_TIMEOUT); } }
//일괄소등요청(isAllOff: TRUE=소등, FALSE=소등해제) void CWallPadKcm::RequestLightSet(BOOL isAllOff) { KCM_PACKET packet = {0,}; if(m_packet.opcode != KCM_OP_ALL_OFF_REQ) { m_nRetry = 0; } if(m_nRetry < 3) { packet.preamble = KCM_PRE; packet.hd = KCM_HD; packet.cc = KCM_CC_ACK_IS | m_nRetry++; packet.pcnt = 0; packet.adh = KCM_DEV_LIGHT; //0x0E packet.adl = 0xff; //전등 전체 packet.ash = KCM_DEV_USS; //0x54 packet.asl = 0; packet.opcode = KCM_OP_ALL_OFF_REQ; //0x00 if(isAllOff) memset(packet.data, 0x00, KCM_DATA_SIZE); else memset(packet.data, 0xff, KCM_DATA_SIZE); packet.fcc = CalcCheckSum((UCHAR *)&packet.hd, 16); packet.eot = KCM_EOT; if(Write((UCHAR*)&packet, sizeof(KCM_PACKET)) > 0) { g_timer.SetTimer(RESPONSE_TIMER, 1, NULL, "Response Timer"); } } else { m_nRetry = 0; g_timer.KillTimer(RESPONSE_TIMER); g_message.SendMessage(MSG_TIMER_EVENT, RETRY_TIMEOUT); } }
//엘레베이터 호출 void CWallPadKcm::RequestElevatorCall() { KCM_PACKET packet = {0,}; if(m_packet.opcode != KCM_OP_ELEVATOR_CALL) { m_nRetry = 0; } if(m_nRetry < 3) { packet.preamble = KCM_PRE; packet.hd = KCM_HD; packet.cc = KCM_CC_ACK_IS | m_nRetry++; packet.pcnt = 0; packet.adh = KCM_DEV_ELEVATOR; //0x44 packet.adl = 0; packet.ash = KCM_DEV_USS; //0x54 packet.asl = 0; packet.opcode = KCM_OP_ELEVATOR_CALL; //0x01 packet.data[0] = 0; packet.fcc = CalcCheckSum((UCHAR *)&packet.hd, 16); packet.eot = KCM_EOT; if(Write((UCHAR*)&packet, sizeof(KCM_PACKET)) > 0) { g_timer.SetTimer(RESPONSE_TIMER, 1, NULL, "Response Timer"); } } else { m_nRetry = 0; g_timer.KillTimer(RESPONSE_TIMER); g_message.SendMessage(MSG_TIMER_EVENT, RETRY_TIMEOUT); } }
void CWallPadKcm::RequestWeatherInfo() { KCM_PACKET packet = {0,}; #ifndef WEATHER_REQ_APPLY //이전방식, 일괄요청사용 if( (m_packet.opcode != KCM_OP_BATCH_REQ) && !CHK_FLAG(m_packet.data[0], KCM_BATCH_REQ_ALL) ) { m_nRetry = 0; } if(m_nRetry < 3) { packet.preamble = KCM_PRE; packet.hd = KCM_HD; packet.cc = KCM_CC_ACK_IS | m_nRetry++; packet.pcnt = 0; packet.adh = KCM_DEV_WALLPAD; //0x01 packet.adl = 0; packet.ash = KCM_DEV_MTM; //0x53 packet.asl = 0; packet.opcode = KCM_OP_BATCH_REQ; //0x00 packet.data[0] = KCM_BATCH_REQ_ALL; //날씨,주차,현관문 일괄요청 packet.fcc = CalcCheckSum((UCHAR *)&packet.hd, 16); packet.eot = KCM_EOT; if(Write((UCHAR*)&packet, sizeof(KCM_PACKET)) > 0) { g_timer.SetTimer(RESPONSE_TIMER, 1, NULL, "Response Timer"); } } else { m_nRetry = 0; g_timer.KillTimer(RESPONSE_TIMER); g_message.SendMessage(MSG_TIMER_EVENT, RETRY_TIMEOUT); } #else if( m_packet.opcode != KCM_OP_WEATHER_REQ ) { m_nRetry = 0; } if(m_nRetry < 3) { packet.preamble = KCM_PRE; packet.hd = KCM_HD; packet.cc = KCM_CC_ACK_IS | m_nRetry++; packet.pcnt = 0; packet.adh = KCM_DEV_WALLPAD; //0x01 packet.adl = 0; packet.ash = KCM_DEV_MTM; //0x53 packet.asl = 0; packet.opcode = KCM_OP_WEATHER_REQ; //0x31 packet.fcc = CalcCheckSum((UCHAR *)&packet.hd, 16); packet.eot = KCM_EOT; if(Write((UCHAR*)&packet, sizeof(KCM_PACKET)) > 0) { g_timer.SetTimer(RESPONSE_TIMER, 1, NULL, "Response Timer"); } } else { m_nRetry = 0; g_timer.KillTimer(RESPONSE_TIMER); g_message.SendMessage(MSG_TIMER_EVENT, RETRY_TIMEOUT); } #endif }
/*********************************************************************** * CheckSumMappedFile (IMAGEHLP.@) */ PIMAGE_NT_HEADERS WINAPI CheckSumMappedFile( LPVOID BaseAddress, DWORD FileLength, LPDWORD HeaderSum, LPDWORD CheckSum) { IMAGE_DOS_HEADER *dos = (IMAGE_DOS_HEADER *) BaseAddress; PIMAGE_NT_HEADERS32 Header32; PIMAGE_NT_HEADERS64 Header64; DWORD *ChecksumFile; DWORD CalcSum; DWORD HdrSum; TRACE("(%p, %d, %p, %p)\n", BaseAddress, FileLength, HeaderSum, CheckSum ); CalcSum = (DWORD)CalcCheckSum(0, BaseAddress, (FileLength + 1) / sizeof(WORD)); if (dos->e_magic != IMAGE_DOS_SIGNATURE) return NULL; Header32 = (IMAGE_NT_HEADERS32 *)((char *)dos + dos->e_lfanew); if (Header32->Signature != IMAGE_NT_SIGNATURE) return NULL; if (Header32->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC) ChecksumFile = &Header32->OptionalHeader.CheckSum; else if (Header32->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) { Header64 = (IMAGE_NT_HEADERS64 *)Header32; ChecksumFile = &Header64->OptionalHeader.CheckSum; } else return NULL; HdrSum = *ChecksumFile; /* Subtract image checksum from calculated checksum. */ /* fix low word of checksum */ if (LOWORD(CalcSum) >= LOWORD(HdrSum)) { CalcSum -= LOWORD(HdrSum); } else { CalcSum = ((LOWORD(CalcSum) - LOWORD(HdrSum)) & 0xFFFF) - 1; } /* fix high word of checksum */ if (LOWORD(CalcSum) >= HIWORD(HdrSum)) { CalcSum -= HIWORD(HdrSum); } else { CalcSum = ((LOWORD(CalcSum) - HIWORD(HdrSum)) & 0xFFFF) - 1; } /* add file length */ CalcSum += FileLength; *CheckSum = CalcSum; *HeaderSum = *ChecksumFile; return (PIMAGE_NT_HEADERS) Header32; }
//----------------------------------------------------------------------------- // 描述: 计算校验和值,并赋给 nCheckSum //----------------------------------------------------------------------------- void CUdpPacketHeader::UpdateCheckSum() { nCheckSum = CalcCheckSum(); }
//----------------------------------------------------------------------------- // 描述: 检查校验和值是否正确 //----------------------------------------------------------------------------- bool CUdpPacketHeader::CheckSumIsValid() const { return nCheckSum == CalcCheckSum(); }
void I2C2_StatusCallback(I2C2_SLAVE_DRIVER_STATUS i2c_bus_state) { static uint8_t deviceID = 0, ptr = 0, PktSz = 0, chksum = 0; static uint8_t slaveWriteType = SLAVE_NORMAL_DATA; static bool headNow = false; uint8_t data; switch (i2c_bus_state) { case I2C2_SLAVE_WRITE_REQUEST: // the master will be sending the eeprom address next slaveWriteType = SLAVE_DATA_ADDRESS; break; case I2C2_SLAVE_WRITE_COMPLETED: switch (slaveWriteType) { case SLAVE_DATA_ADDRESS: deviceID = I2C2_slaveWriteData; headNow = true; ptr = 0; break; case SLAVE_NORMAL_DATA: default: if (headNow) { headNow = false; data = I2C2_slaveWriteData; PktSz = data >> 4; chksum = data & 0xF; break; } if (!CmdQ[deviceID].free) { SendError(deviceID, ERR_DEVICE_BUSY); break; } CmdQ[deviceID].packet[ptr++] = I2C2_slaveWriteData; if (PktSz == ptr) { if (!VerifyCheckSum(CmdQ[deviceID].packet, ptr, chksum)) { SendError(deviceID, ERR_CHECKSUM_FAILURE); break; } CmdQ[deviceID].size = ptr; CmdQ[deviceID].free = false; } break; } // end switch(slaveWriteType) slaveWriteType = SLAVE_NORMAL_DATA; break; case I2C2_SLAVE_READ_REQUEST: PktSz = SendQ[deviceID].size; // If free, nothing to send. if (SendQ[deviceID].free || ptr >= PktSz) { SSP2BUF = 0; break; } if (headSnd) { headSnd = false; chksum = CalcCheckSum(SendQ[deviceID].packet, PktSz); // 4 bit checksum. uint8_t header = PktSz << 4 | (chksum & 0xF); SSP2BUF = header; break; } SSP2BUF = SendQ[deviceID].packet[ptr++]; if (PktSz == ptr) { SendQ[deviceID].free = true; headSnd = true; } break; case I2C2_SLAVE_READ_COMPLETED: default:; } // end switch(i2c_bus_state) }
static char *SendRecvCommand(char cid, char *par, int psz) { CmdDesc *cmdsc; int i, bi, cm, tmo, ibinc, wexit; char chr, cks; tcflush(amp, TCIOFLUSH); for (cm=0; cm<COMMANDS; cm++) { cmdsc = &(cmdtb[cm]); if (cid == cmdsc->Id) { Pkt.Head = STX; Pkt.Tail = ETX; Pkt.DeviceId[0] = Id[0]; Pkt.DeviceId[1] = Id[1]; Pkt.CmdId = cid; if (par) Pkt.Payload = par; else Pkt.Payload = NULL; Pkt.Checksum = CalcCheckSum(PktGeneric,&Pkt,psz); Serialize(&Pkt,psz); OBufSize = GetBufSize(OBuf,OBUF_SIZE); EscapeOBuf(); if (OBufSize != write(amp,OBuf,OBufSize)) { fprintf(stderr,"libamp:Error:Cant write to amp\n"); perror("write"); } //tcflush(amp, TCOFLUSH); tcdrain(amp); if (slow) usleep(slow); tmo = 0; IBufSize = 0; wexit = 0; do { usleep(100000); // It slow give it 100 ms between reads (10^5 us) ibinc = read(amp,&IBuf[IBufSize],(IBUF_SIZE - IBufSize)); if (ibinc > 0) { IBufSize += ibinc; wexit++; } else if (wexit) break; if (tmo++ > 20) { fprintf(stderr,"libamp:Error:Amplifier has not responed after 2 seconds\n"); perror("read"); amp = AmpRecover(); if (amp == 0) { fprintf(stderr,"libamp:Error:Can't recover from amplifier error\n"); perror("open"); } return NULL; } } while ((errno == EAGAIN) && (IBufSize < IBUF_SIZE)); // Wait for data IBufSize = GetBufSize(IBuf,IBufSize); UnEscapeIBuf(); bi = 0; Pkt.Head = IBuf[bi++]; Pkt.DeviceId[0] = IBuf[bi++]; Pkt.DeviceId[1] = IBuf[bi++]; Pkt.CmdId = IBuf[bi++]; Pkt.ModleId[0] = IBuf[bi++]; Pkt.ModleId[1] = IBuf[bi++]; bzero((void *) Payload, PAYLOAD_SIZE); for (i=0; bi<IBufSize-2; bi++) Payload[i++] = IBuf[bi]; PayloadSize = i; cks = IBuf[IBufSize-2]; chr = IBuf[IBufSize-1]; if (i) Pkt.Payload = Payload; else Pkt.Payload = NULL; Pkt.Checksum = cks; cks = CalcCheckSum(PktReply,&Pkt,i); if (cks != Pkt.Checksum) { printf("Reply:Checksum error\n"); } Pkt.Tail = chr; if (chr != ETX) { printf("libamp:Reply:Not terminated by ETX\n"); } return Payload; } } return NULL; }
void PowerDownClockCopy(void) { memcpy((uint8 *)&CalcPpmDateTime.dateTime, (uint8 *)&G_CurDateTime.dateTime, sizeof(CalcPpmDateTime.dateTime)); CalcCheckSum(CalcPpmDateTime); }