Main repository for dump truck API development in Spring 2017
Dependencies: Tracker mbed MotorV2 SRF05 nRF24L01P
Fork of DUMP_TRUCK_TEST_V1 by
Activities
This Week
If needed, please contact Milo Pan at mpan9@gatech.edu for rights and access to this repository.
DumpTruck.cpp
- Committer:
- simplyellow
- Date:
- 2017-04-25
- Revision:
- 16:6530f62dd28b
- Parent:
- 15:a4bbdde8ed69
File content as of revision 16:6530f62dd28b:
#include "DumpTruck.h" #include <iostream> #include <string> DumpTruck::DumpTruck(int truckId) : truckNumber(truckId) { truckNumber = truckId; //track = new Tracker(p29, p30, p15); // PWM: 21, 22, 23 // DIR: 27, 28, 29 //pot pin 19 analogin frontMotor = new Motor(p23, p28); turnMotor = new Motor(p22, p29); bedMotor = new Motor(p24, p30); pot = new AnalogIn(p19); //bed = new IMU(@@@@@@@); srf = new SRF05(p20, p21); //trigger, echo. tooClose = false; interrupted = false; nrf = new nRF24L01P(p5, p6, p7, p8, p9, p10); // transceiver //transceiver set up, similar to one on base station code txDataCnt = 0; rxDataCnt = 0; received = false; numCommands = sizeof(commands)/sizeof(*commands); 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 //zeroAngle = (float) pot.read(); frontMotor->write(0); turnMotor->write(0); bedMotor->write(0); nrf->powerUp(); 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(); // fill acked array for(int i = 0; i < TRANSFER_SIZE; i++) { acked[i] = '0'; nacked[i] = '1'; } } void DumpTruck::sendAck() { wait(1); nrf->write(NRF24L01P_PIPE_P0, acked, TRANSFER_SIZE); printf("ACK SENT\n\r"); } void DumpTruck::sendNack() { wait(1); nrf->write(NRF24L01P_PIPE_P0, nacked, TRANSFER_SIZE); printf("NACK SENT\n\r"); } void DumpTruck::getCommand() { //called at the end of each executable command //dump truck transceiver sends a code to base station, opening the channel //code is all 0's received = false; //acked to receive command sendAck(); //code for receiving while(!received) { if (nrf->readable()) { // ...read the data into the receive buffer rxDataCnt = nrf->read(NRF24L01P_PIPE_P0, rxData, sizeof(rxData)); received = true; //after receiving command printf("received command\n\r"); processCommand(); } } } void DumpTruck::processCommand() { 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 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(); sendAck(); 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) { printf("Report Data \r\n"); printf("Proximity %.2f\n\r", proximity); //printf("Dump Truck is turned %0.2f degrees", ((float) pot - zeroAngle) * 300); //should run last in main thread getCommand(); } void DumpTruck::driveDistance() { //float speed, float distance printf("Drive distance: %d \r\n", commandValue); speed = (float) commandValue/10; frontMotor->write(speed); getCommand(); } void DumpTruck::drive() { //commandValue = speed etc //float speed speed = (float) commandValue/10; printf("Drive speed: %d \r\n", commandValue); frontMotor->write(speed); getCommand(); } void DumpTruck::turn() { //commandValue = angle etc //float angle printf("turn: %d degrees\r\n", commandValue); turnMotor->write(0.6f); wait(1); turnMotor->write(0); getCommand(); return; } void DumpTruck::moveBed() { //bool upper, bool lower, float angle printf("Move bed to angle: %d degrees \r\n", commandValue); if(commandValue > 500) { bedMotor->write(0.9f); } else { bedMotor->write(-0.1f); } wait(1); bedMotor->write(0); getCommand(); return; } void DumpTruck::stopDrive() { printf("Stop drive \r\n"); frontMotor->write(0); getCommand(); } void DumpTruck::detectStop() { printf("Stopped all systems \r\n"); frontMotor->write(0); bedMotor->write(0); turnMotor->write(0); } void DumpTruck::stopTurn() { printf("Stop turn \r\n"); turnMotor->write(0); getCommand(); } void DumpTruck::stopBed() { printf("Stop bed \r\n"); bedMotor->write(0); getCommand(); } bool DumpTruck::detect() { proximity = srf->read(); if(proximity < 10) { //cm tooClose = true; // detectStop(); } else { tooClose = false; } return tooClose; }