perturb room

Dependencies:   SMARTWAV mbed

Fork of stateScript by Mattias Karlsson

Committer:
alustig3
Date:
Mon May 18 01:17:58 2015 +0000
Revision:
5:4d6575e3a07e
Parent:
4:34aca2142df9
perturb room

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