ok

Sensors.cpp

Committer:
RoddyRod
Date:
2019-12-27
Revision:
0:ea630d259217

File content as of revision 0:ea630d259217:

#include "Sensors.h"

using namespace std;

void init_sensors(GPS_I2C &myGPS_I2C, LSM9DS1 &myIMU)
{
    /*    if (myGPS_I2C.begin() == false) printf("Module failed to respond. Please check wiring. \r\n");
        else                            printf("GPS module found!\r\n");

        if (myIMU.begin() == false)     printf("Failed to communicate with LSM9DS1.\r\n");
        else                            printf("LSM9DS1 found.\r\n");*/

    myGPS_I2C.begin();

    myIMU.begin();
    myIMU.calibrate();
}

void read_imu(LSM9DS1 &myIMU)
{
    if (myIMU.gyroAvailable()) {
        myIMU.readGyro();
        //printf("gyro: %d %d %d\n\r" , myIMU.gx, myIMU.gy, myIMU.gz);
    }

    if (myIMU.magAvailable()) {
        myIMU.readMag();
        //printf("mag: %d %d %d\n\r", myIMU.mx, myIMU.my, myIMU.mz);
    }

    if (myIMU.tempAvailable()) {
        myIMU.readTemp();
        //printf("temp: %d \n\r"    , myIMU.temperature);
    }

    if (myIMU.accelAvailable()) {
        myIMU.readAccel();
        //printf("accel: %d %d %d\n\n\r", myIMU.ax, myIMU.ay, myIMU.az);
    }
}


void is_available(Is_sensor& is_sensor, LSM9DS1 &myIMU)
{
    is_sensor.gyro  = myIMU.gyroAvailable();
    is_sensor.mag   = myIMU.magAvailable();
    is_sensor.temp  = myIMU.tempAvailable();
    is_sensor.accel = myIMU.accelAvailable();
    printf("is_gyro : %d \r\n, is_mag : %d \r\n, is_temp : %d \r\n, is_accel : %d \r\n", is_sensor.gyro, is_sensor.mag, is_sensor.temp, is_sensor.accel);
}


void read_gps(GPS_I2C &myGPS_I2C, Gps_info &info)
{
    char    sentences[2048];
    char    rmc_sentence[2048];
    int     char_number = 0;

    while (myGPS_I2C.available()) { //available() returns the number of new bytes available from the GPS module
        char incoming = myGPS_I2C.read(); //Read the latest byte from Qwiic GPS
        if(incoming == '$') {
            sentences[char_number] = '\n';
            char_number++;
            sentences[char_number] = '\r';

        }
        sentences[char_number] = incoming;
        char_number++;
    }

    search_word(sentences, rmc_sentence);

    //GNRMC Parsing
    //Gps_info rmc;
    RMC_parsing(rmc_sentence, info);
    /*    cout << "time = "           << rmc.time << "\r\n";
        cout << "status = "         << rmc.status << "\r\n";
        cout << "latitude = "       << rmc.latitude << "\r\n";
        cout << "N/S indicator = "  << rmc.NS_indicator << "\r\n";
        cout << "longitude = "      << rmc.longitude << "\r\n";
        cout << "E/W indicator = "  << rmc.EW_indicator << "\r\n";
        cout << "Speed = "          << rmc.speed << "\r\n";
        cout << "Course = "         << rmc.course << "\r\n";
        cout << "Date = "           << rmc.date << "\r\n";
        cout << "Mode = "           << rmc.mode << "\r\n";*/
}


void  search_word(char sentences[MAX_PACKET_SIZE] , char one_sentence[MAX_PACKET_SIZE])
{
    char *s = strstr(sentences, "$GNRMC");

    if (s != NULL) {                   // if successful then s now points at "$GNRMC"
        //printf("Found string at index = %d\r\n", s - sentences);
        strcpy(one_sentence, s);
        /*        printf("RMC Sentence : \r\n");
                printf("%s", one_sentence);
                printf("\r\n");*/
    }                                  // index of "sentence_to_find" in buff can be found by pointer subtraction
    else {
        printf("String not found\r\n");  // `strstr` returns NULL if search string not found
    }
}

void  RMC_parsing(char *rmc_sentence, Gps_info &rmc)
{
    size_t rmc_field=0;
    rmc.time.clear();
    rmc.latitude.clear();
    rmc.longitude.clear();
    rmc.speed.clear();
    rmc.course.clear();
    rmc.date.clear();
    
    for(size_t i=0; i < MAX_PACKET_SIZE; i++) {
        while(rmc_sentence[i] == ',') {
            rmc_field++;
            i++;
        }

        switch (rmc_field) {
            case 1:
                rmc.time.push_back(rmc_sentence[i]);
                break;

            case 2:
                rmc.status = rmc_sentence[i];
                break;

            case 3:
                rmc.latitude.push_back(rmc_sentence[i]);
                break;

            case 4:
                rmc.NS_indicator = rmc_sentence[i];
                break;

            case 5:
                rmc.longitude.push_back(rmc_sentence[i]);
                break;

            case 6:
                rmc.EW_indicator = rmc_sentence[i];
                break;

            case 7:
                rmc.speed.push_back(rmc_sentence[i]);
                break;

            case 8:
                rmc.course.push_back(rmc_sentence[i]);
                break;

            case 9:
                rmc.date.push_back(rmc_sentence[i]);
                break;

            case 10:
                rmc.mode = rmc_sentence[i];
                break;

            default:
                break;
        }
    }
}