Subversion Repositories dashGPS

Rev

Rev 15 | Rev 18 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #include "main.h"
  2. #include "libNMEA/nmea.h"
  3. #include <cstring>
  4. #include "libOLED/stm32_halDisplay.H"
  5. #include "libOLED/fontclass.H"
  6. #include "libOLED/displayDial.H"
  7.  
  8. #include "libBMP280/bmp280.h"
  9.  
  10. #include "libSmallPrintf/small_printf.h"
  11.  
  12. #if defined USB_DEVICE
  13. #include "usbd_cdc_if.h"
  14. #endif
  15.  
  16. namespace
  17. {
  18.   int const WIDTH = 128;
  19.   int const HEIGHT = 64;
  20.   int const DISPLAY_RAMWIDTH = 132;
  21.  
  22. }
  23.  
  24. float speedMPH = 0.0;
  25. float speedAVG = 0.0;
  26. int speedTimer  = 0;
  27. float speedDist = 0.0;
  28.  
  29.  
  30. int heading = 0;
  31. Location loc;
  32.  
  33. uint32_t lastTick = 0;
  34. int32_t temp32 = 0;
  35. uint32_t pres32 = 0;
  36. int32_t rslt;
  37.  
  38. uint8_t displayBuffer[dataSize (WIDTH, HEIGHT)];
  39.  
  40. stm32_halDisplay_t display1 (WIDTH, HEIGHT, DISPLAY_RAMWIDTH, displayBuffer,
  41.                              &hspi1,
  42.  
  43.                              SPI_CD_GPIO_Port,
  44.                              SPI_CD_Pin,
  45.                              SPI_RESET_GPIO_Port,
  46.                              SPI_RESET_Pin,
  47.                              SPI_NSS1_GPIO_Port,
  48.                              SPI_NSS1_Pin);
  49.  
  50. displayDial_t dial (display1, 96, 32, 32, 180);
  51.  
  52. extern "C" void
  53. cc_init ()
  54. {
  55.   display1.reset ();
  56.  
  57.   display1.init ();
  58.   display1.clearDisplay ();
  59.  
  60.   dial.draw_scale (0, 360, 8, 1, 45);
  61.  
  62.   display1.display ();
  63.  
  64.   memset (loc.time, '-', 6);
  65. }
  66.  
  67. char fontBuf[] = "01234567";
  68. extern "C" void
  69. cc_run (struct bmp280_dev *bmp)
  70.  
  71. {
  72.  
  73.   display1.clearDisplay ();
  74.   dial.draw_scale (0, 360, 8, 1, 45);
  75.  
  76.   bool stat = updateLocation (&loc, &uc1);
  77.   if (loc.good)
  78.     {
  79.       heading = loc.heading;
  80.  
  81.       loc.good = false;
  82.     }
  83.   if (loc.valid == 'V')
  84.     memset (loc.time, '-', 6);
  85.  
  86.  
  87.  
  88.   // print out the GMT time at the top of the screen
  89.   display1.gotoxy (0, 0);
  90.   display1.printString (small_font, &loc.time[0], 2, WHITE);
  91.   display1.printString (small_font, ":", 1, WHITE);
  92.   display1.printString (small_font, &loc.time[2], 2, WHITE);
  93.  
  94.   display1.printString (small_font, ":", 1, WHITE);
  95.   display1.printString (small_font, &loc.time[4], 2, WHITE);
  96.   int dial_ang = heading + 180;
  97.   dial.draw_needle (dial_ang);
  98.  
  99.   display1.gotoxy (70, 25);
  100.   if (loc.valid == 'A')
  101.     {
  102.       display1.fontDigits (large_font, 3, -1, heading);
  103.     }
  104.   else
  105.     display1.printString (large_font, "GPS?", 4, WHITE);
  106.  
  107.   if (loc.valid == 'A')
  108.     speedMPH = loc.speed / 1.815;
  109.  
  110.   display1.gotoxy (0, 8);
  111.   display1.printString (small_font, "Speed", 5, WHITE);
  112.   display1.gotoxy (0, 16);
  113.   display1.fontDigits (large_font, 4, 1, speedMPH * 10);
  114.  
  115.   display1.gotoxy (0, 32);
  116.   display1.printString (small_font, "Average", 7, WHITE);
  117.   display1.gotoxy (0, 40);
  118.   display1.fontDigits (large_font, 4, 1, speedAVG * 10);
  119.  
  120.   struct bmp280_uncomp_data ucomp_data;
  121.  
  122.   if (HAL_GetTick () - lastTick > 100)
  123.     {
  124.       lastTick = HAL_GetTick ();
  125.       /* Reading the raw data from sensor */
  126.       rslt = bmp280_get_uncomp_data (&ucomp_data, bmp);
  127.  
  128.       if (rslt == BMP280_OK)
  129.         {
  130.           /* Getting the 32 bit compensated temperature */
  131.           rslt = bmp280_get_comp_temp_32bit (&temp32, ucomp_data.uncomp_temp,
  132.                                              bmp);
  133.  
  134.           rslt = bmp280_get_comp_pres_32bit (&pres32, ucomp_data.uncomp_press,
  135.                                              bmp);
  136.  
  137. #if defined USB_DEVICE
  138. /*
  139.           *  $--XDR,a,x.x,a,c--c, ..... *hh<CR><LF> \\
  140.  
  141.               Field Number:
  142.               1) Transducer Type
  143.               2) Measurement Data
  144.               3) Units of measurement
  145.               4) Name of transducer
  146.               x) More of the same
  147.               n) Checksum
  148.  
  149.               Example:
  150.               $IIXDR,C,19.52,C,TempAir*19
  151.               $IIXDR,P,1.02481,B,Barometer*29
  152.  
  153.               Currently, OpenCPN recognizes the following transducers:
  154.  
  155.           Measured Value | Transducer Type | Measured Data   | Unit of measure | Transducer Name
  156.           ------------------------------------------------------------------------------------------------------
  157.           barometric     | "P" pressure    | 0.8..1.1 or 800..1100           | "B" bar         | "Barometer"
  158.           air temperature| "C" temperature |   2 decimals                    | "C" celsius     | "TempAir" or "ENV_OUTAIR_T"
  159.           pitch          | "A" angle       |-180..0 nose down 0..180 nose up | "D" degrees     | "PTCH" or "PITCH"
  160.           rolling        | "A" angle       |-180..0 L         0..180 R       | "D" degrees     | "ROLL"
  161.           water temp     | "C" temperature |   2 decimals                    | "C" celsius     | "ENV_WATER_T"
  162. */
  163.           // compile a logger message over USB
  164.            char buffer[200];
  165.            int cnt = small_sprintf(buffer,"$MJXDR,C,%ld.%02ld,C,AirTemp,P,%01ld.%05ld,B,AirPres",temp32/100,temp32%100,pres32/100000,pres32%100000);
  166.            uint8_t sum=0;
  167.            for(int i=1; i<cnt; i++)
  168.              sum += buffer[i];
  169.            cnt+= small_sprintf(buffer+cnt,"*%02X\n",sum);
  170.  
  171.            CDC_Transmit_FS(reinterpret_cast<uint8_t*>(&buffer[0]),cnt);
  172. #endif
  173.  
  174.         }
  175.     }
  176.   display1.gotoxy (0, 56);
  177.   display1.printString (small_font, "T", 2, WHITE);
  178.   display1.fontDigits (small_font, 4, 1, temp32/10, WHITE);
  179.   display1.printString (small_font, " P", 2, WHITE);
  180.   display1.fontDigits (small_font, 5, 0, pres32/100, WHITE);
  181.   display1.printString (small_font, " ", 1, WHITE);
  182.  
  183.  
  184.   display1.display ();
  185.  
  186. }
  187.