STM32L476

Dependencies:   MbedJSONValue SDFileSystem WConstants mbed-dev DS1820 TinyGPSPlus epd1in54

Fork of A_SSL_Main by SilentSensors

main.cpp

Committer:
WaleedElmughrabi
Date:
2018-08-30
Revision:
6:d30c8e8678c9
Parent:
5:4525141f69d2
Child:
8:bc5a3b2ff424

File content as of revision 6:d30c8e8678c9:

#include "mbed.h"
#include "stm32l496g_discovery.h"
#include "stm32l496g_discovery_lcd.h"
#include "stm32l496g_discovery_sd.h"
#include "DS1820.h"
#include "epd1in54.h"
#include "stdio.h"
#include "math.h"
#include "TinyGPSPlus.h"
#include "SDFileSystem.h"
#include "errno.h"


#define TX5 PG_7
#define RX5 PG_8
#define GPSBaud 9600
#define Serial0Baud 115200
#define SD_FILE_SYSTEM_H   
SDFileSystem*       fs;
FILE*               fp;



Serial GPSSerial(TX5, RX5);
TinyGPSPlus tgps;

void displayInfo(void);

int i = 0;



//DS18B20 temperature sensor
 Serial serial(USBTX, USBRX);
 DS1820  ds1820(PG_15);    //pin name connected to the DS1820 data pin
 float t;
 float tempSerial;
 float tCompare = 0;
 int ab=1;
 
  SDFileSystem sd(PI_3, PC_2, PD_3, PB_12, "sd");
 
//E-ink Display
// Control
PinName rst;
PinName dc;
PinName busy;
//SPI communication
PinName mosi;
PinName miso;
PinName sclk;
PinName cs;
unsigned char frame_black[EPD_HEIGHT*EPD_WIDTH/8];


//function to determine if within polygon geofence 
//first argument is an integer, the rest are floats
//The last vertix should be the same as the first vertix
int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy)
{
  int i, j, c = 0;
  for (i = 0, j = nvert-1; i < nvert; j = i++) {
    if ( ((verty[i]>testy) != (verty[j]>testy)) &&
     (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
       c = !c;
  }
  return c;
}


int inCircle(float radius, float xcentre, float ycentre, float testx, float testy)
{
    float distance;
    int test;
    distance = (sqrt((testx-xcentre)*(testx-xcentre)+(testy-ycentre)*(testy-ycentre)));
       
     if(distance < radius){
            test = 1;
            }
        else{
            test = 0;
            }
  return (test);
}

//GPS acquisition
void displayInfo(void)
{
  serial.printf("Location: "); 
  if (tgps.location.isValid())
  {
    serial.printf("%3.6f, %3.6f", tgps.location.lat(), tgps.location.lng());
  }
  else
  {
    serial.printf("INVALID");
  }

  serial.printf(" - Date/Time: ");
  if (tgps.date.isValid())
  {
    serial.printf("%d/", tgps.date.year());
    if (tgps.date.month() < 10) serial.printf("0");
    serial.printf("%d/", tgps.date.month());
    if (tgps.date.day() < 10) serial.printf("0");
    serial.printf("%d", tgps.date.day());
  }
  else
  {
    serial.printf("INVALID");
  }

  serial.printf(" ");
  if (tgps.time.isValid())
  {
    if (tgps.time.hour() < 10) serial.printf("0");
    serial.printf("%d:", tgps.time.hour());
    if (tgps.time.minute() < 10) serial.printf("0");
    serial.printf("%d:", tgps.time.minute());
    if (tgps.time.second() < 10) serial.printf("0");
    serial.printf("%d\r\n", tgps.time.second());
  }
  else
  {
    serial.printf("INVALID\r\n");
  }
}


float getTemp()
{
    float t;
    // getTemp(tRead);
    if(ds1820.begin()) {
        ds1820.startConversion();
        wait(1.0);
        t = ds1820.read();         // read temperature
        tCompare;
        serial.printf("temp = %3.1f\r\n", t);     // Display temp on terminal

    } else
        serial.printf("No DS1820 sensor found!\r\n");



    
    mosi = PB_5;
    miso = PB_4;
    sclk = PA_5;
    cs = PA_15;
    rst = PI_6;
    dc = PG_6;
    busy = PI_11;

    char cVal[32];
    //char* t_str;
    sprintf(cVal,"%.2f", t);
    
    
     
    memset(frame_black, 0xFF, sizeof(unsigned char)*EPD_HEIGHT*EPD_WIDTH/8);
    Epd epd = Epd(mosi, miso, sclk, cs, dc, rst, busy);
    
    
    if (epd.Init(lut_full_update) != 0) {
        return -1;
    }
    /*Write strings to the buffer */
    epd.DrawStringAt(frame_black, 50, 30, cVal, &Font24, COLORED);
    epd.DrawStringAt(frame_black, 28, 10, "Temperature", &Font16, COLORED);
    /* Display the frame_buffer */
    epd.SetFrameMemory(frame_black, 0, 0, epd.width, epd.height);
    epd.DisplayFrame();
    epd.Sleep();
    return t;
}

int sdCard()
{
//SD card
    // Create and mount SDFileSystem
    /*fs = new SDFileSystem(PI_3, PC_2, PD_3, PB_12, "sd"); // mosi, miso, sck, cs
    serial.printf("Mounting file system...\r\n");
    int err = fs->mount();
    serial.printf("%s\r\n", (err ? "Failed :(\r\n" : "OK\r\n"));
    if (err)
        return err;
    
    // Open the file.
    serial.printf("Opening file '/sd/mytest/sdtest.txt'... ");
    fp = fopen("/sd/mytest/sdtest.txt", "w+");
    serial.printf("%s\r\n", (!fp ? "Failed :(\r\n" : "OK\r\n"));
    
    if (!fp) {
        // Check whether directory '/sd/mytest' exists.
        serial.printf("\r\nChecking directory '/sd/mytest'...\r\n");
        struct stat info;
        err = stat("/sd/mytest", &info);
        if (err) {
            serial.printf("Directory '/sd/mytest' does not exist.\r\n");
            serial.printf("Trying to create it...");
            err = mkdir("/sd/mytest", 0777);
            serial.printf("%s\r\n", (err ? "Failed :(\r\n" : "OK\r\n"));
            if (err)
                return err;
        }

        // Create a new 'sdtest.txt' file.
        serial.printf("File not found, creating a new one...\r\n");
        fp = fopen("/sd/mytest/sdtest.txt", "w+");
        serial.printf("%s\r\n", (!fp ? "Failed :(" : "OK"));
        if (!fp) {
            error("error: %s (%d)\r\n", strerror(errno), -errno);
            return errno;
        }
    }
    for (int i = 0; i < 10; i++) {
        serial.printf("Writing numbers (%d/%d)... ", i, 10);
        err = fprintf(fp, "    %d\r\n", i);
        if (err < 0) {
            serial.printf("Fail :(\r\n");
            error("error: %s (%d)\r\n", strerror(errno), -errno);
        } else
            serial.printf("OK\r\n");
    }

    serial.printf("Writing numbers (%d/%d)... OK\r\n\r\n", 10, 10);
    err = fclose(fp);
    serial.printf("Closing file '/sd/mytest/sdtest.txt'... ");
    //serial.printf("%s\r\n", (err ? "Failed :(\r\n" : "OK\r\n"));
    //if (err)
      //  return err;
        */
         //Mount the filesystem
      sd.mount();
 
      //Perform a write test
      printf("\nWriting to SD card...");
      FILE *fp = fopen("/sd/sdtest.txt", "w");
      if (fp != NULL) {
          fprintf(fp, "We're writing to an SD card!");
          fclose(fp);
          printf("success!\n");
      } else {
          printf("failed!\n");
      }
 
      //Perform a read test
      printf("Reading from SD card...");
      fp = fopen("/sd/sdtest.txt", "r");
      if (fp != NULL) {
          char c = fgetc(fp);
          if (c == 'W')
              printf("success!\n");
          else
             printf("incorrect char (%c)!\n", c);
          fclose(fp);
     } else {
          printf("failed!\n");
      }
 
      //Unmount the filesystem
      sd.unmount();
 
       
}

int main()
{
    GPSSerial.baud(GPSBaud);
    wait(0.001);
    
    
    

    //Variables
    int inpoly;
    float x[5] = { 1,4,4,1,1};
    float y[5] = { 1,1,4,4,1};
    float xtest; 
    float ytest;
    float cx = 1;
    float cy = 50;
    float r = 15;
    int ans = 0;
    float liquidTemp = 0;
 
    wait(2);
    
 
  while(1){ 
    //inCircle(r, cx, cy, xtest, ytest);
    //serial.printf("rx =  0x%02X\n", aRxBuffer);
    //tempSerial = getTemp(t);
    //inpoly = pnpoly(5,x, y, xtest,ytest);
    //serial.printf("inpoly = %d\r\n", inpoly);
    //ans = inCircle(r, cx, cy, xtest, ytest);
    //serial.printf("distance = %3.1f\r\n", ans);
   // GPS
   //if(gps.sample()){
     //         serial.printf("%f\t%c\t%f\t%c\t%f\t%f\t%f\n\r",gps.longitude, gps.ns,gps.latitude,gps.ew, gps.alt, gps.geoid, gps.time);
     //         serial.printf("%d:%d:%d",gps.hour,gps.minute,gps.seconed);
     //       }
   sdCard();
   while(1) {
        //wait (1);

        
        if (tgps.encode(GPSSerial.getc()))
        {
            displayInfo();
            xtest = tgps.location.lng();
            ytest = tgps.location.lat();
            serial.printf("\r\n %3.6f, %3.6f, \r\n", ytest, xtest);
            ans = inCircle(r, cx, cy, xtest, ytest);
            wait(5); //little delay to prevent double writing
            liquidTemp = getTemp();
            serial.printf("\r\n In geofence = %d: \r\n", ans);
           
        }

        if (millis() > 5000 && tgps.charsProcessed() < 10)
        {
            serial.printf("No GPS detected: check wiring.\r\n");
//            while(true);
            break;
        }
        

      }
      serial.printf("%d\r\n",i);
      i++;
      wait(1.0);
    }

    
    wait(5);
  }