Tufts Hybrid Racing Sensor Node

Committer:
wsalis01
Date:
Sun Apr 15 00:12:28 2012 +0000
Revision:
1:fbb17be9a65d
Parent:
0:1f9ada316815
Initial Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wsalis01 1:fbb17be9a65d 1 /*
wsalis01 1:fbb17be9a65d 2 * File: SensorNode/SensorNode.cpp
wsalis01 1:fbb17be9a65d 3 * Author: William Jessup Salisbury
wsalis01 1:fbb17be9a65d 4 * Company: Tufts Hybrid Racing Team
wsalis01 1:fbb17be9a65d 5 * Copyright: CC BY-NC-SA 3.0
wsalis01 1:fbb17be9a65d 6 * Date: 1/12/2012
wsalis01 1:fbb17be9a65d 7 */
wsalis01 1:fbb17be9a65d 8
wsalis01 1:fbb17be9a65d 9 #include "mbed.h"
wsalis01 1:fbb17be9a65d 10 #include "CANProtocol.h"
wsalis01 1:fbb17be9a65d 11 #include "SensorNode.h"
wsalis01 1:fbb17be9a65d 12
wsalis01 1:fbb17be9a65d 13 SensorNode::SensorNode() : _leftWheel(LW_PIN), _rightWheel(RW_PIN), _can(CAN_RX, CAN_TX), _console(USBTX, USBRX), _leftTicks(0), _rightTicks(0), _leftRevolutions(0), _rightRevolutions(0), _syncID(0) {
wsalis01 1:fbb17be9a65d 14 /* InterruptIn initialization */
wsalis01 1:fbb17be9a65d 15 _leftWheel.mode(PullUp);
wsalis01 1:fbb17be9a65d 16 _leftWheel.fall(this, &SensorNode::leftTick);
wsalis01 1:fbb17be9a65d 17 _rightWheel.mode(PullUp);
wsalis01 1:fbb17be9a65d 18 _rightWheel.fall(this, &SensorNode::rightTick);
wsalis01 1:fbb17be9a65d 19
wsalis01 1:fbb17be9a65d 20 /* CAN initialization */
wsalis01 1:fbb17be9a65d 21 _can.frequency(CAN_FREQUENCY);
wsalis01 1:fbb17be9a65d 22 _can.attach(this, &SensorNode::canReceive);
wsalis01 1:fbb17be9a65d 23
wsalis01 1:fbb17be9a65d 24 /* Ticker initialization */
wsalis01 1:fbb17be9a65d 25 //_statusTicker.attach(this, &SensorNode::canSend, tickerTimeout);
wsalis01 1:fbb17be9a65d 26
wsalis01 1:fbb17be9a65d 27 /* Hello, World! */
wsalis01 1:fbb17be9a65d 28 _console.printf("%s\r\n", "SensorNode instantiated");
wsalis01 1:fbb17be9a65d 29 }
wsalis01 1:fbb17be9a65d 30
wsalis01 1:fbb17be9a65d 31 SensorNode::~SensorNode() {
wsalis01 1:fbb17be9a65d 32 _statusTicker.detach();
wsalis01 1:fbb17be9a65d 33 }
wsalis01 1:fbb17be9a65d 34
wsalis01 1:fbb17be9a65d 35 void SensorNode::leftTick() {
wsalis01 1:fbb17be9a65d 36 if ( (++_leftTicks % ticksPerRevolution) == 0 ) {
wsalis01 1:fbb17be9a65d 37 _leftTicks = 0;
wsalis01 1:fbb17be9a65d 38 ++_leftRevolutions;
wsalis01 1:fbb17be9a65d 39 }
wsalis01 1:fbb17be9a65d 40 }
wsalis01 1:fbb17be9a65d 41
wsalis01 1:fbb17be9a65d 42 void SensorNode::rightTick() {
wsalis01 1:fbb17be9a65d 43 if ( (++_rightTicks % ticksPerRevolution) == 0 ) {
wsalis01 1:fbb17be9a65d 44 _rightTicks = 0;
wsalis01 1:fbb17be9a65d 45 ++_rightRevolutions;
wsalis01 1:fbb17be9a65d 46 }
wsalis01 1:fbb17be9a65d 47 }
wsalis01 1:fbb17be9a65d 48
wsalis01 1:fbb17be9a65d 49 void SensorNode::canSend() {
wsalis01 1:fbb17be9a65d 50 CANMessage msg;
wsalis01 1:fbb17be9a65d 51 msg.id = CAN_STATUS;
wsalis01 1:fbb17be9a65d 52 msg.len = 8;
wsalis01 1:fbb17be9a65d 53 msg.data[0] = _syncID;
wsalis01 1:fbb17be9a65d 54 msg.data[1] = 0xE;
wsalis01 1:fbb17be9a65d 55 msg.data[2] = 0xA;
wsalis01 1:fbb17be9a65d 56 msg.data[3] = 0xD;
wsalis01 1:fbb17be9a65d 57 msg.data[4] = 0xB;
wsalis01 1:fbb17be9a65d 58 msg.data[5] = 0xE;
wsalis01 1:fbb17be9a65d 59 msg.data[6] = 0xE;
wsalis01 1:fbb17be9a65d 60 msg.data[7] = 0xF;
wsalis01 1:fbb17be9a65d 61 if (_can.write(msg)) {
wsalis01 1:fbb17be9a65d 62 _console.printf("%s\r\n", "Message sent.");
wsalis01 1:fbb17be9a65d 63 } else {
wsalis01 1:fbb17be9a65d 64 _console.printf("%s\r\n", "Message send failure.");
wsalis01 1:fbb17be9a65d 65 }
wsalis01 1:fbb17be9a65d 66 }
wsalis01 1:fbb17be9a65d 67
wsalis01 1:fbb17be9a65d 68 void SensorNode::canReceive() {
wsalis01 1:fbb17be9a65d 69 CANMessage msg;
wsalis01 1:fbb17be9a65d 70
wsalis01 1:fbb17be9a65d 71 if (_can.read(msg)) {
wsalis01 1:fbb17be9a65d 72 switch (msg.id) {
wsalis01 1:fbb17be9a65d 73 case CAN_RESET:
wsalis01 1:fbb17be9a65d 74 _console.printf("%s\r\n", "CAN_RESET Message received.");
wsalis01 1:fbb17be9a65d 75 Reset();
wsalis01 1:fbb17be9a65d 76 break;
wsalis01 1:fbb17be9a65d 77
wsalis01 1:fbb17be9a65d 78 case CAN_SYNC:
wsalis01 1:fbb17be9a65d 79 _console.printf("%s\r\n", "CAN_SYNC Message received.");
wsalis01 1:fbb17be9a65d 80 _syncID = msg.data[0];
wsalis01 1:fbb17be9a65d 81 canSend();
wsalis01 1:fbb17be9a65d 82 break;
wsalis01 1:fbb17be9a65d 83
wsalis01 1:fbb17be9a65d 84 default:
wsalis01 1:fbb17be9a65d 85 _console.printf("%s\r\n", "Message decode failure.");
wsalis01 1:fbb17be9a65d 86 break;
wsalis01 1:fbb17be9a65d 87 }
wsalis01 1:fbb17be9a65d 88 } else {
wsalis01 1:fbb17be9a65d 89 _console.printf("%s\r\n", "Message recieve failure.");
wsalis01 1:fbb17be9a65d 90 }
wsalis01 1:fbb17be9a65d 91 }
wsalis01 1:fbb17be9a65d 92
wsalis01 1:fbb17be9a65d 93 void SensorNode::Reset() {
wsalis01 1:fbb17be9a65d 94 _leftTicks = 0;
wsalis01 1:fbb17be9a65d 95 _rightTicks = 0;
wsalis01 1:fbb17be9a65d 96 _leftRevolutions = 0;
wsalis01 1:fbb17be9a65d 97 _rightRevolutions = 0;
wsalis01 1:fbb17be9a65d 98 _can.reset();
wsalis01 0:1f9ada316815 99 }