unsigned int pwrMeter::chkcrc(unsigned char *buf,unsigned char len) { unsigned char hi,lo; unsigned int i; unsigned int crc; crc=0xFFFF; for(i=0; i<len; i++) { crc=calccrc(*buf,crc); buf++; } hi=(unsigned char)(crc%256); lo=(unsigned char)(crc/256); crc=(((unsigned int)(hi))<<8)|lo; return crc; }
Status unstore(Header *header, FILE *ifp, FILE *ofp) { /* BB changed next line: complen is a long */ /* register len = header->complen; */ #ifdef __MSDOS__ register long len = header->complen; #else register int len = header->complen; #endif /* __MSDOS__ */ register Byte byte; init_garble(); crc = 0; while (len--) { if (check_stream(ifp) != FNOERR) break; byte = read_byte(ifp); byte = ungarble(byte); calccrc(byte); if (!testing) write_byte(ofp, byte); } if (check_stream(ifp) == FRWERR) return (RERR); if (!testing && check_stream(ofp) == FRWERR) return (WERR); if ((Halfword) crc != header->crc) return (CRCERR); if (testing) { if (!quiet) printf("OK (stored)"); } else if (!quiet) printf("unstored"); return (NOERR); }
int HacDeviceManager::searchDevices() { int retry = 3; bool found = false; while (retry --) { QByteArray data(8, 0); data[0] = 0x00; data[1] = 0x03; data[2] = 0x00; data[3] = 0x00; data[4] = 0x00; data[5] = 32; crc.crc_16bit=0xffff; calccrc(data[0]); calccrc(data[1]); calccrc(data[2]); calccrc(data[3]); calccrc(data[4]); calccrc(data[5]); data[6] = crc.crc_8bit[0]; data[7] = crc.crc_8bit[1]; transmitData(data); data = receiveData(); qDebug() << data.toHex(); if (data.at(0)== 0x00 && data.at(1) == 0x03 &&data.at(2)== 32 && data.at(3) == 0x0E && data.at(4) == 0xAA && data.at(5) == 0x11 && data.at(6) == 0xA0) { found = true; break; } } if (found) { d_devices.append(new HacSwitchDevice(this, this)); #ifdef HAC_SWITCH_TEST for (int i = 0; i < 18; i++) { HacSwitchDevice *swtDev = qobject_cast<HacSwitchDevice *>(d_devices.at(0)); swtDev->switchControl(i, true); HacHelp::MSleep(100); } for (int i = 0; i < 18; i++) { HacSwitchDevice *swtDev = qobject_cast<HacSwitchDevice *>(d_devices.at(0)); swtDev->switchControl(i, false); HacHelp::MSleep(100); } #endif } }
void setchecksum(struct frame (*vals)[FRAMECOUNT]) { int i; for(i = 0; i<FRAMECOUNT; i++) { if((*vals)[i].length[0]) { char checksumcalc[50] = ""; strcpy(checksumcalc,(*vals)[i].header); strcat(checksumcalc,(*vals)[i].control); strcat(checksumcalc,(*vals)[i].address); strcat(checksumcalc,(char*)(*vals)[i].length); //strcat(checksumcalc,(char*)(*vals)[i].header); strcat(checksumcalc,(*vals)[i].data); uint16_t crc = calccrc(checksumcalc, strlen(checksumcalc)); (*vals)[i].checksum[0] = (uint8_t)(crc>>8); (*vals)[i].checksum[1] = (uint8_t)(crc & 0xff); (*vals)[i].checksum[2] = '\0'; // char temp[30]; // sprintf(temp, "crc = %x, %x %x\n",crc, (*vals)[i].checksum[0],(*vals)[i].checksum[1]); // display_string(temp); } }
int decode_frame(struct frame framedata, char * Rframe) { /* return 0 if error bits in return set to specify different things bit 0: No errors bit 1: for me bit 2: set = INFOFRAME, not set = SUPEFRAME bit 3: first frame bit 4: last frame */ int retval = 0; if(Rframe[0] == HEADER && Rframe[strlen(Rframe)-1] == FOOTER ) { unbytestuff(Rframe); strncpy(Rframe, Rframe, strlen(Rframe)-1); Rframe[strlen(Rframe)-1] = '\0'; if(!((long unsigned int)calccrc(Rframe, strlen(Rframe)))) { //put_string("\nNo Errors!\n"); retval |= 1; int i; for(i = 0; i < 10; i++) { if(i < CONTROLLEN) { framedata.control[i] = Rframe[HEADERLEN + i]; } if(i < ADDRESSLEN) { framedata.address[i] = Rframe[HEADERLEN + CONTROLLEN + i]; } if(i < LENGTHLEN) { framedata.length[i] = Rframe[HEADERLEN + CONTROLLEN + ADDRESSLEN + i]; } } framedata.control[CONTROLLEN] = 0; framedata.address[ADDRESSLEN] = 0; framedata.length[LENGTHLEN] = 0; for(i = 0; i < framedata.length[0]; i++) { framedata.data[i] = Rframe[HEADERLEN + CONTROLLEN + ADDRESSLEN + LENGTHLEN + i]; } framedata.data[(int)framedata.length[0]] = 0; put_string(" "); put_string(framedata.data); if(framedata.address[0] == BROADCAST || framedata.address[0] == THISDEVICE) { put_string("\nPacket for me!"); retval |= 1 << 1; if(framedata.data[0] == START) { retval |= 1<< 3; } if(framedata.data[strlen(framedata.data)-1] == END) { retval |= 1<<4; } if(!strcmp(framedata.control, INFOFRAME)) { retval |= 1 << 2; } } else { // not intended recepient put_string("\nNot for me!\n"); //retval = 1; } } else { // error in transmission //retval = 1; ; } } return retval; }