Microcontroller firmware that uses a simple, yet powerful scripting language to control the timing of input and output events with high temporal resolution. Written by Mattias Karlsson

Dependencies:   SMARTWAV mbed

Committer:
mkarlsso
Date:
Tue Feb 07 18:45:25 2017 +0000
Revision:
7:5fe7329751d4
Parent:
4:abee20c0bf2a
Fixed flip command for digital outputs

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mkarlsso 0:8dbd6bd9167f 1 #include "mbedInterface.h"
mkarlsso 0:8dbd6bd9167f 2 #include "mbed.h"
mkarlsso 0:8dbd6bd9167f 3
mkarlsso 0:8dbd6bd9167f 4
mkarlsso 0:8dbd6bd9167f 5
mkarlsso 0:8dbd6bd9167f 6 //--------------------------------------------------------------
mkarlsso 0:8dbd6bd9167f 7 //--------------------------------------------------------------
mkarlsso 0:8dbd6bd9167f 8 //This section is required for all custom harware interfaces
mkarlsso 0:8dbd6bd9167f 9
mkarlsso 0:8dbd6bd9167f 10 //globals defined in hardwareInterface.cpp
mkarlsso 0:8dbd6bd9167f 11 extern uint32_t timeKeeper; //the master clock
mkarlsso 3:d7b0a0890d96 12 uint32_t uSec_SinceLastClockInc = 0;
mkarlsso 3:d7b0a0890d96 13 uint32_t uSec_SinceLastReset = 0;
mkarlsso 3:d7b0a0890d96 14
mkarlsso 0:8dbd6bd9167f 15 extern bool resetTimer;
mkarlsso 0:8dbd6bd9167f 16 extern bool clockSlave;
mkarlsso 0:8dbd6bd9167f 17 extern bool changeToSlave;
mkarlsso 0:8dbd6bd9167f 18 extern bool changeToStandAlone;
mkarlsso 0:8dbd6bd9167f 19 extern outputStream textDisplay;
mkarlsso 0:8dbd6bd9167f 20
mkarlsso 4:abee20c0bf2a 21 int externalIncrementMod = 1;
mkarlsso 0:8dbd6bd9167f 22 int externalIncrementCounter = 0;
mkarlsso 0:8dbd6bd9167f 23
mkarlsso 0:8dbd6bd9167f 24
mkarlsso 0:8dbd6bd9167f 25 #ifdef MBED_RF
mkarlsso 3:d7b0a0890d96 26 //We are listening to an RF signal for hardware syncing----------------------------------------
mkarlsso 0:8dbd6bd9167f 27 //Uses DB9->RJ45 connector to map the following channels:
mkarlsso 0:8dbd6bd9167f 28 //1: P28 Clock Signal In
mkarlsso 0:8dbd6bd9167f 29 //2: P27 Data Signal In
mkarlsso 0:8dbd6bd9167f 30 //3: P20 FiberLED Out Signal
mkarlsso 0:8dbd6bd9167f 31 //4: 5V
mkarlsso 0:8dbd6bd9167f 32 //5: GND
mkarlsso 0:8dbd6bd9167f 33 //6: P6 NC
mkarlsso 0:8dbd6bd9167f 34 //7: P7 NC
mkarlsso 0:8dbd6bd9167f 35 //8: P8 NC
mkarlsso 0:8dbd6bd9167f 36
mkarlsso 0:8dbd6bd9167f 37 DigitalOut mainLED(LED1);
mkarlsso 0:8dbd6bd9167f 38 DigitalOut secondaryLED(LED2);
mkarlsso 0:8dbd6bd9167f 39
mkarlsso 0:8dbd6bd9167f 40 bool lightOn = false;
mkarlsso 0:8dbd6bd9167f 41 bool lightOn2 = false;
mkarlsso 0:8dbd6bd9167f 42 int pulseCounter = 0;
mkarlsso 0:8dbd6bd9167f 43 uint32_t lastPulse = 0;
mkarlsso 0:8dbd6bd9167f 44 uint32_t currentRFTime = 0;
mkarlsso 0:8dbd6bd9167f 45 uint32_t lastRFTime = 0;
mkarlsso 0:8dbd6bd9167f 46 uint32_t timeKeeperAtCurrentRFTime = 0;
mkarlsso 0:8dbd6bd9167f 47 uint32_t timeKeeperAtLastRFTime = 0;
mkarlsso 0:8dbd6bd9167f 48 int RFSyncCounter = 0;
mkarlsso 0:8dbd6bd9167f 49 bool RFSyncReadable = false;
mkarlsso 0:8dbd6bd9167f 50 bool RFSyncWritable = true;
mkarlsso 0:8dbd6bd9167f 51
mkarlsso 0:8dbd6bd9167f 52 //Recieve clock signal from RF system
mkarlsso 0:8dbd6bd9167f 53 InterruptIn RFClock(p28);
mkarlsso 0:8dbd6bd9167f 54 DigitalIn RFData(p27);
mkarlsso 0:8dbd6bd9167f 55
mkarlsso 0:8dbd6bd9167f 56
mkarlsso 0:8dbd6bd9167f 57 void callback_RFClock(void) {
mkarlsso 0:8dbd6bd9167f 58
mkarlsso 0:8dbd6bd9167f 59 //if this amount of time has passed since the last pulse, we have a new timestamp
mkarlsso 0:8dbd6bd9167f 60 if ((timeKeeper-lastPulse) > 4) {
mkarlsso 0:8dbd6bd9167f 61
mkarlsso 0:8dbd6bd9167f 62 //make sure the previous timestamp was 32 pulses
mkarlsso 0:8dbd6bd9167f 63 //if so, update lastRFTime
mkarlsso 0:8dbd6bd9167f 64 //we only process every 100th stamp (once every 10 seconds with 10 Hz timestamps)
mkarlsso 0:8dbd6bd9167f 65 if ((pulseCounter == 31) && (RFSyncCounter == 99)){
mkarlsso 0:8dbd6bd9167f 66 if (RFSyncWritable) {
mkarlsso 0:8dbd6bd9167f 67 lastRFTime = currentRFTime;
mkarlsso 0:8dbd6bd9167f 68 timeKeeperAtLastRFTime = timeKeeperAtCurrentRFTime;
mkarlsso 0:8dbd6bd9167f 69 RFSyncReadable = true;
mkarlsso 0:8dbd6bd9167f 70 RFSyncWritable = false;
mkarlsso 0:8dbd6bd9167f 71 }
mkarlsso 0:8dbd6bd9167f 72 }
mkarlsso 0:8dbd6bd9167f 73
mkarlsso 0:8dbd6bd9167f 74 pulseCounter = 0;
mkarlsso 0:8dbd6bd9167f 75 currentRFTime = 0;
mkarlsso 0:8dbd6bd9167f 76 timeKeeperAtCurrentRFTime = timeKeeper;
mkarlsso 0:8dbd6bd9167f 77 RFSyncCounter = (RFSyncCounter+1)%100;
mkarlsso 0:8dbd6bd9167f 78
mkarlsso 0:8dbd6bd9167f 79
mkarlsso 0:8dbd6bd9167f 80 if (lightOn) {
mkarlsso 0:8dbd6bd9167f 81 mainLED = 0;
mkarlsso 0:8dbd6bd9167f 82 lightOn = false;
mkarlsso 0:8dbd6bd9167f 83 } else {
mkarlsso 0:8dbd6bd9167f 84 mainLED = 1;
mkarlsso 0:8dbd6bd9167f 85 lightOn = true;
mkarlsso 0:8dbd6bd9167f 86 }
mkarlsso 0:8dbd6bd9167f 87 } else {
mkarlsso 0:8dbd6bd9167f 88 if (pulseCounter < 32) {
mkarlsso 0:8dbd6bd9167f 89 currentRFTime = (currentRFTime | ( RFData.read() << pulseCounter));
mkarlsso 0:8dbd6bd9167f 90 pulseCounter++;
mkarlsso 0:8dbd6bd9167f 91 }
mkarlsso 0:8dbd6bd9167f 92 }
mkarlsso 0:8dbd6bd9167f 93 lastPulse = timeKeeper;
mkarlsso 0:8dbd6bd9167f 94 }
mkarlsso 0:8dbd6bd9167f 95
mkarlsso 0:8dbd6bd9167f 96 //------------------------------------------------------------
mkarlsso 0:8dbd6bd9167f 97 #endif
mkarlsso 0:8dbd6bd9167f 98
mkarlsso 3:d7b0a0890d96 99 void externalClockIncDown() {
mkarlsso 0:8dbd6bd9167f 100
mkarlsso 3:d7b0a0890d96 101 //The external clock increment signal pulse has come back down. If the pulse was long
mkarlsso 3:d7b0a0890d96 102 //enough, then we condsider it a valid pulse (the pulses should be 0.5 ms long)
mkarlsso 3:d7b0a0890d96 103 if ((clockSlave)&&(uSec_SinceLastClockInc >= 300)) {
mkarlsso 3:d7b0a0890d96 104 uSec_SinceLastClockInc = 0;
mkarlsso 3:d7b0a0890d96 105 timeKeeper++;
mkarlsso 3:d7b0a0890d96 106
mkarlsso 3:d7b0a0890d96 107 //Clock resets happen upon update so we dont get a partial first ms
mkarlsso 3:d7b0a0890d96 108 if (resetTimer) {
mkarlsso 3:d7b0a0890d96 109 uSec_SinceLastReset = 0;
mkarlsso 3:d7b0a0890d96 110 timeKeeper = 0;
mkarlsso 3:d7b0a0890d96 111 resetTimer = false;
mkarlsso 3:d7b0a0890d96 112 }
mkarlsso 3:d7b0a0890d96 113 }
mkarlsso 3:d7b0a0890d96 114
mkarlsso 3:d7b0a0890d96 115 }
mkarlsso 3:d7b0a0890d96 116
mkarlsso 3:d7b0a0890d96 117 void externalResetDown() {
mkarlsso 3:d7b0a0890d96 118
mkarlsso 3:d7b0a0890d96 119 //The external clock reset signal pulse has come back down. If the pulse was long
mkarlsso 3:d7b0a0890d96 120 //enough, then we condsider it a valid pulse (the pulses should be 1 ms long)
mkarlsso 4:abee20c0bf2a 121 /*
mkarlsso 4:abee20c0bf2a 122 textDisplay << uSec_SinceLastReset;
mkarlsso 3:d7b0a0890d96 123 if ((clockSlave)&&(uSec_SinceLastReset >= 700)) {
mkarlsso 3:d7b0a0890d96 124 uSec_SinceLastReset = 0;
mkarlsso 3:d7b0a0890d96 125 timeKeeper = 1; //It has been 1ms since the reset pulse went up
mkarlsso 3:d7b0a0890d96 126 textDisplay << timeKeeper << " Clock reset\r\n";
mkarlsso 4:abee20c0bf2a 127 }*/
mkarlsso 3:d7b0a0890d96 128 }
mkarlsso 0:8dbd6bd9167f 129
mkarlsso 0:8dbd6bd9167f 130 //------------------------------------------------------------------------
mkarlsso 0:8dbd6bd9167f 131 //------------------------------------------------------------------------
mkarlsso 0:8dbd6bd9167f 132
mkarlsso 0:8dbd6bd9167f 133 //MBED-specific stuff
mkarlsso 0:8dbd6bd9167f 134 //---------------------------------------------------------------------
mkarlsso 0:8dbd6bd9167f 135
mkarlsso 0:8dbd6bd9167f 136 //translate pin numbers to hardware pins
mkarlsso 7:5fe7329751d4 137 //PinName dOutPins[NUMDIGOUTPORTS] = {p11,p13,p15,p18,p21,p23,p25,p29,p20,p6}; //Old board output pins
mkarlsso 0:8dbd6bd9167f 138
mkarlsso 7:5fe7329751d4 139 //PinName dOutPins[NUMDIGOUTPORTS] = {p18,p15,p13,p11,p29,p25,p23,p21,p20}; //New board output pins
mkarlsso 7:5fe7329751d4 140 //PinName dInPins[NUMDIGINPORTS] = {p12,p14,p16,p17,p22,p24,p26,p30,p7};
mkarlsso 7:5fe7329751d4 141 //PinName aInPins[NUMANINPORTS] = {};
mkarlsso 7:5fe7329751d4 142 //PinName aOutPins[NUMANOUTPORTS] = {};
mkarlsso 7:5fe7329751d4 143
mkarlsso 7:5fe7329751d4 144 PinName dOutPins[NUMDIGOUTPORTS] = {p7,p15,p13,p11,p29,p25,p23,p21}; //With analog pins
mkarlsso 7:5fe7329751d4 145 PinName dInPins[NUMDIGINPORTS] = {p12,p14,p16,p17,p22,p24,p26,p30};
mkarlsso 7:5fe7329751d4 146 PinName aInPins[NUMANINPORTS] = {p20};
mkarlsso 7:5fe7329751d4 147 PinName aOutPins[NUMANOUTPORTS] = {p18};
mkarlsso 0:8dbd6bd9167f 148
mkarlsso 3:d7b0a0890d96 149
mkarlsso 0:8dbd6bd9167f 150 //The sound output uses a SmartWav device and their simple serial library
mkarlsso 0:8dbd6bd9167f 151 SMARTWAV sWav(p9,p10,p19); //(TX,RX,Reset);
mkarlsso 0:8dbd6bd9167f 152
mkarlsso 0:8dbd6bd9167f 153 //This is the callback for the MBED timer
mkarlsso 0:8dbd6bd9167f 154 extern "C" void TIMER0_IRQHandler (void) {
mkarlsso 0:8dbd6bd9167f 155
mkarlsso 4:abee20c0bf2a 156 /*if (clockSlave) {
mkarlsso 4:abee20c0bf2a 157
mkarlsso 3:d7b0a0890d96 158 //The function is called every 100 us
mkarlsso 4:abee20c0bf2a 159 if((LPC_TIM0->IR & 0x01) == 0x01) { // if MR0 interrupt, proceed
mkarlsso 4:abee20c0bf2a 160
mkarlsso 4:abee20c0bf2a 161 LPC_TIM0->IR |= 1 << 0; // Clear MR0 interrupt flag
mkarlsso 4:abee20c0bf2a 162 uSec_SinceLastClockInc = uSec_SinceLastClockInc+100;
mkarlsso 4:abee20c0bf2a 163 uSec_SinceLastReset = uSec_SinceLastReset+100;
mkarlsso 4:abee20c0bf2a 164
mkarlsso 4:abee20c0bf2a 165 }
mkarlsso 4:abee20c0bf2a 166
mkarlsso 4:abee20c0bf2a 167
mkarlsso 4:abee20c0bf2a 168 } else {*/
mkarlsso 3:d7b0a0890d96 169 //The function is called every 1 ms
mkarlsso 3:d7b0a0890d96 170 if((LPC_TIM0->IR & 0x01) == 0x01) { // if MR0 interrupt, proceed
mkarlsso 0:8dbd6bd9167f 171
mkarlsso 3:d7b0a0890d96 172 LPC_TIM0->IR |= 1 << 0; // Clear MR0 interrupt flag
mkarlsso 3:d7b0a0890d96 173 timeKeeper++;
mkarlsso 0:8dbd6bd9167f 174
mkarlsso 3:d7b0a0890d96 175 if (resetTimer) {
mkarlsso 3:d7b0a0890d96 176 timeKeeper = 0;
mkarlsso 3:d7b0a0890d96 177 resetTimer = false;
mkarlsso 3:d7b0a0890d96 178 }
mkarlsso 0:8dbd6bd9167f 179 }
mkarlsso 4:abee20c0bf2a 180 //}
mkarlsso 3:d7b0a0890d96 181
mkarlsso 0:8dbd6bd9167f 182 }
mkarlsso 0:8dbd6bd9167f 183 //-----------------------------------------------------------------------
mkarlsso 0:8dbd6bd9167f 184
mkarlsso 0:8dbd6bd9167f 185
mkarlsso 0:8dbd6bd9167f 186
mkarlsso 0:8dbd6bd9167f 187 MBEDSystem::MBEDSystem():
mkarlsso 0:8dbd6bd9167f 188 clockResetInt(p5),
mkarlsso 0:8dbd6bd9167f 189 clockExternalIncrement(p8) {
mkarlsso 0:8dbd6bd9167f 190
mkarlsso 0:8dbd6bd9167f 191 clockResetInt.rise(this, &MBEDSystem::externalClockReset);
mkarlsso 3:d7b0a0890d96 192 clockResetInt.fall(&externalResetDown);
mkarlsso 0:8dbd6bd9167f 193 clockResetInt.mode(PullDown);
mkarlsso 0:8dbd6bd9167f 194
mkarlsso 0:8dbd6bd9167f 195 clockExternalIncrement.mode(PullDown);
mkarlsso 0:8dbd6bd9167f 196
mkarlsso 0:8dbd6bd9167f 197 #ifdef MBED_RF
mkarlsso 0:8dbd6bd9167f 198 //Karpova version-------------
mkarlsso 0:8dbd6bd9167f 199 //Set up callbacks for RF clock signal
mkarlsso 0:8dbd6bd9167f 200 RFClock.rise(&callback_RFClock);
mkarlsso 0:8dbd6bd9167f 201 RFClock.mode(PullDown);
mkarlsso 0:8dbd6bd9167f 202 #endif
mkarlsso 0:8dbd6bd9167f 203
mkarlsso 0:8dbd6bd9167f 204 //-------------------------------
mkarlsso 0:8dbd6bd9167f 205
mkarlsso 7:5fe7329751d4 206 for (int i=0; i < NUMDIGINPORTS; i++) {
mkarlsso 0:8dbd6bd9167f 207 dIn[i].init(i);
mkarlsso 7:5fe7329751d4 208 }
mkarlsso 7:5fe7329751d4 209 for (int i=0; i < NUMDIGOUTPORTS; i++) {
mkarlsso 0:8dbd6bd9167f 210 dOut[i].init(i);
mkarlsso 0:8dbd6bd9167f 211 }
mkarlsso 7:5fe7329751d4 212 for (int i=0; i < NUMANINPORTS; i++) {
mkarlsso 7:5fe7329751d4 213 aIn[i].init(i);
mkarlsso 7:5fe7329751d4 214 }
mkarlsso 7:5fe7329751d4 215 for (int i=0; i < NUMANOUTPORTS; i++) {
mkarlsso 7:5fe7329751d4 216 aOut[i].init(i);
mkarlsso 7:5fe7329751d4 217 }
mkarlsso 7:5fe7329751d4 218
mkarlsso 0:8dbd6bd9167f 219
mkarlsso 0:8dbd6bd9167f 220
mkarlsso 0:8dbd6bd9167f 221 sWav.reset();
mkarlsso 0:8dbd6bd9167f 222
mkarlsso 0:8dbd6bd9167f 223 }
mkarlsso 0:8dbd6bd9167f 224
mkarlsso 0:8dbd6bd9167f 225 void MBEDSystem::timerinit() {
mkarlsso 0:8dbd6bd9167f 226 //intiatiation of timer (specific to the LPC17xx chip). This is used in
mkarlsso 0:8dbd6bd9167f 227 //standalone mode to increment the clock every ms.
mkarlsso 0:8dbd6bd9167f 228 //----------------------------------------------------
mkarlsso 0:8dbd6bd9167f 229 //LPC_SC->PCLKSEL1 &= (3 << 12); //mask
mkarlsso 0:8dbd6bd9167f 230 //LPC_SC->PCLKSEL1 |= (1 << 12); //sets it to 1*SystemCoreClock - table 42 (page 57 in user manual)
mkarlsso 0:8dbd6bd9167f 231 //LPC_SC->PCLKSEL0 &= (3 << 3); //mask
mkarlsso 0:8dbd6bd9167f 232 //LPC_SC->PCLKSEL0 |= (1 << 3); //sets it to 1*SystemCoreClock - table 42 (page 57 in user manual)
mkarlsso 3:d7b0a0890d96 233 LPC_SC->PCONP |=1<1; //timer0 power on
mkarlsso 4:abee20c0bf2a 234
mkarlsso 4:abee20c0bf2a 235
mkarlsso 0:8dbd6bd9167f 236 LPC_TIM0->MR0 = 23980; //1 msec
mkarlsso 3:d7b0a0890d96 237
mkarlsso 4:abee20c0bf2a 238
mkarlsso 0:8dbd6bd9167f 239 //LPC_TIM0->PR = (SystemCoreClock / 1000000); //microsecond steps
mkarlsso 0:8dbd6bd9167f 240 //LPC_TIM0->MR0 = 1000; //100 msec
mkarlsso 0:8dbd6bd9167f 241 //LPC_TIM0->MR0 = (SystemCoreClock / 1000000); //microsecond steps
mkarlsso 0:8dbd6bd9167f 242 LPC_TIM0->MCR = 3; //interrupt and reset control
mkarlsso 0:8dbd6bd9167f 243 //3 = Interrupt & reset timer0 on match
mkarlsso 0:8dbd6bd9167f 244 //1 = Interrupt only, no reset of timer0
mkarlsso 0:8dbd6bd9167f 245 NVIC_EnableIRQ(TIMER0_IRQn); //enable timer0 interrupt
mkarlsso 0:8dbd6bd9167f 246 LPC_TIM0->TCR = 1; //enable Timer0
mkarlsso 0:8dbd6bd9167f 247 //--------------------------------------------------------------
mkarlsso 0:8dbd6bd9167f 248 }
mkarlsso 0:8dbd6bd9167f 249
mkarlsso 3:d7b0a0890d96 250 void MBEDSystem::pauseInterrupts() {
mkarlsso 3:d7b0a0890d96 251 __disable_irq();
mkarlsso 3:d7b0a0890d96 252 }
mkarlsso 3:d7b0a0890d96 253
mkarlsso 3:d7b0a0890d96 254 void MBEDSystem::resumeInterrupts() {
mkarlsso 3:d7b0a0890d96 255 __enable_irq();
mkarlsso 3:d7b0a0890d96 256 }
mkarlsso 3:d7b0a0890d96 257
mkarlsso 0:8dbd6bd9167f 258 void MBEDSystem::mainLoopToDo() {
mkarlsso 0:8dbd6bd9167f 259 #ifdef MBED_RF
mkarlsso 0:8dbd6bd9167f 260 //Karpova version--------------------------
mkarlsso 0:8dbd6bd9167f 261 //Karpova lab RF addition. Print out time sync.
mkarlsso 0:8dbd6bd9167f 262 if (RFSyncReadable) {
mkarlsso 0:8dbd6bd9167f 263 /*
mkarlsso 0:8dbd6bd9167f 264 ostringstream RFTimeConvert;
mkarlsso 0:8dbd6bd9167f 265 RFTimeConvert << timeKeeperAtLastRFTime << " " << "RFsync " << lastRFTime << " "; //broadcast the earliest timestamp when a change occured
mkarlsso 0:8dbd6bd9167f 266
mkarlsso 0:8dbd6bd9167f 267 textDisplay.send(RFTimeConvert.str() + "\r\n");
mkarlsso 0:8dbd6bd9167f 268 RFTimeConvert.clear();
mkarlsso 0:8dbd6bd9167f 269 RFTimeConvert.seekp(0);
mkarlsso 0:8dbd6bd9167f 270 */
mkarlsso 0:8dbd6bd9167f 271
mkarlsso 0:8dbd6bd9167f 272 textDisplay << timeKeeperAtLastRFTime << " RFsync " << lastRFTime << "\r\n";
mkarlsso 0:8dbd6bd9167f 273
mkarlsso 0:8dbd6bd9167f 274 RFSyncReadable = false;
mkarlsso 0:8dbd6bd9167f 275 RFSyncWritable = true;
mkarlsso 0:8dbd6bd9167f 276 }
mkarlsso 0:8dbd6bd9167f 277 //------------------------------------------------------------
mkarlsso 0:8dbd6bd9167f 278 #endif
mkarlsso 0:8dbd6bd9167f 279 }
mkarlsso 0:8dbd6bd9167f 280
mkarlsso 0:8dbd6bd9167f 281 sDigitalOut* MBEDSystem::getDigitalOutPtr(int portNum){
mkarlsso 7:5fe7329751d4 282 if (portNum < NUMDIGOUTPORTS) {
mkarlsso 0:8dbd6bd9167f 283 return &dOut[portNum];
mkarlsso 0:8dbd6bd9167f 284 } else {
mkarlsso 0:8dbd6bd9167f 285 return NULL;
mkarlsso 0:8dbd6bd9167f 286 }
mkarlsso 0:8dbd6bd9167f 287 }
mkarlsso 0:8dbd6bd9167f 288
mkarlsso 0:8dbd6bd9167f 289 sDigitalIn* MBEDSystem::getDigitalInPtr(int portNum) {
mkarlsso 7:5fe7329751d4 290 if (portNum < NUMDIGINPORTS) {
mkarlsso 0:8dbd6bd9167f 291 return &dIn[portNum];
mkarlsso 0:8dbd6bd9167f 292 } else {
mkarlsso 0:8dbd6bd9167f 293 return NULL;
mkarlsso 0:8dbd6bd9167f 294 }
mkarlsso 0:8dbd6bd9167f 295 }
mkarlsso 0:8dbd6bd9167f 296
mkarlsso 7:5fe7329751d4 297 sAnalogOut* MBEDSystem::getAnalogOutPtr(int portNum){
mkarlsso 7:5fe7329751d4 298 if (portNum < NUMANOUTPORTS) {
mkarlsso 7:5fe7329751d4 299 return &aOut[portNum];
mkarlsso 7:5fe7329751d4 300 } else {
mkarlsso 7:5fe7329751d4 301 return NULL;
mkarlsso 7:5fe7329751d4 302 }
mkarlsso 7:5fe7329751d4 303 }
mkarlsso 7:5fe7329751d4 304
mkarlsso 7:5fe7329751d4 305 sAnalogIn* MBEDSystem::getAnalogInPtr(int portNum) {
mkarlsso 7:5fe7329751d4 306 if (portNum < NUMANINPORTS) {
mkarlsso 7:5fe7329751d4 307 return &aIn[portNum];
mkarlsso 7:5fe7329751d4 308 } else {
mkarlsso 7:5fe7329751d4 309 return NULL;
mkarlsso 7:5fe7329751d4 310 }
mkarlsso 7:5fe7329751d4 311 }
mkarlsso 7:5fe7329751d4 312
mkarlsso 0:8dbd6bd9167f 313 sSound* MBEDSystem::createNewSoundAction() {
mkarlsso 0:8dbd6bd9167f 314 MBEDSound *tmpSound = new MBEDSound();
mkarlsso 0:8dbd6bd9167f 315 return tmpSound;
mkarlsso 0:8dbd6bd9167f 316 }
mkarlsso 0:8dbd6bd9167f 317
mkarlsso 0:8dbd6bd9167f 318
mkarlsso 0:8dbd6bd9167f 319 void MBEDSystem::externalClockReset() {
mkarlsso 0:8dbd6bd9167f 320
mkarlsso 3:d7b0a0890d96 321 //The pulse has gone high. When the pulse comes down we will check to see if it was long enough to be valid.
mkarlsso 3:d7b0a0890d96 322 uSec_SinceLastReset = 0;
mkarlsso 3:d7b0a0890d96 323
mkarlsso 3:d7b0a0890d96 324
mkarlsso 4:abee20c0bf2a 325
mkarlsso 0:8dbd6bd9167f 326 if (clockSlave) {
mkarlsso 0:8dbd6bd9167f 327 LPC_TIM0->TCR = 0x02; // reset timer
mkarlsso 0:8dbd6bd9167f 328 externalIncrementCounter = 0;
mkarlsso 4:abee20c0bf2a 329
mkarlsso 0:8dbd6bd9167f 330 immediateClockReset();
mkarlsso 4:abee20c0bf2a 331 }
mkarlsso 0:8dbd6bd9167f 332
mkarlsso 0:8dbd6bd9167f 333 }
mkarlsso 0:8dbd6bd9167f 334
mkarlsso 0:8dbd6bd9167f 335 void MBEDSystem::setStandAloneClock() {
mkarlsso 3:d7b0a0890d96 336 clockSlave = false;
mkarlsso 3:d7b0a0890d96 337 NVIC_DisableIRQ(TIMER0_IRQn); // Disable the interrupt
mkarlsso 3:d7b0a0890d96 338 timerinit(); //set up and enable interrupt
mkarlsso 0:8dbd6bd9167f 339 clockExternalIncrement.rise(NULL); //remove the callback to the external interrupt
mkarlsso 3:d7b0a0890d96 340 //clockExternalIncrement.fall(NULL);
mkarlsso 0:8dbd6bd9167f 341 changeToSlave = false;
mkarlsso 0:8dbd6bd9167f 342 changeToStandAlone = false;
mkarlsso 0:8dbd6bd9167f 343 }
mkarlsso 0:8dbd6bd9167f 344
mkarlsso 0:8dbd6bd9167f 345 void MBEDSystem::setSlaveClock() {
mkarlsso 3:d7b0a0890d96 346 clockSlave = true;
mkarlsso 0:8dbd6bd9167f 347 NVIC_DisableIRQ(TIMER0_IRQn); // Disable the interrupt
mkarlsso 3:d7b0a0890d96 348 //timerinit(); //set up and enable interrupt
mkarlsso 0:8dbd6bd9167f 349 clockExternalIncrement.rise(this, &MBEDSystem::incrementClock);
mkarlsso 3:d7b0a0890d96 350 //clockExternalIncrement.fall(&externalClockIncDown);
mkarlsso 0:8dbd6bd9167f 351 clockSlave = true;
mkarlsso 0:8dbd6bd9167f 352 changeToSlave = false;
mkarlsso 0:8dbd6bd9167f 353 changeToStandAlone = false;
mkarlsso 0:8dbd6bd9167f 354 }
mkarlsso 0:8dbd6bd9167f 355
mkarlsso 0:8dbd6bd9167f 356 void MBEDSystem::incrementClock() {
mkarlsso 0:8dbd6bd9167f 357
mkarlsso 0:8dbd6bd9167f 358 if (clockSlave) {
mkarlsso 3:d7b0a0890d96 359 //The pulse has gone high. When the pulse comes down we will check to see if it was long enough to be valid.
mkarlsso 3:d7b0a0890d96 360 //uSec_SinceLastClockInc = 0;
mkarlsso 3:d7b0a0890d96 361
mkarlsso 3:d7b0a0890d96 362
mkarlsso 3:d7b0a0890d96 363 //The clock is incremented
mkarlsso 3:d7b0a0890d96 364
mkarlsso 0:8dbd6bd9167f 365 externalIncrementCounter = (externalIncrementCounter+1) % externalIncrementMod;
mkarlsso 0:8dbd6bd9167f 366 if (externalIncrementCounter==0) {
mkarlsso 0:8dbd6bd9167f 367 timeKeeper++;
mkarlsso 0:8dbd6bd9167f 368 }
mkarlsso 0:8dbd6bd9167f 369
mkarlsso 0:8dbd6bd9167f 370 } else {
mkarlsso 0:8dbd6bd9167f 371 timeKeeper++;
mkarlsso 0:8dbd6bd9167f 372 }
mkarlsso 0:8dbd6bd9167f 373 //Clock resets happen upon update so we dont get a partial first ms
mkarlsso 3:d7b0a0890d96 374 /*
mkarlsso 0:8dbd6bd9167f 375 if (resetTimer) {
mkarlsso 3:d7b0a0890d96 376 uSec_SinceLastReset = 0;
mkarlsso 0:8dbd6bd9167f 377 timeKeeper = 0;
mkarlsso 0:8dbd6bd9167f 378 resetTimer = false;
mkarlsso 3:d7b0a0890d96 379 }*/
mkarlsso 0:8dbd6bd9167f 380 }
mkarlsso 0:8dbd6bd9167f 381
mkarlsso 0:8dbd6bd9167f 382 //-----------------------------------------------------
mkarlsso 0:8dbd6bd9167f 383
mkarlsso 0:8dbd6bd9167f 384 MBEDSound::MBEDSound() {
mkarlsso 0:8dbd6bd9167f 385
mkarlsso 0:8dbd6bd9167f 386 }
mkarlsso 0:8dbd6bd9167f 387
mkarlsso 0:8dbd6bd9167f 388 void MBEDSound::execute() {
mkarlsso 0:8dbd6bd9167f 389 if (reset) {
mkarlsso 0:8dbd6bd9167f 390 sWav.reset();
mkarlsso 0:8dbd6bd9167f 391 } else if (!play) {
mkarlsso 0:8dbd6bd9167f 392 sWav.stopTrack();
mkarlsso 0:8dbd6bd9167f 393 } else {
mkarlsso 0:8dbd6bd9167f 394 if (volume > -1) {
mkarlsso 0:8dbd6bd9167f 395 sWav.volume(volume);
mkarlsso 0:8dbd6bd9167f 396 } else if (volumePtr != NULL) {
mkarlsso 0:8dbd6bd9167f 397 sWav.volume(*volumePtr);
mkarlsso 0:8dbd6bd9167f 398 }
mkarlsso 0:8dbd6bd9167f 399
mkarlsso 0:8dbd6bd9167f 400 if (fileNameExists) {
mkarlsso 0:8dbd6bd9167f 401 //sWav.playTracks();
mkarlsso 0:8dbd6bd9167f 402 sWav.stopTrack();
mkarlsso 0:8dbd6bd9167f 403 sWav.playTrackName(fileName);
mkarlsso 0:8dbd6bd9167f 404 }
mkarlsso 0:8dbd6bd9167f 405 }
mkarlsso 0:8dbd6bd9167f 406 }
mkarlsso 0:8dbd6bd9167f 407
mkarlsso 0:8dbd6bd9167f 408 //-----------------------------------------------------
mkarlsso 7:5fe7329751d4 409 MBEDAnalogOut::MBEDAnalogOut() {
mkarlsso 7:5fe7329751d4 410
mkarlsso 7:5fe7329751d4 411 }
mkarlsso 7:5fe7329751d4 412
mkarlsso 7:5fe7329751d4 413 void MBEDAnalogOut::init(int pin) {
mkarlsso 7:5fe7329751d4 414 if (pin < NUMANOUTPORTS) {
mkarlsso 7:5fe7329751d4 415 outpin = new AnalogOut(aOutPins[pin]);
mkarlsso 7:5fe7329751d4 416 pinExists = true;
mkarlsso 7:5fe7329751d4 417 }
mkarlsso 7:5fe7329751d4 418 }
mkarlsso 7:5fe7329751d4 419
mkarlsso 7:5fe7329751d4 420 int MBEDAnalogOut::read() {
mkarlsso 7:5fe7329751d4 421
mkarlsso 7:5fe7329751d4 422 if (pinExists) {
mkarlsso 7:5fe7329751d4 423 return outpin->read()*3300.0; //read value is a fload between 0 and 1.0 (max voltage). Convert to mV integer value.
mkarlsso 7:5fe7329751d4 424
mkarlsso 7:5fe7329751d4 425 } else {
mkarlsso 7:5fe7329751d4 426 return 0;
mkarlsso 7:5fe7329751d4 427 }
mkarlsso 7:5fe7329751d4 428
mkarlsso 7:5fe7329751d4 429 }
mkarlsso 7:5fe7329751d4 430
mkarlsso 7:5fe7329751d4 431 void MBEDAnalogOut::write(int value) {
mkarlsso 7:5fe7329751d4 432
mkarlsso 7:5fe7329751d4 433 if (pinExists) {
mkarlsso 7:5fe7329751d4 434
mkarlsso 7:5fe7329751d4 435 outpin->write((float)value / 3300.0);//should be a float input (percentage). We convert from integer mV value.
mkarlsso 7:5fe7329751d4 436 }
mkarlsso 7:5fe7329751d4 437
mkarlsso 7:5fe7329751d4 438
mkarlsso 7:5fe7329751d4 439 }
mkarlsso 7:5fe7329751d4 440 //--------------------------------------------------------
mkarlsso 7:5fe7329751d4 441
mkarlsso 7:5fe7329751d4 442 MBEDAnalogIn::MBEDAnalogIn() {
mkarlsso 7:5fe7329751d4 443
mkarlsso 7:5fe7329751d4 444 }
mkarlsso 7:5fe7329751d4 445
mkarlsso 7:5fe7329751d4 446 void MBEDAnalogIn::init(int pin) {
mkarlsso 7:5fe7329751d4 447
mkarlsso 7:5fe7329751d4 448 if (pin < NUMANINPORTS) {
mkarlsso 7:5fe7329751d4 449 inpin = new AnalogIn(aInPins[pin]);
mkarlsso 7:5fe7329751d4 450 pinExists = true;
mkarlsso 7:5fe7329751d4 451 }
mkarlsso 7:5fe7329751d4 452
mkarlsso 7:5fe7329751d4 453 }
mkarlsso 7:5fe7329751d4 454
mkarlsso 7:5fe7329751d4 455 int MBEDAnalogIn::read() {
mkarlsso 7:5fe7329751d4 456
mkarlsso 7:5fe7329751d4 457 if (pinExists) {
mkarlsso 7:5fe7329751d4 458 return inpin->read()*3300; //read value is a fload between 0 and 1.0 (max voltage). Convert to mV integer value.
mkarlsso 7:5fe7329751d4 459 } else {
mkarlsso 7:5fe7329751d4 460 return 0;
mkarlsso 7:5fe7329751d4 461 }
mkarlsso 7:5fe7329751d4 462 }
mkarlsso 7:5fe7329751d4 463
mkarlsso 7:5fe7329751d4 464
mkarlsso 7:5fe7329751d4 465 //-----------------------------------------------------
mkarlsso 0:8dbd6bd9167f 466 MBEDDigitalOut::MBEDDigitalOut() {
mkarlsso 4:abee20c0bf2a 467 pinExists = false;
mkarlsso 0:8dbd6bd9167f 468 }
mkarlsso 0:8dbd6bd9167f 469
mkarlsso 0:8dbd6bd9167f 470 void MBEDDigitalOut::init(int pin) {
mkarlsso 7:5fe7329751d4 471 if (pin < NUMDIGOUTPORTS) {
mkarlsso 7:5fe7329751d4 472 outpin = new DigitalOut(dOutPins[pin]);
mkarlsso 4:abee20c0bf2a 473 pinExists = true;
mkarlsso 4:abee20c0bf2a 474 }
mkarlsso 0:8dbd6bd9167f 475 }
mkarlsso 0:8dbd6bd9167f 476
mkarlsso 0:8dbd6bd9167f 477 int MBEDDigitalOut::read() {
mkarlsso 4:abee20c0bf2a 478 if (pinExists) {
mkarlsso 4:abee20c0bf2a 479 return outpin->read();
mkarlsso 4:abee20c0bf2a 480 } else {
mkarlsso 4:abee20c0bf2a 481 return 0;
mkarlsso 4:abee20c0bf2a 482 }
mkarlsso 0:8dbd6bd9167f 483 }
mkarlsso 0:8dbd6bd9167f 484
mkarlsso 0:8dbd6bd9167f 485 void MBEDDigitalOut::write(int value) {
mkarlsso 4:abee20c0bf2a 486 if (pinExists) {
mkarlsso 4:abee20c0bf2a 487
mkarlsso 4:abee20c0bf2a 488 outpin->write(value);
mkarlsso 4:abee20c0bf2a 489 }
mkarlsso 0:8dbd6bd9167f 490 }
mkarlsso 0:8dbd6bd9167f 491 //--------------------------------------------------------
mkarlsso 0:8dbd6bd9167f 492
mkarlsso 0:8dbd6bd9167f 493 MBEDDigitalIn::MBEDDigitalIn() {
mkarlsso 4:abee20c0bf2a 494 pinExists = false;
mkarlsso 0:8dbd6bd9167f 495 }
mkarlsso 0:8dbd6bd9167f 496
mkarlsso 0:8dbd6bd9167f 497 void MBEDDigitalIn::init(int pin) {
mkarlsso 4:abee20c0bf2a 498
mkarlsso 7:5fe7329751d4 499 if (pin < NUMDIGINPORTS) {
mkarlsso 7:5fe7329751d4 500 inpin = new DigitalIn(dInPins[pin]);
mkarlsso 7:5fe7329751d4 501 inpin_interrupt = new InterruptIn(dInPins[pin]);
mkarlsso 4:abee20c0bf2a 502 inpin->mode(PullDown);
mkarlsso 4:abee20c0bf2a 503 //Set up callbacks for the port interrupts
mkarlsso 4:abee20c0bf2a 504 inpin_interrupt->rise(this, &MBEDDigitalIn::interrupt_up_callback);
mkarlsso 4:abee20c0bf2a 505 inpin_interrupt->fall(this, &MBEDDigitalIn::interrupt_down_callback);
mkarlsso 4:abee20c0bf2a 506 pinExists = true;
mkarlsso 4:abee20c0bf2a 507 }
mkarlsso 0:8dbd6bd9167f 508 }
mkarlsso 0:8dbd6bd9167f 509
mkarlsso 0:8dbd6bd9167f 510 int MBEDDigitalIn::read() {
mkarlsso 4:abee20c0bf2a 511 if (pinExists) {
mkarlsso 4:abee20c0bf2a 512 return inpin->read();
mkarlsso 4:abee20c0bf2a 513 } else {
mkarlsso 4:abee20c0bf2a 514 return 0;
mkarlsso 4:abee20c0bf2a 515 }
mkarlsso 0:8dbd6bd9167f 516 }
mkarlsso 0:8dbd6bd9167f 517
mkarlsso 0:8dbd6bd9167f 518 void MBEDDigitalIn::interrupt_up_callback() {
mkarlsso 0:8dbd6bd9167f 519 addStateChange(1, timeKeeper);
mkarlsso 0:8dbd6bd9167f 520 }
mkarlsso 0:8dbd6bd9167f 521
mkarlsso 0:8dbd6bd9167f 522 void MBEDDigitalIn::interrupt_down_callback() {
mkarlsso 0:8dbd6bd9167f 523 addStateChange(0, timeKeeper);
mkarlsso 0:8dbd6bd9167f 524 }
mkarlsso 0:8dbd6bd9167f 525
mkarlsso 0:8dbd6bd9167f 526 //----------------------------------------------------------
mkarlsso 0:8dbd6bd9167f 527 MBEDSerialPort::MBEDSerialPort() {
mkarlsso 0:8dbd6bd9167f 528
mkarlsso 0:8dbd6bd9167f 529 }
mkarlsso 0:8dbd6bd9167f 530
mkarlsso 0:8dbd6bd9167f 531 void MBEDSerialPort::init() {
mkarlsso 0:8dbd6bd9167f 532 //Initialize serial communication
mkarlsso 0:8dbd6bd9167f 533 serialToPC = new Serial(USBTX, USBRX); // tx, rx
mkarlsso 0:8dbd6bd9167f 534 serialToPC->baud(115200);
mkarlsso 0:8dbd6bd9167f 535
mkarlsso 0:8dbd6bd9167f 536
mkarlsso 0:8dbd6bd9167f 537 }
mkarlsso 0:8dbd6bd9167f 538
mkarlsso 0:8dbd6bd9167f 539 bool MBEDSerialPort::readable() {
mkarlsso 0:8dbd6bd9167f 540 return serialToPC->readable();
mkarlsso 0:8dbd6bd9167f 541 }
mkarlsso 0:8dbd6bd9167f 542
mkarlsso 0:8dbd6bd9167f 543 char MBEDSerialPort::readChar() {
mkarlsso 0:8dbd6bd9167f 544 return serialToPC->getc();
mkarlsso 0:8dbd6bd9167f 545 }
mkarlsso 0:8dbd6bd9167f 546
mkarlsso 0:8dbd6bd9167f 547 void MBEDSerialPort::writeChar(char s) {
mkarlsso 0:8dbd6bd9167f 548 serialToPC->printf("%c", s);
mkarlsso 0:8dbd6bd9167f 549 }
mkarlsso 3:d7b0a0890d96 550
mkarlsso 3:d7b0a0890d96 551 int MBEDSerialPort::requestToWriteString(char *s, int numBytesRequested) {
mkarlsso 3:d7b0a0890d96 552 //request to print a string to the serial output buffer
mkarlsso 3:d7b0a0890d96 553 //function returns the number of chars actually accepted for output
mkarlsso 3:d7b0a0890d96 554 int numBytesAccepted = 0;
mkarlsso 3:d7b0a0890d96 555 while (numBytesAccepted < numBytesRequested) {
mkarlsso 3:d7b0a0890d96 556
mkarlsso 3:d7b0a0890d96 557 writeChar(*(s+numBytesAccepted));
mkarlsso 3:d7b0a0890d96 558 numBytesAccepted++;
mkarlsso 3:d7b0a0890d96 559 }
mkarlsso 3:d7b0a0890d96 560
mkarlsso 3:d7b0a0890d96 561 return numBytesAccepted;
mkarlsso 3:d7b0a0890d96 562 }