SRXL2 bi-directional serial loses connection due to long code

xdog12

Active member
I'm using the example code for SRXL2 as a bi-directional serial communication on a teensy 4.0. When I add calculations, tft displays and other code the serial connection no longer works. The issue is repeatable if I add delay(100) into the loop.

https://github.com/SpektrumRC/SRXL2/blob/master/Examples/example_app.c

How do I add a section to this code that can run without the risk of being slow enough to break the SRXL2 connection.

I'm looking into Multithreading and SerialEvent(), but I'm not sure what is the best method.
 
Why do you want to use SRXL2 for serial comms? Teensy has it's own serial comms which work just fine.
 
I'm not sure I understand your question. Can you explain the benefits of using default serial code instead of the example code specifically made for srxl2 devices.

Wouldn't the issue that I'm struggling with occur on both codes?
 
Can you post your Teensy code? It may be your implementation of SRXL2 on the Teensy which is causing the problem.

Pete
 
How are you compiling that code for a Teensy 4.0? Are you using the Arduino IDE? If so, you must have modified that code to compile for the Teensy, in which case I'd like to see your modified code.

Pete
 
Code:
// 'Bitmap Car no wheels', 311x125px
const unsigned char TT01Bitmap_Car_no_wheels[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x12, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 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, 0x24, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48,
  0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x12, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
  0x00, 0x00, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0xb0, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x80, 0x00, 0x00, 0x01, 0x20, 0x12, 0x00, 0x00, 0x00,
  0x00, 0x00, 0xbf, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x60, 0x00,
  0x00, 0x01, 0x20, 0x12, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf3, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xe4, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00, 0x03, 0x40, 0x22, 0x00, 0x00, 0x00, 0x00, 0x03,
  0xee, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x0f, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xed, 0xa0, 0x00, 0x00, 0x02,
  0x40, 0x22, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x08, 0x29, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x01, 0xde, 0xe0, 0x00, 0x00, 0x06, 0x80, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x03, 0xd3, 0xe0,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x3c,
  0x00, 0x08, 0x28, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf7, 0xe0, 0x00, 0x00, 0x04, 0x80, 0x5a,
  0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x22, 0x00, 0x08, 0x28, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x01,
  0xff, 0xe0, 0x00, 0x00, 0x0c, 0x80, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x03, 0x7e, 0xe2, 0x00, 0x00,
  0x00, 0x00, 0x01, 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x42, 0x00, 0x0f,
  0xe8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xde, 0xa0, 0x00, 0x00, 0x09, 0x00, 0xaa, 0x00, 0x00,
  0x00, 0x00, 0x07, 0xf1, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x28, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe5, 0xf0,
  0x00, 0x00, 0x09, 0x01, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00,
  0x02, 0x23, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x28, 0x20,
  0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf8, 0x00, 0x00, 0x1a, 0x01, 0x4a, 0x00, 0x00, 0x00, 0x00,
  0xff, 0x73, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x04, 0x24, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x14, 0x00, 0x00, 0x00, 0x28, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf3, 0xbf, 0x80, 0x00,
  0x12, 0x02, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x87, 0x7f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x04, 0x24,
  0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x28, 0x1f, 0xff, 0xff,
  0xf9, 0xf8, 0x03, 0xbf, 0x30, 0x80, 0x00, 0x34, 0x02, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x86, 0xd3,
  0xb2, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14,
  0x00, 0x00, 0x00, 0x28, 0x38, 0x00, 0x00, 0xa5, 0x98, 0x03, 0x6d, 0xb0, 0x80, 0x00, 0x24, 0x04,
  0x8a, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x93, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x08, 0x27, 0xe0, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xff, 0xff, 0xff, 0xe8, 0x60, 0x00, 0x07, 0xa3, 0x98,
  0x03, 0xc4, 0xd8, 0x80, 0x00, 0x6c, 0x0d, 0x0a, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x93, 0x59, 0x00,
  0x00, 0x00, 0x00, 0x10, 0x26, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xff, 0xff,
  0xff, 0x09, 0x80, 0x00, 0x0f, 0xa3, 0x98, 0x06, 0xc4, 0x5f, 0x80, 0x00, 0x48, 0x09, 0x0a, 0x00,
  0x00, 0x00, 0x00, 0x0f, 0x93, 0xd8, 0x80, 0x00, 0x00, 0x00, 0x10, 0x27, 0xe0, 0x00, 0x00, 0x00,
  0x00, 0x01, 0xfe, 0x00, 0x11, 0xff, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x07, 0xa3, 0x98, 0x06, 0xc4,
  0x78, 0x00, 0x00, 0x58, 0xfa, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x92, 0xbf, 0xc0, 0x00, 0x00,
  0x00, 0x20, 0x24, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x11, 0xff, 0xff, 0xff, 0x0c,
  0x00, 0x00, 0x02, 0xa3, 0x98, 0x0f, 0xc7, 0xf8, 0x00, 0x00, 0x97, 0x32, 0x0a, 0x00, 0x00, 0x00,
  0x00, 0x0e, 0x92, 0xff, 0x70, 0x00, 0x00, 0x00, 0x20, 0x22, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff,
  0x02, 0x00, 0x11, 0xff, 0xff, 0xff, 0x30, 0x00, 0x7f, 0xff, 0xe3, 0xd8, 0x0d, 0x4d, 0xf8, 0x00,
  0x00, 0xbc, 0x06, 0x0a, 0x03, 0x80, 0x00, 0x00, 0x0e, 0x92, 0x7f, 0x38, 0x00, 0x00, 0x00, 0x60,
  0x21, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x11, 0xff, 0xff, 0xff, 0xc0, 0x00, 0xc1,
  0xf0, 0xa3, 0xfc, 0x0f, 0x4c, 0xf8, 0x00, 0x01, 0x39, 0xf3, 0x0a, 0x0c, 0xfc, 0x00, 0x00, 0x0e,
  0x92, 0x7f, 0x1e, 0x00, 0x00, 0x00, 0x40, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00,
  0x11, 0xff, 0xff, 0xff, 0x80, 0x00, 0xc2, 0x10, 0xa2, 0x9c, 0x1b, 0x4d, 0xf8, 0x00, 0x03, 0x73,
  0x19, 0x0a, 0x1b, 0xa3, 0xc0, 0x00, 0xfe, 0x92, 0x3e, 0x79, 0x08, 0x00, 0x00, 0xc0, 0x3f, 0xf0,
  0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x11, 0xff, 0xff, 0xfe, 0x00, 0x00, 0xff, 0xff, 0xa2,
  0x74, 0x1a, 0x47, 0x7f, 0x80, 0x02, 0x06, 0xec, 0x8a, 0x17, 0xd0, 0x70, 0x00, 0x83, 0xfa, 0x2e,
  0xf5, 0xff, 0x80, 0x00, 0x80, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x11, 0xff,
  0xff, 0xf8, 0x00, 0x80, 0xc8, 0x02, 0xe2, 0xf4, 0x1e, 0x4f, 0xe0, 0x80, 0x06, 0x05, 0xf4, 0x8a,
  0x16, 0xd0, 0x0c, 0x00, 0x82, 0x0f, 0xff, 0xff, 0x80, 0x60, 0x03, 0x00, 0x20, 0x30, 0x00, 0x00,
  0x00, 0x00, 0x01, 0x06, 0x03, 0xf1, 0xff, 0xff, 0xf0, 0x03, 0xe0, 0xf0, 0x03, 0xa2, 0xfc, 0x34,
  0x57, 0xa0, 0x80, 0x3c, 0xcd, 0xb6, 0x8a, 0x36, 0xd0, 0x03, 0x80, 0x82, 0x08, 0x33, 0x2a, 0xe0,
  0x1f, 0x0e, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfa, 0x02, 0x31, 0xff, 0xff, 0xc0,
  0x0c, 0x64, 0xc0, 0x00, 0xa2, 0xfc, 0x3c, 0x59, 0xa0, 0x80, 0xed, 0x4d, 0xb6, 0x8a, 0x37, 0xd0,
  0x00, 0x60, 0x83, 0xff, 0xe3, 0xf4, 0x70, 0x19, 0xf8, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00,
  0x20, 0x02, 0x05, 0xf1, 0xff, 0xff, 0x00, 0x1f, 0xaa, 0xc0, 0x00, 0xa2, 0xfc, 0x68, 0x98, 0xe0,
  0x83, 0x0f, 0x55, 0xf4, 0x8a, 0x3b, 0xa0, 0x00, 0x38, 0x83, 0xff, 0xe3, 0x8c, 0x4c, 0x18, 0x08,
  0x00, 0x3f, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xe0, 0x02, 0x05, 0xf1, 0xff, 0xfe, 0x00, 0x6f, 0xaa,
  0xc0, 0x00, 0xa3, 0x7c, 0x6b, 0x99, 0xe0, 0x9e, 0x16, 0x96, 0xec, 0x8a, 0x2c, 0xf8, 0x00, 0x2f,
  0x82, 0x0f, 0xff, 0xef, 0xc6, 0x18, 0x08, 0x00, 0x20, 0x30, 0x00, 0x0e, 0x00, 0x00, 0x60, 0x02,
  0x06, 0xb1, 0xff, 0xf8, 0x01, 0x8d, 0x7e, 0xc0, 0x00, 0xa3, 0xfc, 0xff, 0xff, 0xa0, 0xf2, 0x16,
  0xbf, 0x39, 0x0a, 0x43, 0xd4, 0x00, 0x28, 0xfb, 0xf8, 0xae, 0xff, 0x01, 0x18, 0x08, 0x3e, 0x20,
  0x30, 0x00, 0x30, 0x00, 0x00, 0x60, 0x02, 0x03, 0x31, 0xff, 0xe0, 0x03, 0x0c, 0xd0, 0xc0, 0x00,
  0xa2, 0x87, 0xd5, 0x1f, 0xff, 0x92, 0x25, 0x35, 0xf3, 0x0a, 0x40, 0xec, 0x00, 0x28, 0x8f, 0xe0,
  0xaf, 0xf3, 0x01, 0x18, 0x08, 0x3f, 0xa0, 0x30, 0x00, 0xc0, 0x0f, 0xf8, 0x60, 0x02, 0x00, 0xf1,
  0xff, 0xc0, 0x0f, 0x0f, 0x10, 0xc0, 0x00, 0xa3, 0x06, 0xf5, 0x0f, 0xf0, 0x92, 0x25, 0x2b, 0x26,
  0x0a, 0x40, 0x7c, 0x00, 0x28, 0x8a, 0xe0, 0xab, 0x71, 0x83, 0x18, 0x08, 0x3e, 0x63, 0xb0, 0x01,
  0x80, 0xf1, 0xff, 0xe0, 0x02, 0x00, 0x11, 0xff, 0x00, 0x3f, 0x08, 0x08, 0xc0, 0x00, 0xa2, 0x07,
  0xb5, 0x0e, 0xf0, 0x92, 0x49, 0x2f, 0xcd, 0x0a, 0x40, 0x44, 0x00, 0x3f, 0x8a, 0xe0, 0xab, 0x70,
  0x67, 0x18, 0x08, 0x3e, 0x64, 0xb0, 0x02, 0x07, 0x00, 0x03, 0xe0, 0x02, 0x00, 0x11, 0xfe, 0x00,
  0xff, 0x08, 0x08, 0xc0, 0x00, 0xa2, 0x0b, 0xb5, 0x0c, 0x70, 0xfe, 0x59, 0x33, 0x91, 0x0a, 0x40,
  0x38, 0x00, 0x21, 0x8e, 0xe0, 0xa9, 0xf8, 0x3f, 0x98, 0x08, 0x3f, 0xe4, 0x70, 0x02, 0x1c, 0x00,
  0x00, 0x60, 0x02, 0x00, 0x11, 0xf8, 0x01, 0xff, 0x08, 0x04, 0xc0, 0x00, 0xa2, 0x13, 0xf5, 0x0c,
  0x70, 0xc2, 0x90, 0x9f, 0x21, 0x0a, 0x40, 0x3e, 0x00, 0x2f, 0x8f, 0xe0, 0xa9, 0xff, 0xc7, 0x98,
  0x08, 0x3e, 0xe4, 0x70, 0x04, 0x24, 0x07, 0x00, 0x60, 0x02, 0x00, 0x11, 0xe0, 0x07, 0xff, 0x08,
  0x04, 0xc0, 0x00, 0xa3, 0xff, 0x55, 0x0c, 0x70, 0xfa, 0xa0, 0x80, 0x41, 0x0a, 0x40, 0x7f, 0x80,
  0x28, 0x8e, 0xe0, 0xa9, 0xa0, 0x47, 0x98, 0x08, 0x3f, 0xe7, 0xf0, 0x08, 0x48, 0x71, 0xfe, 0x60,
  0x02, 0x00, 0x11, 0xc0, 0x1f, 0xff, 0x08, 0x04, 0xc0, 0x00, 0xa3, 0x03, 0x55, 0x0e, 0x50, 0x8b,
  0x21, 0x20, 0x41, 0x0a, 0x40, 0x73, 0xc0, 0x28, 0x8e, 0xe0, 0xaf, 0xbf, 0xc7, 0x98, 0x08, 0x3e,
  0x66, 0xf0, 0x08, 0x88, 0x80, 0x01, 0xe0, 0x02, 0x00, 0x13, 0x00, 0x3f, 0xff, 0x08, 0x04, 0xc0,
  0x00, 0xa3, 0xff, 0x75, 0x06, 0xd0, 0x8b, 0x42, 0x67, 0x21, 0x0a, 0xc0, 0xc0, 0xe0, 0x28, 0x8f,
  0xff, 0xff, 0xe0, 0x47, 0x98, 0x08, 0x3f, 0xe7, 0xf0, 0x08, 0x88, 0xff, 0xff, 0xe0, 0x02, 0x00,
  0x1c, 0x00, 0xff, 0xff, 0x08, 0x04, 0xc0, 0x00, 0xa3, 0x03, 0xff, 0xff, 0xf0, 0x8a, 0x44, 0xeb,
  0x31, 0x0a, 0x80, 0xc0, 0x7f, 0xe8, 0x8c, 0x00, 0x00, 0x20, 0x47, 0x98, 0x0b, 0xff, 0x25, 0x70,
  0x08, 0x39, 0x00, 0x00, 0x60, 0x02, 0x00, 0x18, 0x03, 0xff, 0xff, 0x08, 0x04, 0xc0, 0x00, 0xa3,
  0x03, 0x00, 0x00, 0x10, 0x8a, 0xfd, 0x29, 0x91, 0x0a, 0x81, 0x80, 0x70, 0x28, 0x8c, 0x00, 0x00,
  0x20, 0x47, 0x98, 0x0c, 0x03, 0xe2, 0xb0, 0x08, 0xc8, 0x80, 0x00, 0x60, 0x02, 0x00, 0x60, 0x06,
  0x00, 0x00, 0x08, 0x04, 0xc0, 0x00, 0xa3, 0x03, 0x00, 0x00, 0x10, 0x8a, 0x97, 0x48, 0xc9, 0x0a,
  0x81, 0x80, 0x38, 0x28, 0x8f, 0xff, 0xff, 0xe0, 0x47, 0x98, 0x00, 0x00, 0x30, 0x30, 0x08, 0x88,
  0x9f, 0xc0, 0x60, 0x02, 0x01, 0x80, 0x1f, 0xff, 0xff, 0x08, 0x04, 0xc0, 0x00, 0xa3, 0x03, 0xff,
  0xff, 0xf0, 0x8a, 0xe6, 0x48, 0xe5, 0x0a, 0x81, 0x00, 0x38, 0x28, 0x88, 0x04, 0x1f, 0xe0, 0x47,
  0x98, 0x20, 0x00, 0x0c, 0x30, 0x08, 0x88, 0xf0, 0xff, 0xe0, 0x02, 0x03, 0x00, 0x60, 0x00, 0x00,
  0x88, 0x04, 0xc0, 0x00, 0xa3, 0x03, 0xfc, 0x10, 0x10, 0x8a, 0xcc, 0x50, 0xe5, 0x0a, 0x83, 0x00,
  0x18, 0x0f, 0x88, 0x04, 0x1f, 0xa0, 0x47, 0x98, 0x40, 0x00, 0x03, 0x30, 0x08, 0x5c, 0x40, 0x00,
  0x20, 0x02, 0x0c, 0x00, 0xc2, 0x3d, 0xef, 0x48, 0x04, 0xc0, 0x00, 0xa3, 0x02, 0xfc, 0x10, 0x10,
  0xfa, 0x1c, 0xd0, 0x53, 0x8a, 0x83, 0x00, 0x18, 0x3f, 0x8f, 0xfc, 0xff, 0xe7, 0xd7, 0x98, 0x40,
  0xff, 0x80, 0xf0, 0x04, 0x64, 0x20, 0x00, 0x3f, 0xfe, 0x10, 0x03, 0xf7, 0xe7, 0x29, 0x68, 0x04,
  0xc0, 0x00, 0xa3, 0x03, 0xff, 0x9f, 0xf0, 0xfe, 0x38, 0x90, 0x69, 0x8a, 0x83, 0x00, 0x0c, 0x40,
  0x89, 0x04, 0x10, 0x2a, 0xcf, 0x98, 0x81, 0x3f, 0x40, 0x70, 0x04, 0x22, 0x20, 0x00, 0x01, 0x02,
  0x60, 0x0c, 0x94, 0x86, 0x31, 0x28, 0x04, 0xc0, 0x00, 0xa3, 0x62, 0x0c, 0x10, 0x50, 0x82, 0x58,
  0x90, 0x69, 0x8a, 0x82, 0x00, 0x0e, 0x41, 0xff, 0xfc, 0x08, 0x35, 0x5f, 0x9f, 0x01, 0x7f, 0xa7,
  0x30, 0x02, 0x12, 0x18, 0x00, 0x01, 0x03, 0x80, 0x14, 0x96, 0x00, 0x31, 0x28, 0x04, 0xc0, 0x00,
  0xa3, 0xf2, 0x08, 0x1f, 0xd0, 0x82, 0xf8, 0xa0, 0x64, 0x8a, 0x82, 0x00, 0x0e, 0x43, 0x00, 0x7c,
  0x08, 0x25, 0x63, 0xf8, 0x01, 0x7f, 0xa8, 0xb0, 0x03, 0x09, 0x04, 0x00, 0x01, 0x02, 0x00, 0x72,
  0x7c, 0x00, 0x61, 0x48, 0x04, 0xc0, 0x00, 0xa3, 0x92, 0x08, 0x1f, 0xd0, 0x82, 0xb9, 0xa0, 0x62,
  0x4a, 0x82, 0x00, 0x0e, 0x42, 0x00, 0x3f, 0xff, 0xe3, 0x62, 0x80, 0x01, 0xbf, 0x6d, 0xb0, 0x01,
  0x04, 0x83, 0x00, 0x01, 0x0c, 0x00, 0x53, 0x60, 0x00, 0xe2, 0xc8, 0x04, 0xc0, 0x00, 0xa3, 0x62,
  0x0c, 0x10, 0x50, 0x82, 0xb1, 0x20, 0x63, 0x6a, 0x86, 0x00, 0x0f, 0xc2, 0x00, 0x00, 0x00, 0x20,
  0x62, 0xf0, 0x01, 0xff, 0x67, 0x30, 0x01, 0x83, 0x40, 0x70, 0x01, 0x30, 0x7f, 0xd3, 0x80, 0x03,
  0xc7, 0x88, 0x04, 0xc0, 0x00, 0xa3, 0x02, 0x03, 0xff, 0xd0, 0x82, 0xf1, 0x20, 0x61, 0x2a, 0x86,
  0x00, 0x07, 0xc2, 0x00, 0x00, 0x00, 0x20, 0x62, 0xd0, 0x01, 0xff, 0x78, 0xff, 0xff, 0xc0, 0xf0,
  0x0f, 0xff, 0xff, 0xc0, 0x7c, 0x03, 0x04, 0x84, 0x08, 0x04, 0xc0, 0x00, 0xa3, 0x82, 0x7f, 0xf0,
  0x50, 0x82, 0xf1, 0x40, 0x20, 0x9a, 0x86, 0x00, 0x06, 0x43, 0xff, 0xfe, 0xff, 0xbf, 0xe2, 0xd0,
  0x01, 0xff, 0xbf, 0xff, 0xff, 0xf0, 0x3c, 0x00, 0x00, 0x03, 0xff, 0xc0, 0x0c, 0x1f, 0x0f, 0xf0,
  0x04, 0xc0, 0x00, 0xe3, 0xff, 0x80, 0x10, 0x50, 0x82, 0xf2, 0x40, 0x20, 0xca, 0x86, 0x00, 0x06,
  0x40, 0x89, 0x02, 0xa0, 0xa0, 0x42, 0xa0, 0x03, 0xbf, 0xb0, 0x00, 0x00, 0x28, 0x07, 0xff, 0xff,
  0xff, 0x00, 0x00, 0x30, 0xfe, 0x1f, 0xe0, 0x04, 0xf0, 0x01, 0xe0, 0x0c, 0x00, 0x10, 0x50, 0x82,
  0xf2, 0x40, 0x30, 0xc2, 0x86, 0x00, 0x06, 0x41, 0xff, 0xfe, 0xff, 0xbf, 0xc3, 0xff, 0xff, 0xbf,
  0xe7, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x87, 0xf8, 0x3f, 0xff, 0xfc, 0xd8,
  0x02, 0xe0, 0x04, 0x00, 0x10, 0x50, 0x82, 0xf2, 0xff, 0xff, 0xe2, 0x86, 0x00, 0x06, 0x42, 0x00,
  0x00, 0x00, 0x20, 0x47, 0xff, 0xfe, 0xbf, 0xa5, 0x80, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00,
  0x3c, 0x00, 0x00, 0x40, 0x00, 0x04, 0xc8, 0x06, 0xa0, 0x04, 0x00, 0x10, 0x50, 0x82, 0xb2, 0x00,
  0x00, 0x02, 0x86, 0x00, 0x06, 0x42, 0x00, 0x00, 0x00, 0x20, 0x47, 0x80, 0x1e, 0xbf, 0x28, 0x80,
  0x00, 0x01, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xc0, 0x00, 0x01, 0xf8, 0x00, 0x08, 0xff, 0xff, 0xa0,
  0x04, 0x00, 0x10, 0x50, 0x82, 0xb2, 0x00, 0x00, 0x02, 0x86, 0x00, 0x06, 0x43, 0xff, 0xfe, 0xff,
  0xbf, 0xc7, 0x80, 0x1e, 0xbf, 0xa7, 0x00, 0x00, 0x00, 0x73, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00,
  0x06, 0x03, 0xff, 0xf0, 0xff, 0xff, 0xe0, 0x04, 0x00, 0x10, 0x50, 0x82, 0xb2, 0x7f, 0xff, 0xe2,
  0x86, 0x00, 0x06, 0x40, 0x89, 0x02, 0xa0, 0xa0, 0x47, 0x00, 0x1f, 0xbf, 0xe0, 0x00, 0x00, 0x00,
  0x0f, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00,
  0x10, 0x50, 0x82, 0xf2, 0x40, 0x30, 0xa2, 0x86, 0x00, 0x06, 0x40, 0x89, 0x02, 0xa0, 0xa0, 0x64,
  0x00, 0x03, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x07, 0xa3, 0xfc, 0x00, 0x10, 0x50, 0x82, 0xf2, 0x40, 0x30, 0xca, 0x86, 0x00,
  0x06, 0x43, 0xff, 0xfe, 0xff, 0xbf, 0xe4, 0x00, 0x03, 0x7f, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xa2, 0xff, 0xfc, 0x10, 0x50,
  0x82, 0xf1, 0x40, 0x20, 0x9a, 0x86, 0x00, 0x07, 0xc2, 0x00, 0x00, 0x00, 0x20, 0x64, 0x00, 0x02,
  0xff, 0x60, 0x20, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x07, 0xa3, 0x02, 0x0f, 0xff, 0xd0, 0x82, 0xf1, 0x40, 0x20, 0x9a, 0x86, 0x00, 0x0f, 0xc3,
  0xff, 0xff, 0xff, 0xe0, 0x64, 0x00, 0x02, 0xff, 0x60, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x02, 0x06, 0x10, 0x50, 0x82, 0xf1,
  0x20, 0x21, 0x2a, 0x82, 0x00, 0x0e, 0x40, 0x89, 0x04, 0x08, 0x67, 0x64, 0x00, 0x02, 0xbf, 0xa0,
  0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
  0xa3, 0xf2, 0x08, 0x10, 0x50, 0x82, 0xb9, 0x20, 0x62, 0x4a, 0x83, 0x00, 0x0e, 0x40, 0x89, 0xfc,
  0x08, 0x25, 0xe4, 0x00, 0x02, 0x7f, 0xa0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0x1f, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xa3, 0x92, 0x08, 0x1f, 0xd0, 0x82, 0xb8, 0xa0, 0x66,
  0xca, 0x83, 0x00, 0x0c, 0x40, 0x89, 0x04, 0x08, 0x37, 0x64, 0x00, 0x02, 0x7f, 0xa2, 0x32, 0x80,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xe0, 0x00, 0x31, 0x22, 0x03, 0xe3, 0x62,
  0x08, 0x10, 0x50, 0x82, 0x78, 0xa0, 0x64, 0x8a, 0x83, 0x00, 0x18, 0x60, 0x89, 0x04, 0x50, 0x6c,
  0xe4, 0x00, 0x02, 0x3f, 0x2d, 0xaa, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
  0x18, 0x00, 0x41, 0x22, 0x03, 0xe5, 0x02, 0x07, 0x10, 0x50, 0x82, 0x38, 0x90, 0x69, 0x8a, 0x83,
  0x00, 0x18, 0x3f, 0x8f, 0xfc, 0xff, 0xe7, 0x64, 0x00, 0x02, 0x3f, 0x32, 0x66, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x01, 0x81, 0x22, 0x03, 0xdf, 0x03, 0xff, 0x9f,
  0xf0, 0xfe, 0x1c, 0x90, 0x53, 0x8a, 0x83, 0x00, 0x18, 0x0f, 0x88, 0x04, 0x1f, 0xe0, 0x64, 0x00,
  0x02, 0x3f, 0x37, 0x62, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
  0x01, 0x22, 0x03, 0xc3, 0x03, 0xfc, 0x10, 0x10, 0xfa, 0x0c, 0x50, 0xd3, 0x8a, 0x81, 0x80, 0x38,
  0x28, 0x8f, 0xff, 0xff, 0xe0, 0x64, 0x00, 0x02, 0x3f, 0x37, 0x62, 0x80, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x3e, 0x03, 0xc3, 0x03, 0xff, 0xff, 0xf0, 0x8a,
  0xc4, 0x50, 0xe5, 0x0a, 0x81, 0x80, 0x38, 0x28, 0x8c, 0x00, 0x00, 0x20, 0x64, 0x00, 0x02, 0x3f,
  0x27, 0x62, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x3e,
  0x03, 0xc3, 0x03, 0x00, 0x00, 0x10, 0x8a, 0xa6, 0x48, 0xc9, 0x0a, 0x81, 0x80, 0x70, 0x28, 0x8c,
  0x00, 0x00, 0x20, 0x64, 0x00, 0x02, 0x3f, 0x20, 0xe2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x23, 0x03, 0xc3, 0x03, 0x00, 0x00, 0x10, 0x8a, 0xd7, 0x49,
  0xc9, 0x0a, 0x80, 0xc0, 0xf7, 0xe8, 0x8c, 0x3f, 0xff, 0x60, 0x64, 0x00, 0x02, 0x00, 0x40, 0xc2,
  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x32, 0x03, 0xc3,
  0x03, 0x3f, 0xff, 0x10, 0x8a, 0x7c, 0xa9, 0x91, 0x0a, 0x40, 0x61, 0xe0, 0x28, 0x8f, 0xde, 0x1d,
  0xff, 0xe4, 0x00, 0x02, 0x00, 0xc1, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x0f, 0xff, 0xff, 0xfe, 0x03, 0xc3, 0xff, 0xfc, 0x38, 0xf0, 0x8a, 0x46, 0x67, 0x21, 0x0a,
  0x40, 0x7f, 0xc0, 0x28, 0x8e, 0x91, 0x17, 0xa0, 0x64, 0x00, 0x02, 0x00, 0x81, 0x02, 0x80, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1d, 0x03, 0xc3, 0x03, 0x74,
  0x44, 0x50, 0x8b, 0x22, 0x26, 0x61, 0x0a, 0x40, 0x7f, 0x80, 0x2f, 0x8e, 0x91, 0x15, 0xbf, 0xe4,
  0x00, 0x02, 0x01, 0x02, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
  0x00, 0x00, 0x3e, 0x83, 0xc1, 0xff, 0x54, 0x44, 0x50, 0xfb, 0x21, 0x00, 0x41, 0x0a, 0x40, 0x1e,
  0x00, 0x21, 0x8e, 0x91, 0x15, 0xff, 0xa4, 0x00, 0x02, 0x01, 0x02, 0x02, 0x80, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x3f, 0x83, 0xc1, 0xff, 0x54, 0x44, 0x70,
  0xc2, 0x90, 0x8e, 0x61, 0x0a, 0x40, 0x7c, 0x00, 0x21, 0x8a, 0x91, 0x17, 0xf8, 0x24, 0x00, 0x02,
  0x02, 0x06, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06,
  0x77, 0xc3, 0xf0, 0x0b, 0xf4, 0x44, 0x70, 0xc2, 0x90, 0xbf, 0x31, 0x0a, 0x40, 0x54, 0x00, 0x3f,
  0x8a, 0x91, 0x17, 0x70, 0x24, 0x00, 0x02, 0x02, 0x06, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xff, 0xfb, 0xf8, 0x0b, 0xb4, 0x44, 0x70, 0xfe, 0x49,
  0x3d, 0x89, 0x0a, 0x40, 0xec, 0x00, 0x28, 0x8a, 0x91, 0x1f, 0xf0, 0x64, 0x00, 0x02, 0x04, 0x0a,
  0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1c, 0x03, 0x0b,
  0xc7, 0x07, 0xf4, 0x5e, 0x70, 0x92, 0x49, 0x2b, 0x47, 0x0a, 0x40, 0x7c, 0x00, 0x28, 0x8f, 0xf9,
  0x1e, 0xf0, 0xa4, 0x00, 0x02, 0x04, 0x0a, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x08, 0x00, 0x24, 0x01, 0xfb, 0x83, 0x06, 0xd4, 0x5f, 0xf0, 0x92, 0x25, 0x2f, 0x22,
  0x0a, 0x67, 0xec, 0x00, 0x29, 0xfa, 0x0f, 0xfe, 0xf0, 0xe4, 0x00, 0x02, 0x08, 0x12, 0x06, 0x80,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x24, 0x01, 0xfa, 0x80, 0x87,
  0xdf, 0xfe, 0x2f, 0xd2, 0x35, 0xb3, 0xf1, 0x0a, 0x28, 0x78, 0x00, 0x2c, 0x82, 0x08, 0x37, 0x91,
  0xe4, 0x00, 0x02, 0x08, 0x12, 0x06, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x08, 0x00, 0x3c, 0x01, 0x0a, 0x81, 0xfc, 0x78, 0x99, 0x20, 0xba, 0x16, 0x9e, 0x19, 0x0a, 0x37,
  0xb0, 0x00, 0x30, 0x83, 0xff, 0xe3, 0x8f, 0x24, 0x00, 0x02, 0x10, 0x22, 0x06, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x07, 0xff, 0xfa, 0xc3, 0xfe, 0x68, 0x98,
  0xe0, 0x86, 0x0e, 0x94, 0xec, 0x8a, 0x37, 0xd0, 0x01, 0xc0, 0x83, 0xff, 0xe3, 0x16, 0xe4, 0x00,
  0x02, 0x10, 0x22, 0x0e, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
  0x01, 0x1b, 0xf2, 0x24, 0x23, 0x38, 0x58, 0xe0, 0x81, 0x8d, 0x5d, 0xf4, 0x8a, 0x3e, 0xd0, 0x07,
  0x00, 0x82, 0x0f, 0x3f, 0x1f, 0x64, 0x00, 0x02, 0x20, 0x62, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x02, 0x22, 0x0e, 0x1c, 0x5f, 0xb4, 0x5f, 0x20, 0x80,
  0x75, 0xcd, 0xb6, 0x8a, 0x17, 0xd0, 0x18, 0x00, 0x83, 0xfb, 0x3f, 0x3f, 0xe4, 0x00, 0x07, 0x20,
  0x7e, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x80, 0x0c, 0x62,
  0x01, 0x86, 0x71, 0xf4, 0x5f, 0xe0, 0x80, 0x1c, 0xcd, 0xf4, 0x8a, 0x17, 0xb0, 0xe0, 0x00, 0x83,
  0xb2, 0x3e, 0x3d, 0xe7, 0x00, 0x1e, 0xc0, 0xa2, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x08, 0x60, 0x18, 0xa2, 0x00, 0x7f, 0xae, 0xde, 0x4e, 0x60, 0x80, 0x02, 0x05,
  0xe4, 0x8a, 0x08, 0x67, 0x00, 0x00, 0xfe, 0x92, 0x7e, 0x2f, 0xe7, 0x80, 0x1e, 0xc0, 0xa2, 0x12,
  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1c, 0x31, 0x22, 0x00, 0x01,
  0xaa, 0x3a, 0x5f, 0x7f, 0x80, 0x02, 0x36, 0x0d, 0x0a, 0x07, 0xf0, 0x00, 0x00, 0x0e, 0x92, 0x7f,
  0x27, 0x67, 0xff, 0xfe, 0x81, 0x22, 0x32, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x0e, 0x07, 0xc7, 0x22, 0x00, 0x01, 0xae, 0x1f, 0x5d, 0x78, 0x00, 0x01, 0x33, 0xf9, 0x0a,
  0x00, 0x00, 0x00, 0x00, 0x0e, 0x92, 0x7f, 0x29, 0x63, 0xe0, 0x7f, 0x81, 0x22, 0xe2, 0x80, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xc0, 0x0d, 0x22, 0x00, 0x00, 0xd0, 0x1d,
  0x55, 0xf8, 0x00, 0x01, 0x28, 0xe2, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x92, 0xbe, 0x1f, 0xe2,
  0xa0, 0x40, 0x02, 0x23, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
  0x40, 0x19, 0x22, 0x00, 0x00, 0x3c, 0x1d, 0xdf, 0x78, 0x00, 0x00, 0x96, 0x02, 0x0a, 0x00, 0x00,
  0x00, 0x00, 0x0e, 0x93, 0xfe, 0x01, 0xe2, 0xe0, 0x40, 0x02, 0x22, 0x02, 0x80, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x21, 0x22, 0x00, 0x00, 0x1e, 0x2f, 0xce, 0x78,
  0x00, 0x00, 0x93, 0xf2, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x93, 0x58, 0x00, 0x62, 0xff, 0xc0,
  0x04, 0x23, 0xf2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xc0, 0x41,
  0x22, 0x00, 0x00, 0x03, 0xc6, 0xc4, 0x78, 0x00, 0x00, 0x48, 0x09, 0x0a, 0x00, 0x00, 0x00, 0x00,
  0xfe, 0x93, 0x78, 0x00, 0x62, 0xf0, 0x00, 0x0c, 0x23, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x08, 0x81, 0x81, 0x22, 0x00, 0x00, 0x01, 0x86, 0xc4, 0x5f, 0x80, 0x00,
  0x68, 0x09, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x86, 0x93, 0xb0, 0x00, 0x22, 0x80, 0x00, 0x18, 0x23,
  0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x07, 0x01, 0x22, 0x00,
  0x00, 0x00, 0x43, 0x44, 0xd8, 0x80, 0x00, 0x24, 0x04, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x87, 0x7f,
  0xb0, 0x00, 0x12, 0x80, 0x00, 0x74, 0x23, 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x08, 0x3c, 0x01, 0x22, 0x00, 0x00, 0x00, 0x63, 0x7f, 0xb0, 0x80, 0x00, 0x24, 0x04,
  0x8a, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x3f, 0x60, 0x00, 0x0f, 0xff, 0xff, 0xc4, 0x23, 0x1a, 0x80,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe1, 0x01, 0x22, 0x00, 0x00, 0x00,
  0x21, 0xbf, 0x30, 0x80, 0x00, 0x12, 0x02, 0x4a, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7f, 0xe0, 0x00,
  0x00, 0x00, 0x00, 0x06, 0x23, 0x12, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x08, 0x00, 0x81, 0x22, 0x00, 0x00, 0x00, 0x21, 0xff, 0xbf, 0x00, 0x00, 0x12, 0x02, 0x4a, 0x00,
  0x00, 0x00, 0x00, 0x0b, 0xbf, 0x60, 0x00, 0x00, 0x00, 0x00, 0x02, 0x63, 0x66, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x61, 0x22, 0x00, 0x00, 0x00, 0x31, 0xbf,
  0x70, 0x00, 0x00, 0x0a, 0x01, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x03, 0xed, 0xa0, 0x00, 0x00, 0x00,
  0x00, 0x03, 0x63, 0x8a, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
  0x11, 0x22, 0x00, 0x00, 0x00, 0x31, 0x6d, 0xf0, 0x00, 0x00, 0x09, 0x01, 0x2a, 0x00, 0x00, 0x00,
  0x00, 0x01, 0xde, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x62, 0x1e, 0x80, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x22, 0x00, 0x00, 0x00, 0x31, 0xde, 0xe0, 0x00,
  0x00, 0x05, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x01, 0xdf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01,
  0xe2, 0x62, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x80, 0x24,
  0x00, 0x00, 0x00, 0x33, 0xf7, 0xe0, 0x00, 0x00, 0x04, 0x80, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x01,
  0xdf, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe3, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x03, 0x9f, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x00, 0x19, 0xf7, 0xe0, 0x00, 0x00, 0x04,
  0x80, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x01, 0xdf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x02,
  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x63, 0x80, 0x00, 0x08, 0x00, 0x00,
  0x00, 0x05, 0xde, 0xe0, 0x00, 0x00, 0x02, 0x40, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6d, 0xa0,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x73, 0x82, 0x80, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x6d, 0xa0, 0x00, 0x00, 0x02, 0x40, 0x22,
  0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x02, 0x80, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x9c, 0x03, 0x80, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x01,
  0xff, 0xc0, 0x00, 0x00, 0x01, 0x60, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x0f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff,
  0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xc0, 0x00, 0x00, 0x01, 0x20, 0x12, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00,
  0x00, 0x00, 0x00, 0xa0, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x01, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x01, 0x80, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x50, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48,
  0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x98, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x17, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x60, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00
};
// 'Joystick', 150x150px
const unsigned char Joy_bitmapJoystick [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x06, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x00, 
  0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 
  0xff, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
  0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x01, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0x06, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3f, 0xff, 0xc0, 0x00, 0x06, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xe0, 0x06, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7f, 0xff, 0xff, 0xff, 
  0xf8, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x60, 
  0x00, 0x00, 0x00, 0xf8, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x01, 0x00, 0xe0, 0x00, 0x00, 0x03, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 
  0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 
  0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
  0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 
  0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 
  0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 
  0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xdf, 
  0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x01, 0x80, 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x01, 0x80, 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xdf, 0xff, 0xff, 0xff, 0xfc, 
  0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 
  0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
  0x00, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 
  0xff, 0xff, 0xff, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 
  0x7f, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x07, 0xff, 0xff, 0xff, 
  0xff, 0xff, 0xf8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 
  0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x7f, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc0, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc0, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x0c, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 
  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x01, 
  0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x01, 0xff, 0xff, 
  0xff, 0xe0, 0x00, 0xff, 0xff, 0xfe, 0x00, 0x1f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x0c, 0xc0, 0x00, 
  0x03, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 
  0x0c, 0xc0, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0x60, 0x00, 0x00, 
  0x1f, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x03, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x0f, 0xff, 0xe0, 0x00, 
  0xe0, 0x00, 0x01, 0xff, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x03, 0x7f, 0xff, 0xff, 0xfe, 0x00, 0x07, 
  0xff, 0x80, 0x01, 0xc7, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0c, 0xc0, 0x00, 0x03, 0x7f, 0xff, 0xff, 
  0xfe, 0x00, 0x03, 0xff, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0c, 0xc0, 0x00, 0x03, 
  0x7f, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfc, 0x00, 0x03, 0x9f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0c, 
  0xc0, 0x00, 0x03, 0x7f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x78, 0x00, 0x07, 0x3f, 0xff, 0xff, 0xff, 
  0x80, 0x00, 0x0c, 0xc0, 0x00, 0x03, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x0e, 0x7f, 
  0xff, 0xff, 0xff, 0x80, 0x00, 0x0c, 0x80, 0x01, 0x83, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 
  0x00, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x84, 0x00, 0x0c, 0x80, 0x03, 0x87, 0x7f, 0xff, 0xff, 0xff, 
  0xe0, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xff, 0x86, 0x00, 0x0c, 0x80, 0x03, 0x83, 0x7f, 
  0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x3b, 0xff, 0xff, 0xff, 0xff, 0x87, 0x00, 0x0c, 0x80, 
  0x07, 0x83, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x73, 0xff, 0xff, 0xff, 0xff, 0x8f, 
  0x80, 0x0c, 0x80, 0x0f, 0x83, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0xe7, 0xff, 0xff, 
  0xff, 0xff, 0x8f, 0x80, 0x0c, 0x80, 0x0f, 0x83, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x01, 
  0xcf, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xc0, 0x0c, 0x80, 0x1f, 0x83, 0x7f, 0xff, 0xff, 0xff, 0xfe, 
  0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xe0, 0x0c, 0x80, 0x3f, 0x83, 0x7f, 0xff, 
  0xff, 0xff, 0xff, 0x00, 0x00, 0x03, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xe0, 0x0c, 0x80, 0x3f, 
  0x83, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf0, 
  0x0c, 0x80, 0x3f, 0x83, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 
  0xff, 0x8f, 0xf0, 0x0c, 0x80, 0x3f, 0x83, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x03, 0xff, 
  0xff, 0xff, 0xff, 0xff, 0x8f, 0xf0, 0x0c, 0x80, 0x1f, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 
  0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xe0, 0x0c, 0x80, 0x1f, 0x83, 0xff, 0xff, 0xff, 
  0xff, 0xfe, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xc0, 0x0c, 0x80, 0x0f, 0x83, 
  0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xc0, 0x0c, 
  0x80, 0x07, 0x83, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 
  0x87, 0x80, 0x0c, 0x80, 0x03, 0x83, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 
  0xff, 0xff, 0xff, 0x87, 0x00, 0x0c, 0x80, 0x03, 0x83, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 
  0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x00, 0x0c, 0xc0, 0x01, 0x83, 0xff, 0xff, 0xff, 0xff, 
  0xe0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x86, 0x00, 0x0c, 0xc0, 0x00, 0x03, 0xff, 
  0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0c, 0xc0, 
  0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 
  0x00, 0x0c, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x78, 0x00, 0x07, 0xff, 0xff, 
  0xff, 0xff, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0xfc, 0x00, 
  0x07, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 
  0x03, 0xdf, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x03, 0xff, 0xff, 
  0xff, 0xfe, 0x00, 0x07, 0x9f, 0x80, 0x01, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0c, 0xc0, 0x00, 
  0x03, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0x3f, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 
  0x0c, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x3c, 0x7f, 0xe0, 0x00, 0xff, 0xff, 0xff, 
  0xff, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x78, 0xff, 0xf0, 0x00, 
  0x7f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xe0, 0x00, 0xf1, 
  0xff, 0xfc, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xff, 
  0x80, 0x03, 0xc7, 0xff, 0xfe, 0x00, 0x07, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x07, 0x8f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 
  0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x1f, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x3f, 0xff, 0xff, 0xe0, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xff, 0xff, 
  0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x71, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc0, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0xe3, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x18, 0x7f, 0xfc, 0x00, 0xff, 0xff, 0xff, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x07, 0xff, 
  0xff, 0xff, 0xff, 0xff, 0xf8, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 
  0xfc, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 
  0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 
  0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 
  0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
  0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 
  0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 
  0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x01, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xcf, 0xff, 0xff, 0xff, 
  0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xef, 
  0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x01, 0x00, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x01, 0x00, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xef, 0xff, 0xff, 0xff, 0xfc, 
  0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xef, 0xff, 
  0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
  0x00, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x01, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xf0, 0x06, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x06, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3f, 0xff, 0xe0, 
  0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 
  0x1f, 0xff, 0xc0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x01, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x06, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 
  0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00
};

// Array of all bitmaps for convenience. (Total bytes used to store images in PROGMEM = 2880)
const int Joy_bitmapallArray_LEN = 1;
const unsigned char* Joy_bitmapallArray[1] = {
  Joy_bitmapJoystick
};


#include <spm_srxl_config.h>
#include <spm_srxl.h>

////////////
#include <stdint.h>
#include "TouchScreen.h"

// These are the pins for the shield!
#define YP A3  // must be an analog pin, use "An" notation!
#define XM A0  // must be an analog pin, use "An" notation!
#define YM A1  // can be a digital pin
#define XP A2  // can be a digital pin

#define MINPRESSURE 10
#define MAXPRESSURE 1000


// This is calibration data for the raw touch data to the screen coordinates
#define TS_MINX 150
#define TS_MINY 120
#define TS_MAXX 920
#define TS_MAXY 940

// For better pressure precision, we need to know the resistance
// between X+ and X- Use any multimeter to read it
// For the one we're using, its 300 ohms across the X plate
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 280);


///////////////
#include <MadgwickAHRS.h>
#define GRAVITY 9.802  // The gravity acceleration in New York City
#define GYRO_X_OFFSET -0.17030127
#define GYRO_Y_OFFSET -0.101372051
#define GYRO_Z_OFFSET 0.067981851

#define ACCEL_X_OFFSET -0.051304073
#define ACCEL_Y_OFFSET -0.083388064
#define ACCEL_Z_OFFSET 1.020884117
Madgwick filter;
unsigned long microsPerReading, microsPrevious;
float accelScale, gyroScale;



bool First = true;

#include <Servo.h>
Servo FRONTSERVO;
Servo REARSERVO;
Servo THROSERVO;
#define Thropin 7   //wow
#define Frontpin 6  //
#define Rearpin 2   //
#define Ch4pin 3    //
#define Gearpin 5   //
#define ENpin 8
#define RPMpin 30
//pwm volatile
volatile unsigned long THROlastmillis = 0;
volatile unsigned long FRONTlastmillis = 0;
volatile unsigned long REARlastmillis = 0;
volatile unsigned long CH4lastmillis = 0;
volatile unsigned long GEARlastmillis = 0;
volatile unsigned long lastmillis = 0;
volatile unsigned int RPMint = 0;
unsigned int SinceRPMLast = 0;
unsigned long RPM = 0;       //max 10000
unsigned long RPMmax = 100;  //max 10000
int RPMratio = 80;           //4000
int RPMstart = 90;
long RPMcount = 0;
long RPMcountLast = 0;
bool RPMBool = false;
elapsedMicros SinceRPM;
elapsedMillis SincePWM;
volatile long THROTTLEIN = 1500;
volatile long FRONTIN = 1500;
volatile long REARIN = 1500;
volatile long CH4IN = 1500;
long CH4 = 1500;
volatile long GEARIN = 1500;
long GEARIN1 = 1500;
#define Result 0
#define Minjoy 1
#define Maxjoy 2
#define Minservo 3
#define Maxservo 4
#define Zerojoy 5
#define Zeroservo 6
#define RPMservo 8
#define VELYservo 9
#define Input 7
//Throttle                      out     Min  Max   Minservo   Maxservo  zero zeroservo      In RPM VELY
int THROpwm[] = { 1500, 1000, 1900, 1000, 2000, 1480, 1485, 1500,1900,1900 };
int THROABS = 1500;
bool brake = false;
//FrontCHannel                   out        Min     Max   Minservo    Maxservo  zero    zeroservo     In
int FRONTpwm[] = { 1500, 1100, 1840, 1070, 1900, 1495, 1450, 1500 };

//RearCHannel                     out    Min    Max     Minservo  Maxservo  zero     zeroservo      In
int REARpwm[] = { 1500, 1170, 1840, 1000, 1800, 1497, 1476, 1500 };
//
int FRONTZERO[] = { FRONTpwm[Zerojoy], FRONTpwm[Zeroservo], 1500, 1500 };
int REARZERO[] = { REARpwm[Zerojoy], REARpwm[Zeroservo], 1500, 1500 };
//Interupt
#include <avr/io.h>
#include <avr/interrupt.h>
////////SCREEN/////////////////////////////////////////////////////////////
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"

// Color definitions
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
/*
Teensy3.x and Arduino's
You are using 4 wire SPI here, so:
 MOSI:  11//Teensy3.x/Arduino UNO (for MEGA/DUE refere to arduino site)
 MISO:  12//Teensy3.x/Arduino UNO (for MEGA/DUE refere to arduino site)
 SCK:   13//Teensy3.x/Arduino UNO (for MEGA/DUE refere to arduino site)
 the rest of pin below:
 NOT THE ORIGINAL DC PIN
 */
#define TFT_DC 31
#define TFT_CS 10
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
/*

Teensy 3.x can use: 2,6,9,10,15,20,21,22,23
Arduino's 8 bit: any
DUE: check arduino site
If you do not use reset, tie it to +3V3
*/


#include "RunningAverage.h"

RunningAverage RPMRA(10);



//GYRO////////////////////////////////////////////////////////////////////////////////////////////
#include <Arduino_LSM6DSOX.h>
long GYROANGLE = 0;
float GYROINX = 0;
float GYROINY = 0;
float GYROINZ = 0;
//long GYROIN = 0;
long GYROZERO = 2;
long accelcount = 0;
long accelsetup = 0;
float ACCX = 0;
float ACCY = 0;
float VELY = 0;
float VELYmax = 2;
float VELYstart = 90;
#define YOFFSET .06
#define YDeadzone .1
float ACCZ = 0;
bool TRC = HIGH;
bool Inmotion = false;
bool CalibrateReciever = false;
bool Calibrating = false;
//float accelsetup[] = {0,0,0};
///////////Current Monitor//////////////////////////
#include <Adafruit_INA260.h>
Adafruit_INA260 ina260 = Adafruit_INA260();

Adafruit_INA260 ina260_2 = Adafruit_INA260();
int INARearAdjust = 0;
int INAFrontAdjust = 0;
float INARear = 0;
float INAFront = 0;
bool RearCurrentTripped = false;
bool FrontCurrentTripped = false;
///////////////////////////////////////////////////////////////////////////
bool FRONTBool = false;
bool REARBool = false;
bool THROBool = false;
bool GEARBool = false;
bool CH4Bool = false;
bool UPDATEFRONT = false;
bool UPDATEREAR = false;
bool UPDATETHRO = false;
bool UPDATEFRONTWHEEL = false;
bool UPDATEREARWHEEL = false;

 
//////////////////////////////PID//////////////////////////////////////////
#include <PID_v1.h>


//Define Variables we'll be connecting to
double Setpoint = 0;
double PIDInput = 0;
double Output = 1500;
//Define the Tuning Parameters
double Kp = 1, Ki = 0.05, Kd = 0.25;
int P = 20000;
//Specify the links and initial tuning parameters
PID myPID(&PIDInput, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
///////////////////////////////PID/////////////////////////////////////////
///////////////////////////////SRXL2/////////////////////////////////////////
/* Spektrum SRXL2 to PWM Bridge
Use Hardware //Serial on standard pins. Hardware //Serial do simpel what it do should do, no need for pullups.
RX -------
         |----- SRXL 2
TX --|<--  a Schottky diode for example the 1N5711 used.
I use a 3,3v 16 MHz Arduino Pro Mini or a ATMega4809 or 4808 run at 3,3V and 16MHz too.
Install MegaCorex for Atmel MVR series 0 for ATMega4809 or 4808 support. Use F temp extended types!
DIY UPDI programmer for Atmel AVR Series 0 and 1  https://github.com/ElTangas/jtag2updi or https://github.com/MCUdude/microUPDI
*/
#include "spm_srxl.h"
#define SRXL2_PORT_BAUDRATE_DEFAULT 115200
#define SRXL2_FRAME_TIMEOUT 22
// Spektrum channel order
#define THRO 0
#define AILE 1
#define ELEV 3
//#define ELEV 2
#define YAW 4
//#define YAW  3
//#define GEAR 4
#define GEAR 2
#define AUX1 5
#define AUX2 6
#define AUX3 7
#define AUX4 8
#define AUX5 9

// Only available at 22ms frame rate.
#define AUX6 10
#define AUX7 11

// Select the PWM output pin mximal 12 servos on one timer

#define srxl2port Serial1
unsigned long currentTime;
unsigned long prevPwmTime = 0;
const long pwmInterval = 22;
bool Failsafesrxl2 = true;
bool PWMNew = false;

///////////////////////////////SRXL2/////////////////////////////////////////

//#include "TeensyTimerTool.h"

//using namespace TeensyTimerTool;

//PeriodicTimer t1; // generate a timer from the pool (Pool: 2xGPT, 16xTMR(QUAD), 20xTCK)

void setup() {

  Serial.begin(115200);
  ////Serial.println("FIN, FOUT, RIN, ROUT ");
  //myPID.SetMode(AUTOMATIC);
  pinMode(ENpin, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(RPMpin, INPUT_PULLUP);
//////////////SRXL2////////////////////////////////////////////////
  srxl2port.begin(SRXL2_PORT_BAUDRATE_DEFAULT);

  srxlInitDevice(SRXL_DEVICE_ID, SRXL_DEVICE_PRIORITY, SRXL_DEVICE_INFO, 0x01000001);  // // Init the local SRXL device with the unique ID 32 bit 0x01000001 hexadezimal.
  srxlInitBus(0, 1, SRXL_SUPPORTED_BAUD_RATES);                                        // Init the SRXL bus: The bus index must always be < SRXL_NUM_OF_BUSES -- in this case, it can only be 0 since we have only 1 bus.

  //t1.begin(SRXL2, 10'000); // 10m
  //tft.begin();
  //tft.setTextSize(2);
  
  //SERVO
#define ESCpin 28
#define Frontservopin 29
#define Rearservopin 33
  //tft.fillScreen(ILI9341_BLACK);
  // origin = left,top landscape (USB left upper)
  //tft.setRotation(1);
  //OFFScreen();
  
}

void RPMMETER() {
  //RPMint = millis() - lastmillis;
  //lastmillis = millis();
  RPMcount += 1;
  //RPMBool = true;
}


void SRXL2() {
  currentTime = millis();
  ////Serial.println(srxlChData.values[THRO]);
  static unsigned long prevSerialRxTime = 0;

  // UART receive buffer
  static uint8_t rxBuffer[2 * SRXL_MAX_BUFFER_SIZE];
  static uint8_t rxBufferIndex = 0;

  if (currentTime - prevSerialRxTime > SRXL2_FRAME_TIMEOUT) {
    //Serial.print("timeout,");
    prevSerialRxTime = currentTime;
    rxBufferIndex = 0;
    srxlRun(0, SRXL2_FRAME_TIMEOUT);
    //digitalWrite(13, HIGH);
    //Failsafelight(HIGH);
  }

  if (srxl2port.available()) {
    //Serial.print("available, ");
    prevSerialRxTime = currentTime;
    unsigned char c = srxl2port.read();  //
    rxBuffer[rxBufferIndex++] = c;
  }

  if (rxBufferIndex >= 5) {
    //Serial.print("Buffer Size: ");
    //Serial.print(rxBufferIndex);
    //Serial.print(", ");
    ////Serial.println(rxBuffer[0] == SPEKTRUM_SRXL_ID);
    if (rxBuffer[0] == SPEKTRUM_SRXL_ID) {
      uint8_t packetLength = rxBuffer[2];
      //Serial.print("SRXL ID, ");
      if (rxBufferIndex >= packetLength) {
        // Try to parse SRXL packet -- this internally calls srxlRun() after packet is parsed and reset timeout
        //Serial.print("Packet length, ");
        if (srxlParsePacket(0, rxBuffer, packetLength)) {
          //Serial.print("srxlrun, ");
          // Move any remaining bytes to beginning of buffer (usually 0)
          ////Serial.print(rxBuffer[0], HEX);
          ////Serial.print(rxBuffer[1], HEX);
          ////Serial.print(rxBuffer[2], HEX);
          ////Serial.print(rxBuffer[3], HEX);
          ////Serial.print(rxBuffer[4], HEX);
          ////Serial.println(" ");
          rxBufferIndex -= packetLength;
          memmove(rxBuffer, &rxBuffer[packetLength], rxBufferIndex);
        } else {
          //Serial.print("Buffer index 0, ");
          rxBufferIndex = 0;
        }
      }
      else {
        //Serial.print("SRXL NOT ID, ");

      }
    }
  }
  else {
    //Serial.print("No Buffer, ");
  }

  if (currentTime - prevPwmTime >= pwmInterval) {
    prevPwmTime = currentTime;
    //Serial.print("PWM Interval ");
    ////Serial
  }
  //Serial.println(" ");

}

///////////////////////// SRXL2 channel interface //////////////////////////////

void userProvidedReceivedChannelData(SrxlChannelData* pChannelData, bool isFailsafe) {
  if ((srxlChData.values[THRO] != 0) & First) {
    First = false;
    FRONTSERVO.attach(Frontservopin);
    REARSERVO.attach(Rearservopin);
    THROSERVO.attach(ESCpin);
    THROpwm[Zeroservo] = srxlChData.values[THRO] >> 6;  // 16-bit to 10-bit range (0 - 1024)
    ////Serial.println(srxlChData.values[THRO]);
    THROpwm[Zeroservo] += 988;
  }
  ////Serial.println(srxlChData.values[ELEV]);
  // Get throttle channel value and convert to 1000 - 1500 - 2000 pwm range
  THROTTLEIN = srxlChData.values[THRO] >> 6;  // 16-bit to 10-bit range (0 - 1024)
  ////Serial.println(srxlChData.values[THRO]);
  THROTTLEIN += 988;
  if (THROpwm[Input] != THROTTLEIN) {
    THROpwm[Input] = THROTTLEIN;
    THROBool = true;
    UPDATETHRO = true;
  }

  // Get Aux2 channel value and convert to 1000 - 1500 - 2000 pwm range
  FRONTIN = srxlChData.values[AILE] >> 6;  // 16-bit to 10-bit range (0 - 1024)
  //if (isFailsafe == true){pwmPos6 =512; } //Center position, change this to the needed failsafe position
  FRONTIN += 988;

  if (FRONTpwm[Input] != FRONTIN) {
    FRONTBool = true;
    UPDATEFRONTWHEEL = true;
    FRONTpwm[Input] = FRONTIN;
  }


  // Get Aux2 channel value and convert to 1000 - 1500 - 2000 pwm range
  REARIN = srxlChData.values[ELEV] >> 6;     // 16-bit to 10-bit range (0 - 1024)
  if (isFailsafe == true) {
    REARIN = 512;  //Center position, change this to the needed failsafe position
  }
  //digitalWrite(13, isFailsafe);
  //Failsafelight(Failsafesrxl2);
  REARIN += 988;
  if (REARpwm[Input] != REARIN) {
    REARBool = true;
    UPDATEREARWHEEL = true;
    REARpwm[Input] = REARIN;
  }

  // Get Aux2 channel value and convert to 1000 - 1500 - 2000 pwm range
  GEARIN = srxlChData.values[YAW] >> 6;  // 16-bit to 10-bit range (0 - 1024)
  if (isFailsafe == true) {
    GEARIN = 512;  //Center position, change this to the needed failsafe position
  }
  GEARIN += 988;
  if (GEARIN1 != GEARIN) {
    GEARBool = true;
    GEARIN1 = GEARIN;
  }

  // Get Aux2 channel value and convert to 1000 - 1500 - 2000 pwm range
  CH4IN = srxlChData.values[GEAR] >> 6;  // 16-bit to 10-bit range (0 - 1024)
  if (isFailsafe == true) {
    CH4IN = 512;  //Center position, change this to the needed failsafe position
  }
  CH4IN += 988;
  if (CH4 != CH4IN) {
    CH4Bool = true;
    CH4 != CH4IN;
  }
  Steering();
  Throttle();
  PWMNew = true;
}



void uartSetBaud(uint8_t uart, uint32_t baudRate)  // Automatic adjust SRXL2 baudrate.
{
  // Not supported yet
}

void uartTransmit(uint8_t uart, uint8_t* pBuffer, uint8_t length) {
  for (uint8_t i = 0; i < length; i++) {
    srxl2port.write(pBuffer[i]);
  }
  srxl2port.flush();
}

void Steering() {

  FRONTpwm[Result] = min(FRONTpwm[Input], FRONTpwm[Maxservo]);
  FRONTpwm[Result] = max(FRONTpwm[Input], FRONTpwm[Minservo]);
  REARpwm[Result] = min(REARpwm[Input], REARpwm[Maxservo]);
  REARpwm[Result] = max(REARpwm[Input], REARpwm[Minservo]);

}

void Throttle() {

  THROpwm[Result] = THROpwm[Input];
  THROpwm[Result] = min(THROpwm[Maxservo], THROpwm[Result]);
  THROpwm[Result] = max(THROpwm[Minservo], THROpwm[Result]);
  //THROSERVO.writeMicroseconds(THROpwm[Result]);
}

void loop() {
  SRXL2();
  //Do Something that takes a long time
  FRONTSERVO.writeMicroseconds(FRONTpwm[Result]);
  REARSERVO.writeMicroseconds(REARpwm[Result]);
  THROSERVO.writeMicroseconds(THROpwm[Result]);
}


Compiled using Arduino IDE on Fast.
 
You have to arrange your code so that the SRXL2() function is called frequently enough that it doesn't miss characters or timeout.
In loop() try:
Code:
  SRXL2();
  //Do Something that takes a long time
  FRONTSERVO.writeMicroseconds(FRONTpwm[Result]);
  SRXL2();
  REARSERVO.writeMicroseconds(REARpwm[Result]);
  SRXL2();
  THROSERVO.writeMicroseconds(THROpwm[Result]);

Pete
 
Hi Pete,

How do I add a section to this code that can run without the risk of being slow enough to break the SRXL2 connection.

I'm looking into Multithreading and SerialEvent(), but I'm not sure what is the best method.

My original question is asking for assistance on making a code that does not risk being too slow for SRXL2. Your method would require numerous time studies on each individual functions and modifications on said functions to ensure that SRXL2 never times out. Is your recommendation to add SRXL2(); to every other line of code? What about built in functions? If I call tft.fillScreen(ILI9341_BLACK); or draw 'Bitmap Car no wheels', 311x125px. What happens if the function itself is longer than the allowed time?

Code:
  SRXL2();
  Code(); //Do Something that takes enough time for SRXL2 to break
 SRXL2();//No longer works
  FRONTSERVO.writeMicroseconds(FRONTpwm[Result]);
  SRXL2();//tries to reconnect
  REARSERVO.writeMicroseconds(REARpwm[Result]);
  SRXL2(); //tries to reconnect
  THROSERVO.writeMicroseconds(THROpwm[Result]);


This section of the code uses interrupts to poll incoming data. I'm struggling to believe that a solution like this is not achievable for serial input.
Code:
void RPMMETER() {
  //RPMint = millis() - lastmillis;
  //lastmillis = millis();
  RPMcount += 1;
  //RPMBool = true;
}
 
In your example, you have "do something that takes a long time". Your options depend on what that "something" is. If it's something that is truly using 100% of the CPU while executing, such as pure calculation, you would need to somehow periodically "interrupt" that process to call SRXL2. You could do that with TeensyThreads, which is time-sliced. In that case, you would create a thread that calls SRXL2(), and you would set the timeslice for the long computation to be short enough that SRXL2 gets called as often as necessary.

If the long duration "something" contains calls to yield(), then you could use EventResponder, which lets you register a callback function for a given event. In your case, that would be for received data on the port where you are using SRXL2. During your long "something", each time it calls yield(), EventResponder could call your SerialEvent handler and process whatever data has arrived. I think of EventResponder as a way of cooperative multi-tasking. It's cooperative in the sense that task "switches" occur only on calls to yield().

If your long "something" does call yield(), an alternative to using EventResponder is to do cooperative multi-tasking in a different way. You could use TeensyThreads, but set a very long timeslice, effectively making it cooperative. Task switches would occur only on yield(), and you would create a TeensyThreads thread that calls SRXL2(), which would execute each time your long "something" calls yield(). When your serial comm thread had processed all of the available data, it would call yield() to switch back to your primary thread. Hope that's all clear.

One more thought. If you are writing the code that takes a long time, you could follow Pete's suggestion and sprinkle some calls to SRXL2() within the long-duration code.
 
Each time you call the SRXL2 function it only reads one available Serial character. You can improve its response by changing this statement:
Code:
  if (srxl2port.available()) {
to this:
Code:
  while (srxl2port.available() > 0) {
You would still have to call SRXL2() between each function that takes a long time as I indicated in #8.

As for interrupts, so far I haven't found anything in the Serial device code that provides a callback on receipt of a character at interrupt level. There is a callback mechanism but it appears that the callback occurs between each time that loop() is executed which isn't any better than what you have now.

Pete
 
Each time you call the SRXL2 function it only reads one available Serial character. You can improve its response by changing this statement:
Code:
  if (srxl2port.available()) {
to this:
Code:
  while (srxl2port.available() > 0) {
You would still have to call SRXL2() between each function that takes a long time as I indicated in #8.


in addition to this you can use something like
Code:
// as global variables
#define srxl_Rx_Buffer_size 64
char srxl_Rx_Buffer[srxl_Rx_Buffer_size];

// in init()
addMemoryForRead(srxl_Rx_Buffer,srxl_Rx_Buffer_size);

to add as much additional buffering to the serial port as you need to ensure the available buffer doesn't overflow.

The Serial driver copies new data from the hardware buffer and into the extra buffer you supply in an interrupt context so it will take priority over anything else going on in the main loop. As long as each time around loop() you pull all of the waiting data out rather than a single byte that should provide a simple enough fix no matter how slow the loop is.
 
Thank you for all the suggestions.

I tried TeensyThreads and the tft display is giving me difficulties integrating into the code. I can't use the screen at all inside of a thread.

I have tried showing a simple black screen. Any suggestions?
Code:
// 'Bitmap Car no wheels', 311x125px


#include <Arduino.h>
#include "TeensyThreads.h"


////////////
#include <stdint.h>
#include "TouchScreen.h"

// These are the pins for the shield!
#define YP A3  // must be an analog pin, use "An" notation!
#define XM A0  // must be an analog pin, use "An" notation!
#define YM A1  // can be a digital pin
#define XP A2  // can be a digital pin

#define MINPRESSURE 10
#define MAXPRESSURE 1000


// This is calibration data for the raw touch data to the screen coordinates
#define TS_MINX 150
#define TS_MINY 120
#define TS_MAXX 920
#define TS_MAXY 940

// For better pressure precision, we need to know the resistance
// between X+ and X- Use any multimeter to read it
// For the one we're using, its 300 ohms across the X plate
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 280);


///////////////
#include <MadgwickAHRS.h>
#define GRAVITY 9.802  // The gravity acceleration in New York City
#define GYRO_X_OFFSET -0.17030127
#define GYRO_Y_OFFSET -0.101372051
#define GYRO_Z_OFFSET 0.067981851

#define ACCEL_X_OFFSET -0.051304073
#define ACCEL_Y_OFFSET -0.083388064
#define ACCEL_Z_OFFSET 1.020884117
Madgwick filter;
unsigned long microsPerReading, microsPrevious;
float accelScale, gyroScale;



bool First = true;

#include <Servo.h>
Servo FRONTSERVO;
Servo REARSERVO;
Servo THROSERVO;
#define Thropin 7   //wow
#define Frontpin 6  //
#define Rearpin 2   //
#define Ch4pin 3    //
#define Gearpin 5   //
#define ENpin 8
#define RPMpin 30
//pwm volatile
volatile unsigned long THROlastmillis = 0;
volatile unsigned long FRONTlastmillis = 0;
volatile unsigned long REARlastmillis = 0;
volatile unsigned long CH4lastmillis = 0;
volatile unsigned long GEARlastmillis = 0;
volatile unsigned long lastmillis = 0;
volatile unsigned int RPMint = 0;
unsigned int SinceRPMLast = 0;
volatile unsigned long RPM = 0;       //max 10000
unsigned long RPMmax = 100;  //max 10000
int RPMratio = 80;           //4000
int RPMstart = 90;
long RPMcount = 0;
long RPMcountLast = 0;
bool RPMBool = false;
elapsedMicros SinceRPM;
elapsedMillis SincePWM;
volatile long THROTTLEIN = 1500;
volatile long FRONTIN = 1500;
volatile long REARIN = 1500;
volatile long CH4IN = 1500;
long CH4 = 1500;
volatile long GEARIN = 1500;
long GEARIN1 = 1500;
#define Result 0
#define Minjoy 1
#define Maxjoy 2
#define Minservo 3
#define Maxservo 4
#define Zerojoy 5
#define Zeroservo 6
#define RPMservo 8
#define VELYservo 9
#define Input 7
//Throttle                      out     Min  Max   Minservo   Maxservo  zero zeroservo      In RPM VELY
int THROpwm[] = { 1500, 1000, 1900, 1000, 2000, 1480, 1485, 1500, 1900, 1900 };
int THROABS = 1500;
bool brake = false;
//FrontCHannel                   out        Min     Max   Minservo    Maxservo  zero    zeroservo     In
int FRONTpwm[] = { 1500, 1100, 1840, 1070, 1900, 1495, 1450, 1500 };

//RearCHannel                     out    Min    Max     Minservo  Maxservo  zero     zeroservo      In
int REARpwm[] = { 1500, 1170, 1840, 1000, 1800, 1497, 1476, 1500 };
//
int FRONTZERO[] = { FRONTpwm[Zerojoy], FRONTpwm[Zeroservo], 1500, 1500 };
int REARZERO[] = { REARpwm[Zerojoy], REARpwm[Zeroservo], 1500, 1500 };
//Interupt
#include <avr/io.h>
#include <avr/interrupt.h>
////////SCREEN/////////////////////////////////////////////////////////////
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"

// Color definitions
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
/*
  Teensy3.x and Arduino's
  You are using 4 wire SPI here, so:
  MOSI:  11//Teensy3.x/Arduino UNO (for MEGA/DUE refere to arduino site)
  MISO:  12//Teensy3.x/Arduino UNO (for MEGA/DUE refere to arduino site)
  SCK:   13//Teensy3.x/Arduino UNO (for MEGA/DUE refere to arduino site)
  the rest of pin below:
  NOT THE ORIGINAL DC PIN
*/
#define TFT_DC 31
#define TFT_CS 10
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
/*

  Teensy 3.x can use: 2,6,9,10,15,20,21,22,23
  Arduino's 8 bit: any
  DUE: check arduino site
  If you do not use reset, tie it to +3V3
*/


#include "RunningAverage.h"

RunningAverage RPMRA(10);



//GYRO////////////////////////////////////////////////////////////////////////////////////////////
#include <Arduino_LSM6DSOX.h>
long GYROANGLE = 0;
float GYROINX = 0;
float GYROINY = 0;
float GYROINZ = 0;
//long GYROIN = 0;
long GYROZERO = 2;
long accelcount = 0;
long accelsetup = 0;
float ACCX = 0;
float ACCY = 0;
float VELY = 0;
float VELYmax = 2;
float VELYstart = 90;
#define YOFFSET .06
#define YDeadzone .1
float ACCZ = 0;
bool TRC = HIGH;
bool Inmotion = false;
bool CalibrateReciever = false;
bool Calibrating = false;
//float accelsetup[] = {0,0,0};
///////////Current Monitor//////////////////////////
#include <Adafruit_INA260.h>
Adafruit_INA260 ina260 = Adafruit_INA260();

Adafruit_INA260 ina260_2 = Adafruit_INA260();
int INARearAdjust = 0;
int INAFrontAdjust = 0;
float INARear = 0;
float INAFront = 0;
bool RearCurrentTripped = false;
bool FrontCurrentTripped = false;
///////////////////////////////////////////////////////////////////////////
bool FRONTBool = false;
bool REARBool = false;
bool THROBool = false;
bool GEARBool = false;
bool CH4Bool = false;
bool UPDATEFRONT = false;
bool UPDATEREAR = false;
bool UPDATETHRO = false;
bool UPDATEFRONTWHEEL = false;
bool UPDATEREARWHEEL = false;


//////////////////////////////PID//////////////////////////////////////////
#include <PID_v1.h>


//Define Variables we'll be connecting to
double Setpoint = 0;
double PIDInput = 0;
double Output = 1500;
//Define the Tuning Parameters
double Kp = 1, Ki = 0.05, Kd = 0.25;
int P = 20000;
//Specify the links and initial tuning parameters
PID myPID(&PIDInput, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
///////////////////////////////PID/////////////////////////////////////////
///////////////////////////////SRXL2/////////////////////////////////////////
/* Spektrum SRXL2 to PWM Bridge
  Use Hardware serial on standard pins. Hardware serial do simpel what it do should do, no need for pullups.
  RX -------
         |----- SRXL 2
  TX --|<--  a Schottky diode for example the 1N5711 used.
  I use a 3,3v 16 MHz Arduino Pro Mini or a ATMega4809 or 4808 run at 3,3V and 16MHz too.
  Install MegaCorex for Atmel MVR series 0 for ATMega4809 or 4808 support. Use F temp extended types!
  DIY UPDI programmer for Atmel AVR Series 0 and 1  https://github.com/ElTangas/jtag2updi or https://github.com/MCUdude/microUPDI
*/
#include "spm_srxl.h"
#define SRXL2_PORT_BAUDRATE_DEFAULT 115200
#define SRXL2_FRAME_TIMEOUT 22
// Spektrum channel order
#define THRO 0
#define AILE 1
#define ELEV 3
//#define ELEV 2
#define YAW 4
//#define YAW  3
//#define GEAR 4
#define GEAR 2
#define AUX1 5
#define AUX2 6
#define AUX3 7
#define AUX4 8
#define AUX5 9

// Only available at 22ms frame rate.
#define AUX6 10
#define AUX7 11

// Select the PWM output pin mximal 12 servos on one timer

#define srxl2port Serial1
//unsigned long currentTime;
//unsigned long prevPwmTime = 0;
const long pwmInterval = 22;
bool Failsafesrxl2 = true;
bool PWMNew = false;

///////////////////////////////SRXL2/////////////////////////////////////////

#include "TeensyTimerTool.h"

using namespace TeensyTimerTool;

OneShotTimer timer1; // generate a timer from the pool (Pool: 2xGPT, 16xTMR(QUAD), 20xTCK)
volatile bool SRXL2TIMEOUT = false;
void TIMEOUT()
{
  SRXL2TIMEOUT = true;
}

void setup() {

  Serial.begin(115200);
  //Serial.println("FIN, FOUT, RIN, ROUT ");
  //myPID.SetMode(AUTOMATIC);
  pinMode(ENpin, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(RPMpin, INPUT_PULLUP);
  //////////////SRXL2////////////////////////////////////////////////
  srxl2port.begin(SRXL2_PORT_BAUDRATE_DEFAULT);

  srxlInitDevice(SRXL_DEVICE_ID, SRXL_DEVICE_PRIORITY, SRXL_DEVICE_INFO, 0x01000001);  // // Init the local SRXL device with the unique ID 32 bit 0x01000001 hexadezimal.
  srxlInitBus(0, 1, SRXL_SUPPORTED_BAUD_RATES);                                        // Init the SRXL bus: The bus index must always be < SRXL_NUM_OF_BUSES -- in this case, it can only be 0 since we have only 1 bus.

  timer1.begin(TIMEOUT);
  attachInterrupt(digitalPinToInterrupt(RPMpin), RPMMETER, FALLING);
  RPMRA.clear();  // explicitly start clean
  /////TFT/////

 

  //SERVO
#define ESCpin 28
#define Frontservopin 29
#define Rearservopin 33
  IMU.begin();
  ina260.begin();
  ina260_2.begin(0x44);

  
  threads.setDefaultTimeSlice(1);
  threads.addThread(Threadloop);


  filter.begin(IMU.accelerationSampleRate());

  // initialize variables to pace updates to correct rate
  microsPerReading = 1000000 / 25;
  microsPrevious = micros();
}

void Threadloop(){
  tft.begin();
  tft.setTextSize(2);
  tft.fillScreen(ILI9341_BLACK);
  // origin = left,top landscape (USB left upper)
  tft.setRotation(1);
}


void loop() {
  SRXL2();
  // // set the values of PWM IN
  if (SincePWM > pwmInterval) {  //22) {      // "sincePrint" auto-increases
  
    FRONTSERVO.writeMicroseconds(FRONTpwm[Result]);
    REARSERVO.writeMicroseconds(REARpwm[Result]);
    THROSERVO.writeMicroseconds(THROpwm[Result]);
    SincePWM = 0;
    //DisplayScreen();
    //Serial.println(SincePrint);
  }
  return;


  if (PWMNew == true) {
    PWMNew = false;
    
    //ServoCheck();
    
  }
}
 
I tried TeensyThreads and the tft display is giving me difficulties integrating into the code. I can't use the screen at all inside of a thread. I have tried showing a simple black screen. Any suggestions?

My suggestion is start from your working code try adding a thread that does something trivial, such as increment a counter, like in the Print example from TeensyThreads. Confirm that you have a working thread and everything else is the same. After that, try putting your SRXL2 code in a thread. I'm not sure, but I think you have multiple SPI devices, so putting one of them (tft) in a thread is not going to be simple. I would also start by using a long timeslice, or at least the default (10) as opposed to a shorter one (1).
 
One could use interrupt chaining

Here is my attempt at interrupt chaining. I used #include "TeensyTimerTool.h" to create a OneShotTimer SRXL2CLK; // generate a timer from the pool (Pool: 2xGPT, 16xTMR(QUAD), 20xTCK). I started the SRXL2 and used a while loop to keep it going until it has enough data to continue. Communication works usually, small changes in the code tend to break things. TFT which is the main requirement is still not working properly. Adding simple code like tft.begin() and tft.print breaks communication with the SRXL2 receiver. I'm not sure what causes the connection to fail, still trying to understand the SRXL2 library.

Code:
void SRXL2(){
    Serial.println(millis());
    do {
    loopStartTime = millis();
    if (loopStartTime - prevSerialRxMillis > SRXL2_FRAME_TIMEOUT)
    {
      prevSerialRxMillis = loopStartTime;
      rxBufferIndex = 0;
      srxlRun(0, SRXL2_FRAME_TIMEOUT);
      //Serial.print(loopStartTime);
      //Serial.println(": Timeout");
      digitalWrite(LEDPin, true);
    }

    if (srxl2port.available())
    { 
      SXRLRUNCALLED = true;
      prevSerialRxMillis = loopStartTime;

      unsigned char c = srxl2port.read();

      rxBuffer[rxBufferIndex++] = c;
    }

    if (rxBufferIndex >= 5)
    {

      if (rxBuffer[0] == SPEKTRUM_SRXL_ID)
      {
        uint8_t packetLength = rxBuffer[2];
        if (rxBufferIndex >= packetLength)
        {
          timeLastPacketParse = loopStartTime;

          // Try to parse SRXL packet -- this internally calls srxlRun() after packet is parsed and reset timeout
          if (srxlParsePacket(0, rxBuffer, packetLength))
          {
            // Move any remaining bytes to beginning of buffer (usually 0)
            rxBufferIndex -= packetLength;
            memmove(rxBuffer, &rxBuffer[packetLength], rxBufferIndex);
          }
          else
          {
            rxBufferIndex = 0;
          }
        }
      }
    }
  }
  while (!SXRLRUNCALLED);
  SRXL2CLK.trigger(0'500);  // switch off after 5ms
}
 
I'm not sure, but I think you have multiple SPI devices, so putting one of them (tft) in a thread is not going to be simple. I would also start by using a long timeslice, or at least the default (10) as opposed to a shorter one (1).

I'm going to take a shot at interrupts instead because your suggestion breaks the requirements of the task.

1: I have SPI devices, seems like Teensy threads is already not the correct solution.

2: I took the example code of teensy threads and example code of tft printline. Could not get the count to appear on the screen.

3: Interrupts seem easier to maintain. By using teensytimer to make a OneShotTimer called SRXL2CLK. SRXL2CLK calls SRXL2() every 5 ms checking for incoming data.

Code:
void SRXL2() {
  do {
    //currentTime = millis();
    //Serial.println(srxlChData.values[THRO]);
    //static unsigned long prevSerialRxTime = 0;
    // UART receive buffer
    static uint8_t rxBuffer[2 * SRXL_MAX_BUFFER_SIZE];
    static uint8_t rxBufferIndex = 0;

    if (SRXL2TIMEOUT)
    {
      //Serial.print("timeout,");
      //prevSerialRxTime = currentTime; START TIMER
      timer1.stop();
      timer1.trigger(22'000);  // switch off after 22ms
      SRXL2TIMEOUT = false;
      rxBufferIndex = 0;
      srxlRun(0, SRXL2_FRAME_TIMEOUT);
      SXRLRUNCALLED = true;
      //digitalWrite(13, HIGH);
      //Failsafelight(HIGH);
    }

    if (srxl2port.available()) {
      Serial.print("available, ");
      timer1.stop();
      timer1.trigger(22'000);
      SRXL2TIMEOUT = false;
      SXRLRUNCALLED = false;
      //prevSerialRxTime = currentTime;
      unsigned char c = srxl2port.read();  //
      rxBuffer[rxBufferIndex++] = c;
    }

    if (rxBufferIndex >= 5) {
      if (rxBuffer[0] == SPEKTRUM_SRXL_ID) {
        uint8_t packetLength = rxBuffer[2];
        if (rxBufferIndex >= packetLength) {

          // Try to parse SRXL packet -- this internally calls srxlRun() after packet is parsed and reset timeout
          if (srxlParsePacket(0, rxBuffer, packetLength)) {
            // Move any remaining bytes to beginning of buffer (usually 0)
            rxBufferIndex -= packetLength;
            SXRLRUNCALLED = true;
            memmove(rxBuffer, &rxBuffer[packetLength], rxBufferIndex);
          } else {
            rxBufferIndex = 0;
          }
        }
      }
    }
  } while (!SXRLRUNCALLED);
  SRXL2CLK.trigger(5'000);  // switch off after 5ms

  }

code works but adding tft.begin() at any point in loop() breaks the communication. Does tft disable interrupts during the function?

The worst part is I'm not even sure why the communication stops. Is it data overflow? Is the host waiting for a response? There's not much information about this out there.
 
.begin() is typically done one time in setup - before any use. Why use in loop()

I only call tft.begin and tft.draw once to prove that the srxl2 communication stops after calls to the tft display. This code flips a bool after 1 loop to test the SRXL2 communication. If I run it in setup() the SRXL2 communication may not start at all. At that point, too many variables can cause the issue for me to debug.

Code:
bool oncehappened = false;
volatile bool SXRLRUNCALLED = false;
void loop() {
  do {
    loopStartTime = millis();
    if (loopStartTime - prevSerialRxMillis > SRXL2_FRAME_TIMEOUT)
    {
      prevSerialRxMillis = loopStartTime;
      rxBufferIndex = 0;
      srxlRun(0, SRXL2_FRAME_TIMEOUT);
      //Serial.print(loopStartTime);
      //Serial.println(": Timeout");
      digitalWrite(LEDPin, true);
    }

    if (srxl2port.available())
    { 
      SXRLRUNCALLED = true;
      prevSerialRxMillis = loopStartTime;

      unsigned char c = srxl2port.read();

      rxBuffer[rxBufferIndex++] = c;
    }

    if (rxBufferIndex >= 5)
    {

      if (rxBuffer[0] == SPEKTRUM_SRXL_ID)
      {
        uint8_t packetLength = rxBuffer[2];
        if (rxBufferIndex >= packetLength)
        {
          timeLastPacketParse = loopStartTime;

          // Try to parse SRXL packet -- this internally calls srxlRun() after packet is parsed and reset timeout
          if (srxlParsePacket(0, rxBuffer, packetLength))
          {
            // Move any remaining bytes to beginning of buffer (usually 0)
            rxBufferIndex -= packetLength;
            memmove(rxBuffer, &rxBuffer[packetLength], rxBufferIndex);
          }
          else
          {
            rxBufferIndex = 0;
          }
        }
      }
    }
  }
  while (!SXRLRUNCALLED);
  //SRXL2();

  if (SincePWM > pwmInterval) {  //22) {      // "sincePrint" auto-increases
    FRONTSERVO.writeMicroseconds(FRONTpwm[Result]);
    REARSERVO.writeMicroseconds(REARpwm[Result]);
    THROSERVO.writeMicroseconds(THROpwm[Result]);
    SincePWM = 0;
    //serial(2);
    //DisplayScreen();
    //Serial.println(SincePrint);
  }
  //ZDisplay();
  oncehappened = false;
  if(oncehappened){
    return;
  }
  tft.begin();
  tft.fillRect(0,0,20, 20, ILI9341_BLACK);
  //MenuScreen();
  //tft.drawRect(0, 0, 150, 50, ILI9341_WHITE);
  //delay(5000);

}
 
Sorry - not following the forum as much these days. Mostly playing with other things.. Also others have give some good advice.

Don't have much time, but if it were me, some things I would look at:

a) Increase the size of the RX buffer for the Serial port. Like add 256 bytes could be larger. And each time you see there is data, read out as much as you can...

b) Display - looks like you are using Adafruit_ILI9341 library try Teensy specific libraries, like ili9341_t3 or mine ili9341_t3n. With mine if you have memory space, you could try using frame buffer for outputs, and potentially updateFrameAsync() to have the screen output be done using DMA.

c) Servo - I believe the servo library is doing lots of timer interrupts and the like, maybe try PWMServo - to see if you can have it done using PWM which once you set the values the hardware takes care of it.

d) Not sure, could put some things on an IntervalTimer.

Edit: maybe helps, maybe hurts
e) potentially move the code to read in from xrxl2port to use the SerialEvent stuff, i.e. serialEvent1 for Serial1...
Then if you scatter calls to yield() in your code, the yield calls will see that there is stuff in the queue and call off to SerialEvent1...
This will happen with you explicit calls to yield, as well as other calls to it, from places that may call it when they are in some form of loop waiting for some state change.

Again I know this is not a lot of details, but those are the things that I would look at.
 
Last edited:
Sorry - not following the forum as much these days. Mostly playing with other things.. Also others have give some good advice.

Don't have much time, but if it were me, some things I would look at:

a) Increase the size of the RX buffer for the Serial port. Like add 256 bytes could be larger. And each time you see there is data, read out as much as you can...

How can I determine if the issue is buffer size related? Is the SRXL2 library iterating through the bytes in the buffer. When I read the code, I can't tell if increasing the buffer would solve the issue.
Code:
        if(bytesReceived)
        {
            rxBufferIndex += bytesReceived;
            if(rxBufferIndex < 5)
                continue;

            if(rxBuffer[0] == SPEKTRUM_SRXL_ID)
            {
                uint8_t packetLength = rxBuffer[2];
                if(rxBufferIndex > packetLength)
                {
                    // Try to parse SRXL packet -- this internally calls srxlRun() after packet is parsed and reset timeout
                    if(srxlParsePacket(0, rxBuffer, packetLength))
                    {
                        // Move any remaining bytes to beginning of buffer (usually 0)
                        rxBufferIndex -= packetLength;
                        memmove(rxBuffer, &rxBuffer[packetLength], rxBufferIndex);
                    }
                    else
                    {
                        rxBufferIndex = 0;
                    }
                }
            }
        }
        else
        {
            // Tell SRXL state machine that 5 more milliseconds have passed since packet received
            srxlRun(0, 5);
            rxBufferIndex = 0;
        }

Can you point me to a serial output code to read the incoming HEX bytes on the serial monitor. I still receive bytes from the SRXL2 device, it seems like the code is reading them out of order. But I can't tell because I'm struggling to understand how the github library works.
 
Hi KurtE,

Using ili9341_t3 helped me finally see PWM data from SRXL2 on the tft screen. I have a lot left to fix, but is a big leap forward. I still have issues with receiving information via serial. I believe the issue is related to how the example code reads the serial data. For instance, the first Hex value should always be A6. When I run the code below, tft.println(rxBuffer[0], HEX); is not usually A6. I believe that will cause if (srxlParsePacket(0, rxBuffer, packetLength)) { to return FALSE. Resulting in rxBufferIndex = 0;. Is this going to cause issues? How do I edit the code to cycle through the data instead of deleting large chunks of RX data.


Code:
void SRXL2() {
  //tft.print("(");
  do {
    //tft.print(SXRLRUNCALLED);
    loopStartTime = millis();
    if (loopStartTime - prevSerialRxMillis > SRXL2_FRAME_TIMEOUT) {
      prevSerialRxMillis = loopStartTime;
      rxBufferIndex = 0;
      srxlRun(0, SRXL2_FRAME_TIMEOUT);
      tft.println(" Timeout! ");
      //tft.fillScreen(ILI9341_BLACK);
      SXRLRUNCALLED = false;
      //Serial.print(loopStartTime);
      //Serial.println(": Timeout");
      digitalWrite(LEDPin, true);
    }

    if (srxl2port.available()) {

      SXRLRUNCALLED = true;
      prevSerialRxMillis = loopStartTime;
      unsigned char c = srxl2port.read();
      //tft.print(c,HEX);
      rxBuffer[rxBufferIndex++] = c;
    } else if (rxBufferIndex > 0) {
      //tft.print("i");
    }

    if (rxBufferIndex >= 5) {
      tft.setTextColor(ILI9341_GREEN, ILI9341_BLACK);
      tft.println(rxBuffer[0], HEX);
      if (rxBuffer[0] == SPEKTRUM_SRXL_ID) {
        uint8_t packetLength = rxBuffer[2];
        if (rxBufferIndex >= packetLength) {
          timeLastPacketParse = loopStartTime;
          // Try to parse SRXL packet -- this internally calls srxlRun() after packet is parsed and reset timeout
          if (srxlParsePacket(0, rxBuffer, packetLength)) {
            // Move any remaining bytes to beginning of buffer (usually 0)
            rxBufferIndex -= packetLength;
            memmove(rxBuffer, &rxBuffer[packetLength], rxBufferIndex);
          } else {

            rxBufferIndex = 0;
            //tft.fillScreen(ILI9341_BLACK);
            //tft.setCursor(0,0);
          }
        }
      }
    }

  } while (SXRLRUNCALLED);
  //delay(1000);
  //tft.print(")");

  //SRXL2Timer.begin(SRXL2, 1000);  // blinkLED to run every 1 ms
}
 
I've made significant progress. I can confirm that the example code does not handle locating the start of each serial communication. If (rxBuffer[0] != SPEKTRUM_SRXL_ID) is true, then the code will be unable to read any PWM data. I wrote code to delete all incoming data until rxBuffer[0] is equal to "the first HEX value sent". Now if I miss any data, the code will locate the most recent starting HEX value.

To fix issues with SRXL2, I added the code below before calling srxlParsePacket. Basically rxBuffer[0] needs to be "A6" for srxlParsePacket to run properly. The github example code assumes that this is true. By adding a delay(1000) or tft.begin, that was no longer true.

Code:
      if (rxBuffer[0] != SPEKTRUM_SRXL_ID) {
        for (byte b = 1; b < rxBufferIndex; b++) {
          if (rxBuffer[b] == 166) {
            tft.print("Start:");
            tft.print(b);
            //rxBufferIndex -= packetLength;
            memmove(rxBuffer, &rxBuffer[b], rxBufferIndex - b);
            rxBufferIndex = 1;
            tft.print(rxBufferIndex);
          }
          //tft.print(rxBuffer[b],HEX);
        }
      }
 
They really didn't provide a very good example, with no logic for "synchronizing" with the start of a packet. I think a complete fix would be more complex. Just looking briefly at their protocol document, it seems like byte value A6 could also occur in the data field or in the CRC field, and maybe even in the length field for long packets. If that happened, you would probably still get an error, but you're going in the right direction.
 
Back
Top