fork of StateScript

Dependencies:   mbed SOMO_II

Fork of stateScript_v2 by Mattias Karlsson

Committer:
alustig3
Date:
Fri Apr 28 14:47:55 2017 +0000
Revision:
10:f65649c13b5b
Parent:
9:f783bce314cd
Code is now compatible with FRDM-K64F.; Replaced SMARTWAV with SOMO-II

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