Tufts Hybrid Racing Sensor Node

SensorNode.cpp

Committer:
wsalis01
Date:
2012-04-15
Revision:
1:fbb17be9a65d
Parent:
0:1f9ada316815

File content as of revision 1:fbb17be9a65d:

/*
 * File: SensorNode/SensorNode.cpp
 * Author: William Jessup Salisbury
 * Company: Tufts Hybrid Racing Team
 * Copyright: CC BY-NC-SA 3.0
 * Date: 1/12/2012
 */

#include "mbed.h"
#include "CANProtocol.h"
#include "SensorNode.h"

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)  {
    /* InterruptIn initialization */
    _leftWheel.mode(PullUp);
    _leftWheel.fall(this, &SensorNode::leftTick);
    _rightWheel.mode(PullUp);
    _rightWheel.fall(this, &SensorNode::rightTick);

    /* CAN initialization */
    _can.frequency(CAN_FREQUENCY);
    _can.attach(this, &SensorNode::canReceive);

    /* Ticker initialization */
    //_statusTicker.attach(this, &SensorNode::canSend, tickerTimeout);

    /* Hello, World! */
    _console.printf("%s\r\n", "SensorNode instantiated");
}

SensorNode::~SensorNode() {
    _statusTicker.detach();
}

void SensorNode::leftTick() {
    if ( (++_leftTicks % ticksPerRevolution) == 0 ) {
        _leftTicks = 0;
        ++_leftRevolutions;
    }
}

void SensorNode::rightTick() {
    if ( (++_rightTicks % ticksPerRevolution) == 0 ) {
        _rightTicks = 0;
        ++_rightRevolutions;
    }
}

void SensorNode::canSend() {
    CANMessage msg;
    msg.id = CAN_STATUS;
    msg.len = 8;
    msg.data[0] = _syncID;
    msg.data[1] = 0xE;
    msg.data[2] = 0xA;
    msg.data[3] = 0xD;
    msg.data[4] = 0xB;
    msg.data[5] = 0xE;
    msg.data[6] = 0xE;
    msg.data[7] = 0xF;
    if (_can.write(msg)) {
        _console.printf("%s\r\n", "Message sent.");
    } else {
        _console.printf("%s\r\n", "Message send failure.");
    }
}

void SensorNode::canReceive() {
    CANMessage msg;

    if (_can.read(msg)) {
        switch (msg.id) {
            case CAN_RESET:
                _console.printf("%s\r\n", "CAN_RESET Message received.");
                Reset();
                break;

            case CAN_SYNC:
                _console.printf("%s\r\n", "CAN_SYNC Message received.");
                _syncID = msg.data[0];
                canSend();
                break;

            default:
                _console.printf("%s\r\n", "Message decode failure.");
                break;
        }
    } else {
        _console.printf("%s\r\n", "Message recieve failure.");
    }
}

void SensorNode::Reset() {
    _leftTicks = 0;
    _rightTicks = 0;
    _leftRevolutions = 0;
    _rightRevolutions = 0;
    _can.reset();
}