Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: Tracker mbed MotorV2 SRF05 nRF24L01P
Fork of DUMP_TRUCK_TEST_V1 by
Revision 14:fd6090cddc2e, committed 2017-04-25
- 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
--- 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
