perturh room legacy

Dependencies:   SMARTWAV USBDevice mbed stateScript

Fork of stateScript by Mattias Karlsson

Committer:
alustig3
Date:
Sat May 16 23:41:46 2015 +0000
Revision:
5:e62cd80aa22f
Parent:
4:34aca2142df9
changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 0:fb6bbc10ffa0 1 #include "mbed.h"
mkarlsso 2:298679fff37c 2 #include <stdint.h>
mkarlsso 2:298679fff37c 3 #include "behave.h"
mkarlsso 2:298679fff37c 4 #include <string.h>
mkarlsso 2:298679fff37c 5 #include <sstream>
mkarlsso 2:298679fff37c 6 #include "SMARTWAV.h"
alustig3 5:e62cd80aa22f 7 #include "USBSerial.h"
mkarlsso 2:298679fff37c 8
mkarlsso 2:298679fff37c 9
mkarlsso 2:298679fff37c 10 uint32_t timeKeeper; //the main clock (updated every ms)
mkarlsso 2:298679fff37c 11 bool resetTimer = false; //if true, the clock is reset
mkarlsso 2:298679fff37c 12 bool clockSlave = false; //slave mode
mkarlsso 2:298679fff37c 13 bool changeToSlave = false;
mkarlsso 2:298679fff37c 14 bool changeToStandAlone = false;
mkarlsso 2:298679fff37c 15
mkarlsso 2:298679fff37c 16 //static char buf1[0x2000] __attribute__((section("AHBSRAM0")));
mkarlsso 2:298679fff37c 17 __attribute((section("AHBSRAM0"),aligned)) outputStream textDisplay(512);
alustig3 5:e62cd80aa22f 18 __attribute((section("AHBSRAM0"),aligned)) char buffer[128];
mkarlsso 2:298679fff37c 19
mkarlsso 2:298679fff37c 20
mkarlsso 2:298679fff37c 21 __attribute((section("AHBSRAM1"),aligned)) event eventBlock[NUMEVENTS];
mkarlsso 2:298679fff37c 22
mkarlsso 2:298679fff37c 23 __attribute((section("AHBSRAM1"),aligned)) condition conditionBlock[NUMCONDITIONS];
mkarlsso 2:298679fff37c 24
mkarlsso 2:298679fff37c 25 __attribute((section("AHBSRAM1"),aligned)) intCompare intCompareBlock[NUMINTCOMPARE];
mkarlsso 2:298679fff37c 26
mkarlsso 2:298679fff37c 27 __attribute((section("AHBSRAM0"),aligned)) action actionBlock[NUMACTIONS];
mkarlsso 2:298679fff37c 28
mkarlsso 2:298679fff37c 29 __attribute((section("AHBSRAM0"),aligned)) portMessage portMessageBlock[NUMPORTMESSAGES];
mkarlsso 2:298679fff37c 30
mkarlsso 2:298679fff37c 31 //__attribute((section("AHBSRAM1"),aligned)) intVariable intVariableBlock[10];
mkarlsso 2:298679fff37c 32
mkarlsso 2:298679fff37c 33 __attribute((section("AHBSRAM0"),aligned)) intOperation intOperationBlock[NUMINTOPERATIONS];
mkarlsso 2:298679fff37c 34
mkarlsso 2:298679fff37c 35 __attribute((section("AHBSRAM0"),aligned)) displayAction displayActionBlock[NUMDISPLAYACTIONS];
mkarlsso 2:298679fff37c 36
mkarlsso 2:298679fff37c 37
mkarlsso 2:298679fff37c 38
mkarlsso 2:298679fff37c 39 Ticker clockBroadCast; //timer used when sending out timestamps on a GPIO
mkarlsso 2:298679fff37c 40 uint32_t currentBroadcastTime;
mkarlsso 2:298679fff37c 41 int currentBroadcastBit = 0;
mkarlsso 2:298679fff37c 42 bool broadcastHigh = false;
mkarlsso 2:298679fff37c 43
mkarlsso 2:298679fff37c 44 int currentDIOstate[2] = {0,0}; //the first number is a bit-wise representaion of the digital inputs, the 2nd is for the outputs
mkarlsso 2:298679fff37c 45 bool digitalInChanged = false;
mkarlsso 2:298679fff37c 46 bool digitalOutChanged = false;
mkarlsso 2:298679fff37c 47 bool broadCastStateChanges = true;
mkarlsso 2:298679fff37c 48 bool textStreaming = true;
mkarlsso 2:298679fff37c 49 uint32_t changeTime;
mkarlsso 2:298679fff37c 50
mkarlsso 2:298679fff37c 51 LocalFileSystem local("local");
mkarlsso 2:298679fff37c 52
mkarlsso 2:298679fff37c 53 digitalPort* portVector[NUMPORTS+1]; //create the digital ports
mkarlsso 2:298679fff37c 54
mkarlsso 2:298679fff37c 55 float brightness = 0.0;
mkarlsso 2:298679fff37c 56
mkarlsso 2:298679fff37c 57 //Define the digial ports
mkarlsso 2:298679fff37c 58
mkarlsso 2:298679fff37c 59 //Pins for clock syncing
alustig3 5:e62cd80aa22f 60 //InterruptIn clockResetInt(p24);
alustig3 5:e62cd80aa22f 61 DigitalOut clockOutSync(p19);
alustig3 5:e62cd80aa22f 62 DigitalOut clockOutSignal(p29);
alustig3 5:e62cd80aa22f 63 InterruptIn clockExternalIncrement(p30);
mkarlsso 4:34aca2142df9 64
mkarlsso 2:298679fff37c 65
mkarlsso 2:298679fff37c 66 //Pins for digital ports. Each port has 1 out and 1 in
mkarlsso 2:298679fff37c 67 //DigitalOut out1(LED1); //route to LED for debugging
alustig3 5:e62cd80aa22f 68 //1A,1B
alustig3 5:e62cd80aa22f 69 DigitalOut out1(p5);
alustig3 5:e62cd80aa22f 70 DigitalIn in1(p6);
alustig3 5:e62cd80aa22f 71 InterruptIn int1(p6);
mkarlsso 2:298679fff37c 72 __attribute((section("AHBSRAM0"),aligned)) digitalPort port1(&out1, &in1);
alustig3 5:e62cd80aa22f 73 //1C,1D
alustig3 5:e62cd80aa22f 74 DigitalOut out2(p9);
alustig3 5:e62cd80aa22f 75 DigitalIn in2(p10);
alustig3 5:e62cd80aa22f 76 InterruptIn int2(p10);
mkarlsso 2:298679fff37c 77 __attribute((section("AHBSRAM0"),aligned)) digitalPort port2(&out2, &in2);
alustig3 5:e62cd80aa22f 78 //2A,2B
alustig3 5:e62cd80aa22f 79 DigitalOut out3(p13);
alustig3 5:e62cd80aa22f 80 DigitalIn in3(p14);
alustig3 5:e62cd80aa22f 81 InterruptIn int3(p14);
mkarlsso 2:298679fff37c 82 __attribute((section("AHBSRAM0"),aligned)) digitalPort port3(&out3, &in3);
alustig3 5:e62cd80aa22f 83 //2C,2D
alustig3 5:e62cd80aa22f 84 DigitalOut out4(p17);
alustig3 5:e62cd80aa22f 85 DigitalIn in4(p18);
alustig3 5:e62cd80aa22f 86 InterruptIn int4(p18);
mkarlsso 2:298679fff37c 87 __attribute((section("AHBSRAM0"),aligned)) digitalPort port4(&out4, &in4);
alustig3 5:e62cd80aa22f 88 //3A,3B
mkarlsso 2:298679fff37c 89 DigitalOut out5(p21);
mkarlsso 2:298679fff37c 90 DigitalIn in5(p22);
mkarlsso 2:298679fff37c 91 InterruptIn int5(p22);
mkarlsso 2:298679fff37c 92 __attribute((section("AHBSRAM0"),aligned)) digitalPort port5(&out5, &in5);
alustig3 5:e62cd80aa22f 93 ////3C,3D
alustig3 5:e62cd80aa22f 94 //DigitalOut out6(p21);
alustig3 5:e62cd80aa22f 95 //DigitalIn in6(p22);
alustig3 5:e62cd80aa22f 96 //InterruptIn int6(p22);
alustig3 5:e62cd80aa22f 97 //__attribute((section("AHBSRAM0"),aligned)) digitalPort port6(&out6, &in6);
alustig3 5:e62cd80aa22f 98 ////4A,4B
alustig3 5:e62cd80aa22f 99 ////DigitalOut out7(p9);
alustig3 5:e62cd80aa22f 100 ////DigitalIn in7(p10);
alustig3 5:e62cd80aa22f 101 ////InterruptIn int7(p10);
alustig3 5:e62cd80aa22f 102 ////__attribute((section("AHBSRAM0"),aligned)) digitalPort port7(&out7, &in7);
alustig3 5:e62cd80aa22f 103 ////5A,5B
alustig3 5:e62cd80aa22f 104 //DigitalOut out7(p13);
alustig3 5:e62cd80aa22f 105 //DigitalIn in7(p14);
alustig3 5:e62cd80aa22f 106 //InterruptIn int7(p14);
alustig3 5:e62cd80aa22f 107 //__attribute((section("AHBSRAM0"),aligned)) digitalPort port7(&out7, &in7);
alustig3 5:e62cd80aa22f 108 ////6A,6B
alustig3 5:e62cd80aa22f 109 //DigitalOut out8(p23);
alustig3 5:e62cd80aa22f 110 //DigitalIn in8(p24);
alustig3 5:e62cd80aa22f 111 //InterruptIn int8(p24);
alustig3 5:e62cd80aa22f 112 //__attribute((section("AHBSRAM0"),aligned)) digitalPort port8(&out8, &in8);
alustig3 5:e62cd80aa22f 113 ////Pump1
alustig3 5:e62cd80aa22f 114 //DigitalOut out9(p25);
alustig3 5:e62cd80aa22f 115 //__attribute((section("AHBSRAM0"),aligned)) digitalPort port9(&out9);
alustig3 5:e62cd80aa22f 116 ////Pump2
alustig3 5:e62cd80aa22f 117 //DigitalOut out10(p26);
alustig3 5:e62cd80aa22f 118 //__attribute((section("AHBSRAM0"),aligned)) digitalPort port10(&out10);
mkarlsso 2:298679fff37c 119
alustig3 5:e62cd80aa22f 120
mkarlsso 2:298679fff37c 121
mkarlsso 2:298679fff37c 122 //Serial communication
alustig3 5:e62cd80aa22f 123 //Serial pc(USBTX, USBRX); // tx, rx
alustig3 5:e62cd80aa22f 124 USBSerial pc;
alustig3 5:e62cd80aa22f 125
mkarlsso 2:298679fff37c 126
mkarlsso 2:298679fff37c 127 //Main event queue
mkarlsso 2:298679fff37c 128 eventQueue mainQueue(portVector, &timeKeeper);
mkarlsso 2:298679fff37c 129
mkarlsso 2:298679fff37c 130 //The script parser
mkarlsso 2:298679fff37c 131 scriptStream parser(&pc, portVector, NUMPORTS, &mainQueue);
mkarlsso 2:298679fff37c 132
mkarlsso 2:298679fff37c 133 //The sound output uses a SmartWav device and their simple serial library
alustig3 5:e62cd80aa22f 134 SMARTWAV sWav(p28,p27,p26); //(TX,RX,Reset);
alustig3 5:e62cd80aa22f 135 //Serial device(p9,p10);
mkarlsso 2:298679fff37c 136 //Erases the input buffer for serial input
mkarlsso 2:298679fff37c 137 void eraseBuffer(char* buffer,int numToErase) {
mkarlsso 2:298679fff37c 138 for (int i = 0; i < numToErase; i++) {
mkarlsso 2:298679fff37c 139 buffer[i] = NULL;
mkarlsso 2:298679fff37c 140 }
mkarlsso 2:298679fff37c 141 }
mkarlsso 2:298679fff37c 142
simon 0:fb6bbc10ffa0 143
mkarlsso 2:298679fff37c 144 //Called by clockBroadCast timer to output a 32-bit timestamp. When the timestmap has been
mkarlsso 2:298679fff37c 145 //sent, the function is detached from the timer.
mkarlsso 2:298679fff37c 146 void broadcastNextBit() {
mkarlsso 2:298679fff37c 147
mkarlsso 2:298679fff37c 148 if (currentBroadcastBit < 32) {
mkarlsso 2:298679fff37c 149 broadcastHigh = !broadcastHigh; //flip the sync signal
mkarlsso 2:298679fff37c 150 if (broadcastHigh) {
mkarlsso 2:298679fff37c 151 clockOutSync = 1;
mkarlsso 2:298679fff37c 152 clockOutSignal = (currentBroadcastTime & ( 1 << currentBroadcastBit)) >> currentBroadcastBit;
mkarlsso 2:298679fff37c 153
mkarlsso 2:298679fff37c 154 } else {
mkarlsso 2:298679fff37c 155 clockOutSync = 0;
mkarlsso 2:298679fff37c 156 clockOutSignal = 0;
mkarlsso 2:298679fff37c 157 currentBroadcastBit++;
mkarlsso 2:298679fff37c 158 }
mkarlsso 2:298679fff37c 159 }
mkarlsso 2:298679fff37c 160 }
mkarlsso 2:298679fff37c 161
mkarlsso 2:298679fff37c 162
mkarlsso 2:298679fff37c 163 //intiatiation of timer2 (specific to the LPC17xx chip). This is used in
mkarlsso 2:298679fff37c 164 //standalone mode to increment the clock every ms.
mkarlsso 2:298679fff37c 165 //we use lower-lever code here to get better control over the timer if we reset it
mkarlsso 2:298679fff37c 166 void timer0_init(void)
mkarlsso 2:298679fff37c 167 {
mkarlsso 2:298679fff37c 168 //LPC_SC->PCLKSEL1 &= (3 << 12); //mask
mkarlsso 2:298679fff37c 169 //LPC_SC->PCLKSEL1 |= (1 << 12); //sets it to 1*SystemCoreClock - table 42 (page 57 in user manual)
mkarlsso 2:298679fff37c 170
mkarlsso 2:298679fff37c 171 //LPC_SC->PCLKSEL0 &= (3 << 3); //mask
mkarlsso 2:298679fff37c 172 //LPC_SC->PCLKSEL0 |= (1 << 3); //sets it to 1*SystemCoreClock - table 42 (page 57 in user manual)
mkarlsso 2:298679fff37c 173 LPC_SC->PCONP |=1<1; //timer0 power on
mkarlsso 2:298679fff37c 174 LPC_TIM0->MR0 = 23980; //1 msec
mkarlsso 2:298679fff37c 175 //LPC_TIM0->PR = (SystemCoreClock / 1000000); //microsecond steps
mkarlsso 2:298679fff37c 176 //LPC_TIM0->MR0 = 1000; //100 msec
mkarlsso 2:298679fff37c 177 //LPC_TIM0->MR0 = (SystemCoreClock / 1000000); //microsecond steps
mkarlsso 2:298679fff37c 178 LPC_TIM0->MCR = 3; //interrupt and reset control
mkarlsso 2:298679fff37c 179 //3 = Interrupt & reset timer0 on match
mkarlsso 2:298679fff37c 180 //1 = Interrupt only, no reset of timer0
mkarlsso 2:298679fff37c 181 NVIC_EnableIRQ(TIMER0_IRQn); //enable timer0 interrupt
mkarlsso 2:298679fff37c 182 LPC_TIM0->TCR = 1; //enable Timer0
mkarlsso 2:298679fff37c 183
mkarlsso 2:298679fff37c 184
mkarlsso 2:298679fff37c 185 /*
mkarlsso 2:298679fff37c 186 LPC_SC->PCONP |= (0x1<<22); // turn on power for timer 2
mkarlsso 2:298679fff37c 187 LPC_TIM2->TCR = 0x02; // reset timer
mkarlsso 2:298679fff37c 188 LPC_TIM2->PR = (SystemCoreClock / 1000000); //microsecond steps
mkarlsso 2:298679fff37c 189 LPC_TIM2->MR0 = 1000; // 1000 microsecond interval interrupts
mkarlsso 2:298679fff37c 190 LPC_TIM2->IR = 0x3f; // reset all interrrupts
mkarlsso 2:298679fff37c 191 LPC_TIM2->MCR = 0x03; // reset timer on match and generate interrupt (MR0)
mkarlsso 2:298679fff37c 192 LPC_TIM2->TCR = 0x01; // start timer
mkarlsso 2:298679fff37c 193
mkarlsso 2:298679fff37c 194 NVIC_EnableIRQ(TIMER2_IRQn); // Enable the interrupt
mkarlsso 2:298679fff37c 195 */
mkarlsso 2:298679fff37c 196 //pc.printf("Done timer_init\n\r");
mkarlsso 2:298679fff37c 197 }
mkarlsso 2:298679fff37c 198
mkarlsso 2:298679fff37c 199 //This is the callback for timer2
mkarlsso 2:298679fff37c 200 extern "C" void TIMER0_IRQHandler (void) {
mkarlsso 2:298679fff37c 201
mkarlsso 2:298679fff37c 202 if((LPC_TIM0->IR & 0x01) == 0x01) { // if MR0 interrupt, proceed
mkarlsso 2:298679fff37c 203
mkarlsso 2:298679fff37c 204 LPC_TIM0->IR |= 1 << 0; // Clear MR0 interrupt flag
mkarlsso 2:298679fff37c 205 timeKeeper++;
mkarlsso 2:298679fff37c 206
mkarlsso 2:298679fff37c 207 if (resetTimer) {
mkarlsso 2:298679fff37c 208 timeKeeper = 0;
mkarlsso 2:298679fff37c 209 resetTimer = false;
mkarlsso 2:298679fff37c 210 }
mkarlsso 2:298679fff37c 211
mkarlsso 2:298679fff37c 212 if (currentBroadcastBit > 31) {
mkarlsso 2:298679fff37c 213 clockBroadCast.detach();
mkarlsso 2:298679fff37c 214 currentBroadcastBit = 0;
mkarlsso 2:298679fff37c 215 }
mkarlsso 2:298679fff37c 216
mkarlsso 2:298679fff37c 217 //Every second, we broadcast out the current time
mkarlsso 2:298679fff37c 218 if ((timeKeeper % 1000) == 0) {
mkarlsso 2:298679fff37c 219 currentBroadcastTime = timeKeeper;
mkarlsso 2:298679fff37c 220 clockOutSync = 1;
mkarlsso 2:298679fff37c 221
mkarlsso 2:298679fff37c 222 currentBroadcastBit = 0;
mkarlsso 2:298679fff37c 223
mkarlsso 2:298679fff37c 224 clockOutSignal = (currentBroadcastTime & ( 1 << currentBroadcastBit)) >> currentBroadcastBit;
mkarlsso 2:298679fff37c 225 broadcastHigh = true;
mkarlsso 2:298679fff37c 226 clockBroadCast.attach_us(&broadcastNextBit, 1000);
mkarlsso 2:298679fff37c 227 }
mkarlsso 2:298679fff37c 228 }
mkarlsso 2:298679fff37c 229 }
mkarlsso 2:298679fff37c 230
mkarlsso 2:298679fff37c 231
mkarlsso 2:298679fff37c 232 //In slave mode, the clock is updated with an external trigger every ms. No need for
mkarlsso 2:298679fff37c 233 //100us resolution.
mkarlsso 2:298679fff37c 234 void callback_clockExternalIncrement(void) {
mkarlsso 2:298679fff37c 235
mkarlsso 2:298679fff37c 236 timeKeeper++;
mkarlsso 2:298679fff37c 237
mkarlsso 2:298679fff37c 238 if (resetTimer) {
mkarlsso 2:298679fff37c 239 timeKeeper = 0;
mkarlsso 2:298679fff37c 240 resetTimer = false;
mkarlsso 2:298679fff37c 241 }
mkarlsso 2:298679fff37c 242
mkarlsso 2:298679fff37c 243 if (currentBroadcastBit > 31) {
mkarlsso 2:298679fff37c 244 clockBroadCast.detach();
mkarlsso 2:298679fff37c 245 currentBroadcastBit = 0;
mkarlsso 2:298679fff37c 246 }
mkarlsso 2:298679fff37c 247
mkarlsso 2:298679fff37c 248 //Every second, we broadcast out the current time
mkarlsso 2:298679fff37c 249 if ((timeKeeper % 1000) == 0) {
mkarlsso 2:298679fff37c 250 currentBroadcastTime = timeKeeper;
mkarlsso 2:298679fff37c 251 clockOutSync = 1;
mkarlsso 2:298679fff37c 252
mkarlsso 2:298679fff37c 253 currentBroadcastBit = 0;
mkarlsso 2:298679fff37c 254
mkarlsso 2:298679fff37c 255 clockOutSignal = (currentBroadcastTime & ( 1 << currentBroadcastBit)) >> currentBroadcastBit;
mkarlsso 2:298679fff37c 256 broadcastHigh = true;
mkarlsso 2:298679fff37c 257 clockBroadCast.attach_us(&broadcastNextBit, 1000);
mkarlsso 2:298679fff37c 258 }
mkarlsso 2:298679fff37c 259 }
mkarlsso 2:298679fff37c 260
mkarlsso 2:298679fff37c 261 //Every digital port's in pin has a hardware interrupt. We use a callback stub for each port
mkarlsso 2:298679fff37c 262 //that routes the int_callback.
mkarlsso 2:298679fff37c 263 void int_callback(int portNum, int direction) {
mkarlsso 2:298679fff37c 264 portVector[portNum]->addStateChange(direction, timeKeeper);
mkarlsso 2:298679fff37c 265 }
mkarlsso 2:298679fff37c 266
mkarlsso 2:298679fff37c 267 //Callback stubs
mkarlsso 2:298679fff37c 268 void callback_port1_rise(void) { int_callback(1, 1); }
mkarlsso 2:298679fff37c 269 void callback_port1_fall(void) { int_callback(1, 0); }
mkarlsso 2:298679fff37c 270 void callback_port2_rise(void) { int_callback(2, 1); }
mkarlsso 2:298679fff37c 271 void callback_port2_fall(void) { int_callback(2, 0); }
mkarlsso 2:298679fff37c 272 void callback_port3_rise(void) { int_callback(3, 1); }
mkarlsso 2:298679fff37c 273 void callback_port3_fall(void) { int_callback(3, 0); }
mkarlsso 2:298679fff37c 274 void callback_port4_rise(void) { int_callback(4, 1); }
mkarlsso 2:298679fff37c 275 void callback_port4_fall(void) { int_callback(4, 0); }
mkarlsso 2:298679fff37c 276 void callback_port5_rise(void) { int_callback(5, 1); }
mkarlsso 2:298679fff37c 277 void callback_port5_fall(void) { int_callback(5, 0); }
mkarlsso 2:298679fff37c 278 void callback_port6_rise(void) { int_callback(6, 1); }
mkarlsso 2:298679fff37c 279 void callback_port6_fall(void) { int_callback(6, 0); }
alustig3 5:e62cd80aa22f 280 //void callback_port7_rise(void) { int_callback(7, 1); }
alustig3 5:e62cd80aa22f 281 //void callback_port7_fall(void) { int_callback(7, 0); }
alustig3 5:e62cd80aa22f 282 //void callback_port8_rise(void) { int_callback(8, 1); }
alustig3 5:e62cd80aa22f 283 //void callback_port8_fall(void) { int_callback(8, 0); }
alustig3 5:e62cd80aa22f 284 //void callback_port9_rise(void) { int_callback(9, 1); }
alustig3 5:e62cd80aa22f 285 //void callback_port9_fall(void) { int_callback(9, 0); }
alustig3 5:e62cd80aa22f 286
mkarlsso 2:298679fff37c 287
mkarlsso 2:298679fff37c 288 //This function is attached to an interrupt pin for external clock reset
mkarlsso 2:298679fff37c 289 void callback_clockReset(void) {
mkarlsso 2:298679fff37c 290 if (timeKeeper > 100) {
mkarlsso 2:298679fff37c 291 LPC_TIM2->TCR = 0x02; // reset timer
mkarlsso 2:298679fff37c 292 timeKeeper = 0;
mkarlsso 2:298679fff37c 293 pc.printf("%d Clock reset\r\n", timeKeeper);
mkarlsso 2:298679fff37c 294 }
mkarlsso 2:298679fff37c 295 }
mkarlsso 2:298679fff37c 296
simon 0:fb6bbc10ffa0 297
simon 0:fb6bbc10ffa0 298 int main() {
mkarlsso 2:298679fff37c 299 timeKeeper = 0; //set main clock to 0;
alustig3 5:e62cd80aa22f 300 // sWav.reset();
alustig3 5:e62cd80aa22f 301 //pc.baud(115200);
alustig3 5:e62cd80aa22f 302 //device.baud(4800);
mkarlsso 2:298679fff37c 303 //pc.baud(9600);
mkarlsso 2:298679fff37c 304
alustig3 5:e62cd80aa22f 305 for (int i = 0; i <NUMPORTS+1; i++) {
mkarlsso 2:298679fff37c 306 portVector[i] = NULL;
mkarlsso 2:298679fff37c 307 }
mkarlsso 2:298679fff37c 308 //We keep portVector 1-based to eliminate confusion
mkarlsso 2:298679fff37c 309 portVector[1] = &port1;
mkarlsso 2:298679fff37c 310 portVector[2] = &port2;
mkarlsso 2:298679fff37c 311 portVector[3] = &port3;
mkarlsso 2:298679fff37c 312 portVector[4] = &port4;
mkarlsso 2:298679fff37c 313 portVector[5] = &port5;
alustig3 5:e62cd80aa22f 314 // portVector[6] = &port6;
alustig3 5:e62cd80aa22f 315 // portVector[7] = &port7;
alustig3 5:e62cd80aa22f 316 // portVector[8] = &port8;
alustig3 5:e62cd80aa22f 317 // portVector[9] = &port9;
alustig3 5:e62cd80aa22f 318 // portVector[10] = &port10;
alustig3 5:e62cd80aa22f 319 //portVector[11] = &port11;
mkarlsso 2:298679fff37c 320
mkarlsso 2:298679fff37c 321 //Callback to update the main clock
mkarlsso 2:298679fff37c 322 //timeTick1.attach_us(&incrementTime, 100);
mkarlsso 2:298679fff37c 323
mkarlsso 2:298679fff37c 324 timer0_init();
mkarlsso 2:298679fff37c 325
mkarlsso 2:298679fff37c 326
mkarlsso 2:298679fff37c 327 //Set up callbacks for the port interrupts
mkarlsso 2:298679fff37c 328 int1.rise(&callback_port1_rise);
mkarlsso 2:298679fff37c 329 int1.fall(&callback_port1_fall);
mkarlsso 2:298679fff37c 330 int2.rise(&callback_port2_rise);
mkarlsso 2:298679fff37c 331 int2.fall(&callback_port2_fall);
mkarlsso 2:298679fff37c 332 int3.rise(&callback_port3_rise);
mkarlsso 2:298679fff37c 333 int3.fall(&callback_port3_fall);
mkarlsso 2:298679fff37c 334 int4.rise(&callback_port4_rise);
mkarlsso 2:298679fff37c 335 int4.fall(&callback_port4_fall);
mkarlsso 2:298679fff37c 336 int5.rise(&callback_port5_rise);
mkarlsso 2:298679fff37c 337 int5.fall(&callback_port5_fall);
alustig3 5:e62cd80aa22f 338 // int6.rise(&callback_port6_rise);
alustig3 5:e62cd80aa22f 339 // int6.fall(&callback_port6_fall);
alustig3 5:e62cd80aa22f 340 // int7.rise(&callback_port7_rise);
alustig3 5:e62cd80aa22f 341 // int7.fall(&callback_port7_fall);
alustig3 5:e62cd80aa22f 342 // int8.rise(&callback_port8_rise);
alustig3 5:e62cd80aa22f 343 // int8.fall(&callback_port8_fall);
alustig3 5:e62cd80aa22f 344 // int9.rise(&callback_port9_rise);
alustig3 5:e62cd80aa22f 345 // int9.fall(&callback_port9_fall);
mkarlsso 2:298679fff37c 346
alustig3 5:e62cd80aa22f 347 //clockResetInt.rise(&callback_clockReset);
alustig3 5:e62cd80aa22f 348 //clockResetInt.mode(PullDown);
mkarlsso 2:298679fff37c 349
mkarlsso 2:298679fff37c 350 clockExternalIncrement.mode(PullDown);
mkarlsso 2:298679fff37c 351
mkarlsso 2:298679fff37c 352 //The inputs are set for pull-up mode (might need to change this)
mkarlsso 2:298679fff37c 353 in1.mode(PullDown);
mkarlsso 2:298679fff37c 354 in2.mode(PullDown);
mkarlsso 2:298679fff37c 355 in3.mode(PullDown);
mkarlsso 2:298679fff37c 356 in4.mode(PullDown);
mkarlsso 2:298679fff37c 357 in5.mode(PullDown);
alustig3 5:e62cd80aa22f 358 // in6.mode(PullDown);
alustig3 5:e62cd80aa22f 359 // in7.mode(PullDown);
alustig3 5:e62cd80aa22f 360 // in8.mode(PullDown);
alustig3 5:e62cd80aa22f 361 // in9.mode(PullDown);
mkarlsso 2:298679fff37c 362
mkarlsso 2:298679fff37c 363 //Set up input buffer for the serial port
mkarlsso 2:298679fff37c 364 //char buffer[128];
mkarlsso 2:298679fff37c 365 int bufferPos = 0;
alustig3 5:e62cd80aa22f 366 eraseBuffer(buffer,128);
mkarlsso 2:298679fff37c 367
mkarlsso 2:298679fff37c 368 ostringstream timeConvert; // stream used for the conversion
mkarlsso 2:298679fff37c 369 ostringstream stateConvert;
mkarlsso 2:298679fff37c 370 char junkChar;
mkarlsso 2:298679fff37c 371 int tmpChar;
mkarlsso 2:298679fff37c 372
alustig3 5:e62cd80aa22f 373 //while (pc.readable()) {
alustig3 5:e62cd80aa22f 374 while (pc.available()) {
mkarlsso 2:298679fff37c 375 junkChar = pc.getc();
mkarlsso 2:298679fff37c 376 }
mkarlsso 2:298679fff37c 377
mkarlsso 2:298679fff37c 378 FILE *fp = fopen("/local/STARTUP.TXT", "r");
mkarlsso 2:298679fff37c 379 if (fp != NULL) {
mkarlsso 2:298679fff37c 380 pc.printf("Executing startup script...\r\n");
mkarlsso 2:298679fff37c 381 do {
mkarlsso 2:298679fff37c 382 tmpChar = fgetc(fp);
mkarlsso 2:298679fff37c 383 if ((tmpChar >= 32) && (tmpChar <= 126)) {
mkarlsso 2:298679fff37c 384 buffer[bufferPos] = tmpChar;
mkarlsso 2:298679fff37c 385 bufferPos++;
mkarlsso 2:298679fff37c 386 }
mkarlsso 2:298679fff37c 387 if ((tmpChar == 13) || (tmpChar == 10)) { //carrriage return
mkarlsso 2:298679fff37c 388 parser.addLineToCurrentBlock(buffer);
mkarlsso 2:298679fff37c 389 bufferPos = 0;
alustig3 5:e62cd80aa22f 390 eraseBuffer(buffer,128);
mkarlsso 2:298679fff37c 391 }
mkarlsso 2:298679fff37c 392 //pc.putc(tmpChar);
mkarlsso 2:298679fff37c 393 } while (tmpChar != EOF);
mkarlsso 2:298679fff37c 394
mkarlsso 2:298679fff37c 395 buffer[bufferPos] = 59;
mkarlsso 2:298679fff37c 396 parser.addLineToCurrentBlock(buffer);
alustig3 5:e62cd80aa22f 397 eraseBuffer(buffer,128);
mkarlsso 2:298679fff37c 398 fclose(fp);
mkarlsso 2:298679fff37c 399 } else {
mkarlsso 2:298679fff37c 400 pc.printf("No startup script found.\r\n");
mkarlsso 2:298679fff37c 401 }
mkarlsso 2:298679fff37c 402
mkarlsso 2:298679fff37c 403 //main loop
simon 0:fb6bbc10ffa0 404 while(1) {
mkarlsso 2:298679fff37c 405 //check the main event queue to see if anything needs to be done
mkarlsso 2:298679fff37c 406 mainQueue.check();
mkarlsso 2:298679fff37c 407
alustig3 5:e62cd80aa22f 408 //https://developer.mbed.org/handbook/Serial
alustig3 5:e62cd80aa22f 409 //if(device.readable()) {
alustig3 5:e62cd80aa22f 410 // pc.putc(device.getc());
alustig3 5:e62cd80aa22f 411 // }
mkarlsso 2:298679fff37c 412 //check if anything has been written to the serial input
alustig3 5:e62cd80aa22f 413 //if (pc.readable()) {
alustig3 5:e62cd80aa22f 414 if (pc.available()) {
mkarlsso 2:298679fff37c 415
mkarlsso 2:298679fff37c 416 buffer[bufferPos] = pc.getc();
mkarlsso 2:298679fff37c 417 bufferPos++;
mkarlsso 2:298679fff37c 418
mkarlsso 2:298679fff37c 419 //'Return' key pressed
mkarlsso 2:298679fff37c 420 if ((buffer[bufferPos-1] == 13) || (buffer[bufferPos-1] == 10)) {
mkarlsso 2:298679fff37c 421 //pc.printf("\r\n");
mkarlsso 2:298679fff37c 422 buffer[bufferPos-1] = '\0';
mkarlsso 2:298679fff37c 423 parser.addLineToCurrentBlock(buffer);
mkarlsso 2:298679fff37c 424 bufferPos = 0;
mkarlsso 2:298679fff37c 425 eraseBuffer(buffer,128);
mkarlsso 2:298679fff37c 426
mkarlsso 2:298679fff37c 427 } else {
mkarlsso 2:298679fff37c 428 //pc.putc(buffer[bufferPos-1]);
mkarlsso 2:298679fff37c 429 //Backspace was pressed
mkarlsso 3:ae33b7f5a7c1 430 if (((buffer[bufferPos-1] == 127)||(buffer[bufferPos-1] == 8)) && (bufferPos > 0)) {
mkarlsso 3:ae33b7f5a7c1 431
mkarlsso 2:298679fff37c 432 bufferPos = bufferPos-2;
mkarlsso 2:298679fff37c 433 }
mkarlsso 2:298679fff37c 434 }
mkarlsso 2:298679fff37c 435 }
mkarlsso 2:298679fff37c 436
mkarlsso 2:298679fff37c 437 // __disable_irq();
mkarlsso 2:298679fff37c 438
mkarlsso 2:298679fff37c 439
mkarlsso 2:298679fff37c 440 //Check all the digital ports to see if anything has changed. In the update routine, the port's
mkarlsso 2:298679fff37c 441 //script callbacks are called if the port was triggered
mkarlsso 2:298679fff37c 442 digitalInChanged = false;
mkarlsso 2:298679fff37c 443 digitalOutChanged = false;
mkarlsso 2:298679fff37c 444 changeTime = timeKeeper;
mkarlsso 2:298679fff37c 445 for (int i = 0; i < NUMPORTS; i++) {
mkarlsso 2:298679fff37c 446 if (portVector[i+1]->update()) {
mkarlsso 2:298679fff37c 447 digitalInChanged = true;
mkarlsso 2:298679fff37c 448 changeTime = min(changeTime,portVector[i+1]->lastChangeTime);
mkarlsso 2:298679fff37c 449
mkarlsso 2:298679fff37c 450 //The input state of all the ports in condensed into one number (each bit contains the info)
mkarlsso 2:298679fff37c 451 if (portVector[i+1]->getLastChangeState() == 1) {
mkarlsso 2:298679fff37c 452 currentDIOstate[0] = currentDIOstate[0] | (1 << i);
mkarlsso 2:298679fff37c 453 } else {
mkarlsso 2:298679fff37c 454 currentDIOstate[0] = currentDIOstate[0] & (255^(1 << i));
mkarlsso 2:298679fff37c 455 }
mkarlsso 2:298679fff37c 456 }
mkarlsso 2:298679fff37c 457 if (portVector[i+1]->outStateChanged) {
mkarlsso 2:298679fff37c 458 digitalOutChanged = true;
mkarlsso 2:298679fff37c 459 changeTime = min(changeTime,portVector[i+1]->lastOutChangeTime);
mkarlsso 2:298679fff37c 460 //The out state of all the ports in condensed into one number (each bit contains the info)
mkarlsso 2:298679fff37c 461 if (portVector[i+1]->outState == 1) {
mkarlsso 2:298679fff37c 462 currentDIOstate[1] = currentDIOstate[1] | (1 << i);
mkarlsso 2:298679fff37c 463 } else {
mkarlsso 2:298679fff37c 464 currentDIOstate[1] = currentDIOstate[1] & (255^(1 << i));
mkarlsso 2:298679fff37c 465 }
mkarlsso 2:298679fff37c 466 portVector[i+1]->outStateChanged = false;
mkarlsso 2:298679fff37c 467 }
mkarlsso 2:298679fff37c 468 }
mkarlsso 2:298679fff37c 469
mkarlsso 2:298679fff37c 470 //If anything changed, we write the new values to the serial port (this can be turned off
mkarlsso 2:298679fff37c 471 //with broadCastStateChanges)
mkarlsso 2:298679fff37c 472 if ( (digitalInChanged||digitalOutChanged) && broadCastStateChanges) {
mkarlsso 2:298679fff37c 473 timeConvert << changeTime; //broadcast the earliest timestamp when a change occured
mkarlsso 2:298679fff37c 474 //stateConvert << currentDIOstate[0] << " " << currentDIOstate[1];
mkarlsso 2:298679fff37c 475 stateConvert << currentDIOstate[0] << " " << currentDIOstate[1] << " ";
mkarlsso 2:298679fff37c 476 textDisplay.send(timeConvert.str() + " " + stateConvert.str() + "\r\n");
mkarlsso 2:298679fff37c 477 timeConvert.clear();
mkarlsso 2:298679fff37c 478 timeConvert.seekp(0);
mkarlsso 2:298679fff37c 479 stateConvert.clear();
mkarlsso 2:298679fff37c 480 stateConvert.seekp(0);
mkarlsso 2:298679fff37c 481 digitalInChanged = false;
mkarlsso 2:298679fff37c 482 digitalOutChanged = false;
mkarlsso 2:298679fff37c 483 }
mkarlsso 2:298679fff37c 484
mkarlsso 2:298679fff37c 485 //We use a buffer to send text via the serial port. For every loop
mkarlsso 2:298679fff37c 486 //in the main loop, we send one character if there is enything to send.
mkarlsso 2:298679fff37c 487 //This way, outputting text to serial does not hold up other time-sensitive
mkarlsso 2:298679fff37c 488 //things in the event queue
mkarlsso 2:298679fff37c 489 if ((textDisplay.unsentData) && (textStreaming)) {
mkarlsso 2:298679fff37c 490 pc.printf("%c", textDisplay.getNextChar());
mkarlsso 2:298679fff37c 491 }
mkarlsso 2:298679fff37c 492
mkarlsso 2:298679fff37c 493 //Here is how we toggle between standalone and slave mode for the clock updating.
mkarlsso 2:298679fff37c 494 if (changeToSlave) {
mkarlsso 2:298679fff37c 495 //timeTick1.detach();
mkarlsso 2:298679fff37c 496 NVIC_DisableIRQ(TIMER2_IRQn); // Disable the interrupt
mkarlsso 2:298679fff37c 497 clockExternalIncrement.rise(&callback_clockExternalIncrement);
mkarlsso 2:298679fff37c 498 clockSlave = true;
mkarlsso 2:298679fff37c 499 changeToSlave = false;
mkarlsso 2:298679fff37c 500 changeToStandAlone = false;
mkarlsso 2:298679fff37c 501 } else if (changeToStandAlone) {
mkarlsso 2:298679fff37c 502 //timeTick1.attach_us(&incrementTime, 100);
mkarlsso 2:298679fff37c 503 timer0_init();
mkarlsso 2:298679fff37c 504 clockExternalIncrement.rise(NULL); //remove the callback to the external interrupt
mkarlsso 2:298679fff37c 505 clockSlave = false;
mkarlsso 2:298679fff37c 506 changeToSlave = false;
mkarlsso 2:298679fff37c 507 changeToStandAlone = false;
mkarlsso 2:298679fff37c 508 }
mkarlsso 2:298679fff37c 509
mkarlsso 2:298679fff37c 510 //__enable_irq();
mkarlsso 2:298679fff37c 511
simon 0:fb6bbc10ffa0 512 }
simon 0:fb6bbc10ffa0 513 }