Works
Dependencies: BMP180 BNO055_fusion Fonts GPSISR HTU21D SDFileSystem UniGraphic mbed uGUI
Fork of Bicycl_Computer_NUCLEO-F411RE by
main.cpp@14:4f0ebc5a4f00, 2017-03-03 (annotated)
- Committer:
- trevieze
- Date:
- Fri Mar 03 02:56:25 2017 +0000
- Revision:
- 14:4f0ebc5a4f00
- Parent:
- 13:1a9c0f9d7128
- Child:
- 15:b174ec6e3ca0
Replaced the BNO055 Library with a more complete one from Github.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Rhyme | 0:cd5e3d371b54 | 1 | /* mbed main.cpp to test adafruit 2.8" TFT LCD shiled w Touchscreen |
Rhyme | 0:cd5e3d371b54 | 2 | * Copyright (c) 2014, 2015 Motoo Tanaka @ Design Methodology Lab |
Rhyme | 0:cd5e3d371b54 | 3 | * |
Rhyme | 0:cd5e3d371b54 | 4 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
Rhyme | 0:cd5e3d371b54 | 5 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
Rhyme | 0:cd5e3d371b54 | 6 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
Rhyme | 0:cd5e3d371b54 | 7 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
Rhyme | 0:cd5e3d371b54 | 8 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
Rhyme | 0:cd5e3d371b54 | 9 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
Rhyme | 0:cd5e3d371b54 | 10 | * THE SOFTWARE. |
Rhyme | 0:cd5e3d371b54 | 11 | */ |
Rhyme | 0:cd5e3d371b54 | 12 | |
Rhyme | 0:cd5e3d371b54 | 13 | /* |
Rhyme | 0:cd5e3d371b54 | 14 | * Note: This program is derived from the SeeeStudioTFTv2 program. |
Rhyme | 0:cd5e3d371b54 | 15 | * Although both program share same ILI9341 TFT driver, |
Rhyme | 0:cd5e3d371b54 | 16 | * the touch sensor was not same with the Display I purchased from Akizuki. |
Rhyme | 0:cd5e3d371b54 | 17 | * http://akizukidenshi.com/catalog/g/gM-07747/ |
Rhyme | 0:cd5e3d371b54 | 18 | * The touch sensor on the display is STMPE610, |
Rhyme | 0:cd5e3d371b54 | 19 | * so I hacked the minimum spi driver for it (polling mode only). |
Rhyme | 0:cd5e3d371b54 | 20 | */ |
Rhyme | 0:cd5e3d371b54 | 21 | |
Rhyme | 0:cd5e3d371b54 | 22 | #include "mbed.h" |
Rhyme | 0:cd5e3d371b54 | 23 | #include <math.h> |
Rhyme | 0:cd5e3d371b54 | 24 | #include "ILI9341.h" |
trevieze | 2:c5085faf2aa5 | 25 | #include "SeeedStudioTFTv2.h" |
trevieze | 6:6eb4b9322931 | 26 | #include "BNO055.h" |
trevieze | 6:6eb4b9322931 | 27 | #include "HTU21D.h" |
trevieze | 6:6eb4b9322931 | 28 | #include "BMP180.h" |
trevieze | 8:8aa9cdab4a07 | 29 | #include "SDFileSystem.h" |
trevieze | 8:8aa9cdab4a07 | 30 | #include "GPSISR.h" |
trevieze | 13:1a9c0f9d7128 | 31 | #include "nav.h" |
trevieze | 9:855884782f67 | 32 | |
trevieze | 6:6eb4b9322931 | 33 | |
trevieze | 11:869a102dd31c | 34 | #include "ArialR16x17.h" |
trevieze | 11:869a102dd31c | 35 | #include "Arial24x23i.h" |
trevieze | 11:869a102dd31c | 36 | #include "Arial28x28.h" |
trevieze | 11:869a102dd31c | 37 | #include "Neu44x36.h" |
trevieze | 11:869a102dd31c | 38 | #include "SCProSB31x55.h" |
Rhyme | 0:cd5e3d371b54 | 39 | #include "Arial12x12.h" |
trevieze | 11:869a102dd31c | 40 | #include "ArialR20x20.h" |
Rhyme | 0:cd5e3d371b54 | 41 | |
trevieze | 8:8aa9cdab4a07 | 42 | //#define PIN_CS_TSC PA_9 |
trevieze | 8:8aa9cdab4a07 | 43 | //#define PIN_TSC_INTR PA_8 |
Rhyme | 0:cd5e3d371b54 | 44 | #define PIN_RESET_TFT PC_13 /* place holder */ |
trevieze | 8:8aa9cdab4a07 | 45 | //ILI9341 SPI PINS |
trevieze | 1:e265e7245ab8 | 46 | #define PIN_XP A3 |
trevieze | 1:e265e7245ab8 | 47 | #define PIN_XM A1 |
trevieze | 1:e265e7245ab8 | 48 | #define PIN_YP A2 |
trevieze | 1:e265e7245ab8 | 49 | #define PIN_YM A0 |
trevieze | 8:8aa9cdab4a07 | 50 | #define PIN_MOSI_SPI1 D11 //SPI 1 MOSI |
trevieze | 8:8aa9cdab4a07 | 51 | #define PIN_MISO_SPI1 D12 //SPI 1 MISO |
trevieze | 8:8aa9cdab4a07 | 52 | #define PIN_SCLK_SPI1 D13 //SPI 1 SLCK |
trevieze | 8:8aa9cdab4a07 | 53 | #define PIN_CS_SPI1 D5 // SPI CS D10 Was D5 |
trevieze | 1:e265e7245ab8 | 54 | #define PIN_DC_TFT D6 |
trevieze | 1:e265e7245ab8 | 55 | #define PIN_CS_SD D4 |
trevieze | 6:6eb4b9322931 | 56 | #define PIN_RESET D7 |
trevieze | 8:8aa9cdab4a07 | 57 | // SD Card on GPS shield PINS |
trevieze | 8:8aa9cdab4a07 | 58 | #define PIN_MOSI_SPI3 PB_15 //SPI 1 MOSI |
trevieze | 8:8aa9cdab4a07 | 59 | #define PIN_MISO_SPI3 PB_14 //SPI 1 MISO |
trevieze | 8:8aa9cdab4a07 | 60 | #define PIN_SCLK_SPI3 PB_13 //SPI 1 SLCK |
trevieze | 8:8aa9cdab4a07 | 61 | #define PIN_CS_SPI3 D2 // SPI CS |
trevieze | 8:8aa9cdab4a07 | 62 | #define PIN_RX_GPS PA_12 //GPS Shield RX pin |
trevieze | 8:8aa9cdab4a07 | 63 | #define PIN_TX_GPS PA_11 //GPS Shield TX pin |
trevieze | 8:8aa9cdab4a07 | 64 | |
trevieze | 11:869a102dd31c | 65 | #define PI 3.14159265358979f |
trevieze | 11:869a102dd31c | 66 | |
Rhyme | 0:cd5e3d371b54 | 67 | #define DEVICE_NAME "F411RE" |
Rhyme | 0:cd5e3d371b54 | 68 | |
Rhyme | 0:cd5e3d371b54 | 69 | #ifndef TARGET_NECLEO_F411RE |
Rhyme | 0:cd5e3d371b54 | 70 | #define TARGET_NECLEO_F411RE |
Rhyme | 0:cd5e3d371b54 | 71 | #endif |
Rhyme | 0:cd5e3d371b54 | 72 | |
trevieze | 7:b78ff34209e5 | 73 | //DigitalOut backlight(PB_3) ; |
trevieze | 6:6eb4b9322931 | 74 | // DigitalOut tsc_cs(PA_9, 1) ; |
trevieze | 6:6eb4b9322931 | 75 | // DigitalOut tft_cs(PB_6, 1) ; |
Rhyme | 0:cd5e3d371b54 | 76 | |
trevieze | 8:8aa9cdab4a07 | 77 | Serial pc(USBTX, USBRX); |
trevieze | 8:8aa9cdab4a07 | 78 | |
trevieze | 6:6eb4b9322931 | 79 | // Display |
Rhyme | 0:cd5e3d371b54 | 80 | ILI9341 TFT(SPI_8, 10000000, |
trevieze | 8:8aa9cdab4a07 | 81 | PIN_MOSI_SPI1, PIN_MISO_SPI1, PIN_SCLK_SPI1, |
trevieze | 8:8aa9cdab4a07 | 82 | PIN_CS_SPI1, PIN_RESET_TFT, PIN_DC_TFT, "Adafruit2.8") ; |
trevieze | 6:6eb4b9322931 | 83 | |
trevieze | 6:6eb4b9322931 | 84 | // TouchScreen |
trevieze | 2:c5085faf2aa5 | 85 | TouchScreen TSC(PIN_XP, PIN_XM, PIN_YP, PIN_YM); |
Rhyme | 0:cd5e3d371b54 | 86 | |
trevieze | 6:6eb4b9322931 | 87 | // 3 Axis IMU |
trevieze | 14:4f0ebc5a4f00 | 88 | BNO055 imu(I2C_SDA, I2C_SCL); // New Library Adafruit |
trevieze | 6:6eb4b9322931 | 89 | |
trevieze | 6:6eb4b9322931 | 90 | // Humidity and Temperature |
trevieze | 11:869a102dd31c | 91 | HTU21D humid(I2C_SDA, I2C_SCL); |
trevieze | 6:6eb4b9322931 | 92 | |
trevieze | 6:6eb4b9322931 | 93 | // Pressure |
trevieze | 7:b78ff34209e5 | 94 | BMP180 bmp180(I2C_SDA, I2C_SCL); |
trevieze | 6:6eb4b9322931 | 95 | |
trevieze | 8:8aa9cdab4a07 | 96 | // SD Card Reader On Adafruit GPS Shield |
trevieze | 8:8aa9cdab4a07 | 97 | SDFileSystem sd(PIN_MOSI_SPI3, PIN_MISO_SPI3, PIN_SCLK_SPI3, PIN_CS_SPI3, "sd"); // the pinout on the mbed Cool Components workshop board |
trevieze | 8:8aa9cdab4a07 | 98 | |
trevieze | 9:855884782f67 | 99 | // Set up serial interrupe service handler for gps characters. |
trevieze | 8:8aa9cdab4a07 | 100 | GPS MyGPS(PIN_TX_GPS,PIN_RX_GPS, 9600); |
trevieze | 9:855884782f67 | 101 | |
trevieze | 13:1a9c0f9d7128 | 102 | //Navigation Class. |
trevieze | 13:1a9c0f9d7128 | 103 | NAV nav; |
trevieze | 13:1a9c0f9d7128 | 104 | double plat = 42.826420; |
trevieze | 13:1a9c0f9d7128 | 105 | double plon = -84.219413; |
trevieze | 13:1a9c0f9d7128 | 106 | |
trevieze | 11:869a102dd31c | 107 | void Draw_Compass_Rose(void); |
trevieze | 11:869a102dd31c | 108 | void arrow(int x2, int y2, int x1, int y1, int alength, int awidth, int colour); |
Rhyme | 0:cd5e3d371b54 | 109 | |
trevieze | 11:869a102dd31c | 110 | const int centreX = 120; |
trevieze | 11:869a102dd31c | 111 | const int centreY = 150; |
trevieze | 11:869a102dd31c | 112 | const int radius = 40; |
trevieze | 12:49600de70963 | 113 | float last_dx; |
trevieze | 12:49600de70963 | 114 | float last_dy; |
Rhyme | 0:cd5e3d371b54 | 115 | |
Rhyme | 0:cd5e3d371b54 | 116 | int main() |
Rhyme | 0:cd5e3d371b54 | 117 | { |
trevieze | 10:a3cb458d7b1c | 118 | TFT.BusEnable(true) ; |
trevieze | 10:a3cb458d7b1c | 119 | TFT.FastWindow(true) ; |
trevieze | 10:a3cb458d7b1c | 120 | wait(0.1); |
trevieze | 10:a3cb458d7b1c | 121 | TFT.cls(); |
trevieze | 10:a3cb458d7b1c | 122 | wait(0.1); |
trevieze | 8:8aa9cdab4a07 | 123 | Timer refresh_Timer; //sets up a timer for use in loop; how often do we print GPS info? |
trevieze | 10:a3cb458d7b1c | 124 | const int refresh_Time = 2000; //refresh time in ms |
trevieze | 8:8aa9cdab4a07 | 125 | refresh_Timer.start(); //starts the clock on the timer |
trevieze | 8:8aa9cdab4a07 | 126 | //backlight = 0 ; |
trevieze | 11:869a102dd31c | 127 | TFT.set_font((unsigned char*) Arial24x23i); |
trevieze | 10:a3cb458d7b1c | 128 | TFT.fillrect(2, 2, 237, 317, White); |
trevieze | 10:a3cb458d7b1c | 129 | TFT.foreground(Blue); |
trevieze | 10:a3cb458d7b1c | 130 | TFT.background(White); |
trevieze | 10:a3cb458d7b1c | 131 | wait(0.1); |
trevieze | 13:1a9c0f9d7128 | 132 | |
trevieze | 11:869a102dd31c | 133 | Draw_Compass_Rose(); |
trevieze | 11:869a102dd31c | 134 | |
trevieze | 8:8aa9cdab4a07 | 135 | while (1) { |
trevieze | 11:869a102dd31c | 136 | |
trevieze | 14:4f0ebc5a4f00 | 137 | TFT.set_font((unsigned char*) ArialR20x20); |
trevieze | 14:4f0ebc5a4f00 | 138 | //check if we recieved a new message from GPS, if so, attempt to parse it, |
trevieze | 8:8aa9cdab4a07 | 139 | if (refresh_Timer.read_ms() >= refresh_Time) { |
trevieze | 8:8aa9cdab4a07 | 140 | refresh_Timer.reset(); |
trevieze | 10:a3cb458d7b1c | 141 | |
trevieze | 14:4f0ebc5a4f00 | 142 | if (bmp180.init() != 0) { |
trevieze | 14:4f0ebc5a4f00 | 143 | //pc.printf("Error communicating with BMP180\n"); |
trevieze | 14:4f0ebc5a4f00 | 144 | } else { |
trevieze | 14:4f0ebc5a4f00 | 145 | //pc.printf("Initialized BMP180\n"); |
trevieze | 14:4f0ebc5a4f00 | 146 | bmp180.startTemperature(); |
trevieze | 14:4f0ebc5a4f00 | 147 | wait(0.1); // Wait for conversion to complete |
trevieze | 14:4f0ebc5a4f00 | 148 | float temp; |
trevieze | 14:4f0ebc5a4f00 | 149 | if(bmp180.getTemperature(&temp) != 0) { |
trevieze | 14:4f0ebc5a4f00 | 150 | //pc.printf("Error getting temperature\n"); |
trevieze | 14:4f0ebc5a4f00 | 151 | } |
trevieze | 14:4f0ebc5a4f00 | 152 | //pc.printf("Temperature is : %f", temp); |
trevieze | 14:4f0ebc5a4f00 | 153 | TFT.locate(4, 26) ; |
trevieze | 14:4f0ebc5a4f00 | 154 | TFT.printf("%.1fF", ((temp* 9.0) / 5.0 + 32)); |
trevieze | 14:4f0ebc5a4f00 | 155 | } |
trevieze | 14:4f0ebc5a4f00 | 156 | int ftemp = humid.sample_ftemp(); |
trevieze | 14:4f0ebc5a4f00 | 157 | int humidity = humid.sample_humid(); |
trevieze | 14:4f0ebc5a4f00 | 158 | TFT.locate(140, 26) ; |
trevieze | 14:4f0ebc5a4f00 | 159 | TFT.printf("%d%%RH",humidity); |
trevieze | 14:4f0ebc5a4f00 | 160 | //pc.printf("HTU21D Temp: %d",ftemp); |
trevieze | 14:4f0ebc5a4f00 | 161 | //pc.printf("HTU21D Humidity: %d",humidity); |
trevieze | 12:49600de70963 | 162 | |
trevieze | 14:4f0ebc5a4f00 | 163 | if (imu.check() == 0){ |
trevieze | 14:4f0ebc5a4f00 | 164 | pc.printf("Bosch BNO055 is NOT avirable!!\r\n"); |
trevieze | 14:4f0ebc5a4f00 | 165 | } else { |
trevieze | 14:4f0ebc5a4f00 | 166 | //printf("Cal %d", imu.read_calib_status()); |
trevieze | 14:4f0ebc5a4f00 | 167 | imu.get_calib(); |
trevieze | 14:4f0ebc5a4f00 | 168 | if (imu.cal.system > 0x0){ |
trevieze | 14:4f0ebc5a4f00 | 169 | TFT.foreground(White); |
trevieze | 14:4f0ebc5a4f00 | 170 | TFT.locate(4, 260) ; |
trevieze | 14:4f0ebc5a4f00 | 171 | TFT.printf("No Data"); |
trevieze | 14:4f0ebc5a4f00 | 172 | TFT.foreground(Blue); |
trevieze | 14:4f0ebc5a4f00 | 173 | imu.get_angles(); |
trevieze | 14:4f0ebc5a4f00 | 174 | TFT.locate(4, 260) ; |
trevieze | 14:4f0ebc5a4f00 | 175 | TFT.printf("%.1f",imu.euler.yaw); |
trevieze | 14:4f0ebc5a4f00 | 176 | //pc.printf("H %.1f",euler_angles.h); |
trevieze | 14:4f0ebc5a4f00 | 177 | //pc.printf("R %.1f",euler_angles.r); |
trevieze | 14:4f0ebc5a4f00 | 178 | //pc.printf("P %.1f",euler_angles.p); |
trevieze | 14:4f0ebc5a4f00 | 179 | |
trevieze | 11:869a102dd31c | 180 | } else { |
trevieze | 14:4f0ebc5a4f00 | 181 | TFT.locate(4, 260) ; |
trevieze | 14:4f0ebc5a4f00 | 182 | TFT.printf("No Data"); |
trevieze | 14:4f0ebc5a4f00 | 183 | } |
trevieze | 14:4f0ebc5a4f00 | 184 | } |
trevieze | 12:49600de70963 | 185 | |
trevieze | 14:4f0ebc5a4f00 | 186 | float angle = int(imu.euler.yaw); // * 180/PI); // Convert radians to degrees for more a more usual result |
trevieze | 14:4f0ebc5a4f00 | 187 | // For the screen -X = up and +X = down and -Y = left and +Y = right, so does not follow coordinate conventions |
trevieze | 14:4f0ebc5a4f00 | 188 | float dx = (0.7*radius * cos((angle-90)*PI/180)) + centreX; // calculate X position for the screen coordinates - can be confusing! |
trevieze | 11:869a102dd31c | 189 | float dy = (0.7*radius * sin((angle-90)*PI/180)) + centreY; // calculate Y position for the screen coordinates - can be confusing! |
trevieze | 11:869a102dd31c | 190 | arrow(last_dx,last_dy, centreX, centreY, 2,2,White); // Erase last arrow |
trevieze | 11:869a102dd31c | 191 | arrow(dx,dy, centreX, centreY, 2, 2,Blue); // Draw arrow in new position |
trevieze | 11:869a102dd31c | 192 | last_dx = dx; |
trevieze | 11:869a102dd31c | 193 | last_dy = dy; |
trevieze | 11:869a102dd31c | 194 | |
trevieze | 10:a3cb458d7b1c | 195 | if (MyGPS.dataready()) { |
trevieze | 10:a3cb458d7b1c | 196 | MyGPS.read(); |
trevieze | 11:869a102dd31c | 197 | //pc.printf("NMEA has valid data"); |
trevieze | 11:869a102dd31c | 198 | //pc.printf("Sats : %d \n", MyGPS.buffer.satellites); |
trevieze | 11:869a102dd31c | 199 | //pc.printf("%d-%d-%d\n", MyGPS.buffer.month, MyGPS.buffer.day, MyGPS.buffer.year); |
trevieze | 11:869a102dd31c | 200 | //pc.printf("%d:%d:%d\n", MyGPS.buffer.hours, MyGPS.buffer.minutes, MyGPS.buffer.seconds); |
trevieze | 10:a3cb458d7b1c | 201 | |
trevieze | 14:4f0ebc5a4f00 | 202 | TFT.foreground(White); |
trevieze | 14:4f0ebc5a4f00 | 203 | TFT.locate(4, 2) ; |
trevieze | 14:4f0ebc5a4f00 | 204 | TFT.printf("No Data"); |
trevieze | 11:869a102dd31c | 205 | TFT.foreground(Blue); |
trevieze | 11:869a102dd31c | 206 | TFT.locate(4, 2) ; |
trevieze | 10:a3cb458d7b1c | 207 | TFT.printf("%d-%d-%d", MyGPS.buffer.month, MyGPS.buffer.day, MyGPS.buffer.year); |
trevieze | 14:4f0ebc5a4f00 | 208 | TFT.locate(4, 50) ; |
trevieze | 14:4f0ebc5a4f00 | 209 | double waypoint = nav.CalculateDistance(MyGPS.buffer.latitude,MyGPS.buffer.longitude,plat,plon)/double(1609.344); |
trevieze | 14:4f0ebc5a4f00 | 210 | TFT.printf("%.1fMI From Perry", waypoint); |
trevieze | 11:869a102dd31c | 211 | TFT.locate(140, 2) ; |
trevieze | 10:a3cb458d7b1c | 212 | TFT.printf("%d:%d:%d", MyGPS.buffer.hours, MyGPS.buffer.minutes, MyGPS.buffer.seconds); |
trevieze | 14:4f0ebc5a4f00 | 213 | TFT.locate(140, 260) ; |
trevieze | 11:869a102dd31c | 214 | TFT.printf("%.1fft", MyGPS.buffer.altitude/0.3048); |
trevieze | 14:4f0ebc5a4f00 | 215 | TFT.locate(4, 280) ; |
trevieze | 14:4f0ebc5a4f00 | 216 | int degree; |
trevieze | 14:4f0ebc5a4f00 | 217 | int minutes; |
trevieze | 14:4f0ebc5a4f00 | 218 | int seconds; |
trevieze | 14:4f0ebc5a4f00 | 219 | degree = (int)abs(MyGPS.buffer.longitude); |
trevieze | 13:1a9c0f9d7128 | 220 | minutes = (int) ( (abs(MyGPS.buffer.longitude) - (double)degree) * 60.0); |
trevieze | 13:1a9c0f9d7128 | 221 | seconds = (int) ( (abs(MyGPS.buffer.longitude) - (double)degree - (double)minutes / 60.0) * 60.0 * 60.0 ); |
trevieze | 13:1a9c0f9d7128 | 222 | TFT.printf("%d %d' %d\" %c lon", degree, minutes,seconds, MyGPS.buffer.lonc); |
trevieze | 14:4f0ebc5a4f00 | 223 | TFT.locate(4, 300) ; |
trevieze | 13:1a9c0f9d7128 | 224 | degree = (int)abs(MyGPS.buffer.latitude); |
trevieze | 13:1a9c0f9d7128 | 225 | minutes = (int) ( (abs(MyGPS.buffer.latitude) - (double)degree) * 60.0); |
trevieze | 13:1a9c0f9d7128 | 226 | seconds = (int) ( (abs(MyGPS.buffer.latitude) - (double)degree - (double)minutes / 60.0) * 60.0 * 60.0 ); |
trevieze | 13:1a9c0f9d7128 | 227 | TFT.printf("%d %d' %d\" %c lat", degree, minutes,seconds, MyGPS.buffer.latc); |
trevieze | 14:4f0ebc5a4f00 | 228 | TFT.set_font((unsigned char*) SCProSB31x55); |
trevieze | 11:869a102dd31c | 229 | TFT.locate(120, 200) ; |
trevieze | 11:869a102dd31c | 230 | TFT.printf("%.1f", MyGPS.buffer.speed); |
trevieze | 14:4f0ebc5a4f00 | 231 | |
trevieze | 14:4f0ebc5a4f00 | 232 | //pc.printf("Dist to Perry %.4f ", nav.CalculateDistance(MyGPS.buffer.latitude,MyGPS.buffer.longitude,plat,plon)); |
trevieze | 13:1a9c0f9d7128 | 233 | |
trevieze | 9:855884782f67 | 234 | } |
trevieze | 9:855884782f67 | 235 | else { |
trevieze | 14:4f0ebc5a4f00 | 236 | TFT.locate(4, 2) ; |
trevieze | 14:4f0ebc5a4f00 | 237 | TFT.printf("No Data"); |
trevieze | 11:869a102dd31c | 238 | //pc.printf("NMEA has no valid data"); |
trevieze | 9:855884782f67 | 239 | } |
trevieze | 8:8aa9cdab4a07 | 240 | } |
trevieze | 8:8aa9cdab4a07 | 241 | } |
trevieze | 11:869a102dd31c | 242 | } |
trevieze | 11:869a102dd31c | 243 | |
trevieze | 11:869a102dd31c | 244 | void arrow(int x2, int y2, int x1, int y1, int alength, int awidth, int colour) { |
trevieze | 11:869a102dd31c | 245 | float distance; |
trevieze | 11:869a102dd31c | 246 | int dx, dy, x2o,y2o,x3,y3,x4,y4,k; |
trevieze | 11:869a102dd31c | 247 | distance = sqrt(pow((double)(x1 - x2),2) + pow((double)(y1 - y2), 2)); |
trevieze | 11:869a102dd31c | 248 | dx = x2 + (x1 - x2) * alength / distance; |
trevieze | 11:869a102dd31c | 249 | dy = y2 + (y1 - y2) * alength / distance; |
trevieze | 11:869a102dd31c | 250 | k = awidth / alength; |
trevieze | 11:869a102dd31c | 251 | x2o = x2 - dx; |
trevieze | 11:869a102dd31c | 252 | y2o = dy - y2; |
trevieze | 11:869a102dd31c | 253 | x3 = y2o * k + dx; |
trevieze | 11:869a102dd31c | 254 | y3 = x2o * k + dy; |
trevieze | 11:869a102dd31c | 255 | x4 = dx - y2o * k; |
trevieze | 11:869a102dd31c | 256 | y4 = dy - x2o * k; |
trevieze | 11:869a102dd31c | 257 | TFT.line(x1, y1, x2, y2, colour); |
trevieze | 11:869a102dd31c | 258 | TFT.line(x1, y1, dx, dy, colour); |
trevieze | 11:869a102dd31c | 259 | TFT.line(x3, y3, x4, y4, colour); |
trevieze | 11:869a102dd31c | 260 | TFT.line(x3, y3, x2, y2, colour); |
trevieze | 11:869a102dd31c | 261 | TFT.line(x2, y2, x4, y4, colour); |
trevieze | 13:1a9c0f9d7128 | 262 | TFT.set_font((unsigned char*) Arial12x12); |
trevieze | 12:49600de70963 | 263 | TFT.foreground(Blue); |
trevieze | 12:49600de70963 | 264 | TFT.background(White); |
trevieze | 13:1a9c0f9d7128 | 265 | TFT.locate((centreX-2),(centreY-24)); |
trevieze | 12:49600de70963 | 266 | TFT.printf("N"); |
trevieze | 12:49600de70963 | 267 | TFT.locate((centreX-2),(centreY+17)); |
trevieze | 12:49600de70963 | 268 | TFT.printf("S"); |
trevieze | 12:49600de70963 | 269 | TFT.locate((centreX+19),(centreY-3)); |
trevieze | 12:49600de70963 | 270 | TFT.printf("E"); |
trevieze | 12:49600de70963 | 271 | TFT.locate((centreX-23),(centreY-3)); |
trevieze | 12:49600de70963 | 272 | TFT.printf("W"); |
trevieze | 13:1a9c0f9d7128 | 273 | TFT.set_font((unsigned char*) ArialR20x20); |
trevieze | 11:869a102dd31c | 274 | } |
Rhyme | 0:cd5e3d371b54 | 275 | |
trevieze | 11:869a102dd31c | 276 | void Draw_Compass_Rose(void) { |
trevieze | 11:869a102dd31c | 277 | int dxo, dyo, dxi, dyi; |
trevieze | 11:869a102dd31c | 278 | TFT.circle(centreX,centreY,radius,Blue); // Draw compass circle |
trevieze | 11:869a102dd31c | 279 | for (float i = 0; i <360; i = i + 22.5) { |
trevieze | 11:869a102dd31c | 280 | dxo = radius * cos(i*3.14/180); |
trevieze | 11:869a102dd31c | 281 | dyo = radius * sin(i*3.14/180); |
trevieze | 11:869a102dd31c | 282 | dxi = dxo * 0.95; |
trevieze | 11:869a102dd31c | 283 | dyi = dyo * 0.95; |
trevieze | 11:869a102dd31c | 284 | TFT.line(dxi+centreX,dyi+centreY,dxo+centreX,dyo+centreY,Blue); |
trevieze | 11:869a102dd31c | 285 | } |
trevieze | 11:869a102dd31c | 286 | TFT.set_font((unsigned char*) Arial12x12); |
trevieze | 11:869a102dd31c | 287 | TFT.foreground(Blue); |
trevieze | 11:869a102dd31c | 288 | TFT.background(White); |
trevieze | 11:869a102dd31c | 289 | TFT.locate((centreX-2),(centreY-24)); |
trevieze | 11:869a102dd31c | 290 | TFT.printf("N"); |
trevieze | 11:869a102dd31c | 291 | TFT.locate((centreX-2),(centreY+17)); |
trevieze | 11:869a102dd31c | 292 | TFT.printf("S"); |
trevieze | 11:869a102dd31c | 293 | TFT.locate((centreX+19),(centreY-3)); |
trevieze | 11:869a102dd31c | 294 | TFT.printf("E"); |
trevieze | 11:869a102dd31c | 295 | TFT.locate((centreX-23),(centreY-3)); |
trevieze | 11:869a102dd31c | 296 | TFT.printf("W"); |
trevieze | 10:a3cb458d7b1c | 297 | } |