Tufts Hybrid Racing Sensor Node
SensorNode.cpp@1:fbb17be9a65d, 2012-04-15 (annotated)
- 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?
User | Revision | Line number | New 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 | } |