Modified for compatibility with Rev.E. hardware

Fork of AkmSensor by AKM Development Platform

Committer:
tkstreet
Date:
Fri May 19 23:13:23 2017 +0000
Revision:
36:aafd15b3291b
Parent:
33:d3e1e9eb2ef9
Child:
40:42e48427e4b7
Added DigitalOut and I2C definitions to AP1017 control class.

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 36:aafd15b3291b 4 #define I2C_SPEED 400000
tkstreet 36:aafd15b3291b 5
tkstreet 25:76c11ab5060e 6 Ap1017Ctrl::Ap1017Ctrl()
tkstreet 36:aafd15b3291b 7 {
tkstreet 25:76c11ab5060e 8 ap1017 = NULL;
tkstreet 25:76c11ab5060e 9 sensorName = "";
tkstreet 36:aafd15b3291b 10 interval = 1;
tkstreet 33:d3e1e9eb2ef9 11
tkstreet 33:d3e1e9eb2ef9 12 MSG("#AP1017: Created.\r\n");
tkstreet 25:76c11ab5060e 13 }
tkstreet 25:76c11ab5060e 14
tkstreet 25:76c11ab5060e 15 Ap1017Ctrl::~Ap1017Ctrl()
tkstreet 36:aafd15b3291b 16 {
tkstreet 25:76c11ab5060e 17 if(ap1017)
tkstreet 25:76c11ab5060e 18 delete ap1017;
tkstreet 36:aafd15b3291b 19
tkstreet 36:aafd15b3291b 20 MSG("#AP1017: Destroyed.\r\n");
tkstreet 25:76c11ab5060e 21 }
tkstreet 25:76c11ab5060e 22
tkstreet 25:76c11ab5060e 23 AkmSensor::Status Ap1017Ctrl::init(const uint8_t id, const uint8_t subid)
tkstreet 36:aafd15b3291b 24 {
tkstreet 25:76c11ab5060e 25 primaryId = id;
tkstreet 25:76c11ab5060e 26 subId = subid;
tkstreet 36:aafd15b3291b 27 freq = 100;
tkstreet 36:aafd15b3291b 28 interval = (freq > 0 ? 1/freq : 0);
tkstreet 36:aafd15b3291b 29
tkstreet 36:aafd15b3291b 30 inputA = new DigitalOut(P0_11);
tkstreet 36:aafd15b3291b 31 inputB = new DigitalOut(P0_9);
tkstreet 36:aafd15b3291b 32 i2cMotor = new I2C(I2C_SDA0, I2C_SCL0);
tkstreet 36:aafd15b3291b 33 i2cMotor->frequency(I2C_SPEED);
tkstreet 25:76c11ab5060e 34
tkstreet 26:4e436b0cbaf8 35 switch (subId) { // template for multiple drivers
tkstreet 25:76c11ab5060e 36 case SUB_ID_AP1017:
tkstreet 36:aafd15b3291b 37 ap1017 = new AP1017(inputA, inputB, i2cMotor); // Instantiate AP1017
tkstreet 25:76c11ab5060e 38 sensorName = "AP1017";
tkstreet 33:d3e1e9eb2ef9 39 MSG("#AP1017 found.\r\n");
tkstreet 25:76c11ab5060e 40 break;
tkstreet 25:76c11ab5060e 41 default:
tkstreet 33:d3e1e9eb2ef9 42 MSG("#Error: No sensor found.\r\n.");
tkstreet 25:76c11ab5060e 43 return AkmSensor::ERROR;
tkstreet 25:76c11ab5060e 44 }
tkstreet 25:76c11ab5060e 45
tkstreet 32:42c6b8fb1922 46 // Default settings
tkstreet 32:42c6b8fb1922 47 ap1017->setDirection(AP1017::DIRECTION_CW);
tkstreet 36:aafd15b3291b 48 ap1017->setSpeed(50.0);
tkstreet 36:aafd15b3291b 49
tkstreet 36:aafd15b3291b 50 MSG("#AP1017: Initialized.\r\n");
tkstreet 25:76c11ab5060e 51
tkstreet 25:76c11ab5060e 52 return AkmSensor::SUCCESS;
tkstreet 25:76c11ab5060e 53 }
tkstreet 25:76c11ab5060e 54
tkstreet 25:76c11ab5060e 55 bool Ap1017Ctrl::isEvent()
tkstreet 33:d3e1e9eb2ef9 56 {
tkstreet 36:aafd15b3291b 57 return false; // No feedback: always false
tkstreet 25:76c11ab5060e 58 }
tkstreet 25:76c11ab5060e 59
tkstreet 25:76c11ab5060e 60 AkmSensor::Status Ap1017Ctrl::startSensor()
tkstreet 36:aafd15b3291b 61 {
tkstreet 36:aafd15b3291b 62 if(freq > 0)
tkstreet 36:aafd15b3291b 63 interval = 1/freq;
tkstreet 36:aafd15b3291b 64
tkstreet 36:aafd15b3291b 65 index = (uint8_t)(100.0/(ap1017->getSpeed()));
tkstreet 36:aafd15b3291b 66
tkstreet 36:aafd15b3291b 67 MSG("#AP1017: Sensor started with no interval argument.\r\n");
tkstreet 36:aafd15b3291b 68 MSG("#AP1017: Speed = %.2f\r\n", ap1017->getSpeed());
tkstreet 36:aafd15b3291b 69 MSG("#AP1017: Frequency = %.1f Hz\r\n", freq);
tkstreet 36:aafd15b3291b 70 MSG("#AP1017: Index = %d\r\n", index);
tkstreet 36:aafd15b3291b 71 MSG("#AP1017: PWM Period = %.8f\r\n", interval);
tkstreet 36:aafd15b3291b 72 MSG("#AP1017: Pulse Period = %.8f\r\n", interval/index);
tkstreet 33:d3e1e9eb2ef9 73
tkstreet 36:aafd15b3291b 74
tkstreet 36:aafd15b3291b 75 pwm.attach(callback(this, &Ap1017Ctrl::pwmPeriod), interval);
tkstreet 36:aafd15b3291b 76 pulse.attach(callback(this, &Ap1017Ctrl::pwmOnPulse), interval/index);
tkstreet 36:aafd15b3291b 77
tkstreet 25:76c11ab5060e 78 return AkmSensor::SUCCESS;
tkstreet 25:76c11ab5060e 79 }
tkstreet 25:76c11ab5060e 80
tkstreet 36:aafd15b3291b 81 AkmSensor::Status Ap1017Ctrl::startSensor(const float freq)
tkstreet 25:76c11ab5060e 82 {
tkstreet 36:aafd15b3291b 83 interval = 1/freq;
tkstreet 33:d3e1e9eb2ef9 84
tkstreet 36:aafd15b3291b 85 MSG("#AP1017: Sensor started with interval argument.\r\n");
tkstreet 32:42c6b8fb1922 86
tkstreet 25:76c11ab5060e 87 return AkmSensor::SUCCESS;
tkstreet 25:76c11ab5060e 88 }
tkstreet 25:76c11ab5060e 89
tkstreet 25:76c11ab5060e 90 AkmSensor::Status Ap1017Ctrl::stopSensor()
tkstreet 36:aafd15b3291b 91 {
tkstreet 36:aafd15b3291b 92 pwm.detach();
tkstreet 33:d3e1e9eb2ef9 93
tkstreet 36:aafd15b3291b 94 ap1017->stop();
tkstreet 36:aafd15b3291b 95
tkstreet 36:aafd15b3291b 96 MSG("#AP1017: Sensor stopped.\r\n");
tkstreet 32:42c6b8fb1922 97
tkstreet 25:76c11ab5060e 98 return AkmSensor::SUCCESS;
tkstreet 25:76c11ab5060e 99 }
tkstreet 25:76c11ab5060e 100
tkstreet 25:76c11ab5060e 101 AkmSensor::Status Ap1017Ctrl::readSensorData(Message* msg)
tkstreet 25:76c11ab5060e 102 {
tkstreet 33:d3e1e9eb2ef9 103 MSG("#AP1017: No sensor data to read.\r\n");
tkstreet 33:d3e1e9eb2ef9 104
tkstreet 33:d3e1e9eb2ef9 105 return AkmSensor::ERROR;
tkstreet 25:76c11ab5060e 106 }
tkstreet 25:76c11ab5060e 107
tkstreet 25:76c11ab5060e 108 AkmSensor::Status Ap1017Ctrl::requestCommand(Message* in, Message* out)
tkstreet 36:aafd15b3291b 109 {
tkstreet 31:8635be9b2e35 110 AkmSensor::Status status = AkmSensor::SUCCESS;
tkstreet 31:8635be9b2e35 111
tkstreet 31:8635be9b2e35 112 Message::Command cmd = in->getCommand(); // Store command
tkstreet 31:8635be9b2e35 113 out->setCommand(cmd); // Load command into output
tkstreet 31:8635be9b2e35 114
tkstreet 31:8635be9b2e35 115 switch(cmd)
tkstreet 31:8635be9b2e35 116 {
tkstreet 31:8635be9b2e35 117 case Message::CMD_MOTOR_START_MOTOR:
tkstreet 31:8635be9b2e35 118 {
tkstreet 36:aafd15b3291b 119 if(startSensor() != AkmSensor::SUCCESS)
tkstreet 31:8635be9b2e35 120 {
tkstreet 31:8635be9b2e35 121 MSG("#AP1017: Failed to start motor.\r\n");
tkstreet 31:8635be9b2e35 122 return AkmSensor::ERROR;
tkstreet 31:8635be9b2e35 123 }
tkstreet 33:d3e1e9eb2ef9 124 else
tkstreet 33:d3e1e9eb2ef9 125 {
tkstreet 33:d3e1e9eb2ef9 126 MSG("#AP1017: Motor started.\r\n");
tkstreet 33:d3e1e9eb2ef9 127 }
tkstreet 31:8635be9b2e35 128 break;
tkstreet 31:8635be9b2e35 129 }
tkstreet 31:8635be9b2e35 130 case Message::CMD_MOTOR_STOP_MOTOR:
tkstreet 31:8635be9b2e35 131 {
tkstreet 36:aafd15b3291b 132 if(stopSensor() != AkmSensor::SUCCESS)
tkstreet 31:8635be9b2e35 133 {
tkstreet 31:8635be9b2e35 134 MSG("#AP1017: Failed to stop motor.\r\n");
tkstreet 31:8635be9b2e35 135 }
tkstreet 33:d3e1e9eb2ef9 136 else
tkstreet 33:d3e1e9eb2ef9 137 {
tkstreet 33:d3e1e9eb2ef9 138 MSG("#AP1017: Motor stopped.\r\n");
tkstreet 33:d3e1e9eb2ef9 139 }
tkstreet 31:8635be9b2e35 140 break;
tkstreet 31:8635be9b2e35 141 }
tkstreet 31:8635be9b2e35 142 case Message::CMD_MOTOR_SET_DIRECTION:
tkstreet 31:8635be9b2e35 143 {
tkstreet 32:42c6b8fb1922 144 if(ap1017->setDirection((AP1017::Rotation)(in->getArgument(0))) != AP1017::SUCCESS)
tkstreet 31:8635be9b2e35 145 {
tkstreet 31:8635be9b2e35 146 MSG("#AP1017: Failed to set motor direction.\r\n");
tkstreet 31:8635be9b2e35 147 }
tkstreet 33:d3e1e9eb2ef9 148 else
tkstreet 33:d3e1e9eb2ef9 149 {
tkstreet 33:d3e1e9eb2ef9 150 MSG("#AP1017: Direction changed.\r\n");
tkstreet 33:d3e1e9eb2ef9 151 }
tkstreet 31:8635be9b2e35 152 break;
tkstreet 31:8635be9b2e35 153 }
tkstreet 31:8635be9b2e35 154 case Message::CMD_MOTOR_SET_DUTY_CYCLE:
tkstreet 31:8635be9b2e35 155 {
tkstreet 32:42c6b8fb1922 156 if(ap1017->setSpeed((AP1017::Rotation)(in->getArgument(0))) != AP1017::SUCCESS)
tkstreet 31:8635be9b2e35 157 {
tkstreet 31:8635be9b2e35 158 MSG("#AP1017: Failed to set the duty cycle.\r\n");
tkstreet 31:8635be9b2e35 159 }
tkstreet 33:d3e1e9eb2ef9 160 else
tkstreet 33:d3e1e9eb2ef9 161 {
tkstreet 36:aafd15b3291b 162 MSG("#AP1017: Duty cycle changed: %.2f.\r\n", ap1017->getSpeed());
tkstreet 33:d3e1e9eb2ef9 163 }
tkstreet 31:8635be9b2e35 164 break;
tkstreet 31:8635be9b2e35 165 }
tkstreet 31:8635be9b2e35 166 default:
tkstreet 31:8635be9b2e35 167 {
tkstreet 33:d3e1e9eb2ef9 168 MSG("#AP1017: Invalid or unimplemented command.\r\n");
tkstreet 31:8635be9b2e35 169 status = AkmSensor::ERROR;
tkstreet 31:8635be9b2e35 170 }
tkstreet 31:8635be9b2e35 171 }
tkstreet 31:8635be9b2e35 172
tkstreet 31:8635be9b2e35 173 return status;
tkstreet 25:76c11ab5060e 174 }
tkstreet 25:76c11ab5060e 175
tkstreet 25:76c11ab5060e 176 char* Ap1017Ctrl::getSensorName()
tkstreet 25:76c11ab5060e 177 {
tkstreet 33:d3e1e9eb2ef9 178 MSG("#AP1017: Getting sensor name.\r\n");
tkstreet 33:d3e1e9eb2ef9 179
tkstreet 26:4e436b0cbaf8 180 return sensorName;
tkstreet 31:8635be9b2e35 181 }
tkstreet 31:8635be9b2e35 182
tkstreet 36:aafd15b3291b 183 // This callback function generates the period for the PWM
tkstreet 36:aafd15b3291b 184 void Ap1017Ctrl::pwmPeriod()
tkstreet 31:8635be9b2e35 185 {
tkstreet 36:aafd15b3291b 186 if(!ap1017->isMotorOn())
tkstreet 36:aafd15b3291b 187 ap1017->start();
tkstreet 36:aafd15b3291b 188 }
tkstreet 36:aafd15b3291b 189
tkstreet 36:aafd15b3291b 190 // This callback function generates period for the ON pulse
tkstreet 36:aafd15b3291b 191 void Ap1017Ctrl::pwmOnPulse()
tkstreet 36:aafd15b3291b 192 {
tkstreet 36:aafd15b3291b 193 static char pulseCounter = 0;
tkstreet 33:d3e1e9eb2ef9 194
tkstreet 36:aafd15b3291b 195 pulseCounter++;
tkstreet 36:aafd15b3291b 196
tkstreet 36:aafd15b3291b 197 if( (pulseCounter % index == 1) && ap1017->isMotorOn() )
tkstreet 36:aafd15b3291b 198 {
tkstreet 36:aafd15b3291b 199 ap1017->stop();
tkstreet 36:aafd15b3291b 200 }
tkstreet 25:76c11ab5060e 201 }