From 1da4c82adf222a4fe62ffffc902cb28bcbf2452e Mon Sep 17 00:00:00 2001 From: Stanley Huang Date: Mon, 10 Jun 2013 13:23:15 +0800 Subject: add MEGA Logger The OBD/GPS/G-force data logger based on Arduino MEGA --- megalogger/README.txt | 11 + megalogger/images.h | 80 ++++++ megalogger/megalogger.cbp | 140 ++++++++++ megalogger/megalogger.ino | 663 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 894 insertions(+) create mode 100644 megalogger/README.txt create mode 100644 megalogger/images.h create mode 100644 megalogger/megalogger.cbp create mode 100644 megalogger/megalogger.ino diff --git a/megalogger/README.txt b/megalogger/README.txt new file mode 100644 index 0000000..79e7c67 --- /dev/null +++ b/megalogger/README.txt @@ -0,0 +1,11 @@ +This is the source code for the Arduino OBD-II data logger, which displays (on a 128x64 OLED display module) and records (to a SD card) a selected set of OBD-II data. For hardware configuration and wiring guide, please refer to: +http://obd.arduinodev.com + +The recorded data is stored in CSV format and the file can be illustrated into a graphic chart by a free service at: +http://obd.arduinodev.com/view.html + +To compile the code with Arduino IDE, please copy all library files from the libraries directory to Arduino's libraries directory. + +To open the project file (obdlogger.cbp), please download CodeBlocks Arduino Edition (http://www.arduinodev.com/codeblocks). + +The source code is distributed under GPL license. diff --git a/megalogger/images.h b/megalogger/images.h new file mode 100644 index 0000000..4a84691 --- /dev/null +++ b/megalogger/images.h @@ -0,0 +1,80 @@ +const unsigned char PROGMEM frame0[78][58 * 2] = { +{0xe3,0x20,0xec,0x5a,0xcb,0x5a,0x6a,0x4a,0x28,0x42,0xc7,0x39,0x86,0x31,0x25,0x29,0x04,0x21,0xa3,0x18,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x18,0xe3,0x20,0x04,0x21,0x65,0x29,0x86,0x31,0xc7,0x39,0x08,0x42,0x49,0x4a,0x8a,0x52,0xaa,0x5a,0xc4,0x18}, +{0xec,0x5a,0x8d,0x73,0xab,0x52,0x49,0x4a,0x29,0x42,0x07,0x42,0xa7,0x31,0x86,0x31,0x66,0x29,0x45,0x29,0x45,0x21,0x45,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x21,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x45,0x29,0x45,0x21,0x44,0x29,0x45,0x29,0x45,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x21,0x44,0x29,0x45,0x29,0x44,0x29,0x45,0x21,0x45,0x29,0x66,0x29,0xa6,0x39,0xc7,0x39,0x07,0x42,0x29,0x42,0x89,0x52,0x6d,0x6b,0xcb,0x5a}, +{0x2c,0x6b,0xcb,0x5a,0xe7,0x39,0x86,0x31,0x65,0x29,0x25,0x21,0x04,0x21,0xc3,0x18,0xa2,0x10,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0xa2,0x10,0xc3,0x18,0x04,0x21,0x25,0x29,0x86,0x31,0xa7,0x39,0xaa,0x5a,0xec,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xa6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xa6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xab,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a}, +{0x0c,0x63,0xca,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0x03,0x21,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x31,0x8a,0x5a,0xcc,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x85,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc3,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xa6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a}, +{0x0d,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xab,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc3,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xab,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x5a,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0x03,0x21,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a}, +{0x0d,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x66,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xa6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x81,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc3,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0x03,0x21,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x31,0x8a,0x5a,0xcb,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x04,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc3,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a}, +{0x0d,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc3,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a}, +{0x0d,0x63,0xca,0x5a,0xc7,0x39,0x86,0x31,0x66,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcb,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x5a,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0x03,0x21,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0xaa,0x5a,0xcc,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x81,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0xaa,0x5a,0xcb,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a}, +{0x0d,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x5a,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc3,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xc3,0x18,0x04,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x10,0xc3,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x31,0x8a,0x5a,0xcc,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xa6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0x03,0x21,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcb,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0x04,0x19,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0xaa,0x5a,0xcb,0x5a}, +{0x0d,0x63,0xaa,0x5a,0xc7,0x31,0x86,0x31,0x46,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x82,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x86,0x31,0x65,0x29,0x04,0x21,0xe3,0x20,0xa3,0x18,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x31,0xa7,0x39,0x8a,0x5a,0xcc,0x5a}, +{0x0c,0x63,0xaa,0x5a,0xc7,0x39,0x86,0x31,0x45,0x29,0x24,0x29,0xe4,0x18,0xc2,0x18,0x62,0x08,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x82,0x08,0xc2,0x18,0xe4,0x18,0x24,0x29,0x66,0x29,0xc6,0x39,0xaa,0x52,0xcb,0x5a}, +{0x2c,0x63,0xab,0x52,0xc7,0x39,0x66,0x31,0x65,0x29,0x04,0x21,0xe3,0x18,0xa3,0x10,0x81,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x10,0xa3,0x18,0x03,0x21,0x25,0x21,0x65,0x29,0xa7,0x39,0x8a,0x5a,0xcc,0x5a}, +{0x2d,0x63,0xcb,0x5a,0xc7,0x39,0xa6,0x39,0x66,0x29,0x24,0x29,0x04,0x19,0xc3,0x18,0x83,0x10,0x61,0x10,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x61,0x10,0xa3,0x10,0xc3,0x18,0x04,0x19,0x44,0x29,0x66,0x29,0xc7,0x39,0xcb,0x52,0xcb,0x5a}, +{0x0c,0x63,0x6e,0x73,0xaa,0x52,0x49,0x4a,0x28,0x4a,0xe8,0x41,0xc7,0x39,0x86,0x31,0x65,0x31,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x25,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x45,0x29,0x65,0x31,0x86,0x31,0xe7,0x39,0xe8,0x41,0x49,0x4a,0x8a,0x52,0x6d,0x73,0xcc,0x5a}, +{0xe4,0x18,0xeb,0x62,0xcb,0x5a,0x69,0x52,0x09,0x42,0xc7,0x39,0x86,0x29,0x44,0x29,0x04,0x19,0xc2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xa2,0x18,0xa3,0x10,0xc2,0x18,0xe4,0x18,0x24,0x29,0x45,0x29,0x86,0x31,0xc7,0x39,0x08,0x42,0x49,0x4a,0xaa,0x5a,0xcb,0x52,0xc3,0x18}, +}; diff --git a/megalogger/megalogger.cbp b/megalogger/megalogger.cbp new file mode 100644 index 0000000..c5815bc --- /dev/null +++ b/megalogger/megalogger.cbp @@ -0,0 +1,140 @@ + + + + + + diff --git a/megalogger/megalogger.ino b/megalogger/megalogger.ino new file mode 100644 index 0000000..1309b93 --- /dev/null +++ b/megalogger/megalogger.ino @@ -0,0 +1,663 @@ +/************************************************************************* +* Arduino GPS/OBD-II/G-Force Data Logger +* Distributed under GPL v2.0 +* Copyright (c) 2013 Stanley Huang +* All rights reserved. +*************************************************************************/ + +#include +#include +#include "OBD.h" +#include "SD.h" +#include "MultiLCD.h" +#include "TinyGPS.h" +#include "MPU6050.h" +#include "images.h" + +/************************************** +* Choose SD pin here +**************************************/ +//#define SD_CS_PIN 4 // ethernet shield +//#define SD_CS_PIN 7 // microduino +#define SD_CS_PIN 10 // SD breakout + +/************************************** +* Config GPS here +**************************************/ +#define USE_GPS +#define GPS_BAUDRATE 115200 /* bps */ +//#define GPS_OPEN_BAUDRATE 4800 /* bps */ + +/************************************** +* Other options +**************************************/ +//#define USE_MPU6050 +//#define OBD_MIN_INTERVAL 200 /* ms */ +#define GPS_DATA_TIMEOUT 2000 /* ms */ +//#define CONSOLE Serial + +// logger states +#define STATE_SD_READY 0x1 +#define STATE_OBD_READY 0x2 +#define STATE_GPS_CONNECTED 0x4 +#define STATE_GPS_READY 0x8 +#define STATE_ACC_READY 0x10 +#define STATE_DATE_SAVED 0x20 + +// additional PIDs (non-OBD) +#define PID_GPS_DATETIME 0xF0 +#define PID_GPS_SPEED 0xF01 +#define PID_GPS_COORDINATE 0xF2 +#define PID_GPS_ALTITUDE 0xF3 +#define PID_ACC 0xF8 +#define PID_GYRO 0xF9 + +#define FILE_NAME_FORMAT "OBD%05d.CSV" + +#ifdef USE_GPS +// GPS logging can only be enabled when there is additional hardware serial UART +#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) +#define GPSUART Serial2 +#elif defined(__AVR_ATmega644P__) +#define GPSUART Serial1 +#endif + +#ifdef GPSUART + +#define PMTK_SET_NMEA_UPDATE_1HZ "$PMTK220,1000*1F" +#define PMTK_SET_NMEA_UPDATE_5HZ "$PMTK220,200*2C" +#define PMTK_SET_NMEA_UPDATE_10HZ "$PMTK220,100*2F" +#define PMTK_SET_NMEA_OUTPUT_ALLDATA "$PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0*28" +#define PMTK_SET_BAUDRATE "$PMTK251,115200*1F" + +TinyGPS gps; + +#endif // GPSUART +#endif + +// SD card +Sd2Card card; +SdVolume volume; +File sdfile; + +LCD_ILI9325D lcd; /* for 2.8" TFT shield */ +#define LCD_LINES 24 +#define CHAR_WIDTH 6 + +static uint32_t fileSize = 0; +static uint32_t lastFileSize = 0; +static uint32_t lastDataTime; +static uint32_t lastGPSDataTime = 0; +static uint16_t lastSpeed = -1; +static int startDistance = 0; +static uint16_t fileIndex = 0; +static uint32_t startTime = 0; + +// cached data to be displayed +static byte lastPID = 0; +static int lastData; + +class CLogger : public COBD +{ +public: + CLogger():state(0) {} + void Setup() + { + lcd.setLineHeight(10); + ShowStates(); + +#ifdef USE_MPU6050 + if (MPU6050_init() == 0) state |= STATE_ACC_READY; + ShowStates(); +#endif + +#ifdef GPSUART + unsigned long t = millis(); + do { + if (GPSUART.available()) { + state |= STATE_GPS_CONNECTED; + break; + } + } while (millis() - t <= 1000); +#endif + + do { + ShowStates(); + } while (!Init()); + + state |= STATE_OBD_READY; + + ShowStates(); + ShowPidsInfo(); + delay(3000); + + ReadSensor(PID_DISTANCE, startDistance); + + // open file for logging + if (!(state & STATE_SD_READY)) { + if (CheckSD()) { + state |= STATE_SD_READY; + ShowStates(); + } + } + + fileSize = 0; + char filename[13]; + sprintf(filename, FILE_NAME_FORMAT, fileIndex); + sdfile = SD.open(filename, FILE_WRITE); + if (!sdfile) { + } + + InitScreen(); + lastDataTime = millis(); + } + void Loop() + { + static byte loopCount = 0; + static uint32_t lastTime = millis(); + static byte dataCount = 0; + + dataCount += 3; + LogData(PID_RPM); +#ifdef GPSUART + if (millis() - lastGPSDataTime > GPS_DATA_TIMEOUT || gps.satellites() < 3) { + // GPS not ready + state &= ~STATE_GPS_READY; + } else { + // GPS ready + state |= STATE_GPS_READY; + } + LogData(PID_SPEED); +#else + LogData(PID_SPEED); +#endif + LogData(PID_THROTTLE); + if (state & STATE_ACC_READY) { + ProcessAccelerometer(); + } + + switch (loopCount++) { + case 0: + case 64: + case 128: + case 192: + LogData(PID_DISTANCE); + dataCount++; + break; + case 4: + LogData(PID_COOLANT_TEMP); + dataCount++; + break; + case 20: + LogData(PID_INTAKE_TEMP); + dataCount++; + break; + } + + uint32_t t = millis(); + if (t >> 10 != lastTime >> 10) { + char buf[10]; + unsigned int sec = (t - startTime) / 1000; + sprintf(buf, "%02u:%02u", sec / 60, sec % 60); + lcd.setCursor(260, 3); + lcd.print(buf); + + sprintf(buf, "%ums ", (uint16_t)(t - lastTime) / dataCount); + lcd.setCursor(260, 9); + lcd.print(buf); + + dataCount = 0; + lastTime = t; + } + + if (errors >= 5) { + Reconnect(); + loopCount = 0; + } + } + bool CheckSD() + { + state &= ~STATE_SD_READY; + pinMode(SS, OUTPUT); + lcd.setCursor(0, 3); + if (card.init(SPI_HALF_SPEED, SD_CS_PIN)) { + const char* type; + char buf[20]; + + switch(card.type()) { + case SD_CARD_TYPE_SD1: + type = "SD1"; + break; + case SD_CARD_TYPE_SD2: + type = "SD2"; + break; + case SD_CARD_TYPE_SDHC: + type = "SDHC"; + break; + default: + type = "SDx"; + } + + lcd.print(type); + lcd.write(' '); + if (!volume.init(card)) { + lcd.print("No FAT!"); + return false; + } + + uint32_t volumesize = volume.blocksPerCluster(); + volumesize >>= 1; // 512 bytes per block + volumesize *= volume.clusterCount(); + volumesize >>= 10; + + sprintf(buf, "%dGB", (int)((volumesize + 511) / 1000)); + lcd.print(buf); + } else { + lcd.print("No SD Card "); + return false; + } + + if (!SD.begin(SD_CS_PIN)) { + lcd.setCursor(8 * CHAR_WIDTH, 0); + lcd.print("Bad SD"); + return false; + } + + char filename[13]; + // now determine log file name + for (fileIndex = 1; fileIndex; fileIndex++) { + sprintf(filename, FILE_NAME_FORMAT, fileIndex); + if (!SD.exists(filename)) { + break; + } + } + if (!fileIndex) { + lcd.setCursor(8 * CHAR_WIDTH, 8); + lcd.print("Bad File"); + return false; + } + + lcd.setCursor(10 * CHAR_WIDTH, 3); + lcd.print(filename); + state |= STATE_SD_READY; + return true; + } +private: + void InitIdleLoop() + { + // called while initializing + char buf[10]; + unsigned int t = (millis() - startTime) / 1000; + sprintf(buf, "%02u:%02u", t / 60, t % 60); + lcd.setCursor(0, 23); + lcd.print(buf); +#ifdef GPSUART + // detect GPS signal + if (GPSUART.available()) { + char c = GPSUART.read(); + if (gps.encode(c)) { + state |= STATE_GPS_READY; + lastGPSDataTime = millis(); + + unsigned long date, time; + gps.get_datetime(&date, &time, 0); + long lat, lon; + gps.get_position(&lat, &lon, 0); + lcd.setCursor(0, 8); + lcd.print("Time:"); + lcd.print(time); + lcd.setCursor(0, 9); + lcd.print("LAT: "); + lcd.print(lat); + lcd.setCursor(0, 10); + lcd.print("LON: "); + lcd.println(lon); + } + } +#endif +#ifdef USE_MPU6050 + if (state & STATE_ACC_READY) { + accel_t_gyro_union data; + MPU6050_readout(&data); + char buf[8]; + sprintf(buf, "X:%4d", data.value.x_accel / 190); + lcd.setCursor(10 * CHAR_WIDTH, 1); + lcd.print(buf); + sprintf(buf, "Y:%4d", data.value.y_accel / 190); + lcd.setCursor(10 * CHAR_WIDTH, 2); + lcd.print(buf); + sprintf(buf, "Z:%4d", data.value.z_accel / 190); + lcd.setCursor(10 * CHAR_WIDTH, 3); + lcd.print(buf); + delay(100); + } +#endif + } +#ifdef GPSUART + void DataIdleLoop() + { + if (GPSUART.available()) + ProcessGPS(); + } + void ProcessGPS() + { + // process GPS data + char c = GPSUART.read(); + if (!gps.encode(c)) + return; + + // parsed GPS data is ready + uint32_t dataTime = millis(); + uint16_t elapsed = (uint16_t)(dataTime - lastDataTime); + int len; + char buf[32]; + unsigned long date, time; + gps.get_datetime(&date, &time, 0); + len = sprintf(buf, "%u,F0,%ld %ld\n", elapsed, date, time); + sdfile.write((uint8_t*)buf, len); + + unsigned int speed = (unsigned int)(gps.speed() * 1852 / 100 / 1000); + + // no need to log GPS data when vehicle has not been moving + // that's when previous speed is zero and current speed is also zero + if (!(speed == 0 && lastSpeed == 0) && gps.satellites() >= 3) { + // lastSpeed will be updated + //ShowSensorData(PID_SPEED, speed); + len = sprintf(buf, "%u,F1,%u\n", elapsed, speed); + sdfile.write((uint8_t*)buf, len); + + long lat, lon; + gps.get_position(&lat, &lon, 0); + len = sprintf(buf, "%u,F2,%ld %ld\n", elapsed, lat, lon); + sdfile.write((uint8_t*)buf, len); + + if (((unsigned int)dataTime / 1000) & 1) + sprintf(buf, "LAT:%d.%ld ", (int)(lat / 100000), lat % 100000); + else + sprintf(buf, "LON:%d.%ld ", (int)(lon / 100000), lon % 100000); + lcd.setCursor(0, 7); + lcd.print(buf); + + len = sprintf(buf, "%u,F3,%ld\n", elapsed, gps.altitude()); + sdfile.write((uint8_t*)buf, len); + } + lastDataTime = dataTime; + lastGPSDataTime = dataTime; + } +#endif + void ProcessAccelerometer() + { +#ifdef USE_MPU6050 + accel_t_gyro_union data; + MPU6050_readout(&data); + uint32_t dataTime = millis(); + + ShowGForce(data.value.y_accel); + + int len; + uint16_t elapsed = (uint16_t)(dataTime - lastDataTime); + char buf[20]; + // log x/y/z of accelerometer + len = sprintf(buf, "%u,F10,%d %d %d\n", data.value.x_accel, data.value.y_accel, data.value.z_accel); + sdfile.write((uint8_t*)buf, len); + // log x/y/z of gyro meter + len = sprintf(buf, "%u,F11,%d %d %d\n", data.value.x_gyro, data.value.y_gyro, data.value.z_gyro); + sdfile.write((uint8_t*)buf, len); + lastDataTime = dataTime; +#endif + } + void LogData(byte pid) + { + char buffer[OBD_RECV_BUF_SIZE]; + int value; + uint32_t start = millis(); + + // send a query to OBD adapter for specified OBD-II pid + Query(pid); + // wait for reponse + bool hasData; + do { + DataIdleLoop(); + } while (!(hasData = available()) && millis() - start < OBD_TIMEOUT_SHORT); + // no need to continue if no data available + if (!hasData) { + errors++; + return; + } + + // display data while waiting for OBD response + ShowSensorData(lastPID, lastData); + + // get response from OBD adapter + pid = 0; + char* data = GetResponse(pid, buffer); + if (!data) { + // try recover next time + write('\r'); + return; + } + // keep data timestamp of returned data as soon as possible + uint32_t dataTime = millis(); + + // convert raw data to normal value + value = GetConvertedValue(pid, data); + + lastPID = pid; + lastData = value; + + // log data to SD card + char buf[32]; + uint16_t elapsed = (uint16_t)(dataTime - lastDataTime); + byte len = sprintf(buf, "%u,%X,%d\n", elapsed, pid, value); + // log OBD data + sdfile.write((uint8_t*)buf, len); + fileSize += len; + lastDataTime = dataTime; + + // flush SD data every 1KB + if (fileSize - lastFileSize >= 1024) { + sdfile.flush(); + // display logged data size + char buf[7]; + sprintf(buf, "%uKB", (int)(fileSize >> 10)); + lcd.setCursor(260, 7); + lcd.print(buf); + lastFileSize = fileSize; + } + + // if OBD response is very fast, go on processing other data for a while +#ifdef OBD_MIN_INTERVAL + while (millis() - start < OBD_MIN_INTERVAL) { + DataIdleLoop(); + } +#endif + } + void ShowPidsInfo() + { + char buffer[24]; + byte pidlist[] = {PID_RPM, PID_SPEED, PID_THROTTLE, PID_ENGINE_LOAD, PID_MAF_FLOW, PID_INTAKE_MAP, PID_FUEL_LEVEL, PID_FUEL_PRESSURE, PID_COOLANT_TEMP, PID_INTAKE_TEMP, PID_AMBIENT_TEMP, PID_TIMING_ADVANCE, PID_BAROMETRIC}; + const char* namelist[] = {"ENGINE RPM", "SPEED", "THROTTLE", "ENGINE LOAD", "MAF", "MAP", "FUEL LEVEL", "FUEL PRESSURE", "COOLANT TEMP", "INTAKE TEMP","AMBIENT TEMP", "IGNITION TIMING", "BAROMETER"}; + + for (byte i = 0; i < sizeof(pidlist) / sizeof(pidlist[0]); i++) { + lcd.setCursor(30 * CHAR_WIDTH, i + 4); + sprintf(buffer, "%s: %s", namelist[i], IsValidPID(PID_RPM) ? "Yes" : "No"); + lcd.print(buffer); + } + } + void Reconnect() + { + sdfile.close(); + lcd.clear(); + lcd.print("Reconnecting..."); + state &= ~(STATE_OBD_READY | STATE_ACC_READY | STATE_DATE_SAVED); + //digitalWrite(SD_CS_PIN, LOW); + for (int i = 0; !Init(); i++) { + if (i == 10) lcd.clear(); + } + fileIndex++; + Setup(); + } + byte state; + + // screen layout related stuff + void ShowStates() + { + lcd.setCursor(0, 4); + lcd.print("GPS:"); + if (state & STATE_GPS_READY) + lcd.print("Yes"); + else if (state & STATE_GPS_CONNECTED) + lcd.print("--"); + else + lcd.print("No"); + + lcd.setCursor(0, 5); + lcd.print("ACC:"); + lcd.print((state & STATE_ACC_READY) ? "Yes" : "No"); + lcd.setCursor(0, 6); + lcd.print("OBD:"); + lcd.print((state & STATE_OBD_READY) ? "Yes" : "No"); + } + virtual void ShowSensorData(byte pid, int value) + { + char buf[8]; + switch (pid) { + case PID_RPM: + lcd.setCursor(34, 9); + lcd.printInt((unsigned int)value % 10000, FONT_SIZE_XLARGE, 4); + break; + case PID_SPEED: + if (lastSpeed != value) { + lcd.setCursor(50, 3); + lcd.printInt((unsigned int)value % 1000, FONT_SIZE_XLARGE, 3); + lastSpeed = value; + } + break; +/* + case PID_THROTTLE: + lcd.setCursor(66, 8); + lcd.printInt(value % 100, FONT_SIZE_XLARGE, 2); + break; + case PID_INTAKE_TEMP: + lcd.setCursor(64, 3); + lcd.printInt(value, FONT_SIZE_LARGE, 3); + break; +*/ + case PID_DISTANCE: + if ((unsigned int)value >= startDistance) { + sprintf(buf, "%ukm", ((unsigned int)value - startDistance) % 1000); + lcd.setCursor(260, 5); + lcd.print(buf); + } + break; + } + } + virtual void ShowGForce(int g) + { + byte n; + /* 0~1.5g -> 0~8 */ + g /= 85 * 25; + lcd.setCursor(0, 1); + if (g == 0) { + lcd.clearLine(1); + } else if (g < 0 && g >= -8) { + for (n = 0; n < 8 + g; n++) { + lcd.write(' '); + } + for (; n < 8; n++) { + lcd.write('<'); + } + lcd.print(" "); + } else if (g > 0 && g < 8) { + lcd.print(" "); + for (n = 0; n < g; n++) { + lcd.write('>'); + } + for (; n < 8; n++) { + lcd.write(' '); + } + } + } + virtual void InitScreen() + { + //lcd.clear(); + lcd.setLineHeight(8); + lcd.backlight(true); + + lcd.clear(156, 0, 8, 240); + lcd.clear(0, 116, 320, 8); + + lcd.draw2x(frame0[0], 0, 0, 78, 58); + lcd.draw2x(frame0[0], 164, 0, 78, 58); + lcd.draw2x(frame0[0], 0, 124, 78, 58); + lcd.draw2x(frame0[0], 164, 124, 78, 58); + + lcd.setCursor(63, 2); + lcd.print("SPEED"); + lcd.setCursor(110, 5); + lcd.print("km/h"); + lcd.setCursor(60, 8); + lcd.print("ENGINE"); + lcd.setCursor(110, 11); + lcd.print("rpm"); + + lcd.setCursor(190, 3); + lcd.print("Elapsed:"); + lcd.setCursor(190, 5); + lcd.print("Distance:"); + lcd.setCursor(190, 7); + lcd.print("Data Size:"); + lcd.setCursor(190, 9); + lcd.print("OBD Time:"); + /* + lcd.setCursor(32, 4); + lcd.print("%"); + lcd.setCursor(68, 5); + lcd.print("Intake Air"); + lcd.setCursor(112, 4); + lcd.print("C"); + */ + } +}; + +static CLogger logger; + +void setup() +{ + lcd.begin(); + //lcd.clear(); + lcd.backlight(true); + lcd.print("MEGA LOGGER - OBD-II/GPS/G-FORCE DATA LOGGER"); + lcd.setCursor(0, 1); + lcd.print("Initializing..."); + +#ifdef CONSOLE + CONSOLE.begin(115200); +#endif + // start serial communication at the adapter defined baudrate + OBDUART.begin(OBD_SERIAL_BAUDRATE); +#ifdef GPSUART +#ifdef GPS_OPEN_BAUDRATE + GPSUART.begin(GPS_OPEN_BAUDRATE); + delay(10); + GPSUART.println(PMTK_SET_BAUDRATE); + GPSUART.end(); +#endif + GPSUART.begin(GPS_BAUDRATE); + // switching to 10Hz mode, effective only for MTK3329 + //GPSUART.println(PMTK_SET_NMEA_OUTPUT_ALLDATA); + //GPSUART.println(PMTK_SET_NMEA_UPDATE_5HZ); +#endif + + delay(500); + + //lcd.setColor(0x7FF); + lcd.print("OK"); + logger.CheckSD(); + logger.Setup(); +} + +void loop() +{ + logger.Loop(); +} -- cgit v1.2.3