#include "scheduler.h"#include "roundRobinTasks.h"#include "io.h"#include "railCrossing.h"void setup() { initIO(); schedulerInit();}void loop() { // readSerialBus(); niet nodig voor ons processRoundRobinTasks(); railCrossing();}
// io.h#define reedInTrack1 3 // reed contacten#define reedOutTrack1 4#define reedInTrack2 5#define reedOutTrack2 6#define burnLed 7 // de 3 leds#define toggleLed1 8#define toggleLed2 9extern void initIO(void);......// io.c#include "io.h"extern void initIO(void) { pinMode(reedInTrack1, INPUT); pinMode(reedOutTrack1, INPUT); pinMode(reedInTrack2, INPUT); pinMode(reedOutTrack2, INPUT); pinMode(burnLed, OUTPUT); pinMode(toggleLed1, OUTPUT); pinMode(toggleLed2, OUTPUT); }
#include "roundRobinTasks.h"#include "io.h"#include "roundRobinTasks.h"#include "io.h"extern void processRoundRobinTasks(void) { static unsigned char taskCounter = 0; taskCounter ++; // HIGH priority tasks // readSerialBus(); // heb deze module nog niet af en we hebben hem niet nodig /* fill in a task */ // LOW priorty tasks switch(taskCounter) { default: taskCounter = 0; case 0: /* fill in a task */ break; case 1: /* fill in a task */ break; } }
#include "roundRobinTasks.h"#include "io.h"bool track1occupied, track2occupied;// deze functie lezen elk 1 van 2 reed contacten in, afhankelijk of er al een trein is of nietstatic void readReedTrack1() { if(!track1occupied) { if(digitalRead(reedInTrack1) track1Occupied = 1; } // trein komt aan else { if(digitalRead(reedOutTrack1) track1Occupied = 0; } }// trein is weer wegstatic void readReedTrack2() { if(!track2occupied) { if(digitalRead(reedInTrack2) track1Occupied = 1; } // trein komt aan else { if(digitalRead(reedOutTrack2) track1Occupied = 0; } }// trein is weer wegextern void processRoundRobinTasks(void) { static unsigned char taskCounter = 0; taskCounter ++; // HIGH priority tasks // readSerialBus(); // heb deze module nog niet af en we hebben hem niet nodig /* fill in a task */ readReedTrack1(); readReedTrack2(); // LOW priorty tasks switch(taskCounter) { default: taskCounter = 0; case 0: /* fill in a task */ break; case 1: /* fill in a task */ break; } }
extern void processRoundRobinTasks();extern bool track1occupied, track2occupied;
#define State(x) break; case x: if(x##F())extern void railCrossing(void) { if(enabled) switch(state){ default: case railCrossingIDLE: return; State(closeCrossing) { nextState(openCrossing, 0); } State(openCrossing) { nextState(waitCrossing, 0); } State(waitCrossing) { nextState(closeCrossing, 0); } break;} else if(!railCrossingT) enabled = true; }#undef State
#define State(x) static bool x##F(void)State(waitCrossing) { entryState { } onState { exitFlag = true; } exitState { return true; } }
#include "roundRobinTasks.h" // nodig om de 2 flags te kunnen benaderen...State(waitCrossing) { entryState { } onState { if(track1occupied || track2occupied) exitFlag = true; } // toegvoegd, als minimaal 1 flag waar is, dan is er een trein exitState { return true; } }
entryState { digitalWrite(burnLed, HIGH); digitalWrite(toggleLed1, HIGH); // de 2 toggle leds knipperen om de beurt digitalWrite(toggleLed2, LOW)); }// daarom is 1 aan en en de ander uit
if(!railCrossingT) { // als de timer 0 is railCrossingT = 50; // zet timer op 500ms digitalWrite(toggleLed1, !digitalRead()); // toggle de 2 toggle leds digitalWrite(toggleLed2, !digitalRead()); }
#define upPosition 160 // natte vinger werk hier#define downPosition 73 // natte vinger werk hierState(closeCrossing) { entryState { pos = upPosition; // initialiseer 'pos' digitalWrite(burnLed, HIGH); digitalWrite(toggleLed1, HIGH); // de 2 toggle leds knipperen om de beurt digitalWrite(toggleLed2, LOW)); }// daarom is 1 aan en en de ander uit onState { if(!servoT) { // nieuwe aan te maken timer servoT = 55; //55ms let op dus niet 550ms servo1.write(pos); // arm 1 servo2.write(pos); // arm 2 pos -= 1; // of += 1 net hoe die is aangesloten op je boom. if(pos <= downPosition) pos = downPosition; }// houdt de positie in deze stand if(!railCrossingT) { // als de timer 0 is railCrossingT = 50; // zet timer op 500ms digitalWrite(toggleLed1, !digitalRead()); // toggle de 2 toggle leds digitalWrite(toggleLed2, !digitalRead()); } if(!track1occupied && !track2occupied) exitFlag = true; } // als beide sporen leeg zijn... volgende state open de overweg exitState { return true; } }
State(openCrossing) { entryState { pos = downPosition; // als het goed is stond pos al goed trouwens. // de leds staan iig nog goed en hoeven niet opnieuwe geinitialiseerd te worden, dit mag natuurlijk wel } onState { if(!servoT) { servoT = 55; servo1.write(pos); servo2.write(pos); pos += 1; // nu gaan de armen weer omhoog dus doen we += if(pos >= upPosition) pos = upPosition; } if(!railCrossingT) { railCrossingT = 50; digitalWrite(toggleLed1, !digitalRead()); digitalWrite(toggleLed2, !digitalRead()); } if(pos == upPosition) exitFlag = true; } // let op deze regel, wanneer de bomen helemaal boven zijn -> exit exitState { digitalWrite(burnLed, LOW); // en zet alle leds weer uit. digitalWrite(toggleLed1, LOW); digitalWrite(toggleLed2, LOW)); } return true; } }
unsigned char pos;#define State(x) static bool x##F(void)State(waitCrossing) { entryState { } onState { if(track1occupied || track2occupied) exitFlag = true; } exitState { return true; } }#define upPosition 160 // natte vinger werk hier#define downPosition 73 // natte vinger werk hierState(closeCrossing) { entryState { pos = upPosition; // initialiseer 'pos' digitalWrite(burnLed, HIGH); digitalWrite(toggleLed1, HIGH); // de 2 toggle leds knipperen om de beurt digitalWrite(toggleLed2, LOW)); }// daarom is 1 aan en en de ander uit onState { if(!servoT) { // nieuwe aan te maken timer servoT = 55; //55ms let op dus niet 550ms servo1.write(pos); // arm 1 servo2.write(pos); // arm 2 pos -= 1; // of += 1 net hoe die is aangesloten op je boom. if(pos <= downPosition) pos = downPosition; }// houdt de positie in deze stand if(!railCrossingT) { // als de timer 0 is railCrossingT = 50; // zet timer op 500ms digitalWrite(toggleLed1, !digitalRead()); // toggle de 2 toggle leds digitalWrite(toggleLed2, !digitalRead()); } if(!track1occupied && !track2occupied) exitFlag = true; } // als beide sporen leeg zijn... volgende state open de overweg exitState { return true; } }State(openCrossing) { entryState { pos = downPosition; // als het goed is stond pos al goed trouwens. // de leds staan iig nog goed en hoeven niet opnieuwe geinitialiseerd te worden, dit mag natuurlijk wel } onState { if(!servoT) { servoT = 55; servo1.write(pos); servo2.write(pos); pos += 1; // nu gaan de armen weer omhoog dus doen we += if(pos >= upPosition) pos = upPosition; } if(!railCrossingT) { railCrossingT = 50; digitalWrite(toggleLed1, !digitalRead()); digitalWrite(toggleLed2, !digitalRead()); } if(pos == upPosition) exitFlag = true; } // let op deze regel, wanneer de bomen helemaal boven zijn -> exit exitState { digitalWrite(burnLed, LOW); // en zet alle leds weer uit. digitalWrite(toggleLed1, LOW); digitalWrite(toggleLed2, LOW)); } return true; } }#undef State#define State(x) break; case x: if(x##F())extern void railCrossing(void) { if(enabled) switch(state){ default: case railCrossingIDLE: return; State(closeCrossing) { nextState(openCrossing, 0); } State(openCrossing) { nextState(waitCrossing, 0); } State(waitCrossing) { nextState(closeCrossing, 0); } break;} else if(!railCrossingT) enabled = true; }#undef State
//.hextern void schedulerInit();extern unsigned char railCrossingT;extern unsigned char servoT; // deze regel <- toevoegen//.cpp#include <Arduino.h>#include "scheduler.h"extern void schedulerInit() { /* code for starting timer */ }// timer declarations, don't forget to declare them extern in the .h file as wellunsigned char railCrossingT;unsigned char servoT; // deze regel <- toevoegenISR(TIMER2_OVF_vect) {static unsigned char _1ms, _10ms, _100ms; // Don't complain about the indentations and add your timers. Thank you. _1ms += 1; // add 1ms timers here if(servoT) servoT--; // en deze regel <- toevoegen if(!(_1ms % 10)) { // if 10ms passed _1ms = 0; _10ms += 1; // add 10ms timers if(!(_10ms % 10)) { // if 100ms passed _10ms = 0; _100ms += 1; // add 100ms timers if(buttonTestT) buttonTestT--; if(railCrossingT) railCrossingT--; if(!(_100ms % 10)) { // if 1000ms passed _100ms = 0; // add 1000ms timers } // mooi gezicht niet waar :P}}}