int isSolvable(Board start, Board goal){ // returns TRUE if solvable, else FALSE int solvable = FALSE; if (calcParity(start) % 2 == calcParity(goal) % 2){ solvable = TRUE; } return solvable; }
void interpretData(const byte *data, int size, char *output) { if (size != 7) { sprintf(output, "Invalid data (not 7 bytes)"); return; } // Check parity bits. (Byte 0 and byte 7 have no parity bits.) for (int i=1; i<=5; i++) { if (calcParity(data[i]) != (data[i] & 0x80)) { sprintf(output, "Parity failure in byte %d [0x%.2X !~ 0x%.2X]", i, data[i], calcParity(data[i])); return; } } // Check checksum. unsigned char cksum = 0; for (int i=0; i<=5; i++) { cksum += data[i]; } if ((cksum & 0xFF) != data[6]) { sprintf(output, "Checksum failure (0x%X vs. 0x%X)", cksum, data[6]); return; } // Data is good! Construct string of data... // Source A/B/C and ID output += sprintf(output, "Channel ", (data[0] & 0xC0) == 0xC0 ? 'A' : (data[0] & 0xC0) == 0x80 ? 'B' : (data[0] & 0xC0) == 0x00 ? 'C' : 'x'); output += sprintf(output, "0x%X ", (data[0] & 0x3F) << 7 | (data[1] & 0x7F)); output += sprintf(output, "%d%% ", data[3] & 0x7f); // Temperature unsigned long t1 = ((data[4] & 0x0F) << 7) | (data[5] & 0x7F); float temp = ((float)t1 - (float) 1024) / 10.0; output += sprintf(output, "%f C (%f F)", temp, temp * 9.0 / 5.0 + 32.0); }
void interpretData(const byte *data, int size) { if (size == 7) { printf("\n"); for (int i=0; i<size; i++) { printf("0x%.2X ", data[i]); } printf("\n"); // Check parity bits. (Byte 0 and byte 7 have no parity bits.) for (int i=1; i<=5; i++) { if (calcParity(data[i]) != (data[i] & 0x80)) { printf("Parity failure in byte %d\n", i); return; } } // Check checksum. unsigned char cksum = 0; for (int i=0; i<=5; i++) { cksum += data[i]; } if ((cksum & 0xFF) != data[6]) { printf("Checksum failure (0x%X vs. 0x%X)\n", cksum, data[6]); return; } // Packet is good! Display information. // Source A/B/C and ID printf("Source ID: 0x%X\n", (data[0] & 0x3F) << 7 | (data[1] & 0x7F)); printf("Channel: %c\n", (data[0] & 0xC0) == 0xC0 ? 'A' : (data[0] & 0xC0) == 0x80 ? 'B' : (data[0] & 0xC0) == 0x00 ? 'C' : 'x'); if ((data[2] & 0x7F) != 0x44) { printf("Device signature does not match AcuRite signature: 0x%X (expected 0x44)\n", data[2] & 0x7F); } // Humidity. Value of 0x7F means "no humidity sensor installed" if ((data[3] & 0x7F) != 0x7F) { printf("Humidity: %d%%\n", data[3] & 0x7f); } // Temperature unsigned long t1 = ((data[4] & 0x0F) << 7) | (data[5] & 0x7F); float temp = ((float)t1 - (float) 1024) / 10.0; printf("Temperature: %f C (%f F)\n", temp, temp * 9.0 / 5.0 + 32.0); } }