Terrabots / Mbed 2 deprecated DUMP_TRUCK_SPR2017

Dependencies:   Tracker mbed MotorV2 SRF05 nRF24L01P

Fork of DUMP_TRUCK_TEST_V1 by Terrabots

Files at this revision

API Documentation at this revision

Comitter:
simplyellow
Date:
Tue Apr 25 05:24:47 2017 +0000
Parent:
13:112b6543909a
Child:
15:a4bbdde8ed69
Commit message:
communications final implementation

Changed in this revision

DumpTruck.cpp Show annotated file Show diff for this revision Revisions of this file
DumpTruck.h Show annotated file Show diff for this revision Revisions of this file
commands.h Show annotated file Show diff for this revision Revisions of this file
--- a/DumpTruck.cpp	Thu Apr 13 17:32:44 2017 +0000
+++ b/DumpTruck.cpp	Tue Apr 25 05:24:47 2017 +0000
@@ -1,9 +1,10 @@
 #include "DumpTruck.h"
-
+#include <iostream>
+#include <string>
 
 DumpTruck::DumpTruck(int truckId) : truckNumber(truckId) {
     truckNumber = truckId;
-        //track = new Tracker(p29, p30, p15);
+    //track = new Tracker(p29, p30, p15);
     // PWM: 21, 22, 23
     // DIR: 27, 28, 29
     frontMotor = new Motor(p23, p28);
@@ -18,19 +19,25 @@
     txDataCnt = 0;
     rxDataCnt = 0;
     received = false;
+    numCommands = sizeof(commands)/sizeof(*commands);
     
-    void (*commands[2]);
-    commands[0] = DumpTruck::stopBed;
-    commands[1] = DumpTruck::stopDrive;
+    commArr[0] = &DumpTruck::reportData;
+    commArr[1] = &DumpTruck::driveDistance;
+    commArr[2] = &DumpTruck::drive;
+    commArr[3] = &DumpTruck::turn;
+    commArr[4] = &DumpTruck::moveBed;
+    commArr[5] = &DumpTruck::stopBed;
+    commArr[6] = &DumpTruck::stopTurn;
+    commArr[7] = &DumpTruck::stopDrive;
 }
 
 void DumpTruck::startComms() {
+    //must call first in main.cpp
     nrf->powerUp();
-    printf( "nRF24L01+ Frequency    : %d MHz\r\n",  nrf->getRfFrequency() );
-    printf( "nRF24L01+ Output power : %d dBm\r\n",  nrf->getRfOutputPower() );
-    printf( "nRF24L01+ Data Rate    : %d kbps\r\n", nrf->getAirDataRate() );
-    printf( "nRF24L01+ TX Address   : 0x%010llX\r\n", nrf->getTxAddress() );
-    printf( "nRF24L01+ RX Address   : 0x%010llX\r\n", nrf->getRxAddress() );
+    printf("\n\r--------\r\n");
+    printf("DUMP TRUCK\r\n");
+    printf("ID: %d \r\n", truckNumber);
+    printf("--------\r\n");
     nrf->setTransferSize( TRANSFER_SIZE );
     nrf->setReceiveMode();
     nrf->enable();
@@ -40,20 +47,19 @@
         acked[i] = '0';
         nacked[i] = '1';
     }
+    
 }
 
 void DumpTruck::sendAck() {
-    printf("SEND acked\n\r");
     wait(1);
     nrf->write(NRF24L01P_PIPE_P0, acked, TRANSFER_SIZE);
-    printf("SENT\n\r");
+    printf("ACK SENT\n\r");
 }
 
 void DumpTruck::sendNack() {
-    printf("SEND nacked\n\r");
     wait(1);
     nrf->write(NRF24L01P_PIPE_P0, nacked, TRANSFER_SIZE);
-    printf("SENT\n\r");
+    printf("NACK SENT\n\r");
 }
 
 void DumpTruck::getCommand() {
@@ -77,59 +83,124 @@
 }
 
 void DumpTruck::processCommand() {
-    //strcmp(rxData,"on")==0
-    //perhaps have an array of all commands..??
-        //maybe commands.h is just the array
-    //and the "on" becomes commands[k]?
-    // real time driving
-    switch(rxData) {
-        case 1:
+    printf("Processing command...\n\r");
+    int commandEnd = 99;
+    int valueEnd = 99;
+    for(int h = 0; h < TRANSFER_SIZE; h++) {
+        if(rxData[h] == ' ' || h == TRANSFER_SIZE - 1) {
+            if(commandEnd == 99) {
+                commandEnd = h + 1;
+            }
+            if((rxData[h+1] != ' ')&&(h < TRANSFER_SIZE-1)) {
+                valueEnd = h+1;
+            }
+        }
+    }
+    printf("%d, %d \r\n", commandEnd - 1, valueEnd);
+    char commandChar[commandEnd];
+    for(int g = 0; g < commandEnd; g++) {
+        commandChar[g] = rxData[g];
+    }
+    
+    //limit user input value to 2 digits
+    // "turn 360"
+    //commandEnd - 1 = 4
+    //valueEnd = 5
+    // "drived 5"
+    //commandEnd = 6
+    //valueEnd = 7
+    int valSize = valueEnd - commandEnd + 1;
+    //printf("no cast %i, cast %i \r\n", rxData[valueEnd]-'0', (int)rxData[valueEnd]-'0');
+    if(valSize < 2) {       //filters out commands with no # appended
+        if(valueEnd < 7) {  //two digit
+            commandValue = 10*(int)((rxData[valueEnd])-'0') + (int)((rxData[valueEnd+1])-'0');
+            printf("2- command val is %i \r\n", commandValue);
+        } else {            //one digit
+            commandValue = (int)(rxData[valueEnd]-'0');
+            printf("1- command val is %i \r\n", commandValue);
+        }
+    }
+
+    printf("There are %d commands available\n\r", sizeof(commands)/sizeof(*commands));
+    int f;
+    for(f = 0; f < numCommands; f++ ) {
+        if(strcmp(commandChar,commands[f])==32) {
+            printf("COMMAND #%i: ", f+1);
+            for(int a = 0; a < commandEnd; a++) {
+                printf("%c", commandChar[a]);
+            }
+            printf("\r\nORIGINAL: ");
+            for(int b = 0; b < TRANSFER_SIZE; b++) {
+                printf("%c", rxData[b]);
+            }  
+            printf("\r\n");       
+            // syntax: (this->*func)(foo, bar);
+            // commArr[0] = &DumpTruck::reportData;
+            (this->*commArr[f])();
             sendAck();
-            printf("ack\n\r");
             break;
-        default:
-            sendNack();
-            printf("nack\n\r");
-            break;
+        }
     }
+    if(f == numCommands) {
+        //base station still interprets this as an ack because 
+        //the dump truck tells it that it's ready to receive another command
+        sendNack();
+        printf("Command not recognized. \r\n");
+    }
+    printf("Waiting for next command\n\r");
     getCommand();
 }
 
-void DumpTruck::reportData() {
+void DumpTruck::reportData(void) {
+    printf("Report Data \r\n");
     //should run last in main thread
+    getCommand();
 }
 
-void DumpTruck::driveDistance(float speed, float distance) {
+void DumpTruck::driveDistance() {
+    //float speed, float distance
+    printf("Drive distance: %d \r\n", commandValue);
     frontMotor->write(speed);
     getCommand();
 }
 
-void DumpTruck::drive(float speed) {
+void DumpTruck::drive() {
+    //commandValue = speed etc
+    //float speed
+    printf("Drive speed: %d \r\n", commandValue);
     frontMotor->write(speed);
     getCommand();
 }
 
-void DumpTruck::turn(float angle) {
+void DumpTruck::turn() {
+    //commandValue = angle etc
+    //float angle
+    printf("turn: %d degrees\r\n", commandValue);
     getCommand();
     return;
 }
 
-void DumpTruck::moveBed(bool raise, float angle) {
+void DumpTruck::moveBed() {
+    //bool upper, bool lower, float angle
+    printf("Move bed to angle: %d degrees \r\n", commandValue);
     getCommand();
     return;
 }
 
 void DumpTruck::stopDrive() {
+    printf("Stop drive \r\n");
     frontMotor->write(0);
     getCommand();
 }
 
 void DumpTruck::stopTurn() {
+    printf("Stop turn \r\n");
     turnMotor->write(0);
     getCommand();
 }
 
 void DumpTruck::stopBed() {
+    printf("Stop bed \r\n");
     bedMotor->write(0);
     getCommand();
 }
@@ -142,235 +213,4 @@
         tooClose = false;
     }
     return tooClose;
-}
-
-
-//void Calibrate(){}
-
-//void DumpTruck::drive() {
-//    // get desired distance and speed
-//    distance = 0; // placeholder
-//    // speed = 0.5;
-//    // distance = setTruckDistance();
-//    speed = setTruckSpeed();
-//    // terminal confirmation of distance and speed
-//    pc.printf("Truck will drive a distance of %f at a speed of %f\r\n",distance,speed);
-//    // insert while loop here which relates to distance travelled
-//    while(1) {
-//    // if the speed is greater than zero, go forward at specified speed
-//    if (speed >= 0) {
-//    DirPin = 1;
-//    DrivePin = speed;
-//    } // else, go backwards at specified speed
-//    else {
-//    DirPin = 0;
-//    DrivePin = -1*speed;
-//    }
-//    }
-//    // stop motors
-//    // stop();
-//    // calibrate motors
-//    Calibrate();
-//    //
-//    travelled = 0;
-//}
-
-/*void DumpTruck::drive() {
-    // get desired distance and speed
-     // placeholder
-    // speed = 0.5;
-    //distance = 5.0;
-    distance = setTruckDistance();
-    speed = setTruckSpeed();
-    // terminal confirmation of distance and speed
-    pc.printf("Truck will drive a distance of %f inches at a speed of %f\r\n",distance,speed);
-    // insert while loop here which relates to distance travelled
-    travelled = getDistance();
-    //pc.printf("Check 1: %f, %f\r\n", distance, travelled);
-    while(travelled < distance) {
-    //pc.printf("Check 2:\r\n");
-    travelled = getDistance();
-    pc.printf("Travelling...: %f\n\r", (distance - travelled));
-    // if the speed is greater than zero, go forward at specified speed
-    if (speed >= 0) {
-    DirPin = 1;
-    DrivePin = speed;
-    } // else, go backwards at specified speed
-    else {
-    DirPin = 0;
-    DrivePin = -1*speed;
-         }
-    }
-    //pc.printf("Check 3:\r\n");
-    // stop motors
-    // stop();
-    // calibrate motors
-    //Calibrate();
-}
-
-
-
-
-float DumpTruck::setTruckDistance(){
-    // terminal prompt for distance
-    pc.printf("Please enter the truck distance:\r\n");
-    // sets return value to given value
-    //float input = pc.getc();
-    //input = input - 48;
-    // returns value
-    //return input;
-
-    char c;
-    char buffer[128];
-    pc.gets(buffer, 4);
-    float input = strtod(buffer,NULL);
-    return input;
-
-    }
-
-float DumpTruck::setTruckSpeed(){
-//      float mod = 0;
-//      float div = 10;
-//      pc.printf("Enter a direction - 1 = forward, 0 = backward:\r\n");
-//      float dir = pc.getc();
-//      while ((dir<48)||(dir>49)){
-//          pc.printf("Invalid input. Please enter a valid direction, 1 or 0: \r\n");
-//          dir = pc.getc();
-//          }
-//      if (dir == 48) {
-//          mod = -1; }
-//          else {
-//          mod = 1; }
-//
-//      // terminal prompt for speed
-//      pc.printf("Please enter a truck speed from 0-9 or F for full speed:\r\n");
-//      // sets return value to given value
-//      float input = pc.getc();
-//      while ((input<48)||(input>57)){
-//          if((input == 70) || (input == 102)) {
-//              input = 1;
-//              input = input * mod;
-//              return input;
-//        }
-//          pc.printf("Invalid input. Please enter a valid speed from 0-9 or F: \r\n");
-//          input = pc.getc();
-//          }
-//      input = input - 48;
-//      input = input * (1/div);
-//      // returns value
-//      input = input * mod;
-
-
-    pc.printf("Enter a speed from -10 to +10:\r\n");
-    char c;
-    char buffer[128];
-    pc.gets(buffer, 4);
-    float input = strtod(buffer,NULL);
-
-    while ((buffer[0] < 43) || (buffer[0] > 45)) {
-        pc.printf("Invalid input. Please correct input and try again:\r\n");
-        setTruckSpeed();
-    }
-
-    pc.printf("buffer[0]: %d\r\n",buffer[0]);
-    pc.printf("buffer[1]: %d\r\n",buffer[1]);
-    pc.printf("buffer[2]: %d\r\n",buffer[2]);
-    input = input / 10;
-
-    return input;}
-
-
-void DumpTruck::stop(){
-    pc.printf("Truck will now stop.\r\n");
-    //stop motors
-    DrivePin = 0;
-    }
-
-float DumpTruck::getDistance() {
-    //while(1){
-        pulseCount = (float) wheel.getPulses();
-        travelled = pulseCount*d/encoding/20/68;
-        wait(0.1);
-        //pc.printf("Inches travelled: %f\n\r", travelled);
-        return travelled;
-        //(pulse count / X * N) * (1 / PPI)
-
-    //}
-}*/
-
-//void DumpTruck::RotateTo() {
-//    pc.printf("Desired Angle: ");
-//    DesiredPivotAngle = pc.getc();
-//    float CurrentPivotAngle =  getPivotAngle();
-//    Difference = DesiredPivotAngle-CurrentPivotAngle;
-//    if (Difference > limit)
-//    {
-//        PivotSpeed = setPivotSpeed();
-//        pc.printf("Rotating to %s /n", DesiredPivotAngle);
-//        //Drive Motors
-//        }
-//    else
-//    {stop()}
-//
-//}
-//
-//void DumpTruck::BedDown() {
-//     SwitchState = bool GetBedUpperSwitch();
-//     if SwitchState
-//     {return 0;}
-//     else
-//
-//     while(SwitchState == 0)
-//     {
-//         //driveMotor
-//         }
-//         calibrate();
-//    }
-//void DumpTruck::LowerBed() {
-//    SwitchState = bool GetLowerUpperSwitch();
-//     if SwitchState
-//     {return 0;}
-//     else
-//
-//     while(SwitchState == 0)
-//     {
-//         //driveMotor
-//         }
-//         calibrate();
-//    }
-//}
-//void DumpTruck::raiseTo(int angle) {
-//      pc.printf("Desired Angle: ");
-//    DesiredBedAngle = pc.getc();
-//    float CurrentBedAngle =  getBedAngle();
-//    Difference = DesiredBedAngle-CurrentBedAngle;
-//    if (Difference > limit)
-//    {
-//        BedSpeed = setBedSpeed();
-//        pc.printf("Rotating to %s /n", DesiredBedAngle);
-//        //Drive Motors
-//        }
-//    else
-//    {stop()}
-//}
-//
-//float DumpTruck::getPivotAngle(){
-//    float input = AnalogIn(x);
-//    return input
-//    }
-//float DumpTruck::setPivotSpeed(){
-//     pc.printf("Please enter the Pivot speed /n");
-//    float input = pc.getc();
-//    return input;
-//    }
-//
-//float DumpTruck::setBedSpeed(){
-//    pc.printf("Please enter the Bed speed /n");
-//    float input = pc.getc();
-//    return input;
-//    }
-//float DumpTruck::getBedAngle(){
-//    float input = AnalogIn(x); // data from potentiometer
-//    return input;
-//    }
-//
\ No newline at end of file
+}
\ No newline at end of file
--- a/DumpTruck.h	Thu Apr 13 17:32:44 2017 +0000
+++ b/DumpTruck.h	Tue Apr 25 05:24:47 2017 +0000
@@ -16,14 +16,11 @@
 #include "Motor.h"
 #include "nRF24L01P.h" //Transceiver library
 #include "SRF05.h"
-
-//using strings to process commands
-#include <string> 
-#include <stdio.h>
-using namespace std;
+#include "commands.h"
 
 #define TRANSFER_SIZE   8
 
+
 // ADD SWITCHES & ULTRASONIC SENSOR implementation
 
 /**
@@ -77,33 +74,33 @@
     /*
     *   Drive a certain distance at a desired speed.
     */
-    void driveDistance(float speed, float distance);// frontMotor
+    void driveDistance();// frontMotor
     /*
     *   Drive at a desired speed.
     */
-    void drive(float speed);
+    void drive();
     /*
     *   Turn the rear wheels a certain angle.
     */
-    void turn(float angle);                 // turnMotor
+    void turn();                 // turnMotor
     /*
     *   Move the dump truck's bed up/down a certain angle.
     */
-    void moveBed(bool raise, float angle);  // bedMotor
+    void moveBed();  // bedMotor
     /*
     *   Stop driving.
     */
-    int stopDrive();                            // all Motors
+    void stopDrive();                            // all Motors
     
     /*
     *   Stop turning.
     */
-    int stopTurn();                            // all Motors
+    void stopTurn();                            // all Motors
 
     /*
     *   Stop bed.
     */
-    int stopBed();                            // all Motors
+    void stopBed();                            // all Motors
 
     // ultrasonic functions
     /*
@@ -118,9 +115,12 @@
     char acked[TRANSFER_SIZE];
     char nacked[TRANSFER_SIZE]; 
     bool received;
-
-
-protected:
+    int numCommands;
+    int commandValue;
+    typedef void (DumpTruck::*funcArray)(void);
+    funcArray commArr[sizeof(commands)/sizeof(*commands)];
+    
+protected:    
     Tracker *track;
     //IMU *bed;
     Motor *frontMotor;
--- a/commands.h	Thu Apr 13 17:32:44 2017 +0000
+++ b/commands.h	Tue Apr 25 05:24:47 2017 +0000
@@ -1,3 +1,12 @@
 #include "DumpTruck.h"
 
-string a("text");
\ No newline at end of file
+const char * const commands[] = {
+     "report",      //reportData();
+     "drived",      //driveDistance(float distance);
+     "drives",      //drive(float speed);
+     "turn",        //turn(float angle); 
+     "moveb",       //moveBed(float angle); 
+     "stopbed",     //stopBed();
+     "stopturn",    //stopTurn();
+     "stopdriv"     //stopDrive();
+};
\ No newline at end of file