void Serial_HexDump(const void *buffer, size_t size) { uint32_t start = (uint32_t)buffer & 0x0f; uint32_t address = (uint32_t)buffer & ~0x0f; const uint8_t *bytes = (const uint8_t *)address; size_t offset; for (offset = 0; offset < start + size; offset += 16) { Serial_printf("%08lx: ", address + offset); int i; for (i = 0; i < 16; ++i) { if (8 == i) { Serial_PutChar(' '); } if (offset + i < start || offset + i >= start + size) { Serial_print(" --"); } else { Serial_printf(" %02x", bytes[offset + i]); } } Serial_print(" |"); for (i = 0; i < 16; i++) { if (8 == i) { Serial_PutChar(' '); } if (offset + i < start || offset + i >= start + size) { Serial_PutChar(' '); } else if (isprint(bytes[offset + i])) { Serial_PutChar(bytes[offset + i]); } else { Serial_PutChar('.'); } } Serial_print("|\n"); } }
void loop( void ) { bool gpsDateTimeValid; bool gpsTransitDataValid; bool obdSpeedKphValid; /* Update GPS & OBD data drivers */ GPS_update(); OBD_update(); /* Wait for valid date & time */ if ( millis() - g_timer_sample_count_ms >= g_timer_sample_rate_ms ) { /* Blink status LED for 100ms */ LED_blink( LED_ID_STATUS, 100 ); /* Get GPS date & time */ gpsDateTimeValid = GPS_getUtcDateTime( &g_sampledDateTime ); /* Increase sample rate if GPS date and time is locked */ g_timer_sample_rate_ms = ( gpsDateTimeValid ) ? TIMER_GPS_LOCKED_SAMPLE_RATE_MS : TIMER_GPS_NOT_LOCKED_SAMPLE_RATE_MS; /* Get GPS transit data */ gpsTransitDataValid = GPS_getTransitData( &g_sampledTransitData ); /* Get OBD vehicle speed KPH */ obdSpeedKphValid = OBD_getVehicleSpeed( &g_sampledVehicleSpeedKph ); /* Output sampled data to serial port */ Serial_printf( /* 0 1 2 3 4 5 6 7 8 9 A B C D E */ "%lu,%u,%04u-%02u-%02uT%02u:%02u:%02uZ00:00,%u,%f,%f,%f,%f,%u,%f\n", GPS_getNumOfSatellites(), /* 0 */ gpsDateTimeValid, /* 1 */ g_sampledDateTime.year, /* 2 */ g_sampledDateTime.month, /* 3 */ g_sampledDateTime.day, /* 4 */ g_sampledDateTime.hour, /* 5 */ g_sampledDateTime.minute, /* 6 */ g_sampledDateTime.second, /* 7 */ gpsTransitDataValid, /* 8 */ g_sampledTransitData.lat, /* 9 */ g_sampledTransitData.lng, /* A */ g_sampledTransitData.speedMph, /* B */ g_sampledTransitData.course, /* C */ obdSpeedKphValid, /* D */ g_sampledVehicleSpeedKph /* E */ ); g_timer_sample_count_ms = millis(); } /* Reset the WDT */ WDT_reset(); }