Example #1
0
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);
}
Example #3
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);
  }
}