Working firmware for simultaneous LiDAR and Magnetometer data retrieval over ethernet.

Dependencies:   EthernetInterface FXOS8700Q LidarLite mbed-rtos mbed

main.cpp

Committer:
jakelarsen17
Date:
2015-12-10
Revision:
0:ade62dde274b

File content as of revision 0:ade62dde274b:

/*
#include "mbed.h"

DigitalOut gpo(D0);
DigitalOut led(LED_RED);

int main()
{
    while (true) {
        gpo = !gpo; // toggle pin
        led = !led; // toggle led
        wait(0.2f);
    }
}
*/

// MalletFirmware, this is the real deal version
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *      
 *         
 *          Pinout for FRDM-k64f                                    
 *                                  J2
 *                                  X X 
 *                                  X X 
 *                                  X X 
 *          J3                      X X GND
 *          X X                     X X SCLK
 *          X X                     X X MISO
 *          X X                     X X MOSI
 *          X X                     X X CS
 *          X X                 GND X X 
 *      GND X X                     X X 
 *      GND X X                         
 *     5Vin X X                     J1  
 *                                  X X 
 *          J4                      X X motorA
 *          X X                     X X motorB
 *     mic1 X X                     X X 
 *     mic2 X X                     X X 
 *          X X                     X X 
 *          X X               quadA X X 
 *          X X               quadB X X Painter 1
 *  
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
#include "mbed.h"
#include <string>

//LiDAR
#include "LidarLite.h"
#define LIDARLite1_SDA PTC11   //SDA pin 
#define LIDARLite1_SCL PTC10  //SCL pin 

//Magnetometer
#include "FXOS8700Q.h"
FXOS8700Q_mag mag( PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // Proper Ports and I2C Address for K64F Freedom board
MotionSensorDataUnits mag_data;
MotionSensorDataCounts mag_raw;

// Hardware delays
#include "pause.cpp"

// Ethernet
#include "EthernetInterface.h"

#include <stdio.h>
#include "PeripheralNames.h"
#include "PeripheralPins.h"

// Settings for each mallet
#define NUM         9            // this number identifies the mallet and is a value between 1-7, (8 or 9 for the painters)
#define PORT        (55000+NUM)  // set to a random port number.  All the mallets can use the same port number.
#define MAX_CLIENTS  2           // set the max number of clients to at least 2 (first client is MATLAB, second is the distance unit)
#define DEBUG        0           // '1' enables debug statements printed through serial port at baud 230400, '0' disables

// Ethernet
#define LEN_PACKET 1460
//#define N_PACKET (TOTAL_SAMPLES/LEN_PACKET)
#define GATEWAY "169.254.99.1" // set to match your computer
#define MASK "255.255.0.0"      // set to match your computer (probably does already)
#define IP_LAPTOP "169.254.99.103"

#define IP "169.254.99.139"

// Status reporting

// data good flags?

// DMA status flag?

// for debug purposes
Serial pc(USBTX, USBRX);
#if DEBUG
#define DEBUG_PRINT(x) pc.printf(x)
#else
#define DEBUG_PRINT(x) do {} while(0)
#endif
DigitalOut led_red(LED_RED);
DigitalOut led_green(LED_GREEN);
DigitalOut led_blue(LED_BLUE);
DigitalOut paint(D0);

LidarLite sensor1(LIDARLite1_SDA, LIDARLite1_SCL); //Define LIDAR Lite sensor 1
Timer dt;
float distance;

float fmX, fmY, fmZ;
int16_t rmX, rmY, rmZ;

char buffer[LEN_PACKET]; // general purpose tx/rx buffer

// Declaration of functions
void clearBuffer();

using namespace std;
 
int main() {
    led_blue = 1;
    led_green = 1;
    led_red = 0;
    
    pc.baud(230400);
    mag.enable();
    dt.start();
    
    pc.printf("Starting M%i\r\n",NUM);
    DEBUG_PRINT("HELLO\r\n");
    // Give everything lower priority
    for(int i = 0; i < 86; i++) 
    {
        if(NVIC_GetPriority((IRQn_Type) i) == 0) NVIC_SetPriority((IRQn_Type) i, 2);
    }
    
    // Give hardware associated with 
    // sampling the highest priority
    NVIC_SetPriority(ADC1_IRQn,0);
    NVIC_SetPriority(ADC0_IRQn,0);
    NVIC_SetPriority(PDB0_IRQn,0);
    NVIC_SetPriority(DMA0_IRQn,0);
    NVIC_SetPriority(DMA1_IRQn,0);
    NVIC_SetPriority(DMA2_IRQn,0);
    
    NVIC_SetPriority(ENET_1588_Timer_IRQn,1);
    NVIC_SetPriority(ENET_Transmit_IRQn,1);
    NVIC_SetPriority(ENET_Receive_IRQn,1);
    NVIC_SetPriority(ENET_Error_IRQn,1);
    
    
    // The ethernet setup must be within the first few lines of code, otherwise the program hangs
    EthernetInterface interface;
    interface.init(IP, MASK, GATEWAY);
    interface.connect();
    
    led_green = 0;
    
    pc.printf("IP Address is: %s\n\r", interface.getIPAddress());
    pc.printf("Port is: %i\n\r", PORT);
    ENET_TIPG = 0x08; // minimum time between TCP packets
    
    // ethernet setup failed for some reason.  Flash yellow light then uC resets itself
    if(interface.getIPAddress() == 0)
    {
        for(int i = 0; i < 5; i++)
        {
            // flash yellow LED
            led_red = 0;
            led_green = 0;
            pause_ms(500);
            led_red = 1;
            led_green = 1;
            pause_ms(1000);
        }
        NVIC_SystemReset();
    }

    
    TCPSocketServer server;
    server.bind(PORT);
    server.listen(MAX_CLIENTS);
        
    led_green = 1;
    led_red = 1;
    led_blue = 1;
    pc.printf("Server started\r\n");
   
    while(true) { // tcp connect/disconnect loop
        
        TCPSocketConnection laptop;
        server.accept(laptop);
        laptop.set_blocking(false, 9000); // timeout after 9s
        
        bool ipVerified = true;
        string ipAddress = laptop.get_address();
        if(ipAddress != IP_LAPTOP) ipVerified = false;
        int n;
        while(true) { // rx/tx loop
            n = laptop.receive(buffer,LEN_PACKET); // this operation times out after 1.5s
            if(n <= 0) break; // exit rx/tx loop
            
            if(!ipVerified){
                clearBuffer();
                sprintf(buffer,"Incorrect IP address");
                n = laptop.send(buffer,LEN_PACKET);
                pc.printf("%s\r\n");
                break; // exit rx/tx loop
            }
            
            if(buffer[0] == ':' && ipVerified) {
                /*
                if(n == 2){
                    if(buffer[1] == '.'){
                        paint = 1;
                        pause_ms(100);
                        paint = 0;
                    }
                    else if(buffer[1] == '-'){
                        paint = 1;
                        pause_ms(300);
                        paint = 0;
                    }
                }
                */
                
                //dt.start();
          
                /*
                pc.printf("range: %d cm, velocity: %d cm/s, rate: %.2f Hz\n", sensor1.getRange_cm(), sensor1.getVelocity_cms(), 1/dt.read());
                dt.reset();
                */
                
                if(n == 2){
                    if(buffer[1] == 'l'){
                        sensor1.refreshRangeVelocity();
                        //distance = double(sensor1.getRange_cm())*.393701;
                        //pc.printf("Distance: %f in\r\n", float(sensor1.getRange_cm())*.393701);
                        clearBuffer();    
                        sprintf(buffer, "Distance: %f inches", float(sensor1.getRange_cm())*.393701);
                        n = laptop.send(buffer,LEN_PACKET);
                    }
                    else if(buffer[1] == 'm'){
                        clearBuffer();
                        
                        mag.getAxis(mag_data);
                        //sprintf(buffer, "MAG: X=%4.1f Y=%4.1f Z=%4.1f\r\n", mag_data.x, mag_data.y, mag_data.z);
                        
                        mag.getX(&fmX);
                        mag.getY(&fmY);
                        mag.getZ(&fmZ);
                        //sprintf(buffer, "MAG: X=%4.1f Y=%4.1f Z=%4.1f\r\n", fmX, fmY, fmZ);
                        
                        mag.getAxis(mag_raw);
                        //sprintf(buffer, "MAG: X=%d Y=%d Z=%d\r\n", mag_raw.x, mag_raw.y, mag_raw.z);
                        
                        mag.getX(&rmX);
                        mag.getY(&rmY);
                        mag.getZ(&rmZ);
                        //sprintf(buffer, "MAG: X=%d Y=%d Z=%d\r\n", rmX, rmY, rmZ);
                        
                        sprintf(buffer, "MAG: X=%4.1f Y=%4.1f Z=%4.1f\r\nMAG: X=%4.1f Y=%4.1f Z=%4.1f\r\nMAG: X=%d Y=%d Z=%d\r\nMAG: X=%d Y=%d Z=%d\r\n\n", mag_data.x, mag_data.y, mag_data.z, fmX, fmY, fmZ, mag_raw.x, mag_raw.y, mag_raw.z, rmX, rmY, rmZ);
                        n = laptop.send(buffer,LEN_PACKET);
                    }
                    else{
                        clearBuffer();     
                        sprintf(buffer, "Invalid Input");
                        n = laptop.send(buffer,LEN_PACKET);
                    }
                }
                else{
                    clearBuffer();     
                    sprintf(buffer, "Invalid Input");
                    n = laptop.send(buffer,LEN_PACKET); 
                }
                //pc.printf("%s\r\n",buffer); 
                
            }           // end if(buffer[0] == ':')
            if(n <= 0) break;
        }               // end while(true) rx/tx loop
    }                   // end while(true) tcp connect/disconnect loop
}                       // end main

void clearBuffer() {
    for(int i = 0; i < 100; i++) buffer[i] = 0;
}