Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: AP3000 ARM_RTC Beep BurstSPI FRAMSPI FT813 I2CEEBlockDevice I2CList MCP79412 NMEA0183 PCA9745B SDBlockDevice SPIFBlockDevice SystemClock WDT nmea_parser
Revision 0:a3b629f6dab5, committed 2018-07-23
- Comitter:
- JackB
- Date:
- Mon Jul 23 12:32:19 2018 +0000
- Commit message:
- x
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/AP3000.lib Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/JackB/code/AP3000/#0ee5e6b7245e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ARM_RTC.lib Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/JackB/code/ARM_RTC/#1af2ff7cfe26
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Beep.lib Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/JackB/code/Beep/#cfc88789e54f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BurstSPI.lib Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/JackB/code/BurstSPI/#35df38577abd
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/FRAMSPI.lib Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/JackB/code/FRAMSPI/#0411eff88bac
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/FT813.lib Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/JackB/code/FT813/#6a81aeca25e3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/I2CEEBlockDevice.lib Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/JackB/code/I2CEEBlockDevice/#45d514e74be4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/I2CList.lib Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/JackB/code/I2CList/#a13a2f61b5f1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MCP79412.lib Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/JackB/code/MCP79412/#04311b121ac4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NMEA0183.lib Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/JackB/code/NMEA0183/#a6e68073c162
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PCA9745B.lib Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/JackB/code/PCA9745B/#0f53e5add603
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SDBlockDevice.lib Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/JackB/code/SDBlockDevice/#6c7012898e59
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SPIFBlockDevice.lib Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/JackB/code/SPIFBlockDevice/#b4f61c49c866
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SystemClock.lib Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/JackB/code/SystemClock/#86b437ce0d0f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WDT.lib Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/JackB/code/WDT/#aae68a400cf2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/macros.h Mon Jul 23 12:32:19 2018 +0000
@@ -0,0 +1,24 @@
+#define _BV(bit) (1 << (bit))
+#define bit(b) (1UL << (b))
+
+#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
+#define bitSet(value, bit) ((value) |= (1UL << (bit)))
+#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
+#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
+
+#define lowByte(w) ((uint8_t)((w) & 0xff))
+#define highByte(w) ((uint8_t)((w) >> 8))
+#define lowWord(w) ((uint16_t)((w) & 0xffff))
+#define highWord(w) ((uint16_t)((w) >> 16))
+#define bytesToWord(hb, lb) ((uint16_t)((((uint16_t)(hb & 0xFF)) << 8) | ((uint16_t)lb)))
+#define wordstoDWord(hw, lw) ((uint32_t)((((uint32_t)(hw & 0xFFFF)) << 16) | ((uint32_t)lw)))
+
+#define min(a,b) ((a)<(b)?(a):(b))
+#define max(a,b) ((a)>(b)?(a):(b))
+
+#define swap(x,y) { x = x + y; y = x - y; x = x - y; }
+
+#define abs(value) ((value)>0?(value):(-value))
+#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
+
+#define LV_MATH_ABS(x) ((x)>0?(x):(-(x)))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Mon Jul 23 12:32:19 2018 +0000
@@ -0,0 +1,1576 @@
+#include "mbed.h"
+// string::substr
+//#include <iostream>
+//#include <string>
+
+#include "main.h"
+
+#include "AP3000.h"
+#include "SetupPage.h"
+
+// https://github.com/ARMmbed/sd-driver
+// https://github.com/ARMmbed/mbed-os-example-fat-filesystem/blob/master/main.cpp
+// https://github.com/RudolphRiedel/FT800-FT813
+// https://github.com/RudolphRiedel/FT800-FT813/blob/master/FT8_commands.c
+// https://os.mbed.com/components/EVE-FT800/
+// https://os.mbed.com/users/dreschpe/code/FT800_2/file/16e22c789f7d/FT_CoPro_Cmds.cpp/
+// https://os.mbed.com/users/dreschpe/code/FT800_RGB_demo2/
+// https://os.mbed.com/users/dreschpe/code/FT800_RGB_demo2/docs/tip/main_8cpp_source.html
+// https://os.mbed.com/users/dreschpe/code/FT800_2/file/16e22c789f7d/FT_CoPro_Cmds.cpp/
+// https://os.mbed.com/users/dreschpe/code/FT800_JPG/
+// https://os.mbed.com/users/dreschpe/code/FT800_JPG/file/c603024cbd1d/main.cpp/
+// https://os.mbed.com/users/cpm219/code/FT810/rev/2d0ef4830603/
+// https://os.mbed.com/users/davidchilds/code/FT810_RGB_demo/file/7a29cc1298ef/main.cpp/
+// https://os.mbed.com/users/mozillain/code/FT810/
+// https://os.mbed.com/teams/The-Best/code/FT800_3/rev/a69ac4d39afd/
+// https://www.mikrocontroller.net/topic/395608
+// https://os.mbed.com/users/cpm219/code/FT810/docs/ca6a7c6a2f4b/FT__GPU__Hal_8cpp_source.html
+// https://os.mbed.com/users/mozillain/code/FT810/file/74108436751e/src/FT_Hal_Utils.cpp/
+// https://os.mbed.com/teams/mbed-os-examples/code/mbed-os-example-fat-filesystem/rev/ab69df6f1c47/
+// https://os.mbed.com/questions/79055/How-can-I-get-a-library-for-a-SD-card-re/
+// https://docs.mbed.com/docs/mbed-os-api-reference/en/latest/APIs/storage/filesystem/
+// Existing block devices:
+// SDBlockDevice - block device for SD cards.
+// SPIFBlockDevice - block device for NOR based SPI flash devices.
+// I2CEEBlockDevice - block device for EEPROM based I2C devices.
+// HeapBlockDevice - block device backed by the heap for quick testing.
+// https://github.com/armmbed/sd-driver
+// https://github.com/ARMmbed/spif-driver
+// https://github.com/ARMmbed/i2cee-driver
+// https://www.mikroe.com/flash-click
+// https://www.tindie.com/products/Bazinga/micron-1gb-serial-nor-flash-memory-breakout/
+// https://os.mbed.com/teams/Embedded-Artists/wiki/LPC4088DM-Using-Images
+// https://github.com/ARMmbed/spif-driver
+// http://nl.farnell.com/integrated-silicon-solution-issi/is25lp128-jble/nor-flash-memory-128mbit-133mhz/dp/2787056 € 2,36
+// http://nl.farnell.com/cypress-semiconductor/s25fl128lagmfv010/flash-memory-128mbit-133mhz-soic/dp/2771141 € 3,81
+// http://nl.farnell.com/spansion/s25fl256sagmfi011/memory-flash-256mb-16soic/dp/2340545?st=Flash%20Memory%20NOR
+// http://nl.farnell.com/cypress-semiconductor/s25fl512sagmfi011/memory-flash-512mbit-16soic/dp/2136298?st=Flash%20Memory%20NOR%20512mbit
+// http://nl.farnell.com/cypress-semiconductor/s25fl128lagmfm010/flash-memory-aec-q100-128mbit/dp/2771145 € 5,54
+// https://os.mbed.com/users/Decimus/code/FRAMSPI/
+// http://www.ftdicommunity.com/index.php?board=3.0
+// https://github.com/nopnop2002/STM32_GD2/blob/master/STM32_GD2.cpp
+// http://www.ftdichip.com/Support/Documents/AppNotes/AN_269_FT_App_Signature.pdf
+// http://forum.arduino.cc/index.php?topic=296126.0
+// https://www.youtube.com/watch?v=2FKN5UdqCKg
+// https://os.mbed.com/users/Sissors/code/BurstSPI/
+
+
+//#define BAUD_RATE 9600
+//// NUCLEO-F746ZG
+//#define USB_TX SERIAL_TX // PD_8 USART3 TX
+//#define USB_RX SERIAL_RX // PD_9 USART3 RX
+//
+//#define BUFFER_SIZE 8192
+//
+//#define BUTTON_ACCEPT_ALARM_TAG 1
+//#define BUTTON_ACCEPT_HORN_TAG 2
+//#define BUTTON_SET_TAG 3
+//#define BUTTON_DIM_TAG 4
+//
+//#define TFT_MOSI PA_7
+//#define TFT_MISO PA_6
+//#define TFT_SCLK PA_5
+//#define TFT_CS PC_7
+//#define TFT_INT PB_4
+//#define TFT_PD PA_4
+//
+//// Pinout on Nucleo-F746ZG
+//#define SD_MOSI PE_14
+//#define SD_MISO PE_13
+//#define SD_SCLK PE_12
+//#define SD_CS PE_11
+//
+//#define SF_MOSI PB_15
+//#define SF_MISO PC_2
+//#define SF_SCLK PB_13
+//#define SF_CS PB_12
+//
+//#define EE_SDA PB_9
+//#define EE_SCL PB_8
+//#define EE_ADDR 0xa0
+//#define EE_SIZE 32*1024
+//#define EE_BLOCK_SIZE 16
+//
+//#define MBED_CONF_SD_SPI_TRANSFER_FREQ 40000000
+//
+//#define INDICATOR_RUN_STATUS_OFF 0
+//#define INDICATOR_RUN_STATUS_RUNNING 1
+//#define INDICATOR_RUN_STATUS_WARNING 2
+//#define INDICATOR_RUN_STATUS_OFF_RED 3
+//
+//#define INDICATOR_ALARM_STATUS_OFF 0
+//#define INDICATOR_ALARM_STATUS_WARNING 1
+//#define INDICATOR_ALARM_STATUS_FAILURE 2
+//
+Serial pc(USBTX, USBRX);
+
+DigitalOut myled(LED1);
+
+// Setup the watchdog timer
+WDT wdt;
+
+FT813 TFT(TFT_MOSI, TFT_MISO, TFT_SCLK, TFT_CS, TFT_INT, TFT_PD); // mosi, miso, sck, ss, int, pd // the FT813 is connected to SPI 11-13
+
+// PinName io0, PinName io1, PinName io2, PinName io3, PinName sclk, PinName ssel=NC, int mode=0
+//QSPI qspi(PF_8, PF_9, PF_7, PF_6, PF_10, PB_10);
+DigitalOut myledPF8(PF_8);
+
+//HeapBlockDevice bd(128 * 512, 512);
+
+// Instantiate the SDBlockDevice by specifying the SPI pins connected to the SDCard socket.
+SDBlockDevice sd(MBED_CONF_SD_SPI_MOSI, MBED_CONF_SD_SPI_MISO, MBED_CONF_SD_SPI_CLK, MBED_CONF_SD_SPI_CS, MBED_CONF_SD_SPI_TRANSFER_FREQ);
+
+// Create flash device on SPI bus with PTE5 as chip select
+SPIFBlockDevice spif(SF_MOSI, SF_MISO, SF_SCLK, SF_CS, 100000); // mosi, miso, sclk, cs, freq
+
+// Create EEPROM device on I2C bus with 32kbytes of memory
+//I2CEEBlockDevice ee(EE_SDA, EE_SCL, EE_ADDR, EE_SIZE, EE_BLOCK_SIZE); // sda, scl, addr, size, block, freq
+
+//I2C i2c(EE_SDA, EE_SCL); // sda, scl
+//
+//I2CList I2C_List(EE_SDA, EE_SCL); // sda, scl
+
+//SPI spi(SF_MOSI, SF_MOSI, SF_SCLK); // mosi, miso, sclk
+//FRAMSPI fram(spi, SF_CS);
+
+BurstSPI bspi(SF_MOSI, SF_MISO, SF_SCLK); // PinName mosi, PinName miso, PinName sclk
+SPI rspi(SF_MOSI, SF_MISO, SF_SCLK); // PinName mosi, PinName miso, PinName sclk
+
+FATFileSystem fs("fs");
+
+//AP3000 ap3000(&TFT);
+
+Timer timer;
+
+NMEA0183 nmea0183;
+
+MCP79412 rtc(EE_SDA, EE_SCL); // sda, scl
+
+uint8_t setting_block_size;
+
+struct t_setting {
+ uint8_t version;
+ char name[32];
+ double value;
+} setting = {
+ 1,
+ "Hello World!",
+ 3.1415926536
+};
+
+//struct button {
+// uint8_t accept_alarm_pressed;
+// uint8_t accept_horn_pressed;
+// uint8_t set_pressed;
+// uint8_t dim_pressed;
+//};
+//
+//struct indicator {
+// uint8_t md_main_running;
+// uint8_t rb_main_phase_fail;
+// uint8_t rb_main_main_power;
+// uint8_t rb_main_ctrl_power;
+// uint8_t rb_main_oil_press;
+// uint8_t rb_main_hydr_lock;
+// uint8_t rb_main_overload;
+// uint8_t rb_main_oil_level;
+// uint8_t rb_main_oil_filter;
+// uint8_t rb_main_oil_temp;
+//
+// uint8_t md_aux_running;
+// uint8_t rb_aux_phase_fail;
+// uint8_t rb_aux_main_power;
+// uint8_t rb_aux_ctrl_power;
+// uint8_t rb_aux_oil_press;
+// uint8_t rb_aux_hydr_lock;
+// uint8_t rb_aux_overload;
+// uint8_t rb_aux_oil_level;
+// uint8_t rb_aux_oil_filter;
+// uint8_t rb_aux_oil_temp;
+//
+// uint8_t rb_fu_failure;
+// uint8_t rb_used;
+// uint8_t rb_main_most_used;
+// uint8_t rb_aux_most_used;
+//};
+//
+//struct button my_button;
+
+typedef struct {
+ char name[64];
+ uint16_t fmt;
+ uint16_t w;
+ uint16_t h;
+} image;
+
+//image images[128];
+
+uint16_t imageCount = 0;
+
+ ft_int16_t x_size,y_size;
+ int err;
+
+void return_error(int ret_val){
+ if (ret_val)
+ printf("\033[1;31mFailure. %d\033[0m\n", ret_val);
+ else
+ printf("\033[1;32mdone.\033[0m\n");
+}
+
+void errno_error(void* ret_val){
+ if (ret_val == NULL)
+ printf(" \033[1;31mFailure. %d\033[0m\n", errno);
+ else
+ printf(" \033[1;32mdone.\033[0m\n");
+}
+
+// global Vars
+unsigned int r,b,g;
+
+
+//int getImageIndexFromName(char *name) {
+// for (int i = 0; i < imageCount; i++) {
+// if(strstr(images[i].name, name) != NULL) {
+// return i;
+// }
+// }
+// return -1;
+//}
+
+
+// function to convert hue , saturation and value to RGB
+// see http://en.wikipedia.org/wiki/HSL_and_HSV
+void hsv2rgb(float H, float S, float V)
+{
+ float f, h, p, q, t;
+ int i;
+ if( S == 0.0) {
+ r = V * 255;
+ g = V * 255;
+ b = V * 255;
+ return;
+ }
+ if(H > 360.0) H = 0.0; // check values
+ if(S > 1.0) S = 1.0;
+ if(S < 0.0) S = 0.0;
+ if(V > 1.0) V = 1.0;
+ if(V < 0.0) V = 0.0;
+
+ h = H / 60.0;
+ i = (int) h;
+ f = h - i;
+ p = V * (1.0 - S);
+ q = V * (1.0 - (S * f));
+ t = V * (1.0 - (S * (1.0 - f)));
+
+ switch(i) {
+ case 0:
+ r = V * 255;
+ g = t * 255;
+ b = p * 255;
+ break;
+ case 1:
+ r = q * 255;
+ g = V * 255;
+ b = p * 255;
+ break;
+ case 2:
+ r = p * 255;
+ g = V * 255;
+ b = t * 255;
+ break;
+ case 3:
+ r = p * 255;
+ g = q * 255;
+ b = V * 255;
+ break;
+ case 4:
+ r = t * 255;
+ g = p * 255;
+ b = V * 255;
+ break;
+ case 5:
+ default:
+ r = V * 255;
+ g = p * 255;
+ b = q * 255;
+ break;
+ }
+}
+
+
+/***************************************************************************/
+/* Show a Screen with Text for 5 seconds */
+/* A spinner shows the delay */
+/***************************************************************************/
+
+ft_void_t Start_Screen(ft_char8_t *str)
+{
+ TFT.DLstart(); // start a new display command list
+ TFT.DL(CLEAR_COLOR_RGB(0xff, 0xff, 0xff)); // set the clear color to white
+ TFT.DL(CLEAR(1, 1, 1)); // clear buffers -> color buffer,stencil buffer, tag buffer
+
+ TFT.DL(COLOR_RGB(0x80, 0x80, 0x00)); // set current color
+ TFT.Text((TFT.DispWidth/2), TFT.DispHeight/2, 31, OPT_CENTERX, str); // draw Text with font 31
+ TFT.DL(COLOR_RGB(0xFF, 0x00, 0x00)); // change current color
+ TFT.Spinner((TFT.DispWidth/2), TFT.DispHeight/4, 0, 0); // draw a animated spinner
+
+ TFT.DL(DISPLAY()); // Display the image
+ TFT.Swap(); // Swap the current display list
+ TFT.Flush_Co_Buffer(); // Download the command list into fifo
+
+ TFT.WaitCmdfifo_empty(); // Wait till coprocessor completes the operation
+ TFT.Sleep(1000); // Wait 5 s to show
+}
+
+void screen_cm3000(void)
+{
+ TFT.DLstart(); // start a new display command list
+ TFT.DL(CLEAR_COLOR_RGB(0x21, 0x21, 0x21)); // set current color to white
+ TFT.DL(CLEAR(1, 1, 1)); // clear buffers -> color buffer,stencil buffer, tag buffer
+ TFT.DL(COLOR_RGB(0xff, 0xff, 0xff)); // set current color to white
+
+ // Bitmap
+ // BACKGROUND-01.png
+ TFT.DL(TAG(1)); // assign TAG
+ // Narrow On button, 100x132, Address 0-26400
+ TFT.DL(BEGIN(BITMAPS));
+ TFT.DL(BITMAP_SOURCE(TFT.GetBitmapAddress(0)));
+ TFT.DL(BITMAP_LAYOUT(ARGB4, 100*2, 132)); // <------- this distorts the colors
+ TFT.DL(BITMAP_SIZE(NEAREST, BORDER, BORDER, 100, 132));
+ TFT.DL(COLOR_RGB(0xff, 0xff, 0xff)); // all colors in bitmap at 100%
+ TFT.DL(VERTEX2II(20, 290, 0, 0));
+
+// TFT.SetRotate(0); // Standard landscape
+// TFT.SetRotate(1); // Rotate 180 to landscape (upside down)
+// TFT.SetRotate(2); // Rotate 90 CCW to portrait
+// TFT.SetRotate(3); // Rotate 90 CW to portrait
+// TFT.SetRotate(4); // Mirror over landscape X
+// TFT.SetRotate(5); // Mirror over landscape Y
+// TFT.SetRotate(6); // Rotate 90 CCW to portrait and mirror over portrait X
+// TFT.SetRotate(7); // Rotate 90 CW to portrait and mirror over portrait X
+
+ TFT.DL(DISPLAY()); // Display the image
+ TFT.Swap(); // Swap the current display list
+ TFT.Flush_Co_Buffer(); // Download the command list into fifo
+ TFT.WaitCmdfifo_empty(); // Wait till coprocessor completes the operation
+}
+
+// construct the screen and downloasd it to the LCD
+void screen_1(unsigned int color, unsigned int bright, unsigned int tagoption1, unsigned int tagoption2, unsigned int tagoption3, unsigned int tagoption4)
+{
+ TFT.DLstart(); // start a new display command list
+ TFT.DL(CLEAR_COLOR_RGB(0x21, 0x21, 0x21)); // set current color to white
+ TFT.DL(CLEAR(1, 1, 1)); // clear buffers -> color buffer,stencil buffer, tag buffer
+ TFT.DL(COLOR_RGB(0xff, 0xff, 0xff)); // set current color to white
+
+ // Default widget colors
+ TFT.SetThemeDefaultColor();
+// TFT.GradColor(COLOR_RGB(0xff, 0xff, 0xff)); // Default 0xffffff
+// TFT.FgColor(COLOR_RGB(0x00, 0x38, 0x70)); // Default 0x003870 0 56 112
+// TFT.BgColor(COLOR_RGB(0x00, 0x20, 0x40)); // Default 0x002040 0 32 64
+
+ TFT.DL(TAG(1)); // assign TAG value 1
+// TFT.FgColor(COLOR_RGB(0x00, 0x00, 0xff)); // forground color red
+// TFT.BgColor(COLOR_RGB(0x00, 0x00, 0x80));
+ TFT.Dial(249, 86, 55, 0, color); // dial for color
+
+ TFT.DL(TAG(2)); // assign TAG value 2
+// TFT.FgColor(COLOR_RGB(0x00, 0x00, 0xff)); // forground color red
+// TFT.BgColor(COLOR_RGB(0x00, 0x00, 0x80));
+ TFT.Slider(196, 215, 236, 21, 0, bright , 255); // slider for brightness
+ TFT.DL(COLOR_RGB(0xff, 0xff, 0xff)); // set current color to white
+ TFT.Text(22, 84, 30, 0, "Color"); // text Color
+ TFT.Text(22, 208, 30, 0, "Brightness"); // text Brightness
+
+ // TFT.Button(ft_int16_t x, ft_int16_t y, ft_int16_t w, ft_int16_t h, ft_int16_t font, ft_uint16_t options, const ft_char8_t* s);
+ TFT.DL(TAG(3)); // This is tag value for button
+ // 0 = 3D, OPT_FLAT
+ TFT.SetThemeColor(COLOR_RGB(0xff, 0x00, 0x00));
+// TFT.GradColor(COLOR_RGB(0xff, 0xff, 0xff));
+// TFT.FgColor(COLOR_RGB(0x70, 0x00, 0x00));
+// TFT.BgColor(COLOR_RGB(0x38, 0x00, 0x00));
+ TFT.Button(500, 20, 200, 50, 31, tagoption1, "25%");
+
+ TFT.DL(TAG(4)); // This is tag value for button
+ TFT.SetThemeColor(COLOR_RGB(0x00, 0xff, 0x00));
+// TFT.GradColor(COLOR_RGB(0xff, 0xff, 0xff));
+// TFT.FgColor(COLOR_RGB(0x00, 0x70, 0x00));
+// TFT.BgColor(COLOR_RGB(0x00, 0x40, 0x00));
+ TFT.Button(500, 80, 200, 50, 31, tagoption2, "50%");
+
+ TFT.DL(TAG(5)); // This is tag value for button
+ TFT.SetThemeColor(COLOR_RGB(0x00, 0x7f, 0xff));
+// TFT.GradColor(COLOR_RGB(0xff, 0xff, 0xff));
+// TFT.FgColor(COLOR_RGB(0x00, 0x38, 0x70));
+// TFT.BgColor(COLOR_RGB(0x00, 0x20, 0x40));
+ TFT.Button(500, 140, 200, 50, 31, tagoption3, "75%");
+
+// // Default
+// TFT.SetThemeDefaultColor();
+//// TFT.GradColor(COLOR_RGB(0xff, 0xff, 0xff)); // Default 0xffffff
+//// TFT.FgColor(COLOR_RGB(0x00, 0x38, 0x70)); // Default 0x003870
+//// TFT.BgColor(COLOR_RGB(0x00, 0x20, 0x40)); // Default 0x002040
+//
+//
+ TFT.DL(POINT_SIZE(100)); // color point around the dial
+ TFT.DL(BEGIN(POINTS));
+ TFT.DL(COLOR_RGB(0x00, 0x0, 0xff)); // color of next point
+ TFT.DL(VERTEX2II(183, 47, 0, 0)); // set point x,y
+ TFT.DL(COLOR_RGB(0xff, 0x00, 0x00));
+ TFT.DL(VERTEX2II(249, 162, 0, 0));
+ TFT.DL(COLOR_RGB(0xff, 0x00, 0xff));
+ TFT.DL(VERTEX2II(183, 123, 0, 0));
+ TFT.DL(COLOR_RGB(0xff, 0xff, 0x00));
+ TFT.DL(VERTEX2II(317, 123, 0, 0));
+ TFT.DL(COLOR_RGB(0x00, 0xff, 0xff));
+ TFT.DL(VERTEX2II(249, 11, 0, 0));
+ TFT.DL(COLOR_RGB(0x00, 0xff, 0x00));
+ TFT.DL(VERTEX2II(317, 50, 0, 0));
+ TFT.DL(SCISSOR_XY(10, 10)); // define sub area starting at 10,10
+ TFT.DL(SCISSOR_SIZE(50, 50)); // size 50, 50
+ hsv2rgb(color / 65536.0 * 360, 1.0, bright / 255.0); // calculate rgb color from settings
+ TFT.DL(CLEAR_COLOR_RGB(r, b, g)); // set filling color to r,g,b
+ TFT.DL(CLEAR(1, 1, 1)); // fill the area
+
+ // Clipping area
+ TFT.DL(SCISSOR_XY(0, 0)); // define area starting at 380,220
+ TFT.DL(SCISSOR_SIZE(480, 800)); // size 480, 800
+ TFT.DL(COLOR_RGB(0xff, 0xff, 0xff));
+
+ // Rectangle
+ TFT.DL(TAG(6)); // assign TAG
+ TFT.DL(COLOR_RGB(0x80, 0x00, 0xff)); // set current color to red
+ TFT.Rect(60, 270, 260, 340, 5);
+
+ // Circle
+ TFT.DL(TAG(7)); // assign TAG
+ TFT.DL(COLOR_RGB(0x00, 0xff, 0x00)); // set current color to green
+ TFT.Point(400, 340, 60);
+
+ // Rectangle
+ TFT.DL(TAG(8)); // assign TAG
+ TFT.DL(COLOR_RGB(r, b, g)); // set current color to red
+ TFT.Rect(160, 305, 360, 440, 20);
+ TFT.DL(COLOR_RGB(0x00, 0x00, 0x00)); // set current color to black
+ TFT.Rect(165, 310, 355, 435, 10);
+
+ // Line
+ TFT.DL(TAG(9)); // assign TAG
+ TFT.DL(COLOR_RGB(0x00, 0x00, 0xff)); // set current color to blue
+ TFT.Line(440, 310, 680, 230 + r, 20);
+
+ // Circle
+ TFT.DL(TAG(10)); // assign TAG
+ TFT.DL(COLOR_RGB(0xff, 0x00, 0xff)); // set current color to green
+ TFT.Point(600, 340, 80);
+// TFT.DL(TAG(10)); // assign TAG
+ TFT.DL(COLOR_RGB(0x00, 0x00, 0x00)); // set current color to green
+ TFT.Point(600, 340, 70);
+
+ // Bitmap
+ TFT.DL(TAG(11)); // assign TAG
+ // Narrow On button, 100x132, Address 0-26400
+ TFT.DL(COLOR_RGB(0xff, 0xff, 0xff)); // set the clear color to white
+ TFT.DL(BEGIN(BITMAPS));
+// TFT.DL(BITMAP_SOURCE(TFT.GetBitmapAddress(1)));
+// TFT.DL(BITMAP_LAYOUT(ARGB4, 100*2, 132)); // <------- this distorts the colors
+// TFT.DL(BITMAP_SIZE(NEAREST, BORDER, BORDER, 100, 132));
+// TFT.DL(COLOR_RGB(0xff, 0xff, 0xff)); // all colors in bitmap at 100%
+// TFT.DL(VERTEX2II(20, 290, 0, 0));
+
+// int index = 0;
+ if (tagoption4 == 0) {
+// index = getImageIndexFromName("SwitchOn_100x132");
+ TFT.ShowBitmapByName("SwitchOn_100x132", 20, 290);
+ }
+ else {
+// index = getImageIndexFromName("SwitchOff_100x132");
+ TFT.ShowBitmapByName("SwitchOff_100x132", 20, 290);
+ }
+// TFT.ShowBitmapAtAddress(images[index].addr, images[index].fmt, 20, 290, images[index].w, images[index].h);
+
+
+// TFT.SetRotate(0); // Standard landscape
+// TFT.SetRotate(1); // Rotate 180 to landscape (upside down)
+// TFT.SetRotate(2); // Rotate 90 CCW to portrait
+// TFT.SetRotate(3); // Rotate 90 CW to portrait
+// TFT.SetRotate(4); // Mirror over landscape X
+// TFT.SetRotate(5); // Mirror over landscape Y
+// TFT.SetRotate(6); // Rotate 90 CCW to portrait and mirror over portrait X
+// TFT.SetRotate(7); // Rotate 90 CW to portrait and mirror over portrait X
+
+ TFT.DL(DISPLAY()); // Display the image
+ TFT.Swap(); // Swap the current display list
+ TFT.Flush_Co_Buffer(); // Download the command list into fifo
+ TFT.WaitCmdfifo_empty(); // Wait till coprocessor completes the operation
+}
+
+// construct the screen and downloasd it to the LCD
+void screen_2(unsigned int r, unsigned int g, unsigned int b)
+{
+ TFT.DLstart(); // start a new display command list
+ TFT.DL(CLEAR(1, 1, 1)); // clear buffers -> color buffer,stencil buffer, tag buffer
+ TFT.DL(COLOR_RGB(0xff, 0xff, 0xff)); // set current color to white
+ TFT.DL(TAG(1)); // assign TAG value 1
+ TFT.FgColor(COLOR_RGB(0xff, 0x00, 0x00)); // forground color red
+ TFT.Slider(140, 81, 310, 14, 0, r, 255); // slider for red
+ TFT.DL(TAG(2)); // assign TAG value 2
+ TFT.FgColor(COLOR_RGB(0x00, 0xff, 0x00)); // forground color green
+ TFT.Slider(140, 133, 310, 14, 0, g, 255); // slider for green
+ TFT.DL(TAG(3)); // assign TAG value 3
+ TFT.FgColor(COLOR_RGB(0x00, 0x00, 0xff)); // forground color blue
+ TFT.Slider(139, 185, 310, 14, 0, b, 255); // slider for blue
+ TFT.DL(COLOR_RGB(0xff, 0x00, 0x00)); // set current color to red
+ TFT.Text(82, 69, 30, 0, "R"); // text R
+ TFT.DL(COLOR_RGB(0x00, 0xff, 0x00)); // set current color to green
+ TFT.Text(82, 120, 30, 0, "G"); // text G
+ TFT.DL(COLOR_RGB(0x00, 0x00, 0xff)); // set current color to blue
+ TFT.Text(82, 174, 30, 0, "B"); // text B
+ TFT.DL(SCISSOR_XY(10, 10)); // define area starting at 10,10
+ TFT.DL(SCISSOR_SIZE(50, 50)); // size 50,50
+ TFT.DL(CLEAR_COLOR_RGB(r, g, b)); // set clear color to r,g,b
+ TFT.DL(CLEAR(1, 1, 1)); // fill the area
+
+ // Clipping area
+ TFT.DL(SCISSOR_XY(0, 220)); // define area starting at 380,220
+ TFT.DL(SCISSOR_SIZE(799, 259)); // size 50,50
+ // Rectangle
+ TFT.DL(COLOR_RGB(0xff, 0x00, 0x00)); // set current color to red
+ TFT.Rect(160, 290, 360, 440, 20);
+ TFT.DL(COLOR_RGB(0x00, 0x00, 0x00)); // set current color to black
+ TFT.Rect(165, 295, 355, 435, 10);
+ // Circle
+ TFT.DL(COLOR_RGB(0x00, 0xff, 0x00)); // set current color to green
+ TFT.Point(400, 260, 40);
+ // Line
+ TFT.DL(COLOR_RGB(0x00, 0x00, 0xff)); // set current color to blue
+ TFT.Line(440, 270, 680, 400, 20);
+
+ TFT.DL(DISPLAY()); // Display the image
+ TFT.Swap(); // Swap the current display list
+ TFT.Flush_Co_Buffer(); // Download the command list into fifo
+ TFT.WaitCmdfifo_empty(); // Wait till coprocessor completes the operation
+}
+
+void substring(char *s, char *d, int pos, int len) //usage: substring(Src, Dst, Pos, Len);
+{
+//usage: substring(Source, Destination, pos, len);
+ char *t;
+
+ s=s+pos;
+ t=s+len;
+ while (s!=t) {
+ *d=*s;
+ s++;
+ d++;
+ }
+ *d='\0';
+}
+
+int main() {
+ pc.baud(BAUD_RATE);
+ printf("\n\n\n");
+ printf("----------------------------------\n");
+ printf("20180621_FT800_RGB_demo2\n");
+ printf("" __DATE__ " " __TIME__ "\n");
+#if defined(MBED_MAJOR_VERSION)
+ printf("Using \033[1;37mMbed OS %d.%d.%d\033[0m\n", MBED_MAJOR_VERSION, MBED_MINOR_VERSION, MBED_PATCH_VERSION);
+#else
+ printf("Using Mbed OS from master.\n");
+#endif
+ printf("CPU SystemCoreClock: \033[1;37m%d MHz\033[0m\n", SystemCoreClock/1000000);
+ printf("----------------------------------\n");
+
+ // https://www.unixtimestamp.com/
+ set_time(1531525845); // Set RTC time to Wed, 28 Oct 2009 11:35:37
+
+ uint8_t second = 0;
+ uint8_t minute = 0;
+ uint8_t hour = 0;
+ uint8_t dayOfWeek = 1; // Will be determined
+ uint8_t dayOfMonth = 16;
+ uint8_t month = 7;
+ uint8_t year = 18;
+ printf("%02d-%02d-%02d %02d:%02d:%02d\n", dayOfMonth, month, year, hour, minute, second);
+
+// struct tm *t;
+// *t = rtc.setSystemDateTime(second, minute, hour, dayOfMonth, month, year);
+// printf("-> Debug %d %02d-%02d-%03d %02d:%02d:%02d\n", t->tm_wday, t->tm_mday, t->tm_mon, t->tm_year, t->tm_hour, t->tm_min, t->tm_sec);
+
+ struct tm t;
+ t = rtc.setSystemDateTime(second, minute, hour, dayOfMonth, month, year);
+ printf("-> Debug %d %02d-%02d-%03d %02d:%02d:%02d\n", t.tm_wday, t.tm_mday, t.tm_mon, t.tm_year, t.tm_hour, t.tm_min, t.tm_sec);
+
+ time_t secondsEpoch = time(NULL);
+
+ printf("Time as seconds since January 1, 1970 = %d\n", secondsEpoch);
+
+ printf("Time as a basic string = %s", ctime(&secondsEpoch));
+
+ char buffer[32];
+ strftime(buffer, 32, "%a %d-%m-%Y %H:%M:%S\n", localtime(&secondsEpoch));
+ printf("Time: %s", buffer);
+// wait(5);
+ secondsEpoch = time(NULL);
+ strftime(buffer, 32, "%a %d-%m-%Y %H:%M:%S\n", localtime(&secondsEpoch));
+ printf("Time: %s", buffer);
+
+ printf("year %d\n", year);
+ time_t seconds2 = rtc.convertDateTimeToTimestamp(second, minute, hour, dayOfMonth, month, year);
+ printf("seconds2 %d\n", seconds2);
+
+ uint8_t Weekday = rtc.getWeekdayFromDate(dayOfMonth, month, year);
+ printf("Weekday %d\n", Weekday);
+
+ rtc.setRtcFromTm(&t);
+
+// uint8_t second = 0;
+// uint8_t minute = 18;
+// uint8_t hour = 1;
+// uint8_t dayOfWeek = 6;
+// uint8_t dayOfMonth = 14;
+// uint8_t month = 7;
+// uint8_t year = 18;
+// printf("%02d-%02d-%02d %02d:%02d:%02d\n", dayOfMonth, month, year, hour, minute, second);
+// rtc.setSystemDateTime(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
+// wait(5);
+ rtc.getSystemDateTime(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
+ printf("%d %02d-%02d-%02d %02d:%02d:%02d\n", dayOfWeek, dayOfMonth, month, year, hour, minute, second);
+// wait(5);
+ rtc.getSystemDateTime(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
+ printf("%d %02d-%02d-%02d %02d:%02d:%02d\n", dayOfWeek, dayOfMonth, month, year, hour, minute, second);
+
+
+// https://os.mbed.com/questions/77039/Use-external-clock-signal-HSE-in-Nucleo-/
+
+
+
+ switch (__HAL_RCC_GET_SYSCLK_SOURCE())
+ {
+// case RCC_SYSCLKSOURCE_STATUS_MSI:
+// printf("MSI used as system clock.\r\n");
+// break;
+ case RCC_SYSCLKSOURCE_STATUS_HSI:
+ printf("HSI used as system clock.\r\n");
+ break;
+ case RCC_SYSCLKSOURCE_STATUS_HSE:
+ printf("HSE used as system clock.\r\n");
+ break;
+ case RCC_SYSCLKSOURCE_STATUS_PLLCLK:
+ printf("PLL used as system clock.\r\n");
+// if ((RCC->CFGR & RCC_CFGR_PLLSRC) == RCC_CFGR_PLLSRC_HSE) {
+// printf("HSE oscillator clock selected as PLL input clock.\r\n");
+// }
+// else {
+// printf("HSI16 oscillator clock selected as PLL input clock.\r\n");
+// }
+ break;
+ }
+
+ printf("HCE Information: \r\n");
+
+ if (READ_BIT(RCC->CR, RCC_CR_HSEON)){
+ printf("RCC_CR_HSEON = 1 \r\n");
+ }
+ else{
+ printf("RCC_CR_HSEON = 0 \r\n");
+ }
+
+ if (READ_BIT(RCC->CR, RCC_CR_HSEBYP)){
+ printf("RCC_CR_HSEBYP = 1 \r\n");
+ }
+ else{
+ printf("RCC_CR_HSEBYP = 0 \r\n");
+ }
+
+ if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) {
+ printf("RCC_FLAG_HSERDY = 1 \r\n");
+ }
+ else {
+ printf("RCC_FLAG_HSERDY = 0 \r\n");
+ }
+
+
+ printf("\n");
+// I2C_List.List();
+
+// printf("Searching for I2C devices...\n");
+// int count = 0;
+// for (int address=0; address<256; address+=2) {
+// if (!i2c.write(address, NULL, 0)) { // 0 returned is ok
+// count++;
+// printf("%2d: 0x%02X\n", count, address);
+// }
+// }
+// printf("%d I2C devices found\n", count);
+
+ wdt.Configure(WDT_TIMEOUT);
+
+ timer.start();
+ double my_time = timer.read();
+
+ int error = 0;
+ printf("Welcome to the FAT32 filesystem example.\n");
+
+// printf("Formatting a FAT, SD-Card filesystem... "); // "Formatting a FAT, RAM-backed filesystem... "
+// fflush(stdout);
+// error = FATFileSystem::format(&sd);
+// return_error(error);
+
+ printf("Mounting the filesystem on \"/fs\"... ");
+ fflush(stdout);
+ // Initialize the SD card device and print the memory layout
+ sd.init();
+ error = fs.mount(&sd);
+ return_error(error);
+ printf("sd size: %llu Bytes.\n", sd.size());
+// printf("sd read size: %llu\n", sd.get_read_size());
+// printf("sd program size: %llu\n", sd.get_program_size());
+// printf("sd erase size: %llu\n", sd.get_erase_size());
+
+// // Initialize the SPI flash device and print the memory layout
+// spif.init();
+// printf("spif size: %llu\n", spif.size());
+// printf("spif read size: %llu\n", spif.get_read_size());
+// printf("spif program size: %llu\n", spif.get_program_size());
+// printf("spif erase size: %llu\n", spif.get_erase_size());
+
+// printf("Mounting the filesystem on \"/eefs\"... ");
+ fflush(stdout);
+
+// // Initialize the EEPROM and print the memory layout
+// ee.init();
+//// error = eefs.mount(&i2cee);
+//// return_error(error);
+// printf("ee size: %llu Bytes.\n", ee.size());
+// printf("ee read size: %llu\n", ee.get_read_size());
+// printf("ee program size: %llu\n", ee.get_program_size());
+// printf("ee erase size: %llu\n", ee.get_erase_size());
+
+// printf("Send 1000 SPI packets as fast as possible...\n");
+// uint8_t data[1000];
+// for (int i = 0; i<1000; i++)
+// data[i] = (uint8_t) (i & 0xff);
+// //Send 1000 SPI packets as fast as possible
+// bspi.setFormat();
+// timer.reset();
+// for (int i = 0; i<1000; i++)
+// bspi.fastWrite(data[i]);
+// my_time = timer.read();
+// bspi.clearRX();
+// printf("Time: %f.\n", my_time);
+//
+// rspi.format(8, 0); // 8 bit spi mode 0
+// rspi.frequency(54000000);
+// timer.reset();
+// for (int i = 0; i<1000; i++)
+// rspi.write(data[i]);
+// my_time = timer.read();
+// printf("Time: %f.\n", my_time);
+
+// printf("----------\n");
+// printf("EEPROM string...\n");
+// timer.reset();
+// // --- Save a string into EEPROM and read it back ---
+// uint8_t block_size = 32;
+// ee.erase(0, block_size);
+// // Write "Hello World!" to the first block
+// char hello[] = "Hello World!";
+// printf("Save \"%s\"\n", hello);
+// char *buffer = (char*)malloc(block_size);
+// sprintf(buffer, "%s", hello);
+// // Program EEPROM
+// ee.program(buffer, 0, block_size);
+// sprintf(buffer, "empty\n"); // empty buffer, not nessesary but helps when debugging
+// // Read back what was stored
+// ee.read(buffer, 0, block_size);
+// printf("Read \"%s\"\n", buffer);
+// my_time = timer.read();
+// printf("Time: %f.\n", my_time);
+//
+//
+// printf("----------\n");
+// printf("EEPROM struct...\n");
+// timer.reset();
+// // --- Save a structure into EEPROM and read it back ---
+// // No. of bytes to be stored, but topped up to be multiplied by block size
+// unsigned int setting_block_size = ceil(sizeof(setting)/(double)EE_BLOCK_SIZE)*EE_BLOCK_SIZE;
+// printf("No. of bytes to be stored: %d\n", setting_block_size);
+// // Temporary buffer
+// char *buffer2 = (char*)malloc(setting_block_size);
+// // Save the struct to EEPROM
+// setting.version = 56;
+// printf("Save struct version: %u, name: %s, value: %3.10lf\n", setting.version, setting.name, setting.value);
+// memcpy(buffer2, &setting, sizeof(setting));
+// // Program EEPROM
+// ee.program(buffer2, 0, setting_block_size);
+// // Read back what was stored
+// t_setting tmp; // Re-make the struct
+// memset(buffer2, 0, sizeof(buffer2)); // empty buffer, not nessesary but helps when debugging
+// // Read the struct from the EEPROM
+// if (ee.read(buffer2, 0, setting_block_size ) == 0) { // get data into buffer
+// // Convert what we read into struct
+// memcpy(&tmp, buffer2, sizeof(tmp)); // copy only size of struct not setting_block_size
+// printf("Read struct version: %u, name: %s, value: %3.10lf\n", tmp.version, tmp.name, tmp.value);
+// } else {
+// printf("Error when reading\n");
+// }
+// my_time = timer.read();
+// printf("Time: %f.\n", my_time);
+
+//
+// char filename[] = "/fs/my_text_file.txt";
+//
+// printf("Opening a new file, \"/%s\"...", filename);
+// fflush(stdout);
+// FILE* fd = fopen(filename, "w");
+// errno_error(fd);
+//
+// printf("Writing text to a file:\n");
+// char text[] = "Hello world!\nThis is just some text...\n";
+// printf("\033[1;37m%s\033[0m", text);
+// fprintf(fd, "%s", text);
+//
+//// for (int i = 0; i < 10; i++) {
+//// printf("%d/20\n", i);
+//// fprintf(fd, "%d\n", i);
+//// }
+//// printf("Writing decimal numbers to a file (10/10) done.\n");
+// printf("Writing text to a file done.\n");
+//
+// printf("Closing file...");
+//// fflush(stdout);
+// fclose(fd);
+// printf(" done.\r\n");
+//
+// printf("Re-opening file read-only...");
+//// fflush(stdout);
+// fd = fopen(filename, "r");
+// errno_error(fd);
+//
+// printf("Dumping file to screen:\n");
+// printf("\033[1;37m");
+// char buff[16] = {0};
+// while (!feof(fd)) {
+// int size = fread(&buff[0], 1, 15, fd);
+// fwrite(&buff[0], 1, size, stdout);
+// }
+// printf("\033[0m");
+// printf("Closing file...");
+//// fflush(stdout);
+// fclose(fd);
+// printf(" done.\r\n");
+//
+// printf("Opening root directory...");
+// fflush(stdout);
+// DIR* dir = opendir("/fs/");
+// errno_error(fd);
+//
+// struct dirent* de;
+// printf("Printing all filenames:\n");
+// printf("\033[1;37m");
+// while((de = readdir(dir)) != NULL) {
+// printf(" %s\r\n", &(de->d_name)[0]);
+// }
+// printf("\033[0m");
+//
+// printf("Closing root directory... ");
+// fflush(stdout);
+// error = closedir(dir);
+// return_error(error);
+// printf("Filesystem Demo complete.\n");
+
+
+// printf("Start FRAM Demo.\n");
+// char wdata[] = "Hello world!";
+// char rdata[14];
+// fram.write(0, wdata, 13); // 12 symbols + zero terminator
+// fram.read(0, rdata, 13);
+// pc.printf("data: %s", rdata);
+// printf("Done.\n");
+
+
+// Set screen rotation
+// TFT.SetRotate(2); // Rotate 90 CCW to portrait
+// TFT.SetRotate(3); // Rotate 90 CW to portrait
+
+// TFT.SetOrientation(FT8_DISPLAY_LANDSCAPE_0);
+ TFT.SetOrientation(FT8_DISPLAY_PORTRAIT_90CW); // CM3000
+// TFT.SetOrientation(FT8_DISPLAY_PORTRAIT_90CCW); // CM3000
+
+// ap3000.SetBacklight((uint16_t)255);
+
+// TFT.Calibrate(); // calibrate the touch screen
+// // Read calibrate registers
+// printf("// Calibration values:\n");
+// printf(" ft_uint32_t canned_calibration_data[] = {\n");
+// for(int i = 0; i < 24; i+=4) {
+// printf(" ");
+// printf("0x%08x", TFT.read_calibrate_reg32(i));
+// if (i < 20)
+// printf(",");
+// printf("\n");
+// }
+// printf(" };\n");
+// printf(" TFT.write_calibrate32(canned_calibration_data);\n");
+
+ // Default
+// ft_uint32_t canned_calibration_data[] = {
+// 0x00000000,
+// 0x00010000,
+// 0x00000000,
+// 0xffff0000,
+// 0x00000000,
+// 0x031f0000
+// };
+// TFT.write_calibrate32(canned_calibration_data);
+
+
+ // Landscape 0
+// ft_uint32_t canned_calibration_data[] = {
+// 0x000109b0, // 68016
+// 0x0000023d, // 573
+// 0x0000fa64, // 64100
+// 0xffffffcf, // -49
+// 0xfffefc9a, // -66406
+// 0x01ee8754 // 32409428
+// };
+// TFT.write_calibrate32(canned_calibration_data);
+
+ // Calibration rotate 90 CCW to portrait
+// ft_uint32_t canned_calibration_data[] = {
+// 0x00000491,
+// 0x0000fd0b,
+// 0xfff6f84b,
+// 0x00010503,
+// 0x000006b7,
+// 0xffeeb0b7
+// };
+// TFT.write_calibrate32(canned_calibration_data);
+
+// // Calibration rotate 90 CW to portrait
+// ft_uint32_t canned_calibration_data[] = {
+// 0xfffff994,
+// 0xffff07d3,
+// 0x01e4b85c,
+// 0xfffef6f5,
+// 0x000002ad,
+// 0x032eb4d4
+// };
+// TFT.write_calibrate32(canned_calibration_data);
+
+// // Read calibrate registers
+// printf("// Calibration values:\n");
+// printf(" ft_uint32_t canned_calibration_data[] = {\n");
+// for(int i = 0; i < 24; i+=4) {
+// printf(" ");
+// printf("0x%08x", TFT.read_calibrate_reg32(i));
+// if (i < 20)
+// printf(",");
+// printf("\n");
+// }
+// printf(" };\n");
+// printf(" TFT.write_calibrate32(canned_calibration_data);\n");
+
+
+
+
+
+
+//
+// TFT.DL(CLEAR(1, 1, 1)); // clear buffers -> color buffer,stencil buffer, tag buffer
+// TFT.DL(COLOR_RGB(0xff, 0xff, 0xff)); // set the clear color to white
+// TFT.DL(SAVE_CONTEXT());
+
+// TFT.DL(BEGIN(BITMAPS));
+//
+// TFT.DL(BLEND_FUNC(ONE,ZERO));
+// TFT.DL(COLOR_A(0x55));
+// TFT.DL(VERTEX2II(0, 0, 0, 0));
+// TFT.DL(BLEND_FUNC(ONE,ONE));
+// TFT.DL(COLOR_A(0xAA));
+// TFT.DL(VERTEX2II(0, 0, 0, 1));
+// TFT.DL(COLOR_MASK(1,1,1,0));
+// TFT.Scale(4*65536,4*65536);
+// TFT.SetMatrix();
+// TFT.DL(BLEND_FUNC(DST_ALPHA,ZERO));
+// TFT.DL(VERTEX2II(0, 0, 2, 1));
+// TFT.DL(BLEND_FUNC(ONE_MINUS_DST_ALPHA,ONE));
+// TFT.DL(VERTEX2II(0, 0, 2, 0));
+//
+// TFT.DL(RESTORE_CONTEXT());
+
+
+// // NMEA0183 Test
+
+ int status = nmea0183.CheckParity("$PVMAL,A,R1,F3A8,C000,0030*34");
+ printf("nmea0183.CheckParity %d\n", status);
+
+
+//image images2[] = {
+// {"/fs/BACKGROUND_01_C_20x20_BL.bin", L8, 20, 20},
+// {"/fs/BACKGROUND_01_C_20x20_BR.bin", L8, 20, 20},
+// {"/fs/BACKGROUND_01_C_20x20_TL.bin", L8, 20, 20},
+// {"/fs/BACKGROUND_01_C_20x20_TR.bin", L8, 20, 20},
+//
+// {"/fs/BACKGROUND_01_H_5x4.bin", L8, 5, 4},
+// {"/fs/BACKGROUND_01_H_10x4.bin", L8, 10, 4},
+// {"/fs/BACKGROUND_01_H_25x4.bin", L8, 25, 4},
+// {"/fs/BACKGROUND_01_H_190x4.bin", L8, 190, 4},
+// {"/fs/BACKGROUND_01_V_4x535.bin", L8, 4, 535},
+// {"/fs/BACKGROUND_01_V_4x21.bin", L8, 4, 21},
+//
+// {"/fs/RegularButtonRed_220x51r.bin", ARGB4, 220, 51},
+// {"/fs/RegularButtonBlk_220x51r4t.bin", ARGB4, 220, 51},
+// {"/fs/RegularButtonGray_220x51r0r10t.bin", ARGB4, 220, 51},
+// {"/fs/RegularButtonRed_220x51r0r10t.bin", ARGB4, 220, 51},
+// {"/fs/RegularButtonYel_220x51r0r10t.bin", ARGB4, 220, 51},
+//
+// {"/fs/RegulaButtonrBlk_220x51r0t.bin", ARGB4, 220, 51},
+// {"/fs/RegularButtonGray_220x51r0t.bin", ARGB4, 220, 51},
+// {"/fs/RegularButtonRed_220x51r0t.bin", ARGB4, 220, 51},
+// {"/fs/RegularButtonYel_220x51r0t.bin", ARGB4, 220, 51},
+//
+// {"/fs/SwitchOn_234x132_blk.bin", L8, 234, 132},
+// {"/fs/SwitchOff_234x132_blk.bin", L8, 234, 132},
+// {"/fs/SwitchOn_100x132_blk.bin", L8, 100, 132},
+// {"/fs/SwitchOff_100x132_blk.bin", L8, 234, 132},
+// {"/fs/SwitchOn_115x66_t.bin", L8, 115, 66},
+// {"/fs/SwitchOff_115x66_t.bin", L8, 115, 66},
+//
+// {"/fs/MD_DISABLED_230x70.bin", ARGB4, 230, 70},
+// {"/fs/MD_OFF_230x70.bin", ARGB4, 230, 70},
+// {"/fs/MD_OFF_GREY_230x70.bin", ARGB4, 230, 70},
+// {"/fs/MD_RUNNING_230x70.bin", ARGB4, 230, 70},
+// {"/fs/MD_WARNING_230x70.bin", ARGB4, 230, 70},
+//
+// {"/fs/RUN_TIME_C_ON_21_X_21.bin", ARGB4, 21, 21},
+// {"/fs/RUN_TIME_C_OFF_21_X_21.bin", ARGB4, 21, 21},
+// {"/fs/RUN_TIME_L_ON_21_X_21.bin", ARGB4, 21, 21},
+// {"/fs/RUN_TIME_L_OFF_21_X_21.bin", ARGB4, 21, 21},
+// {"/fs/RUN_TIME_R_ON_21_X_21.bin", ARGB4, 21, 21},
+// {"/fs/RUN_TIME_R_OFF_21_X_21.bin", ARGB4, 21, 21}
+//};
+// uint16_t entries = sizeof(images2) / sizeof(images2[0]);
+// printf("--- images2[] %d\n", entries);
+// for (int i = 0; i < entries; i++) {
+// printf("%3d - %s, %d, %d, %d\n", i, images2[i].name, images2[i].fmt, images2[i].w, images2[i].h);
+// }
+
+// TFT.SetLoadAddress(0);
+// TFT.SetBitmapCount(0);
+
+
+
+
+
+
+
+
+
+ // ---------------------------------------- Load and show bitmaps ----------------------------------------
+
+
+ // Splash Screen
+// printf("--------------\n");
+// printf("loadSplashScreen...\n");
+// timer.reset();
+// loadSplashScreen();
+// my_time = timer.read();
+// printf("Time: %f Sec.\n", my_time);
+
+ printf("--------------\n");
+ printf("showSplashScreen...\n");
+ timer.reset();
+ showSplashScreen();
+ my_time = timer.read();
+ printf("Time: %f Sec.\n", my_time);
+
+// wait(3);
+
+ printf("--------------\n");
+ printf("loadBitmaps...\n");
+ timer.reset();
+
+ loadBitmaps();
+
+ my_time = timer.read();
+ printf("Time: %f Sec.\n", my_time);
+
+ uint32_t RamUsage = TFT.GetRamUsage();
+ uint16_t GetRamNoOfBitmaps = TFT.GetRamNoOfBitmaps();
+ printf("RAM usage: %d Bytes.\n", RamUsage);
+ printf("RAM no of bitmaps: %d.\n", GetRamNoOfBitmaps);
+
+ printf("--------------\n");
+ printf("showMainPage...\n");
+ timer.reset();
+
+ InitAP3000();
+
+// button my_button;
+// my_button.accept_alarm_pressed = 0;
+// my_button.accept_horn_pressed = 0;
+// my_button.set_pressed = 0;
+// my_button.dim_pressed = 0;
+//
+// indicator my_indicator;
+// my_indicator.rb_used = 1;
+// my_indicator.rb_main_most_used = 1;
+// my_indicator.rb_aux_most_used = 0;
+//
+// // INDICATOR_RUN_STATUS_OFF
+// // INDICATOR_RUN_STATUS_RUNNING
+// // INDICATOR_RUN_STATUS_WARNING
+// // INDICATOR_RUN_STATUS_OFF_RED
+// my_indicator.md_main_running = INDICATOR_RUN_STATUS_RUNNING;
+// my_indicator.md_aux_running = INDICATOR_RUN_STATUS_WARNING;
+//
+// // INDICATOR_ALARM_STATUS_OFF
+// // INDICATOR_ALARM_STATUS_WARNING
+// // INDICATOR_ALARM_STATUS_FAILURE
+// my_indicator.rb_main_phase_fail = INDICATOR_ALARM_STATUS_FAILURE;
+// my_indicator.rb_main_main_power = INDICATOR_ALARM_STATUS_FAILURE;
+// my_indicator.rb_main_ctrl_power = INDICATOR_ALARM_STATUS_FAILURE;
+// my_indicator.rb_main_oil_press = INDICATOR_ALARM_STATUS_FAILURE;
+// my_indicator.rb_main_hydr_lock = INDICATOR_ALARM_STATUS_OFF;
+// my_indicator.rb_main_overload = INDICATOR_ALARM_STATUS_WARNING;
+// my_indicator.rb_main_oil_level = INDICATOR_ALARM_STATUS_WARNING;
+// my_indicator.rb_main_oil_filter = INDICATOR_ALARM_STATUS_WARNING;
+// my_indicator.rb_main_oil_temp = INDICATOR_ALARM_STATUS_WARNING;
+//
+// my_indicator.rb_aux_phase_fail = INDICATOR_ALARM_STATUS_FAILURE;
+// my_indicator.rb_aux_main_power = INDICATOR_ALARM_STATUS_FAILURE;
+// my_indicator.rb_aux_ctrl_power = INDICATOR_ALARM_STATUS_FAILURE;
+// my_indicator.rb_aux_oil_press = INDICATOR_ALARM_STATUS_FAILURE;
+// my_indicator.rb_aux_hydr_lock = INDICATOR_ALARM_STATUS_OFF;
+// my_indicator.rb_aux_overload = INDICATOR_ALARM_STATUS_WARNING;
+// my_indicator.rb_aux_oil_level = INDICATOR_ALARM_STATUS_WARNING;
+// my_indicator.rb_aux_oil_filter = INDICATOR_ALARM_STATUS_WARNING;
+// my_indicator.rb_aux_oil_temp = INDICATOR_ALARM_STATUS_WARNING;
+//
+// my_indicator.rb_fu_failure = INDICATOR_ALARM_STATUS_FAILURE;
+
+ showMainPage();
+// wait(1);
+
+// wait(1);
+
+ my_time = timer.read();
+ printf("Time: %f Sec.\n", my_time);
+
+ TFT.Track( 3, 623, 234, 132, BUTTON_ACCEPT_ALARM_TAG);
+ TFT.Track(243, 623, 234, 132, BUTTON_ACCEPT_HORN_TAG);
+ TFT.Track( 5, 553, 115, 66, BUTTON_SET_TAG);
+ TFT.Track(360, 553, 115, 66, BUTTON_DIM_TAG);
+ TFT.Track( 10, 360, 220, 51, 100);
+ TFT.Track(250, 360, 220, 51, 101);
+
+ Timer touchTimer;
+ touchTimer.reset();
+ touchTimer.start();
+
+// setPumpRunningBlinkStatus(MAIN_SYSTEM, STEADY_RUNNING_ON);
+// setPumpRunningBlinkStatus(AUX_SYSTEM, BLINK_WARNING_ON);
+//
+// setAlarmBlinkStatus(MAIN_SYSTEM, OIL_PRESS, BLINK_FAILURE_ON);
+// setAlarmBlinkStatus(AUX_SYSTEM, HYDR_LOCK, BLINK_WARNING_ON);
+// setAlarmBlinkStatus(GLOBAL_SYSTEM, FU_FAILURE, BLINK_FAILURE_ON);
+
+ Timer minutes;
+ minutes.reset();
+ minutes.start();
+ uint32_t noOfMinutes = 0;
+
+ uint32_t secondCount = 0;
+ Timer seconds;
+ seconds.reset();
+ seconds.start();
+ Timer timerWdt;
+ timerWdt.reset();
+ timerWdt.start();
+ uint16_t tagvalOld = TAGVAL_NONE;
+ while(1) {
+ // Watch Dog Timer
+ if (timerWdt.read() >= 1.0f) {
+ timerWdt.reset();
+ wdt.Service();
+ TFT.SetTouchConfig(VAL_TOUCH_CONFIG);
+ }
+
+ // Print time (check stability)
+ if (minutes.read() >= 60.0f) {
+ minutes.reset();
+ noOfMinutes++;
+ secondsEpoch = time(NULL);
+ strftime(buffer, 32, "%a %d-%m-%Y %H:%M\n", localtime(&secondsEpoch));
+ printf("Time: %s", buffer);
+ }
+
+// uint16_t tagval = TFT.GetTouchedTag();
+ uint16_t tagval = TFT.GetTouchTag();
+
+ if(tagval != 0) { // touch -> get new values
+ uint16_t tagX = TFT.GetTouchTagX();
+ uint16_t tagY = TFT.GetTouchTagY();
+ uint16_t TouchConfig = TFT.GetTouchConfig();
+// printf("GetTouchTagXY %d %d\n", tagX, tagY);
+// uint16_t tagval1 = TFT.GetTouchedTag(1);
+ printf("GetTouchTagXY %d %d %04x\n", tagX, tagY, TouchConfig);
+ // The touch screen is touched, the tag value (touch-id) greater than 0
+ // However, we can ocasionally get random (invalid) touch id's
+ // Therfore we validate the touch duration times
+ // Valid touch events take about 0.15 Sec.
+ // Invalid touch events take very short, not longer than about 0.025 Sec.
+ // Now, we can also detect long press
+ my_time = touchTimer.read();
+// printf("d: %f\n", time);
+ if ((tagval != tagvalOld) && (my_time >= 0.035)) {
+ // Execute below only once, if the touched tag (touch-id) changed
+ printf("t %d\n", tagval);
+ processButtonPressed(tagval);
+ touchTimer.reset();
+ showMainPage();
+ tagvalOld = tagval;
+ wait(0.01);
+ }
+ }
+ else
+ {
+ // The touch screen is released, the tag value (touch-id) is 0
+ if (tagvalOld != TAGVAL_NONE) {
+ my_time = touchTimer.read();
+ printf("r: %f\n", my_time);
+ processButtonReleased();
+ showMainPage();
+ tagvalOld = TAGVAL_NONE;
+ wait(0.01);
+ }
+ }
+ updateAlarmLights();
+
+ // Create alarms at time intervals to test it
+ if (seconds.read() >= 1.0f) {
+ seconds.reset();
+ secondCount++;
+
+ if (secondCount == 2) {
+ setPumpRunningBlinkStatus(MAIN_SYSTEM, STEADY_RUNNING_ON);
+ }
+ if (secondCount == 4) {
+ setAlarmBlinkStatus(MAIN_SYSTEM, OIL_PRESS, BLINK_FAILURE_ON);
+ }
+ if (secondCount == 6) {
+ setAlarmBlinkStatus(AUX_SYSTEM, HYDR_LOCK, BLINK_WARNING_ON);
+ }
+ if (secondCount == 8) {
+ setAlarmBlinkStatus(GLOBAL_SYSTEM, FU_FAILURE, BLINK_FAILURE_ON);
+ }
+ if (secondCount == 10) {
+ setPumpRunningBlinkStatus(AUX_SYSTEM, STEADY_WARNING_ON);
+ }
+ if (secondCount == 12) {
+ setAlarmBlinkStatus(MAIN_SYSTEM, OIL_PRESS, STEADY_FAILURE_ON);
+ }
+ if (secondCount == 14) {
+ setAlarmBlinkStatus(AUX_SYSTEM, HYDR_LOCK, STEADY_WARNING_ON);
+ }
+ if (secondCount == 16) {
+ setAlarmBlinkStatus(GLOBAL_SYSTEM, FU_FAILURE, STEADY_FAILURE_ON);
+ }
+ if (secondCount == 18) {
+ setPumpInUse(PUMP_IN_USE_MAIN);
+ }
+ if (secondCount == 20) {
+ setAlarmBlinkStatus(GLOBAL_SYSTEM, FU_FAILURE, BLINK_FAILURE_ON);
+ }
+ }
+ wait(0.01);
+ }
+
+// wait (500);
+//}
+
+
+
+
+
+
+// printf("----------\n");
+// for (int i = 0; i < 4; i++)
+// {
+// printf("Show Bitmap from memory...\n");
+// timer.reset();
+// TFT.DLstart(); // start a new display command list
+//
+// TFT.DL(CLEAR_COLOR_RGB(0x21, 0x21, 0x21)); // set the clear color to white
+// TFT.DL(CLEAR(1, 1, 1)); // clear buffers -> color buffer,stencil buffer, tag buffer
+// TFT.DL(COLOR_RGB(0xff, 0xff, 0xff)); // set the clear color to white
+//
+//// TFT.DL(SAVE_CONTEXT());
+//// TFT.DL(BITMAP_HANDLE(0));
+//
+//// TFT.Png("/fs/BACKGROUND-01.png", 0, 0);
+//
+// // TFT.LoadIdentity();
+// TFT.DL(BEGIN(BITMAPS));
+//
+//
+// // Narrow On button, 100x132, Address 0-26400
+// TFT.ShowBitmap(1, ARGB4, 125, 20, 100, 132); // bitmap, x, y, w, h
+// // Narrow Off button, 100x132, Address 26400-52800
+// TFT.ShowBitmap(2, ARGB4, 20, 20, 100, 132); // bitmap, x, y, w, h
+// // Wide On button, 182x132, Address 52800-100848
+// TFT.ShowBitmap(3, ARGB4, 416, 20, 182, 132); // bitmap, x, y, w, h
+// // Wide Off button, 182x132, Address 100848-148896
+// TFT.ShowBitmap(4, ARGB4, 230, 20, 182, 132); // bitmap, x, y, w, h
+//
+//// TFT.DL(END());
+// TFT.DL(DISPLAY()); // Display the image (erases the other images!)
+// TFT.Swap(); // Swap the current display list
+// TFT.Flush_Co_Buffer(); // Download the command list into fifo
+// TFT.WaitCmdfifo_empty(); // Wait till coprocessor completes the operation
+// time = timer.read();
+// printf("Time: %f.\n", time);
+// wait(0.5);
+//
+//
+//
+// printf("Show Bitmap from memory...\n");
+// timer.reset();
+// TFT.DLstart(); // start a new display command list
+//
+// TFT.DL(CLEAR_COLOR_RGB(0x21, 0x21, 0x21)); // set the clear color to white
+// TFT.DL(CLEAR(1, 1, 1)); // clear buffers -> color buffer,stencil buffer, tag buffer
+// TFT.DL(COLOR_RGB(0xff, 0xff, 0xff)); // set the clear color to white
+//
+// TFT.DL(SAVE_CONTEXT());
+// TFT.DL(BITMAP_HANDLE(0));
+//
+// // TFT.LoadIdentity();
+// TFT.DL(BEGIN(BITMAPS));
+//
+// // Narrow On button, 100x132, Address 0-26400
+// TFT.ShowBitmap(1, ARGB4, 20, 20, 100, 132); // bitmap, x, y, w, h
+// // Narrow Off button, 100x132, Address 26400-52800
+// TFT.ShowBitmap(2, ARGB4, 125, 20, 100, 132); // bitmap, x, y, w, h
+// // Wide On button, 182x132, Address 52800-100848
+// TFT.ShowBitmap(3, ARGB4, 230, 20, 182, 132); // bitmap, x, y, w, h
+// // Wide Off button, 182x132, Address 100848-148896
+// TFT.ShowBitmap(4, ARGB4, 416, 20, 182, 132); // bitmap, x, y, w, h
+//
+//// TFT.DL(END());
+// TFT.DL(DISPLAY()); // Display the image (erases the other images!)
+// TFT.Swap(); // Swap the current display list
+// TFT.Flush_Co_Buffer(); // Download the command list into fifo
+// TFT.WaitCmdfifo_empty(); // Wait till coprocessor completes the operation
+// time = timer.read();
+// printf("Time: %f.\n", time);
+// wait(0.5);
+// }
+
+
+
+// printf("----------\n");
+// printf("Erase screen\n");
+// TFT.DLstart(); // start a new display command list
+// TFT.DL(CLEAR_COLOR_RGB(0x00, 0x00, 0x00)); // set the clear color to black
+// TFT.DL(CLEAR(1, 1, 1)); // clear buffers -> color buffer,stencil buffer, tag buffer
+// TFT.DL(COLOR_RGB(0xff, 0xff, 0xff)); // set the color to white
+// TFT.DL(DISPLAY()); // Display the image
+// TFT.Swap(); // Swap the current display list
+// TFT.Flush_Co_Buffer(); // Download the command list into fifo
+// TFT.WaitCmdfifo_empty(); // Wait till coprocessor completes the operation
+
+// printf("----------\n");
+// printf("JpgSplash...\n");
+// timer.reset();
+// TFT.JpgSplash("/fs/Damen-shipyards-logo_760x157.jpg", 0xff, 0xff, 0xff);
+// time = timer.read();
+// printf("Time: %f.\n", time);
+// wait(1);
+
+// printf("RGB DEMO START\n");
+// Start_Screen("RGB DEMO START"); // Show start screen
+// TFT.Calibrate(); // calibrate the touch screen
+// /* Set the tracker for the 3 sliders - define the Area for touching */
+// TFT.Track(131, 63, 330, 48, 1); // slider r
+// TFT.Track(131, 116, 330, 48, 2); // slider g
+// TFT.Track(131, 168, 330, 48, 3); // slider b
+// TFT.Flush_Co_Buffer(); // Download the commands into fifo
+// TFT.WaitCmdfifo_empty(); // Wait till coprocessor completes the operation
+// screen_2(r,g,b); // paint screen
+// /* the demo is updating the screen in a endless loop */
+// while(1) {
+// ft_uint8_t tagval = 0;
+// TrackRegisterVal = TFT.Rd32(REG_TRACKER); // check if one of the tree Slider is touched
+// tagval = TrackRegisterVal & 0xff;
+// if(0 != tagval) { // touch -> get new rgb value
+// if(1 == tagval) { // the red slider is touched
+// r = TrackRegisterVal>>16; // get the new value
+// r = r *255/65536; // scale it down to 255
+// } else if(2 == tagval) { // the green slider is touched
+// g = TrackRegisterVal>>16; // get new slider value
+// g = g * 255/65536; // scale it down to 255
+// } else if(3 == tagval) { // the blue slider is touched
+// b = TrackRegisterVal>>16; // get new slider value
+// b = b * 255/65536; // scale it down to 255
+// }
+// screen_2(r, g, b); // paint new screen
+// TFT.Sleep(10); // wait 10ms for next check
+// }
+// } // end of display loop
+
+
+
+// unsigned int color = 0;
+// unsigned int bright = 255;
+//// ft_uint32_t TrackRegisterVal = 0; // touch track
+// uint16_t TrackRegisterVal = 0; // touch track
+//
+//// printf("RGB DEMO2 START\n");
+//// Start_Screen("RGB DEMO2 START"); // Show start screen
+//
+//
+// /* Set the tracker for the dial - define the Area for touching */
+// printf("Set the tracker for the dial - define the Area for touching\n");
+//
+//
+// TFT.DL(TAG(2)); // assign TAG value 2
+// //TFT.FgColor(COLOR_RGB(0x00 ,0xff, 0x00)); // forground color green
+//
+// // TFT.Dial(249, 86, 55, 0, color); // dial for color
+// TFT.Track(249, 86, 1, 1, 1); // Dial - dimension 1,1 means rotary
+// // TFT.Slider(196, 215, 236, 21, 0, bright , 255); // slider for brightness
+// TFT.Track(179, 199, 277, 48, 2); // Slider
+// // TFT.Button(500, 63, 200, 50, 31, 0, "Test 1");
+// TFT.Track(500, 20, 200, 50, 3); // Button
+// TFT.Track(500, 80, 200, 50, 4); // Button
+// TFT.Track(500, 140, 200, 50, 5); // Button
+// TFT.Track(20, 290, 100, 132, 11); // Bitmap
+//
+// TFT.Flush_Co_Buffer(); // Download the commands into fifo
+// TFT.WaitCmdfifo_empty(); // Wait till coprocessor completes the operation
+// int tagoption1 = 0;
+// int tagoption2 = 0;
+// int tagoption3 = 0;
+// int tagoption4 = 0;
+// screen_1(color, bright, tagoption1, tagoption2, tagoption3, tagoption4); // paint screen
+// /* the demo is updating the screen in a endless loop */
+//
+// Timer t1;
+// t1.start();
+// t1.reset();
+//
+// tagoption1 = 0;
+// tagoption2 = 0;
+// tagoption3 = 0;
+// tagoption4 = 0;
+//// int tagvalOld = -1;
+// tagvalOld = -1;
+// while(1) {
+// ft_uint8_t tagval = 0;
+// TrackRegisterVal = TFT.Rd32(REG_TRACKER); // check if one of the tracking fields is touched
+// tagval = TrackRegisterVal & 0xff;
+// if(tagval != 0) { // touch -> get new values
+// if (tagval != tagvalOld) {
+// printf("t %d\n", tagval);
+// tagvalOld = tagval;
+// }
+// if(tagval == 1) { // the dial touched
+// color = TrackRegisterVal>>16; // get the new value
+// }
+// else if(tagval == 2) { // the slider is touched
+// bright = TrackRegisterVal>>16; // get new slider value
+// bright = bright * 255/65536; // scale it down to 255
+// TFT.SetBacklight(bright); // Brightness
+// }
+// else if(tagval == 3) { // the button is touched
+//// TFT.SetBacklight(63); // Brightness
+// tagoption1 = OPT_FLAT;
+// bright = 64;
+// TFT.SetBacklight(bright); // Brightness
+// }
+// else if(tagval == 4) { // the button is touched
+//// TFT.SetBacklight(63); // Brightness
+// tagoption2 = OPT_FLAT;
+// bright = 128;
+// TFT.SetBacklight(bright); // Brightness
+// }
+// else if(tagval == 5) { // the button is touched
+//// TFT.SetBacklight(63); // Brightness
+// tagoption3 = OPT_FLAT;
+// bright = 192;
+// TFT.SetBacklight(bright); // Brightness
+// }
+// else if(tagval == 8) { // the button is touched
+//// TFT.SetBacklight(63); // Brightness
+//// tagoption2 = OPT_FLAT;
+// bright = 171;
+// TFT.SetBacklight(bright); // Brightness
+// }
+// else if(tagval == 10) { // the button is touched
+//// TFT.SetBacklight(63); // Brightness
+//// tagoption3 = OPT_FLAT;
+// bright = 212;
+// TFT.SetBacklight(bright); // Brightness
+// }
+// else if(tagval == 11) { // the button is touched
+//// TFT.SetBacklight(63); // Brightness
+//// tagoption3 = OPT_FLAT;
+// tagoption4 = OPT_FLAT;
+// bright = 230;
+// TFT.SetBacklight(bright); // Brightness
+// }
+// screen_1(color, bright, tagoption1, tagoption2, tagoption3, tagoption4); // paint new screen
+// TFT.Sleep(10); // wait 10ms for next check
+// }
+// else
+// {
+// tagvalOld = -1;
+//// printf("Tagval %d, tagoption %d\n", tagval, tagoption);
+// if (tagoption1 != 0)
+// {
+// tagoption1 = 0;
+// screen_1(color, bright, tagoption1, tagoption2, tagoption3, tagoption4); // paint new screen
+// TFT.Sleep(10); // wait 10ms for next check
+// }
+// if (tagoption2 != 0)
+// {
+// tagoption2 = 0;
+// screen_1(color, bright, tagoption1, tagoption2, tagoption3, tagoption4); // paint new screen
+// TFT.Sleep(10); // wait 10ms for next check
+// }
+// if (tagoption3 != 0)
+// {
+// tagoption3 = 0;
+// screen_1(color, bright, tagoption1, tagoption2, tagoption3, tagoption4); // paint new screen
+// TFT.Sleep(10); // wait 10ms for next check
+// }
+// if (tagoption4 != 0)
+// {
+// tagoption4 = 0;
+// screen_1(color, bright, tagoption1, tagoption2, tagoption3, tagoption4); // paint new screen
+// TFT.Sleep(10); // wait 10ms for next check
+// }
+// }
+// } // end of display loop
+//
+// while(1) {
+// myled = !myled; // LED is ON
+// wait(0.5); // 500 ms
+// }
+//
+// fs.unmount();
+//
+// // Deinitialize the device
+// sd.deinit();
+
+ // Deinitialize the device
+// spif.deinit();
+
+ // Deinitialize the device
+// ee.deinit();
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.h Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,75 @@ +#ifndef __MAIN_H__ +#define __MAIN_H__ + +#include "FT_Platform.h" +#include "SDBlockDevice.h" +#include "FATFileSystem.h" +//#include "HeapBlockDevice.h" +#include "SPIFBlockDevice.h" +#include "I2CEEBlockDevice.h" +//#include "FRAMSPI.h" +#include "BurstSPI.h" +#include "NMEA0183.h" +#include "nmea_parser.h" +#include "WDT.h" +#include "I2CList.h" +#include "MCP79412.h" + +#define WDT_TIMEOUT (float) 20.0 + +#define BAUD_RATE 9600 +// NUCLEO-F746ZG +#define USB_TX SERIAL_TX // PD_8 USART3 TX +#define USB_RX SERIAL_RX // PD_9 USART3 RX + +#define BUFFER_SIZE 8192 + +//#define BUTTON_ACCEPT_ALARM_TAG 1 +//#define BUTTON_ACCEPT_HORN_TAG 2 +//#define BUTTON_SET_TAG 3 +//#define BUTTON_DIM_TAG 4 + +#define TFT_MOSI PA_7 +#define TFT_MISO PA_6 +#define TFT_SCLK PA_5 +#define TFT_CS PC_7 +#define TFT_INT PE_7 // PB_4 +#define TFT_PD PE_8 // PA_4 + +// Pinout on Nucleo-F746ZG +#define SD_MOSI PE_14 +#define SD_MISO PE_13 +#define SD_SCLK PE_12 +#define SD_CS PE_11 + +#define SF_MOSI PB_15 +#define SF_MISO PC_2 +#define SF_SCLK PB_13 +#define SF_CS PB_12 + +#define EE_SDA PB_9 +#define EE_SCL PB_8 +#define EE_ADDR 0xA0 +#define EE_SIZE 32*1024 +#define EE_BLOCK_SIZE 16 + +#define MBED_CONF_SD_SPI_TRANSFER_FREQ 40000000 + + + +extern Serial pc; +extern WDT wdt; +extern DigitalOut myled; +extern FT813 TFT; +extern SDBlockDevice sd; +extern SPIFBlockDevice spif; +extern I2CEEBlockDevice ee; +extern FATFileSystem fs; +extern NMEA0183 nmea0183; + + +//Serial pc(USBTX, USBRX); +//DigitalOut myled(LED1); +//FT813 TFT(TFT_MOSI, TFT_MISO, TFT_SCLK, TFT_CS, TFT_INT, TFT_PD); // mosi, miso, sck, ss, int, pd // the FT813 is connected to SPI 11-13 + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-os.lib Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/mbed-os/#50bd61a4a72332baa6b1bac6caccb44dc5423309
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed_lib.json Mon Jul 23 12:32:19 2018 +0000
@@ -0,0 +1,216 @@
+{
+ "name": "sd",
+ "config": {
+ "SPI_CS": "NC",
+ "SPI_MOSI": "NC",
+ "SPI_MISO": "NC",
+ "SPI_CLK": "NC",
+ "DEVICE_SPI": 1,
+ "FSFAT_SDCARD_INSTALLED": 1,
+ "CMD_TIMEOUT": 10000,
+ "CMD0_IDLE_STATE_RETRIES": 5,
+ "SD_INIT_FREQUENCY": 100000
+ },
+ "target_overrides": {
+ "DISCO_F051R8": {
+ "SPI_MOSI": "SPI_MOSI",
+ "SPI_MISO": "SPI_MISO",
+ "SPI_CLK": "SPI_SCK",
+ "SPI_CS": "SPI_CS"
+ },
+ "DISCO_L475VG_IOT01A": {
+ "SPI_MOSI": "SPI_MOSI",
+ "SPI_MISO": "SPI_MISO",
+ "SPI_CLK": "SPI_SCK",
+ "SPI_CS": "SPI_CS"
+ },
+ "DISCO_L476VG": {
+ "SPI_MOSI": "PE_15",
+ "SPI_MISO": "PE_14",
+ "SPI_CLK": "PE_13",
+ "SPI_CS": "PE_12"
+ },
+ "K20D50M": {
+ "SPI_MOSI": "PTD2",
+ "SPI_MISO": "PTD3",
+ "SPI_CLK": "PTD1",
+ "SPI_CS": "PTC2"
+ },
+ "KL22F": {
+ "SPI_MOSI": "PTD6",
+ "SPI_MISO": "PTD7",
+ "SPI_CLK": "PTD5",
+ "SPI_CS": "PTD4"
+ },
+ "KL25Z": {
+ "SPI_MOSI": "PTD2",
+ "SPI_MISO": "PTD3",
+ "SPI_CLK": "PTD1",
+ "SPI_CS": "PTD0"
+ },
+ "KL43Z": {
+ "SPI_MOSI": "PTD6",
+ "SPI_MISO": "PTD7",
+ "SPI_CLK": "PTD5",
+ "SPI_CS": "PTD4"
+ },
+ "KL46Z": {
+ "SPI_MOSI": "PTD6",
+ "SPI_MISO": "PTD7",
+ "SPI_CLK": "PTD5",
+ "SPI_CS": "PTD4"
+ },
+ "K64F": {
+ "SPI_MOSI": "PTE3",
+ "SPI_MISO": "PTE1",
+ "SPI_CLK": "PTE2",
+ "SPI_CS": "PTE4"
+ },
+ "K66F": {
+ "SPI_MOSI": "PTE3",
+ "SPI_MISO": "PTE1",
+ "SPI_CLK": "PTE2",
+ "SPI_CS": "PTE4"
+ },
+ "LPC11U37H_401": {
+ "SPI_MOSI": "SDMOSI",
+ "SPI_MISO": "SDMISO",
+ "SPI_CLK": "SDSCLK",
+ "SPI_CS": "SDSSEL"
+ },
+ "LPC2368": {
+ "SPI_MOSI": "p11",
+ "SPI_MISO": "p12",
+ "SPI_CLK": "p13",
+ "SPI_CS": "p14"
+ },
+ "NUCLEO_F411RE": {
+ "SPI_MOSI": "PC_3",
+ "SPI_MISO": "PC_2",
+ "SPI_CLK": "PC_7",
+ "SPI_CS": "PB_9"
+ },
+ "NUCLEO_F429ZI": {
+ "SPI_MOSI": "PC_12",
+ "SPI_MISO": "PC_11",
+ "SPI_CLK": "PC_10",
+ "SPI_CS": "PA_15"
+ },
+ "DISCO_F429ZI": {
+ "SPI_MOSI": "PC_12",
+ "SPI_MISO": "PC_11",
+ "SPI_CLK": "PC_10",
+ "SPI_CS": "PA_15"
+ },
+ "NUCLEO_F746ZG": {
+ "device_has": ["QSPI"],
+ "SPI_MOSI": "PE_14",
+ "SPI_MISO": "PE_13",
+ "SPI_CLK": "PE_12",
+ "SPI_CS": "PE_11"
+ },
+ "NUCLEO_F767ZI": {
+ "device_has": ["QSPI"],
+ "SPI_MOSI": "PC_12",
+ "SPI_MISO": "PC_11",
+ "SPI_CLK": "PC_10",
+ "SPI_CS": "PA_15"
+ },
+ "NUCLEO_L031K6": {
+ "SPI_MOSI": "SPI_MOSI",
+ "SPI_MISO": "SPI_MISO",
+ "SPI_CLK": "SPI_SCK",
+ "SPI_CS": "SPI_CS"
+ },
+ "NUCLEO_L476RG": {
+ "SPI_MOSI": "SPI_MOSI",
+ "SPI_MISO": "SPI_MISO",
+ "SPI_CLK": "SPI_SCK",
+ "SPI_CS": "SPI_CS"
+ },
+ "NUMAKER_PFM_M453": {
+ "SPI_MOSI": "PD_13",
+ "SPI_MISO": "PD_14",
+ "SPI_CLK": "PD_15",
+ "SPI_CS": "PD_12"
+ },
+ "NUMAKER_PFM_M487": {
+ "SPI_MOSI": "D11",
+ "SPI_MISO": "D12",
+ "SPI_CLK": "D13",
+ "SPI_CS": "D10"
+ },
+ "NUMAKER_PFM_NUC472": {
+ "SPI_MOSI": "PF_0",
+ "SPI_MISO": "PD_15",
+ "SPI_CLK": "PD_14",
+ "SPI_CS": "PD_13"
+ },
+ "nRF51822": {
+ "SPI_MOSI": "p12",
+ "SPI_MISO": "p13",
+ "SPI_CLK": "p15",
+ "SPI_CS": "p14"
+ },
+ "UBLOX_C030_U201": {
+ "SPI_MOSI": "D11",
+ "SPI_MISO": "D12",
+ "SPI_CLK": "D13",
+ "SPI_CS": "D10"
+ },
+ "UBLOX_EVK_ODIN_W2": {
+ "SPI_CS": "D9",
+ "SPI_MOSI": "D11",
+ "SPI_MISO": "D12",
+ "SPI_CLK": "D13"
+ },
+ "MTB_UBLOX_ODIN_W2": {
+ "SPI_CS": "PG_4",
+ "SPI_MOSI": "PE_14",
+ "SPI_MISO": "PE_13",
+ "SPI_CLK": "PE_12"
+ },
+ "RZ_A1H": {
+ "SPI_MOSI": "P8_5",
+ "SPI_MISO": "P8_6",
+ "SPI_CLK": "P8_3",
+ "SPI_CS": "P8_4"
+ },
+ "GR_LYCHEE": {
+ "SPI_MOSI": "P5_6",
+ "SPI_MISO": "P5_7",
+ "SPI_CLK": "P5_4",
+ "SPI_CS": "P5_5"
+ },
+ "HEXIWEAR": {
+ "SPI_MOSI": "PTE3",
+ "SPI_MISO": "PTE1",
+ "SPI_CLK": "PTE2",
+ "SPI_CS": "PTE4"
+ },
+ "MTB_MTS_DRAGONFLY": {
+ "SPI_MOSI": "SPI2_MOSI",
+ "SPI_MISO": "SPI2_MISO",
+ "SPI_CLK": "SPI2_SCK",
+ "SPI_CS": "SPI_CS2"
+ },
+ "TB_SENSE_12": {
+ "SPI_MOSI": "PC6",
+ "SPI_MISO": "PC7",
+ "SPI_CLK": "PC8",
+ "SPI_CS": "PC9"
+ },
+ "LPC1768": {
+ "SPI_MOSI": "p5",
+ "SPI_MISO": "p6",
+ "SPI_CLK": "p7",
+ "SPI_CS": "p8"
+ },
+ "REALTEK_RTL8195AM": {
+ "SPI_MOSI": "D11",
+ "SPI_MISO": "D12",
+ "SPI_CLK": "D13",
+ "SPI_CS": "D9"
+ }
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nmea_parser.lib Mon Jul 23 12:32:19 2018 +0000 @@ -0,0 +1,1 @@ +http://os.mbed.com/users/tylerjw/code/nmea_parser/#a6e1707fdec0