Modified for compatibility with Rev.E. hardware

Fork of AkmSensor by AKM Development Platform

Committer:
tkstreet
Date:
Fri Apr 21 20:23:24 2017 +0000
Revision:
33:d3e1e9eb2ef9
Parent:
32:42c6b8fb1922
Child:
36:aafd15b3291b
Added Motor Driver case. Added AP1017 functions. Included debugging MSG commands at various points.  Updated some comments.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tkstreet 25:76c11ab5060e 1 #include "ap1017ctrl.h"
tkstreet 25:76c11ab5060e 2 #include "debug.h"
tkstreet 25:76c11ab5060e 3
tkstreet 25:76c11ab5060e 4 Ap1017Ctrl::Ap1017Ctrl()
tkstreet 25:76c11ab5060e 5 {
tkstreet 33:d3e1e9eb2ef9 6 MSG("#AP1017: Creating.\r\n");
tkstreet 33:d3e1e9eb2ef9 7
tkstreet 25:76c11ab5060e 8 ap1017 = NULL;
tkstreet 25:76c11ab5060e 9 event = false;
tkstreet 25:76c11ab5060e 10 sensorName = "";
tkstreet 32:42c6b8fb1922 11 interval = 0;
tkstreet 33:d3e1e9eb2ef9 12
tkstreet 33:d3e1e9eb2ef9 13 MSG("#AP1017: Created.\r\n");
tkstreet 25:76c11ab5060e 14 }
tkstreet 25:76c11ab5060e 15
tkstreet 25:76c11ab5060e 16 Ap1017Ctrl::~Ap1017Ctrl()
tkstreet 25:76c11ab5060e 17 {
tkstreet 33:d3e1e9eb2ef9 18 MSG("#AP1017: Destroying.\r\n");
tkstreet 33:d3e1e9eb2ef9 19
tkstreet 25:76c11ab5060e 20 if(ap1017)
tkstreet 25:76c11ab5060e 21 delete ap1017;
tkstreet 25:76c11ab5060e 22 }
tkstreet 25:76c11ab5060e 23
tkstreet 25:76c11ab5060e 24 AkmSensor::Status Ap1017Ctrl::init(const uint8_t id, const uint8_t subid)
tkstreet 25:76c11ab5060e 25 {
tkstreet 33:d3e1e9eb2ef9 26 MSG("#AP1017: Initializing...\r\n");
tkstreet 33:d3e1e9eb2ef9 27
tkstreet 25:76c11ab5060e 28 primaryId = id;
tkstreet 25:76c11ab5060e 29 subId = subid;
tkstreet 32:42c6b8fb1922 30 interval = 1; // Set timer interrupt interval to 1s
tkstreet 25:76c11ab5060e 31
tkstreet 26:4e436b0cbaf8 32 switch (subId) { // template for multiple drivers
tkstreet 25:76c11ab5060e 33 case SUB_ID_AP1017:
tkstreet 32:42c6b8fb1922 34 ap1017 = new AP1017(); // Instantiate AP1017
tkstreet 25:76c11ab5060e 35 sensorName = "AP1017";
tkstreet 33:d3e1e9eb2ef9 36 MSG("#AP1017 found.\r\n");
tkstreet 25:76c11ab5060e 37 break;
tkstreet 25:76c11ab5060e 38 default:
tkstreet 33:d3e1e9eb2ef9 39 MSG("#Error: No sensor found.\r\n.");
tkstreet 25:76c11ab5060e 40 return AkmSensor::ERROR;
tkstreet 25:76c11ab5060e 41 }
tkstreet 25:76c11ab5060e 42
tkstreet 32:42c6b8fb1922 43 // Default settings
tkstreet 32:42c6b8fb1922 44 ap1017->setDirection(AP1017::DIRECTION_CW);
tkstreet 32:42c6b8fb1922 45 ap1017->setSpeed(50.0);
tkstreet 25:76c11ab5060e 46
tkstreet 25:76c11ab5060e 47 return AkmSensor::SUCCESS;
tkstreet 25:76c11ab5060e 48 }
tkstreet 25:76c11ab5060e 49
tkstreet 25:76c11ab5060e 50 bool Ap1017Ctrl::isEvent()
tkstreet 33:d3e1e9eb2ef9 51 {
tkstreet 25:76c11ab5060e 52 return event; // No feedback: always false
tkstreet 25:76c11ab5060e 53 }
tkstreet 25:76c11ab5060e 54
tkstreet 25:76c11ab5060e 55 AkmSensor::Status Ap1017Ctrl::startSensor()
tkstreet 25:76c11ab5060e 56 {
tkstreet 33:d3e1e9eb2ef9 57 MSG("#AP1017: Starting sensor, no interval argument.\r\n");
tkstreet 33:d3e1e9eb2ef9 58
tkstreet 31:8635be9b2e35 59 ticker.attach(callback(this, &Ap1017Ctrl::timerCallback), interval);
tkstreet 25:76c11ab5060e 60 return AkmSensor::SUCCESS;
tkstreet 25:76c11ab5060e 61 }
tkstreet 25:76c11ab5060e 62
tkstreet 25:76c11ab5060e 63 AkmSensor::Status Ap1017Ctrl::startSensor(const float sec)
tkstreet 25:76c11ab5060e 64 {
tkstreet 33:d3e1e9eb2ef9 65 MSG("#AP1017: Starting sensor with interval argument.\r\n");
tkstreet 33:d3e1e9eb2ef9 66
tkstreet 32:42c6b8fb1922 67 // Initialize timer interrupt
tkstreet 26:4e436b0cbaf8 68 interval = sec;
tkstreet 31:8635be9b2e35 69 ticker.attach(callback(this, &Ap1017Ctrl::timerCallback), interval);
tkstreet 32:42c6b8fb1922 70
tkstreet 32:42c6b8fb1922 71 ap1017->start(); // Start motor
tkstreet 32:42c6b8fb1922 72
tkstreet 25:76c11ab5060e 73 return AkmSensor::SUCCESS;
tkstreet 25:76c11ab5060e 74 }
tkstreet 25:76c11ab5060e 75
tkstreet 25:76c11ab5060e 76 AkmSensor::Status Ap1017Ctrl::stopSensor()
tkstreet 25:76c11ab5060e 77 {
tkstreet 33:d3e1e9eb2ef9 78 MSG("#AP1017: Stopping sensor.\r\n");
tkstreet 33:d3e1e9eb2ef9 79
tkstreet 32:42c6b8fb1922 80 ap1017->stop(); // Stop motor
tkstreet 33:d3e1e9eb2ef9 81 ticker.detach();
tkstreet 33:d3e1e9eb2ef9 82 event = false;
tkstreet 32:42c6b8fb1922 83
tkstreet 25:76c11ab5060e 84 return AkmSensor::SUCCESS;
tkstreet 25:76c11ab5060e 85 }
tkstreet 25:76c11ab5060e 86
tkstreet 25:76c11ab5060e 87 AkmSensor::Status Ap1017Ctrl::readSensorData(Message* msg)
tkstreet 25:76c11ab5060e 88 {
tkstreet 33:d3e1e9eb2ef9 89 MSG("#AP1017: No sensor data to read.\r\n");
tkstreet 33:d3e1e9eb2ef9 90
tkstreet 33:d3e1e9eb2ef9 91 event = false; // Reset event flag
tkstreet 33:d3e1e9eb2ef9 92
tkstreet 33:d3e1e9eb2ef9 93 return AkmSensor::ERROR;
tkstreet 25:76c11ab5060e 94 }
tkstreet 25:76c11ab5060e 95
tkstreet 25:76c11ab5060e 96 AkmSensor::Status Ap1017Ctrl::requestCommand(Message* in, Message* out)
tkstreet 25:76c11ab5060e 97 {
tkstreet 33:d3e1e9eb2ef9 98 MSG("#AP1017: Requesting command.\r\n");
tkstreet 33:d3e1e9eb2ef9 99
tkstreet 31:8635be9b2e35 100 AkmSensor::Status status = AkmSensor::SUCCESS;
tkstreet 31:8635be9b2e35 101
tkstreet 31:8635be9b2e35 102 Message::Command cmd = in->getCommand(); // Store command
tkstreet 31:8635be9b2e35 103 out->setCommand(cmd); // Load command into output
tkstreet 31:8635be9b2e35 104
tkstreet 31:8635be9b2e35 105 switch(cmd)
tkstreet 31:8635be9b2e35 106 {
tkstreet 31:8635be9b2e35 107 case Message::CMD_MOTOR_START_MOTOR:
tkstreet 31:8635be9b2e35 108 {
tkstreet 32:42c6b8fb1922 109 if(ap1017->start() != AP1017::SUCCESS)
tkstreet 31:8635be9b2e35 110 {
tkstreet 31:8635be9b2e35 111 MSG("#AP1017: Failed to start motor.\r\n");
tkstreet 31:8635be9b2e35 112 return AkmSensor::ERROR;
tkstreet 31:8635be9b2e35 113 }
tkstreet 33:d3e1e9eb2ef9 114 else
tkstreet 33:d3e1e9eb2ef9 115 {
tkstreet 33:d3e1e9eb2ef9 116 MSG("#AP1017: Motor started.\r\n");
tkstreet 33:d3e1e9eb2ef9 117 }
tkstreet 31:8635be9b2e35 118 break;
tkstreet 31:8635be9b2e35 119 }
tkstreet 31:8635be9b2e35 120 case Message::CMD_MOTOR_STOP_MOTOR:
tkstreet 31:8635be9b2e35 121 {
tkstreet 32:42c6b8fb1922 122 if(ap1017->stop() != AP1017::SUCCESS)
tkstreet 31:8635be9b2e35 123 {
tkstreet 31:8635be9b2e35 124 MSG("#AP1017: Failed to stop motor.\r\n");
tkstreet 31:8635be9b2e35 125 }
tkstreet 33:d3e1e9eb2ef9 126 else
tkstreet 33:d3e1e9eb2ef9 127 {
tkstreet 33:d3e1e9eb2ef9 128 MSG("#AP1017: Motor stopped.\r\n");
tkstreet 33:d3e1e9eb2ef9 129 }
tkstreet 31:8635be9b2e35 130 break;
tkstreet 31:8635be9b2e35 131 }
tkstreet 31:8635be9b2e35 132 case Message::CMD_MOTOR_SET_DIRECTION:
tkstreet 31:8635be9b2e35 133 {
tkstreet 32:42c6b8fb1922 134 if(ap1017->setDirection((AP1017::Rotation)(in->getArgument(0))) != AP1017::SUCCESS)
tkstreet 31:8635be9b2e35 135 {
tkstreet 31:8635be9b2e35 136 MSG("#AP1017: Failed to set motor direction.\r\n");
tkstreet 31:8635be9b2e35 137 }
tkstreet 33:d3e1e9eb2ef9 138 else
tkstreet 33:d3e1e9eb2ef9 139 {
tkstreet 33:d3e1e9eb2ef9 140 MSG("#AP1017: Direction changed.\r\n");
tkstreet 33:d3e1e9eb2ef9 141 }
tkstreet 31:8635be9b2e35 142 break;
tkstreet 31:8635be9b2e35 143 }
tkstreet 31:8635be9b2e35 144 case Message::CMD_MOTOR_SET_DUTY_CYCLE:
tkstreet 31:8635be9b2e35 145 {
tkstreet 32:42c6b8fb1922 146 if(ap1017->setSpeed((AP1017::Rotation)(in->getArgument(0))) != AP1017::SUCCESS)
tkstreet 31:8635be9b2e35 147 {
tkstreet 31:8635be9b2e35 148 MSG("#AP1017: Failed to set the duty cycle.\r\n");
tkstreet 31:8635be9b2e35 149 }
tkstreet 33:d3e1e9eb2ef9 150 else
tkstreet 33:d3e1e9eb2ef9 151 {
tkstreet 33:d3e1e9eb2ef9 152 MSG("#AP1017: Duty cycle changed.\r\n");
tkstreet 33:d3e1e9eb2ef9 153 }
tkstreet 31:8635be9b2e35 154 break;
tkstreet 31:8635be9b2e35 155 }
tkstreet 31:8635be9b2e35 156 default:
tkstreet 31:8635be9b2e35 157 {
tkstreet 33:d3e1e9eb2ef9 158 MSG("#AP1017: Invalid or unimplemented command.\r\n");
tkstreet 31:8635be9b2e35 159 status = AkmSensor::ERROR;
tkstreet 31:8635be9b2e35 160 }
tkstreet 31:8635be9b2e35 161 }
tkstreet 31:8635be9b2e35 162
tkstreet 31:8635be9b2e35 163 return status;
tkstreet 25:76c11ab5060e 164 }
tkstreet 25:76c11ab5060e 165
tkstreet 25:76c11ab5060e 166 char* Ap1017Ctrl::getSensorName()
tkstreet 25:76c11ab5060e 167 {
tkstreet 33:d3e1e9eb2ef9 168 MSG("#AP1017: Getting sensor name.\r\n");
tkstreet 33:d3e1e9eb2ef9 169
tkstreet 26:4e436b0cbaf8 170 return sensorName;
tkstreet 31:8635be9b2e35 171 }
tkstreet 31:8635be9b2e35 172
tkstreet 31:8635be9b2e35 173 void Ap1017Ctrl::timerCallback()
tkstreet 31:8635be9b2e35 174 {
tkstreet 33:d3e1e9eb2ef9 175 MSG("#AP1017: timerCallback()\r\n");
tkstreet 33:d3e1e9eb2ef9 176
tkstreet 32:42c6b8fb1922 177 ap1017->setDirection(ap1017->getDirection());
tkstreet 32:42c6b8fb1922 178 ap1017->setSpeed(ap1017->getSpeed());
tkstreet 25:76c11ab5060e 179 }