+ Firstname = %s
+ Lastname = %s
+
+
+ """ % (escape(firstname), escape(lastname))
+ httpResponse.WriteResponseOk( headers = None,
+ contentType = "text/html",
+ contentCharset = "UTF-8",
+ content = content )
+
+routeHandlers = [
+ ( "/test", "GET", _httpHandlerTestGet ),
+ ( "/test", "POST", _httpHandlerTestPost )
+]
+
+srv = MicroWebSrv(routeHandlers=routeHandlers)
+
+srv.Start(threaded=True)
diff --git a/MicroPython_BUILD/components/internalfs_image/image/flash.sh b/MicroPython_BUILD/components/internalfs_image/image/flash.sh
deleted file mode 100755
index bf722b7..0000000
--- a/MicroPython_BUILD/components/internalfs_image/image/flash.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-esptool.py --chip esp32 --port /dev/tty.SLAB_USBtoUART --baud 961200 write_flash -z 0x1000 ~/workspace/M5Stack/M5Cloud/firmwares/m5cloud-20180309-v0.3.6.bin
-ampy put SFArch_48.fon && ampy put main.py
\ No newline at end of file
diff --git a/MicroPython_BUILD/components/internalfs_image/image/fonts/BigFont.fon b/MicroPython_BUILD/components/internalfs_image/image/fonts/BigFont.fon
new file mode 100644
index 0000000..c7b3c48
Binary files /dev/null and b/MicroPython_BUILD/components/internalfs_image/image/fonts/BigFont.fon differ
diff --git a/MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans12.fon b/MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans12.fon
new file mode 100644
index 0000000..36e76bf
Binary files /dev/null and b/MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans12.fon differ
diff --git a/MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans18.fon b/MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans18.fon
new file mode 100644
index 0000000..0d609fb
Binary files /dev/null and b/MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans18.fon differ
diff --git a/MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans24.fon b/MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans24.fon
new file mode 100644
index 0000000..5220bfc
Binary files /dev/null and b/MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans24.fon differ
diff --git a/MicroPython_BUILD/components/internalfs_image/image/fonts/DotMatrix_M.fon b/MicroPython_BUILD/components/internalfs_image/image/fonts/DotMatrix_M.fon
new file mode 100644
index 0000000..a932f51
Binary files /dev/null and b/MicroPython_BUILD/components/internalfs_image/image/fonts/DotMatrix_M.fon differ
diff --git a/MicroPython_BUILD/components/internalfs_image/image/fonts/Grotesk24x48.fon b/MicroPython_BUILD/components/internalfs_image/image/fonts/Grotesk24x48.fon
new file mode 100644
index 0000000..ee59c36
Binary files /dev/null and b/MicroPython_BUILD/components/internalfs_image/image/fonts/Grotesk24x48.fon differ
diff --git a/MicroPython_BUILD/components/internalfs_image/image/fonts/OCR_A_Extended_M.c b/MicroPython_BUILD/components/internalfs_image/image/fonts/OCR_A_Extended_M.c
new file mode 100644
index 0000000..1104238
--- /dev/null
+++ b/MicroPython_BUILD/components/internalfs_image/image/fonts/OCR_A_Extended_M.c
@@ -0,0 +1,119 @@
+// OCR_A_Extended_M.c
+// Font type : Full (95 characters)
+// Font size : 16x24 pixels
+// Memory usage : 4564 bytes
+
+#if defined(__AVR__)
+ #include
+ #define fontdatatype const uint8_t
+#elif defined(__PIC32MX__)
+ #define PROGMEM
+ #define fontdatatype const unsigned char
+#elif defined(__arm__)
+ #define PROGMEM
+ #define fontdatatype const unsigned char
+#endif
+
+fontdatatype OCR_A_Extended_M[4564] PROGMEM={
+0x10,0x18,0x20,0x5F,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //
+0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // !
+0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x1E,0x78,0x1E,0x78,0x0E,0x70,0x0C,0x30,0x0C,0x30,0x0C,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,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x1F,0xF8,0x1F,0xF8,0x06,0x60,0x06,0x60,0x06,0x60,0x1F,0xF8,0x1F,0xF8,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // #
+0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0xF8,0x1F,0xF8,0x18,0x00,0x18,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x18,0x00,0x18,0x1F,0xF8,0x1F,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // $
+0x00,0x00,0x1C,0x00,0x1C,0x18,0x1C,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0xE0,0x00,0xC0,0x01,0x80,0x01,0x80,0x03,0x00,0x07,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x38,0x18,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // %
+0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC0,0x0F,0xC0,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x0C,0xC0,0x07,0x80,0x07,0x00,0x0F,0x80,0x1D,0xC8,0x18,0xF8,0x18,0x70,0x18,0xF0,0x0F,0xD8,0x0F,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // &
+0x00,0x00,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // '
+0x00,0x00,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80,0x03,0x80,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x80,0x01,0x80,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // (
+0x00,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x01,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x01,0xC0,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // )
+0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x19,0x88,0x19,0x98,0x0F,0xF0,0x07,0xE0,0x03,0xC0,0x03,0xC0,0x07,0xE0,0x0F,0xF0,0x1D,0xB8,0x11,0x98,0x01,0x80,0x01,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,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0xF8,0x1F,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,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,0x00,0x00,0x00,0x07,0xE0,0x07,0xE0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,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,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // -
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // .
+0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0xC0,0x00,0xC0,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // /
+
+0x00,0x00,0x0F,0xF0,0x1F,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF8,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 0
+0x00,0x00,0x1F,0x80,0x1F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x98,0x01,0x98,0x01,0x98,0x01,0x98,0x01,0x98,0x01,0x98,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 1
+0x00,0x00,0x1F,0xF0,0x1F,0xF8,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x0F,0xF8,0x1F,0xF0,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 2
+0x00,0x00,0x1F,0xF8,0x1F,0xFC,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x07,0xF8,0x07,0xF8,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x1F,0xFC,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 3
+0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x1F,0xF8,0x1F,0xF8,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 4
+0x00,0x00,0x07,0xF8,0x07,0xF8,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0xF0,0x07,0xF8,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x18,0x18,0x1F,0xF8,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 5
+0x00,0x00,0x1C,0x00,0x1C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1F,0xF8,0x1F,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 6
+0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x18,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 7
+0x00,0x00,0x07,0xE0,0x07,0xE0,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x0F,0xF0,0x1F,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF8,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 8
+0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF8,0x1F,0xF8,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 9
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,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,0x07,0x00,0x07,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x07,0xE0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ;
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x78,0x00,0xE0,0x01,0xC0,0x07,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x01,0xC0,0x00,0xE0,0x00,0x78,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // <
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // =
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x1E,0x00,0x07,0x00,0x03,0x80,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x70,0x00,0xE0,0x03,0x80,0x07,0x00,0x1E,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // >
+0x00,0x00,0x00,0x20,0x00,0x60,0x01,0xF0,0x03,0x98,0x07,0x18,0x0E,0x18,0x18,0x70,0x10,0xE0,0x01,0xC0,0x03,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ?
+
+0x00,0x00,0x07,0xE0,0x0F,0xF0,0x18,0x18,0x18,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x0F,0x98,0x0F,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x0F,0xF0,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // @
+0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x0C,0x30,0x0F,0xF0,0x0F,0xF0,0x0C,0x30,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // A
+0x00,0x00,0x1F,0xF0,0x1F,0xF8,0x18,0x1C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x1C,0x1F,0xF8,0x1F,0xF8,0x18,0x1C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x1C,0x1F,0xF8,0x1F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // B
+0x00,0x00,0x01,0xFC,0x03,0xFC,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1C,0x00,0x0C,0x00,0x0E,0x00,0x06,0x00,0x07,0x00,0x03,0xFC,0x01,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // C
+0x00,0x00,0x1F,0xC0,0x1F,0xE0,0x06,0x70,0x06,0x30,0x06,0x30,0x06,0x18,0x06,0x18,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x1C,0x06,0x18,0x06,0x38,0x06,0x30,0x06,0x70,0x1F,0xE0,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // D
+0x00,0x00,0x1F,0xFC,0x1F,0xFC,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1F,0xC0,0x1F,0xC0,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1F,0xFC,0x1F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // E
+0x00,0x00,0x1F,0xFC,0x1F,0xFC,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1F,0xF0,0x1F,0xF0,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // F
+0x00,0x00,0x01,0xF8,0x03,0xF8,0x03,0x00,0x06,0x00,0x0E,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0xF8,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0F,0xF8,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // G
+0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF8,0x1F,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // H
+0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // I
+0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x07,0xF0,0x03,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // J
+0x00,0x00,0x18,0x0C,0x18,0x18,0x18,0x30,0x18,0x60,0x18,0xC0,0x19,0x80,0x1B,0x00,0x1E,0x00,0x1C,0x00,0x1E,0x00,0x1F,0x00,0x1B,0x80,0x19,0xC0,0x18,0xE0,0x18,0x70,0x18,0x30,0x18,0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // K
+0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // L
+0x00,0x00,0x1C,0x38,0x1C,0x38,0x1E,0x78,0x1E,0xF8,0x1B,0xD8,0x19,0x98,0x19,0x98,0x19,0x98,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // M
+0x00,0x00,0x1C,0x18,0x1C,0x18,0x1E,0x18,0x1E,0x18,0x1E,0x18,0x1B,0x18,0x1B,0x18,0x1B,0x18,0x19,0x98,0x19,0x98,0x18,0xD8,0x18,0xD8,0x18,0xD8,0x18,0x78,0x18,0x78,0x18,0x78,0x18,0x38,0x18,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // N
+0x00,0x00,0x03,0xC0,0x03,0xC0,0x06,0x60,0x06,0x60,0x0E,0x70,0x0C,0x30,0x0C,0x30,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0C,0x30,0x0C,0x30,0x0E,0x70,0x06,0x60,0x06,0x60,0x03,0xC0,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // O
+
+0x00,0x00,0x1F,0xF0,0x1F,0xF0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF0,0x1F,0xF0,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // P
+0x00,0x00,0x00,0x70,0x00,0xF8,0x01,0xD8,0x03,0x98,0x07,0x18,0x0C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x19,0x98,0x19,0x98,0x19,0xF0,0x18,0xE0,0x19,0xC0,0x1B,0xE0,0x1F,0x78,0x0E,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Q
+0x00,0x00,0x1F,0xF0,0x1F,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF8,0x1F,0xF0,0x19,0x80,0x19,0x80,0x18,0xC0,0x18,0xC0,0x18,0x60,0x18,0x60,0x18,0x30,0x18,0x30,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // R
+0x00,0x00,0x0F,0xF0,0x1F,0xF8,0x18,0x18,0x18,0x18,0x0C,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x00,0xC0,0x00,0x60,0x00,0x60,0x00,0x30,0x18,0x18,0x18,0x18,0x1F,0xF8,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // S
+0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x19,0x98,0x19,0x98,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // T
+0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0F,0xF0,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // U
+0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0C,0x30,0x0C,0x30,0x0E,0x70,0x06,0x60,0x06,0x60,0x07,0xE0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // V
+0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x0F,0xF0,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // W
+0x00,0x00,0x18,0x18,0x18,0x18,0x0C,0x30,0x0C,0x30,0x06,0x60,0x06,0x60,0x03,0xC0,0x03,0xC0,0x01,0x80,0x01,0x80,0x03,0xC0,0x03,0xC0,0x06,0x60,0x06,0x60,0x0C,0x30,0x0C,0x30,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // X
+0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0C,0x30,0x0E,0x60,0x07,0xE0,0x03,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Y
+0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0xC0,0x00,0xC0,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Z
+0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // [
+0x00,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x07,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x00,0xC0,0x00,0xC0,0x00,0x60,0x00,0x70,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //
+0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ]
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x03,0xC0,0x03,0xC0,0x07,0xE0,0x07,0xE0,0x0E,0x70,0x0E,0x70,0x1C,0x30,0x1C,0x38,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ^
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, // _
+
+0x00,0x00,0x06,0x00,0x07,0xC0,0x03,0xE0,0x00,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,0x00, // `
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x07,0xF0,0x00,0x18,0x00,0x18,0x00,0x18,0x0F,0xF8,0x0F,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x38,0x1F,0xF8,0x0F,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // a
+0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1B,0xE0,0x1F,0xF0,0x1E,0x38,0x1C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1C,0x18,0x1E,0x38,0x1F,0xF0,0x1B,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // b
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFC,0x07,0xFC,0x0E,0x00,0x1C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1C,0x00,0x0E,0x00,0x07,0xFC,0x03,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // c
+0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x07,0xD8,0x0F,0xF8,0x1C,0x78,0x18,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x38,0x1C,0x78,0x0F,0xF8,0x07,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // d
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x0F,0xF0,0x1C,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF8,0x1F,0xF8,0x18,0x00,0x18,0x00,0x1C,0x00,0x0F,0xF8,0x07,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // e
+0x00,0x00,0x00,0xFC,0x01,0xFC,0x03,0x80,0x03,0x00,0x03,0x00,0x0F,0xF0,0x0F,0xF0,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // f
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xD8,0x0F,0xF8,0x1C,0x78,0x18,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x38,0x1C,0x78,0x0F,0xF8,0x07,0xD8,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x38,0x0F,0xF0,0x0F,0xE0, // g
+0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x19,0xF0,0x1B,0xF0,0x1F,0x18,0x1C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // h
+0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x0F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x0F,0xF0,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // i
+0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xF8,0x03,0xF8,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x0C,0x18,0x0C,0x18,0x07,0xF0,0x03,0xE0, // j
+0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x30,0x18,0x60,0x18,0xC0,0x19,0x80,0x1B,0x80,0x1F,0x00,0x1E,0x00,0x1F,0x00,0x19,0x80,0x18,0xC0,0x18,0x60,0x18,0x30,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // k
+0x00,0x00,0x0F,0x80,0x0F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x0F,0xF0,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // l
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x78,0x3F,0xFC,0x39,0xCC,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // m
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0xF0,0x1B,0xF0,0x1F,0x18,0x1C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // n
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x0F,0xF0,0x1C,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1C,0x38,0x0F,0xF0,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // o
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,0xC0,0x1F,0xE0,0x1E,0x70,0x1C,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1C,0x38,0x1E,0x70,0x1F,0xE0,0x1B,0xC0,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00, // p
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xD8,0x0F,0xF8,0x1C,0x78,0x18,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x38,0x1C,0x78,0x0F,0xF8,0x07,0xD8,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18, // q
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0xF0,0x1B,0xF8,0x1F,0x0C,0x1C,0x0C,0x18,0x0C,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // r
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x1F,0xF8,0x18,0x18,0x18,0x00,0x1E,0x00,0x07,0x80,0x01,0xF0,0x00,0x70,0x00,0x18,0x00,0x18,0x18,0x18,0x1F,0xF0,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // s
+0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0xF8,0x1F,0xF8,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x0C,0x06,0x1C,0x03,0xF8,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // t
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x38,0x18,0xF8,0x0F,0xD8,0x07,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // u
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x38,0x38,0x18,0x30,0x18,0x30,0x0C,0x60,0x0C,0x60,0x06,0xC0,0x06,0xC0,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // v
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x33,0xCC,0x1F,0xF8,0x1E,0x78,0x1C,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // w
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x1C,0x38,0x0C,0x30,0x06,0x60,0x03,0xC0,0x03,0xC0,0x01,0x80,0x03,0xC0,0x06,0xE0,0x0E,0x70,0x0C,0x30,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // x
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x38,0x38,0x18,0x30,0x18,0x30,0x0C,0x60,0x0C,0x60,0x06,0xC0,0x07,0xC0,0x07,0x80,0x01,0x80,0x03,0x80,0x03,0x00,0x03,0x00,0x3E,0x00,0x3E,0x00, // y
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x38,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x1C,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // z
+0x00,0x00,0x00,0xF8,0x01,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0x00,0x1F,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xF8,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // {
+0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // |
+0x00,0x00,0x1F,0x00,0x1F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0xF8,0x00,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,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,0x8C,0x1F,0xFC,0x18,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ~
+};
diff --git a/MicroPython_BUILD/components/internalfs_image/image/fonts/arial_bold.fon b/MicroPython_BUILD/components/internalfs_image/image/fonts/arial_bold.fon
new file mode 100644
index 0000000..9cf4ee6
Binary files /dev/null and b/MicroPython_BUILD/components/internalfs_image/image/fonts/arial_bold.fon differ
diff --git a/MicroPython_BUILD/components/internalfs_image/image/fonts/swiss721_outline.fon b/MicroPython_BUILD/components/internalfs_image/image/fonts/swiss721_outline.fon
new file mode 100644
index 0000000..2ece05e
Binary files /dev/null and b/MicroPython_BUILD/components/internalfs_image/image/fonts/swiss721_outline.fon differ
diff --git a/MicroPython_BUILD/components/internalfs_image/image/func_point b/MicroPython_BUILD/components/internalfs_image/image/func_point
deleted file mode 100644
index e69de29..0000000
diff --git a/MicroPython_BUILD/components/internalfs_image/image/lib/LoRaReceiver.py b/MicroPython_BUILD/components/internalfs_image/image/lib/LoRaReceiver.py
new file mode 100644
index 0000000..981e7fa
--- /dev/null
+++ b/MicroPython_BUILD/components/internalfs_image/image/lib/LoRaReceiver.py
@@ -0,0 +1,13 @@
+def receive(lora):
+ print("LoRa Receiver")
+
+ while True:
+ if lora.receivedPacket():
+ lora.blink_led()
+ payload = lora.read_payload()
+
+ try:
+ print("*** Received message ***\n{}".format(payload.decode()))
+ except Exception as e:
+ print(e)
+ print("with RSSI: {}\n".format(lora.packetRssi()))
\ No newline at end of file
diff --git a/MicroPython_BUILD/components/internalfs_image/image/lib/LoRaSender.py b/MicroPython_BUILD/components/internalfs_image/image/lib/LoRaSender.py
new file mode 100644
index 0000000..028ec76
--- /dev/null
+++ b/MicroPython_BUILD/components/internalfs_image/image/lib/LoRaSender.py
@@ -0,0 +1,14 @@
+from time import sleep
+
+
+def send(lora):
+ counter = 0
+ print("LoRa Sender")
+
+ while True:
+ payload = 'Hello ({0})'.format(counter)
+ print("Sending packet: \n{}\n".format(payload))
+ lora.println(payload)
+
+ counter += 1
+ sleep(5)
\ No newline at end of file
diff --git a/MicroPython_BUILD/components/internalfs_image/image/lib/bme280.py b/MicroPython_BUILD/components/internalfs_image/image/lib/bme280.py
new file mode 100644
index 0000000..c8d67ba
--- /dev/null
+++ b/MicroPython_BUILD/components/internalfs_image/image/lib/bme280.py
@@ -0,0 +1,206 @@
+# Authors: Paul Cunnane 2016, Peter Dahlebrg 2016
+#
+# This module borrows from the Adafruit BME280 Python library. Original
+# Copyright notices are reproduced below.
+#
+# Those libraries were written for the Raspberry Pi. This modification is
+# intended for the MicroPython and esp8266 boards.
+#
+# Copyright (c) 2014 Adafruit Industries
+# Author: Tony DiCola
+#
+# Based on the BMP280 driver with BME280 changes provided by
+# David J Taylor, Edinburgh (www.satsignal.eu)
+#
+# Based on Adafruit_I2C.py created by Kevin Townsend.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+import time
+from ustruct import unpack, unpack_from
+from array import array
+
+# BME280 default address.
+BME280_I2CADDR = 0x76
+
+# Operating Modes
+BME280_OSAMPLE_1 = 1
+BME280_OSAMPLE_2 = 2
+BME280_OSAMPLE_4 = 3
+BME280_OSAMPLE_8 = 4
+BME280_OSAMPLE_16 = 5
+
+BME280_REGISTER_CONTROL_HUM = 0xF2
+BME280_REGISTER_CONTROL = 0xF4
+
+
+class BME280:
+
+ def __init__(self,
+ mode=BME280_OSAMPLE_1,
+ address=BME280_I2CADDR,
+ i2c=None,
+ **kwargs):
+ # Check that mode is valid.
+ if mode not in [BME280_OSAMPLE_1, BME280_OSAMPLE_2, BME280_OSAMPLE_4,
+ BME280_OSAMPLE_8, BME280_OSAMPLE_16]:
+ raise ValueError(
+ 'Unexpected mode value {0}. Set mode to one of '
+ 'BME280_ULTRALOWPOWER, BME280_STANDARD, BME280_HIGHRES, or '
+ 'BME280_ULTRAHIGHRES'.format(mode))
+ self._mode = mode
+ self.address = address
+ if i2c is None:
+ raise ValueError('An I2C object is required.')
+ self.i2c = i2c
+
+ # load calibration data
+ dig_88_a1 = self.i2c.readfrom_mem(self.address, 0x88, 26)
+ dig_e1_e7 = self.i2c.readfrom_mem(self.address, 0xE1, 7)
+ self.dig_T1, self.dig_T2, self.dig_T3, self.dig_P1, \
+ self.dig_P2, self.dig_P3, self.dig_P4, self.dig_P5, \
+ self.dig_P6, self.dig_P7, self.dig_P8, self.dig_P9, \
+ _, self.dig_H1 = unpack("> 4)
+
+ self.dig_H6 = unpack_from("> 4
+ raw_press = ((readout[0] << 16) | (readout[1] << 8) | readout[2]) >> 4
+ # temperature(0xFA): ((msb << 16) | (lsb << 8) | xlsb) >> 4
+ raw_temp = ((readout[3] << 16) | (readout[4] << 8) | readout[5]) >> 4
+ # humidity(0xFD): (msb << 8) | lsb
+ raw_hum = (readout[6] << 8) | readout[7]
+
+ result[0] = raw_temp
+ result[1] = raw_press
+ result[2] = raw_hum
+
+ def read_compensated_data(self, result=None):
+ """ Reads the data from the sensor and returns the compensated data.
+
+ Args:
+ result: array of length 3 or alike where the result will be
+ stored, in temperature, pressure, humidity order. You may use
+ this to read out the sensor without allocating heap memory
+
+ Returns:
+ array with temperature, pressure, humidity. Will be the one from
+ the result parameter if not None
+ """
+ self.read_raw_data(self._l3_resultarray)
+ raw_temp, raw_press, raw_hum = self._l3_resultarray
+ # temperature
+ var1 = ((raw_temp >> 3) - (self.dig_T1 << 1)) * (self.dig_T2 >> 11)
+ var2 = (((((raw_temp >> 4) - self.dig_T1) *
+ ((raw_temp >> 4) - self.dig_T1)) >> 12) * self.dig_T3) >> 14
+ self.t_fine = var1 + var2
+ temp = (self.t_fine * 5 + 128) >> 8
+
+ # pressure
+ var1 = self.t_fine - 128000
+ var2 = var1 * var1 * self.dig_P6
+ var2 = var2 + ((var1 * self.dig_P5) << 17)
+ var2 = var2 + (self.dig_P4 << 35)
+ var1 = (((var1 * var1 * self.dig_P3) >> 8) +
+ ((var1 * self.dig_P2) << 12))
+ var1 = (((1 << 47) + var1) * self.dig_P1) >> 33
+ if var1 == 0:
+ pressure = 0
+ else:
+ p = 1048576 - raw_press
+ p = (((p << 31) - var2) * 3125) // var1
+ var1 = (self.dig_P9 * (p >> 13) * (p >> 13)) >> 25
+ var2 = (self.dig_P8 * p) >> 19
+ pressure = ((p + var1 + var2) >> 8) + (self.dig_P7 << 4)
+
+ # humidity
+ h = self.t_fine - 76800
+ h = (((((raw_hum << 14) - (self.dig_H4 << 20) -
+ (self.dig_H5 * h)) + 16384)
+ >> 15) * (((((((h * self.dig_H6) >> 10) *
+ (((h * self.dig_H3) >> 11) + 32768)) >> 10) +
+ 2097152) * self.dig_H2 + 8192) >> 14))
+ h = h - (((((h >> 15) * (h >> 15)) >> 7) * self.dig_H1) >> 4)
+ h = 0 if h < 0 else h
+ h = 419430400 if h > 419430400 else h
+ humidity = h >> 12
+
+ if result:
+ result[0] = temp
+ result[1] = pressure
+ result[2] = humidity
+ return result
+
+ return array("i", (temp, pressure, humidity))
+
+ @property
+ def values(self):
+ """ human readable values """
+
+ t, p, h = self.read_compensated_data()
+
+ p = p // 256
+ pi = p // 100
+ pd = p - pi * 100
+
+ hi = h // 1024
+ hd = h * 100 // 1024 - hi * 100
+ return ("{}C".format(t / 100), "{}.{:02d}hPa".format(pi, pd),
+ "{}.{:02d}%".format(hi, hd))
diff --git a/MicroPython_BUILD/components/internalfs_image/image/lib/config_lora.py b/MicroPython_BUILD/components/internalfs_image/image/lib/config_lora.py
new file mode 100644
index 0000000..6102814
--- /dev/null
+++ b/MicroPython_BUILD/components/internalfs_image/image/lib/config_lora.py
@@ -0,0 +1,30 @@
+import sys
+import os
+import time
+
+
+def mac2eui(mac):
+ mac = mac[0:6] + 'fffe' + mac[6:]
+ return hex(int(mac[0:2], 16) ^ 2)[2:] + mac[2:]
+
+
+# Node Name
+from machine import unique_id
+import ubinascii
+unique_id = ubinascii.hexlify(unique_id()).decode()
+
+NODE_NAME = 'ESP32_'
+
+NODE_EUI = mac2eui(unique_id)
+NODE_NAME = NODE_NAME + unique_id
+# NODE_NAME = NODE_NAME + NODE_EUI
+
+# millisecond
+millisecond = time.ticks_ms
+# microsecond = time.ticks_us
+
+
+# Controller
+from controller_esp import Controller
+
+
diff --git a/MicroPython_BUILD/components/internalfs_image/image/lib/controller.py b/MicroPython_BUILD/components/internalfs_image/image/lib/controller.py
new file mode 100644
index 0000000..27537d9
--- /dev/null
+++ b/MicroPython_BUILD/components/internalfs_image/image/lib/controller.py
@@ -0,0 +1,122 @@
+from time import sleep
+
+
+class Controller:
+
+ class Mock:
+ pass
+
+
+ ON_BOARD_LED_PIN_NO = None
+ ON_BOARD_LED_HIGH_IS_ON = True
+ GPIO_PINS = []
+
+ PIN_ID_FOR_LORA_RESET = None
+
+ PIN_ID_SCK = None
+ PIN_ID_MOSI = None
+ PIN_ID_MISO = None
+
+ PIN_ID_FOR_LORA_SS = None
+ PIN_ID_FOR_LORA_DIO0 = None
+ PIN_ID_FOR_LORA_DIO1 = None
+ PIN_ID_FOR_LORA_DIO2 = None
+ PIN_ID_FOR_LORA_DIO3 = None
+ PIN_ID_FOR_LORA_DIO4 = None
+ PIN_ID_FOR_LORA_DIO5 = None
+
+ spi = None
+
+ def __init__(self,
+ spi = spi,
+ pin_id_led = ON_BOARD_LED_PIN_NO,
+ on_board_led_high_is_on = ON_BOARD_LED_HIGH_IS_ON,
+ pin_id_reset = PIN_ID_FOR_LORA_RESET,
+ blink_on_start = (2, 0.5, 0.5)):
+
+ self.pin_led = self.prepare_pin(pin_id_led)
+ self.on_board_led_high_is_on = on_board_led_high_is_on
+ self.pin_reset = self.prepare_pin(pin_id_reset)
+ self.spi = self.prepare_spi(spi)
+ self.reset_transceivers()
+ self.transceivers = {}
+ self.blink_led(*blink_on_start)
+
+
+ def add_transceiver(self,
+ transceiver,
+ pin_id_ss = PIN_ID_FOR_LORA_SS,
+ pin_id_RxDone = PIN_ID_FOR_LORA_DIO0,
+ pin_id_RxTimeout = PIN_ID_FOR_LORA_DIO1,
+ pin_id_ValidHeader = PIN_ID_FOR_LORA_DIO2,
+ pin_id_CadDone = PIN_ID_FOR_LORA_DIO3,
+ pin_id_CadDetected = PIN_ID_FOR_LORA_DIO4,
+ pin_id_PayloadCrcError = PIN_ID_FOR_LORA_DIO5):
+
+ transceiver.transfer = self.spi.transfer
+ transceiver.blink_led = self.blink_led
+
+ transceiver.pin_ss = self.prepare_pin(pin_id_ss)
+ transceiver.pin_RxDone = self.prepare_irq_pin(pin_id_RxDone)
+ transceiver.pin_RxTimeout = self.prepare_irq_pin(pin_id_RxTimeout)
+ transceiver.pin_ValidHeader = self.prepare_irq_pin(pin_id_ValidHeader)
+ transceiver.pin_CadDone = self.prepare_irq_pin(pin_id_CadDone)
+ transceiver.pin_CadDetected = self.prepare_irq_pin(pin_id_CadDetected)
+ transceiver.pin_PayloadCrcError = self.prepare_irq_pin(pin_id_PayloadCrcError)
+
+ transceiver.init()
+
+ self.transceivers[transceiver.name] = transceiver
+ return transceiver
+
+
+ def prepare_pin(self, pin_id, in_out = None):
+ reason = '''
+ # a pin should provide:
+ # .low()
+ # .high()
+ # .value() # read input.
+ # .irq() # ref to the irq function of real pin object.
+ '''
+ raise NotImplementedError('reason')
+
+
+ def prepare_irq_pin(self, pin_id):
+ reason = '''
+ # a irq_pin should provide:
+ # .set_handler_for_irq_on_rising_edge() # to set trigger and handler.
+ # .detach_irq()
+ '''
+ raise NotImplementedError('reason')
+
+
+ def prepare_spi(self, spi):
+ reason = '''
+ # a spi should provide:
+ # .close()
+ # .transfer(address, value = 0x00)
+ '''
+ raise NotImplementedError('reason')
+
+
+ def led_on(self, on = True):
+ self.pin_led.high() if self.on_board_led_high_is_on == on else self.pin_led.low()
+
+
+ def blink_led(self, times = 1, on_seconds = 0.1, off_seconds = 0.1):
+ for i in range(times):
+ self.led_on(True)
+ sleep(on_seconds)
+ self.led_on(False)
+ sleep(off_seconds)
+
+
+ def reset_transceivers(self, duration_low = 0.01, duration_high = 0.01):
+ self.pin_reset.low()
+ sleep(duration_low)
+ self.pin_reset.high()
+ sleep(duration_high)
+
+
+ def __exit__(self):
+ self.spi.close()
diff --git a/MicroPython_BUILD/components/internalfs_image/image/lib/controller_esp.py b/MicroPython_BUILD/components/internalfs_image/image/lib/controller_esp.py
new file mode 100644
index 0000000..cd868c6
--- /dev/null
+++ b/MicroPython_BUILD/components/internalfs_image/image/lib/controller_esp.py
@@ -0,0 +1,163 @@
+from machine import Pin, SPI, reset
+import config_lora
+import controller
+
+
+'''
+import time
+PIN_ID_FOR_LORA_RESET = 18
+PIN_ID_FOR_LORA_SS = 26
+PIN_ID_SCK = 19
+PIN_ID_MOSI = 23
+PIN_ID_MISO = 25
+PIN_ID_FOR_LORA_DIO0 = 5
+ON_BOARD_LED_PIN_NO = 2
+
+#spi = machine.SPI(1, baudrate = 8000000, sck = machine.Pin(PIN_ID_SCK, machine.Pin.OUT), mosi = machine.Pin(PIN_ID_MOSI, machine.Pin.OUT), miso = machine.Pin(PIN_ID_MISO, machine.Pin.IN), cs = machine.Pin(PIN_ID_FOR_LORA_SS, machine.Pin.OUT), duplex=False)
+#spi = machine.SPI(1, baudrate = 8000000, sck = machine.Pin(PIN_ID_SCK, machine.Pin.OUT), mosi = machine.Pin(PIN_ID_MOSI, machine.Pin.OUT), miso = machine.Pin(PIN_ID_MISO, machine.Pin.IN), duplex=False)
+spi = machine.SPI(1, baudrate = 8000000, sck = machine.Pin(PIN_ID_SCK, machine.Pin.OUT), mosi = machine.Pin(PIN_ID_MOSI, machine.Pin.OUT), miso = machine.Pin(PIN_ID_MISO, machine.Pin.IN))
+
+dio=machine.Pin(PIN_ID_FOR_LORA_DIO0, machine.Pin.IN)
+cs=machine.Pin(PIN_ID_FOR_LORA_SS, machine.Pin.OUT)
+rst=machine.Pin(PIN_ID_FOR_LORA_RESET, machine.Pin.OUT)
+rst.value(0)
+response = bytearray(4)
+
+def xrst():
+ rst.value(0)
+ time.sleep_ms(100)
+ rst.value(1)
+
+xrst()
+
+def xrd(reg):
+ cs.value(0)
+ spi.write_readinto(bytes([reg]), response);
+ cs.value(1)
+ print(response)
+
+def yrd(reg):
+ cs.value(0)
+ spi.write(bytes([reg]));
+ spi.readinto(response)
+ cs.value(1)
+ print(response)
+
+def zrd(reg):
+ cs.value(0)
+ spi.write(bytes([reg]));
+ spi.write_readinto(bytes([0]),response)
+ cs.value(1)
+ print(response)
+
+def wrd(reg):
+ cs.value(0)
+ res = spi.readfrom_mem(reg,4)
+ cs.value(1)
+ print(res)
+
+'''
+
+class Controller(controller.Controller):
+
+ PIN_ID_FOR_LORA_RESET = 18
+
+ PIN_ID_FOR_LORA_SS = 26
+ PIN_ID_SCK = 19
+ PIN_ID_MOSI = 23
+ PIN_ID_MISO = 25
+
+ PIN_ID_FOR_LORA_DIO0 = 5
+ PIN_ID_FOR_LORA_DIO1 = None
+ PIN_ID_FOR_LORA_DIO2 = None
+ PIN_ID_FOR_LORA_DIO3 = None
+ PIN_ID_FOR_LORA_DIO4 = None
+ PIN_ID_FOR_LORA_DIO5 = None
+
+ spi = None
+
+ ON_BOARD_LED_PIN_NO = 2
+ ON_BOARD_LED_HIGH_IS_ON = True
+ GPIO_PINS = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 17, 18, 19, 21, 22,
+ 23, 25, 26, 27, 32, 34, 35, 36, 37, 38, 39)
+ try:
+ if not spi:
+ spi = SPI(1, baudrate = 5000000, polarity = 0, phase = 0, bits = 8, firstbit = SPI.MSB,
+ sck = Pin(PIN_ID_SCK, Pin.OUT),
+ mosi = Pin(PIN_ID_MOSI, Pin.OUT),
+ miso = Pin(PIN_ID_MISO, Pin.IN))
+ #spi.init()
+ print(spi)
+
+ except Exception as e:
+ print(e)
+ if spi:
+ spi.deinit()
+ spi = None
+ reset() # in case SPI is already in use, need to reset.
+
+
+ def __init__(self,
+ spi = spi,
+ pin_id_led = ON_BOARD_LED_PIN_NO,
+ on_board_led_high_is_on = ON_BOARD_LED_HIGH_IS_ON,
+ pin_id_reset = PIN_ID_FOR_LORA_RESET,
+ blink_on_start = (2, 0.5, 0.5)):
+
+ super().__init__(spi,
+ pin_id_led,
+ on_board_led_high_is_on,
+ pin_id_reset,
+ blink_on_start)
+
+
+ def prepare_pin(self, pin_id, in_out = Pin.OUT):
+ if pin_id is not None:
+ pin = Pin(pin_id, in_out)
+ new_pin = Controller.Mock()
+ new_pin.pin_id = pin_id
+ new_pin.value = pin.value
+
+ if in_out == Pin.OUT:
+ new_pin.low = lambda : pin.value(0)
+ new_pin.high = lambda : pin.value(1)
+ else:
+ new_pin.irq = pin.irq
+
+ return new_pin
+
+
+ def prepare_irq_pin(self, pin_id):
+ pin = self.prepare_pin(pin_id, Pin.IN)
+ if pin:
+ pin.set_handler_for_irq_on_rising_edge = lambda handler: pin.irq(handler = handler, trigger = Pin.IRQ_RISING)
+ pin.detach_irq = lambda : pin.irq(handler = None, trigger = 0)
+ return pin
+
+
+ def prepare_spi(self, spi):
+ if spi:
+ new_spi = Controller.Mock()
+
+ def transfer(pin_ss, address, value = 0x00):
+ response = bytearray(1)
+
+ pin_ss.low()
+
+ spi.write(bytes([address])) # write register address
+ spi.write_readinto(bytes([value]), response) # write or read register walue
+ #spi.write_readinto(bytes([address]), response)
+
+ pin_ss.high()
+
+ return response
+
+ new_spi.transfer = transfer
+ new_spi.close = spi.deinit
+ return new_spi
+
+
+ def __exit__(self):
+ self.spi.close()
+
diff --git a/MicroPython_BUILD/components/internalfs_image/image/lib/led.py b/MicroPython_BUILD/components/internalfs_image/image/lib/led.py
new file mode 100644
index 0000000..17e7b61
--- /dev/null
+++ b/MicroPython_BUILD/components/internalfs_image/image/lib/led.py
@@ -0,0 +1,11 @@
+# coding: utf-8
+
+import time
+
+
+def blink(pin, times = 1, on_seconds = 0.1, off_seconds = 0.1, high_is_on = True):
+ for i in range(times):
+ pin.high() if high_is_on else pin.low()
+ time.sleep(on_seconds)
+ pin.low() if high_is_on else pin.high()
+ time.sleep(off_seconds)
\ No newline at end of file
diff --git a/MicroPython_BUILD/components/internalfs_image/image/lib/sx127x.py b/MicroPython_BUILD/components/internalfs_image/image/lib/sx127x.py
new file mode 100644
index 0000000..4b4aa22
--- /dev/null
+++ b/MicroPython_BUILD/components/internalfs_image/image/lib/sx127x.py
@@ -0,0 +1,389 @@
+from time import sleep
+import time
+import gc
+import config_lora
+
+
+PA_OUTPUT_RFO_PIN = 0
+PA_OUTPUT_PA_BOOST_PIN = 1
+
+
+# registers
+REG_FIFO = 0x00
+REG_OP_MODE = 0x01
+REG_FRF_MSB = 0x06
+REG_FRF_MID = 0x07
+REG_FRF_LSB = 0x08
+REG_PA_CONFIG = 0x09
+REG_LNA = 0x0c
+REG_FIFO_ADDR_PTR = 0x0d
+
+REG_FIFO_TX_BASE_ADDR = 0x0e
+FifoTxBaseAddr = 0x00
+# FifoTxBaseAddr = 0x80
+
+REG_FIFO_RX_BASE_ADDR = 0x0f
+FifoRxBaseAddr = 0x00
+REG_FIFO_RX_CURRENT_ADDR = 0x10
+REG_IRQ_FLAGS_MASK = 0x11
+REG_IRQ_FLAGS = 0x12
+REG_RX_NB_BYTES = 0x13
+REG_PKT_RSSI_VALUE = 0x1a
+REG_PKT_SNR_VALUE = 0x1b
+REG_MODEM_CONFIG_1 = 0x1d
+REG_MODEM_CONFIG_2 = 0x1e
+REG_PREAMBLE_MSB = 0x20
+REG_PREAMBLE_LSB = 0x21
+REG_PAYLOAD_LENGTH = 0x22
+REG_FIFO_RX_BYTE_ADDR = 0x25
+REG_MODEM_CONFIG_3 = 0x26
+REG_RSSI_WIDEBAND = 0x2c
+REG_DETECTION_OPTIMIZE = 0x31
+REG_DETECTION_THRESHOLD = 0x37
+REG_SYNC_WORD = 0x39
+REG_DIO_MAPPING_1 = 0x40
+REG_VERSION = 0x42
+
+# modes
+MODE_LONG_RANGE_MODE = 0x80 # bit 7: 1 => LoRa mode
+MODE_SLEEP = 0x00
+MODE_STDBY = 0x01
+MODE_TX = 0x03
+MODE_RX_CONTINUOUS = 0x05
+MODE_RX_SINGLE = 0x06
+
+# PA config
+PA_BOOST = 0x80
+
+# IRQ masks
+IRQ_TX_DONE_MASK = 0x08
+IRQ_PAYLOAD_CRC_ERROR_MASK = 0x20
+IRQ_RX_DONE_MASK = 0x40
+IRQ_RX_TIME_OUT_MASK = 0x80
+
+# Buffer size
+MAX_PKT_LENGTH = 255
+
+
+class SX127x:
+
+ # The controller needs to provide an interface consisted of:
+ # 1. a SPI, with transfer function.
+ # 2. a reset pin, with low(), high() functions.
+ # 3. IRQ pinS , to be triggered by RFM96W's DIO0~5 pins. These pins each has two functions:
+ # 3.1 set_handler_for_irq_on_rising_edge()
+ # 3.2 detach_irq()
+ # 4. a function to blink on-board LED.
+
+ def __init__(self,
+ name = 'SX127x',
+ parameters = {'frequency': 868E6, 'tx_power_level': 2, 'signal_bandwidth': 125E3,
+ 'spreading_factor': 8, 'coding_rate': 5, 'preamble_length': 8,
+ 'implicitHeader': False, 'sync_word': 0x12, 'enable_CRC': False},
+ onReceive = None):
+
+ self.name = name
+ self.parameters = parameters
+ self._onReceive = onReceive
+ self._lock = False
+
+
+ def init(self):
+ # check version
+ version = self.readRegister(REG_VERSION)
+ if version != 0x12:
+ print("Detected version:", version)
+ raise Exception('Invalid version.')
+
+
+ # put in LoRa and sleep mode
+ self.sleep()
+
+
+ # config
+ self.setFrequency(self.parameters['frequency'])
+ self.setSignalBandwidth(self.parameters['signal_bandwidth'])
+
+ # set LNA boost
+ self.writeRegister(REG_LNA, self.readRegister(REG_LNA) | 0x03)
+
+ # set auto AGC
+ self.writeRegister(REG_MODEM_CONFIG_3, 0x04)
+
+ self.setTxPower(self.parameters['tx_power_level'])
+ self._implicitHeaderMode = None
+ self.implicitHeaderMode(self.parameters['implicitHeader'])
+ self.setSpreadingFactor(self.parameters['spreading_factor'])
+ self.setCodingRate(self.parameters['coding_rate'])
+ self.setPreambleLength(self.parameters['preamble_length'])
+ self.setSyncWord(self.parameters['sync_word'])
+ self.enableCRC(self.parameters['enable_CRC'])
+
+ # set base addresses
+ self.writeRegister(REG_FIFO_TX_BASE_ADDR, FifoTxBaseAddr)
+ self.writeRegister(REG_FIFO_RX_BASE_ADDR, FifoRxBaseAddr)
+
+ self.standby()
+
+
+ def beginPacket(self, implicitHeaderMode = False):
+ self.standby()
+ self.implicitHeaderMode(implicitHeaderMode)
+
+ # reset FIFO address and paload length
+ self.writeRegister(REG_FIFO_ADDR_PTR, FifoTxBaseAddr)
+ self.writeRegister(REG_PAYLOAD_LENGTH, 0)
+
+
+ def endPacket(self):
+ # put in TX mode
+ self.writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_TX)
+
+ # wait for TX done, standby automatically on TX_DONE
+ tmo = 0
+ freg = self.readRegister(REG_IRQ_FLAGS)
+ while (freg & IRQ_TX_DONE_MASK) == 0:
+ time.sleep_ms(10)
+ tmo += 1
+ if tmo > 20:
+ break
+ freg = self.readRegister(REG_IRQ_FLAGS)
+ pass
+
+ # clear IRQ's
+ self.writeRegister(REG_IRQ_FLAGS, IRQ_TX_DONE_MASK)
+
+ if tmo >= 20:
+ print("Send timeout.")
+
+ self.collect_garbage()
+
+
+ def write(self, buffer):
+ currentLength = self.readRegister(REG_PAYLOAD_LENGTH)
+ size = len(buffer)
+
+ # check size
+ size = min(size, (MAX_PKT_LENGTH - FifoTxBaseAddr - currentLength))
+
+ # write data
+ for i in range(size):
+ self.writeRegister(REG_FIFO, buffer[i])
+
+ # update length
+ self.writeRegister(REG_PAYLOAD_LENGTH, currentLength + size)
+ return size
+
+
+ def aquire_lock(self, lock = False):
+ pass
+
+
+ def println(self, string, implicitHeader = False):
+ self.aquire_lock(True) # wait until RX_Done, lock and begin writing.
+
+ self.beginPacket(implicitHeader)
+ self.write(string.encode())
+ self.endPacket()
+
+ self.aquire_lock(False) # unlock when done writing
+
+
+ def getIrqFlags(self):
+ irqFlags = self.readRegister(REG_IRQ_FLAGS)
+ self.writeRegister(REG_IRQ_FLAGS, irqFlags)
+ return irqFlags
+
+
+ def packetRssi(self):
+ return (self.readRegister(REG_PKT_RSSI_VALUE) - (164 if self._frequency < 868E6 else 157))
+
+
+ def packetSnr(self):
+ return (self.readRegister(REG_PKT_SNR_VALUE)) * 0.25
+
+
+ def standby(self):
+ self.writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_STDBY)
+
+
+ def sleep(self):
+ self.writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_SLEEP)
+
+
+ def setTxPower(self, level, outputPin = PA_OUTPUT_PA_BOOST_PIN):
+ if (outputPin == PA_OUTPUT_RFO_PIN):
+ # RFO
+ level = min(max(level, 0), 14)
+ self.writeRegister(REG_PA_CONFIG, 0x70 | level)
+
+ else:
+ # PA BOOST
+ level = min(max(level, 2), 17)
+ self.writeRegister(REG_PA_CONFIG, PA_BOOST | (level - 2))
+
+
+ def setFrequency(self, frequency):
+ self._frequency = frequency
+
+ frfs = {169E6: (42, 64, 0),
+ 433E6: (108, 64, 0),
+ 434E6: (108, 128, 0),
+ 866E6: (216, 128, 0),
+ 868E6: (217, 0, 0),
+ 915E6: (228, 192, 0)}
+
+ self.writeRegister(REG_FRF_MSB, frfs[frequency][0])
+ self.writeRegister(REG_FRF_MID, frfs[frequency][1])
+ self.writeRegister(REG_FRF_LSB, frfs[frequency][2])
+
+
+ def setSpreadingFactor(self, sf):
+ sf = min(max(sf, 6), 12)
+ self.writeRegister(REG_DETECTION_OPTIMIZE, 0xc5 if sf == 6 else 0xc3)
+ self.writeRegister(REG_DETECTION_THRESHOLD, 0x0c if sf == 6 else 0x0a)
+ self.writeRegister(REG_MODEM_CONFIG_2, (self.readRegister(REG_MODEM_CONFIG_2) & 0x0f) | ((sf << 4) & 0xf0))
+
+
+ def setSignalBandwidth(self, sbw):
+ bins = (7.8E3, 10.4E3, 15.6E3, 20.8E3, 31.25E3, 41.7E3, 62.5E3, 125E3, 250E3)
+
+ bw = 9
+ for i in range(len(bins)):
+ if sbw <= bins[i]:
+ bw = i
+ break
+
+ self.writeRegister(REG_MODEM_CONFIG_1, (self.readRegister(REG_MODEM_CONFIG_1) & 0x0f) | (bw << 4))
+
+
+ def setCodingRate(self, denominator):
+ denominator = min(max(denominator, 5), 8)
+ cr = denominator - 4
+ self.writeRegister(REG_MODEM_CONFIG_1, (self.readRegister(REG_MODEM_CONFIG_1) & 0xf1) | (cr << 1))
+
+
+ def setPreambleLength(self, length):
+ self.writeRegister(REG_PREAMBLE_MSB, (length >> 8) & 0xff)
+ self.writeRegister(REG_PREAMBLE_LSB, (length >> 0) & 0xff)
+
+
+ def enableCRC(self, enable_CRC = False):
+ modem_config_2 = self.readRegister(REG_MODEM_CONFIG_2)
+ config = modem_config_2 | 0x04 if enable_CRC else modem_config_2 & 0xfb
+ self.writeRegister(REG_MODEM_CONFIG_2, config)
+
+
+ def setSyncWord(self, sw):
+ self.writeRegister(REG_SYNC_WORD, sw)
+
+
+ # def enable_Rx_Done_IRQ(self, enable = True):
+ # if enable:
+ # self.writeRegister(REG_IRQ_FLAGS_MASK, self.readRegister(REG_IRQ_FLAGS_MASK) & ~IRQ_RX_DONE_MASK)
+ # else:
+ # self.writeRegister(REG_IRQ_FLAGS_MASK, self.readRegister(REG_IRQ_FLAGS_MASK) | IRQ_RX_DONE_MASK)
+
+
+ def dumpRegisters(self):
+ for i in range(128):
+ print("0x{0:02x}: {1:02x}".format(i, self.readRegister(i)))
+
+
+ def implicitHeaderMode(self, implicitHeaderMode = False):
+ if self._implicitHeaderMode != implicitHeaderMode: # set value only if different.
+ self._implicitHeaderMode = implicitHeaderMode
+ modem_config_1 = self.readRegister(REG_MODEM_CONFIG_1)
+ config = modem_config_1 | 0x01 if implicitHeaderMode else modem_config_1 & 0xfe
+ self.writeRegister(REG_MODEM_CONFIG_1, config)
+
+
+ def onReceive(self, callback):
+ self._onReceive = callback
+
+ if self.pin_RxDone:
+ if callback:
+ self.writeRegister(REG_DIO_MAPPING_1, 0x00)
+ self.pin_RxDone.set_handler_for_irq_on_rising_edge(handler = self.handleOnReceive)
+ else:
+ self.pin_RxDone.detach_irq()
+
+
+ def receive(self, size = 0):
+ self.implicitHeaderMode(size > 0)
+ if size > 0: self.writeRegister(REG_PAYLOAD_LENGTH, size & 0xff)
+
+ # The last packet always starts at FIFO_RX_CURRENT_ADDR
+ # no need to reset FIFO_ADDR_PTR
+ self.writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_RX_CONTINUOUS)
+
+
+ # on RPi, interrupt callback is threaded and racing with main thread,
+ # Needs a lock for accessing FIFO.
+ # https://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/
+ # http://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry-pi-and-rpi-gpio-part-2
+ def handleOnReceive(self, event_source):
+ self.aquire_lock(True) # lock until TX_Done
+
+ # irqFlags = self.getIrqFlags() should be 0x50
+ if (self.getIrqFlags() & IRQ_PAYLOAD_CRC_ERROR_MASK) == 0:
+ if self._onReceive:
+ payload = self.read_payload()
+ self.aquire_lock(False) # unlock when done reading
+
+ self._onReceive(self, payload)
+
+ self.aquire_lock(False) # unlock in any case.
+
+
+ def receivedPacket(self, size = 0):
+ irqFlags = self.getIrqFlags()
+
+ self.implicitHeaderMode(size > 0)
+ if size > 0: self.writeRegister(REG_PAYLOAD_LENGTH, size & 0xff)
+
+ # if (irqFlags & IRQ_RX_DONE_MASK) and \
+ # (irqFlags & IRQ_RX_TIME_OUT_MASK == 0) and \
+ # (irqFlags & IRQ_PAYLOAD_CRC_ERROR_MASK == 0):
+
+ if (irqFlags == IRQ_RX_DONE_MASK): # RX_DONE only, irqFlags should be 0x40
+ # automatically standby when RX_DONE
+ return True
+
+ elif self.readRegister(REG_OP_MODE) != (MODE_LONG_RANGE_MODE | MODE_RX_SINGLE):
+ # no packet received.
+ # reset FIFO address / # enter single RX mode
+ self.writeRegister(REG_FIFO_ADDR_PTR, FifoRxBaseAddr)
+ self.writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_RX_SINGLE)
+
+
+ def read_payload(self):
+ # set FIFO address to current RX address
+ # fifo_rx_current_addr = self.readRegister(REG_FIFO_RX_CURRENT_ADDR)
+ self.writeRegister(REG_FIFO_ADDR_PTR, self.readRegister(REG_FIFO_RX_CURRENT_ADDR))
+
+ # read packet length
+ packetLength = self.readRegister(REG_PAYLOAD_LENGTH) if self._implicitHeaderMode else \
+ self.readRegister(REG_RX_NB_BYTES)
+
+ payload = bytearray()
+ for i in range(packetLength):
+ payload.append(self.readRegister(REG_FIFO))
+
+ self.collect_garbage()
+ return bytes(payload)
+
+
+ def readRegister(self, address, byteorder = 'big', signed = False):
+ response = self.transfer(self.pin_ss, address & 0x7f)
+ return int.from_bytes(response, byteorder)
+
+
+ def writeRegister(self, address, value):
+ self.transfer(self.pin_ss, address | 0x80, value)
+
+
+ def collect_garbage(self):
+ gc.collect()
+ print('[Memory - free: {} allocated: {}]'.format(gc.mem_free(), gc.mem_alloc()))
+
diff --git a/MicroPython_BUILD/components/internalfs_image/image/main.py b/MicroPython_BUILD/components/internalfs_image/image/main.py
index b3bf1d1..bdd7fd5 100644
--- a/MicroPython_BUILD/components/internalfs_image/image/main.py
+++ b/MicroPython_BUILD/components/internalfs_image/image/main.py
@@ -1,103 +1,34 @@
-'''
-Arduino version:
-https://github.com/dankelley2/M5Stack_BTCTicker
+import machine, network, utime
-Response (JSON)
- last Last BTC price.
- high Last 24 hours price high.
- low Last 24 hours price low.
- vwap Last 24 hours volume weighted average price.
- volume Last 24 hours volume.
- bid Highest buy order.
- ask Lowest sell order.
- timestamp Unix timestamp date and time.
- open First price of the day.
-
- m5stack.com/api/btc/ticker/btcusd.json
-'''
+print("")
+print("Starting WiFi ...")
+sta_if = network.WLAN(network.STA_IF); sta_if.active(True)
+sta_if.connect("mySSID", "wifi_password")
+tmo = 50
+while not sta_if.isconnected():
+ utime.sleep_ms(100)
+ tmo -= 1
+ if tmo == 0:
+ sta_if.disconnect()
+ break
-from m5stack import *
-from utils import *
-import utime as time
-import machine
-import urequests
-import ujson
-import curl
-import utils
-import m5cloud
-import gc
+if tmo > 0:
+ print("WiFi started")
+ utime.sleep_ms(500)
-
-def timeout_reset(timer):
- import machine
- machine.reset()
-
-t1 = machine.Timer(2)
-t1.init(period=60*1000*60*6, mode=t1.PERIODIC, callback=timeout_reset)
-
-
-def main():
- lcd.clear()
- lcd.setBrightness(500)
- lcd.setTextColor(lcd.WHITE, lcd.BLACK)
- lcd.font('SFArch_48.fon')
- lcd.print('BTC Price', lcd.CENTER, 30, lcd.ORANGE)
- prev_price = ''
- timereset = time.ticks_ms() + (60*1000)
- while True:
- if not m5cloud.idle():
+ rtc = machine.RTC()
+ print("Synchronize time from NTP server ...")
+ rtc.ntp_sync(server="hr.pool.ntp.org")
+ tmo = 100
+ while not rtc.synced():
+ utime.sleep_ms(100)
+ tmo -= 1
+ if tmo == 0:
break
- try:
- # btc_data = get_btc_price()
- gc.collect()
- lcd.triangle(300,0, 319,0, 319,19, lcd.YELLOW, lcd.YELLOW)
- r = curl.get('http://api.m5stack.com/btc')
- lcd.triangle(300,0, 319,0, 319,19, lcd.BLUE, lcd.BLUE)
- btc_data = ujson.loads(r[2])
- print(btc_data)
- print('')
- if btc_data:
- # update time
- t = int(btc_data['timestamp'])
- t = time.gmtime(t)
- tstr = 'Update: %4d-%02d-%02d %02d:%02d:%02d' % (t[0], t[1], t[2], t[3], t[4], t[5])
- lcd.font(lcd.FONT_Default)
- lcd.print(tstr, 3, 3, 0x666666)
-
- # Max price
- high = btc_data['high']
- high = high[:(high.find('.')+3)]
- lcd.font(lcd.FONT_DejaVu18)
- lcd.print('Max:', 20, 192, lcd.GREEN)
- lcd.print(high, 5, 215, lcd.GREEN)
-
- # Min price
- low = btc_data['low']
- low = low[:(low.find('.')+3)]
- lcd.font(lcd.FONT_DejaVu18)
- lcd.print('Min:', 255, 192, lcd.RED)
- lcd.print(low, lcd.RIGHT, 215, lcd.RED)
-
- # Last Price
- price = btc_data['last']
- if not price == prev_price:
- lcd.rect(0, 105, 320, 48, lcd.BLACK, lcd.BLACK)
- lcd.font('SFArch_48.fon')
- lcd.print('$ '+price, lcd.CENTER, 105, color=lcd.WHITE)
-
- # Symbol
- _offset = 185
- if price > prev_price:
- lcd.rect(140, _offset, 41, 26, lcd.BLACK, lcd.BLACK)
- lcd.triangle(160,_offset, 140,_offset+25, 180,_offset+25, lcd.GREEN, lcd.GREEN)
- elif price < prev_price:
- lcd.rect(140, _offset, 41, 26, lcd.BLACK, lcd.BLACK)
- lcd.triangle(160,_offset+25, 140,_offset, 180,_offset, lcd.RED, lcd.RED)
- prev_price = price
-
- except:
- pass
- time.sleep(5)
-
-main()
+ if tmo > 0:
+ print("Time set")
+ utime.sleep_ms(500)
+ t = rtc.now()
+ utime.strftime("%c")
+ print("")
diff --git a/MicroPython_BUILD/components/internalfs_image/image/spiffs.info b/MicroPython_BUILD/components/internalfs_image/image/spiffs.info
new file mode 100644
index 0000000..68946a2
--- /dev/null
+++ b/MicroPython_BUILD/components/internalfs_image/image/spiffs.info
@@ -0,0 +1,11 @@
+INTRODUCTION
+
+Spiffs is a file system intended for SPI NOR flash devices on embedded targets.
+Spiffs is designed with following characteristics in mind:
+
+ * Small (embedded) targets, sparse RAM without heap
+ * Only big areas of data (blocks) can be erased
+ * An erase will reset all bits in block to ones
+ * Writing pulls one to zeroes
+ * Zeroes can only be pulled to ones by erase
+ * Wear leveling
diff --git a/MicroPython_BUILD/components/internalfs_image/image/www/favicon.ico b/MicroPython_BUILD/components/internalfs_image/image/www/favicon.ico
new file mode 100644
index 0000000..169f21c
Binary files /dev/null and b/MicroPython_BUILD/components/internalfs_image/image/www/favicon.ico differ
diff --git a/MicroPython_BUILD/components/internalfs_image/image/www/index.html b/MicroPython_BUILD/components/internalfs_image/image/www/index.html
new file mode 100644
index 0000000..15bdd01
--- /dev/null
+++ b/MicroPython_BUILD/components/internalfs_image/image/www/index.html
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+ MicroWebSrv test page
+
+
+
+
+
MicroWebSrv test page
+
Hello from MicroPython !
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis eget ligula quis libero mollis dapibus. Suspendisse potenti. Nullam facilisis neque et sem. Proin placerat adipiscing urna. Aenean sollicitudin. Mauris lorem erat, fringilla quis, sagittis a, varius sed, nunc. Pellentesque ligula. Nullam egestas eleifend turpis. Vivamus ac sapien. Sed venenatis, ligula ut scelerisque vehicula, erat tellus euismod ipsum, eget faucibus tortor arcu et lectus. Vivamus vel purus. Fusce dignissim tortor quis diam elementum fermentum. Mauris eleifend lorem vel arcu. Vivamus tempus faucibus lectus. Curabitur volutpat ornare mi. Curabitur ac libero. Sed eu elit ac metus egestas iaculis.
+
+
+
+
\ No newline at end of file
diff --git a/MicroPython_BUILD/components/internalfs_image/image/www/pdf-sample.pdf b/MicroPython_BUILD/components/internalfs_image/image/www/pdf-sample.pdf
new file mode 100644
index 0000000..f698ff5
Binary files /dev/null and b/MicroPython_BUILD/components/internalfs_image/image/www/pdf-sample.pdf differ
diff --git a/MicroPython_BUILD/components/internalfs_image/image/www/pdf.png b/MicroPython_BUILD/components/internalfs_image/image/www/pdf.png
new file mode 100644
index 0000000..b5acfe6
Binary files /dev/null and b/MicroPython_BUILD/components/internalfs_image/image/www/pdf.png differ
diff --git a/MicroPython_BUILD/components/internalfs_image/image/www/style.css b/MicroPython_BUILD/components/internalfs_image/image/www/style.css
new file mode 100644
index 0000000..9a7852e
--- /dev/null
+++ b/MicroPython_BUILD/components/internalfs_image/image/www/style.css
@@ -0,0 +1,36 @@
+html, body {
+ margin: 0;
+ padding: 0;
+ }
+body {
+ background-color: white;
+ font-family: Verdana, sans-serif;
+ font-size: 100%;
+ }
+h1 {
+ font-size: 200%;
+ color: navy;
+ text-align: center;
+ }
+h2 {
+ font-size: 150%;
+ color: red;
+ padding-left: 15px;
+ }
+p,ul,li,td {
+ color: black;
+ }
+a:link {
+ color: green;
+ text-decoration: underline;
+ }
+a:visited {
+ color: gray;
+ }
+a:hover {
+ color: red;
+ text-decoration: none;
+}
+a:active, a:focus {
+ color: red;
+}
\ No newline at end of file
diff --git a/MicroPython_BUILD/components/internalfs_image/image/www/test.pyhtml b/MicroPython_BUILD/components/internalfs_image/image/www/test.pyhtml
new file mode 100644
index 0000000..bb98d2c
--- /dev/null
+++ b/MicroPython_BUILD/components/internalfs_image/image/www/test.pyhtml
@@ -0,0 +1,34 @@
+
+
+ TEST
+
+
+
BEGIN
+ {{ py }}
+ def _testFunction(x) :
+ return "IN TEST FUNCTION %s" % x
+ {{ end }}
+
+ {{ for toto in range(3) }}
+ This is an HTML test...
+ TOTO = {{ toto + 1 }} !
+ {{ for toto2 in range(3) }}
+ TOTO2 = {{ _testFunction(toto2) }}
+ {{ end }}
+ Ok good.
+ {{ end }}
+
+ {{ _testFunction(100) }}
+
+ {{ if 2+5 < 3 }}
+ IN IF (1)
+ {{ elif 10+15 != 25 }}
+ IN ELIF (2)
+ {{ elif 10+15 == 25 }}
+ IN ELIF (3)
+ {{ else }}
+ IN ELSE (4)
+ {{ end }}
+