Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MCP23017 SDFileSystem WattBob_TextLCD mbed
Revision 7:2973bf297f3d, committed 2016-03-02
- Comitter:
- sk398
- Date:
- Wed Mar 02 00:51:17 2016 +0000
- Parent:
- 6:ceda53939eb8
- Child:
- 8:7f3594882cec
- Commit message:
- All tasks bar 2 and 3 Operational with relatively good timing
Changed in this revision
| Tasks.h | Show annotated file Show diff for this revision Revisions of this file |
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/Tasks.h Mon Feb 29 11:20:48 2016 +0000 +++ b/Tasks.h Wed Mar 02 00:51:17 2016 +0000 @@ -40,7 +40,7 @@ #define FALSE 0 // Task 1 definitions -#define WATCHDOG_PULSE_WIDTH 15 +#define WATCHDOG_PULSE_WIDTH 15 // ms // Task 2 definitions @@ -50,11 +50,14 @@ #define NUM_ANALOG_SAMPLES 4.0 // Task 5 definitions +#define BACK_LIGHT_ON(INTERFACE) INTERFACE->write_bit(1,BL_BIT) +#define BACK_LIGHT_OFF(INTERFACE) INTERFACE->write_bit(0,BL_BIT) // Task 6 definitions #define ERROR_CODE_CDTN_MET 3 #define ERROR_CODE_CDTN_FAIL 0 + /* ####################### Class definitions and prototypes ####################### */ /* ==================================== Task 1 ==================================== */
--- a/main.cpp Mon Feb 29 11:20:48 2016 +0000
+++ b/main.cpp Wed Mar 02 00:51:17 2016 +0000
@@ -24,69 +24,288 @@
#include "mbed.h"
#include "Tasks.h"
-#include "MCP23017.h"
-#include "WattBob_TextLCD.h"
-#define BACK_LIGHT_ON(INTERFACE) INTERFACE->write_bit(1,BL_BIT)
-#define BACK_LIGHT_OFF(INTERFACE) INTERFACE->write_bit(0,BL_BIT)
-
-DigitalOut myled(LED1);
-
+// ============================================================================
+// Task Declerations
+// ============================================================================
Task1 task1(p11); // Square wave Measurement
-Task2 task2_switch1(p12); // Read digital Output
+Task2 task2_switch1(p12); // Read digital Input
Task3 task3(p13); // Watchdog Pulse
Task4 task4(p15,p16); // Read analog Inputs
Task5 task5(p9,p10,0x40); // Output to LCD Display
Task6 task6; // Logical checks
Task7 task7(p5,p6,p7,p8,"SD","/SD/A2"); // SD Card Write
+// ============================================================================
+// Cyclic Executive Objects and Declerations
+// ============================================================================
+DigitalOut ErrorLED(LED1); // Error Indicating LED
+DigitalOut LenPin(p21); // Pulse Pin
+DigitalIn SDRemoval(p18); // Switch state to indicate to remove SD
+Timer BusyWait; // Wasted time Timer
+Ticker CyclicTicker; // Ticker object to cycle tasks
+
+// ============================================================================
+// Global Data Parameters used in Cyclic Executive
+// ============================================================================
+// Counter to record the number of ticks went through by the Cyclic Executive
+int cyclicTicks = 1;
+
+// Global parameter storing the most up to date value of the return from Task 1
+volatile int task1Frequency;
+
+// Global parameter storing the most up to date value of the return from Task 2
+volatile int task2SwitchState;
+
+// Global parameter storing the most up to date value of the return from Task 4
+volatile float task4AnalogChannels[2];
+
+// Global parameter storing the most up to date value of the return from Task 6
+volatile int task6ErrorState;
+
+// Char array to store the concatenated string for output onto the SD Card
+char logData[50];
+
+int slotCounter = 0;
+int taskNum = 2;
+
+// ============================================================================
+// Cyclic Executive Function Prototypes
+// ============================================================================
+void CyclicExec();
+
+// ============================================================================
+// Main Execution Program
+// ============================================================================
int main() {
-
- volatile int task1Frequency;
- volatile int task2SwitchState;
- volatile float task4AnalogChannels[2];
- volatile int errorState;
- char logData[50];
-
- task1Frequency = task1.ReadFrequency();
-// printf("Task 1 Frequency %d Hz\r\n",task1Frequency);
-
- task2SwitchState = task2_switch1.digitalInState();
-// printf("Switch 1 State: %d\r\n",task2SwitchState);
-
- task3.OutputWatchdogPulse();
+
+ // Attempt to open SD file
+ // If open failed, do not run Cyclic Exec
+ if(!task7.openFile("/SD/A2/test.csv","a"))
+ {
+ // Start Cyclic Executive
+ CyclicTicker.attach(&CyclicExec,0.025); // 25ms pulses
+
+ // Keep program running until RESET
+ while(1)
+ {
+ }
+ }
- float *analogReading = task4.returnAnalogReadings();
- task4AnalogChannels[0] = *(analogReading);
- task4AnalogChannels[1]= *(analogReading+1);
-// printf("Analog Readings:\r\nChannel 1-%f\r\nChannel 2-%f\r\n",task4AnalogChannels[0],task4AnalogChannels[1]);
-
- errorState = task6.updateErrorCode( task2SwitchState,
- task4AnalogChannels[0],
- task4AnalogChannels[1] );
-
- task5.updateDisplay(task1Frequency,
- task2SwitchState,
- errorState,
- task4AnalogChannels[0],
- task4AnalogChannels[1] );
-
- if(task7.openFile("/SD/A2/test.csv","a"))
- {
- printf("File not opened");
- }
+ // If FIle is not opened, prompt user and show Error on LED
else
{
- int a = sprintf(logData,"Freq=%d,SW1=%d,A1=%1.3f,A2=%1.3f\n",task1Frequency,
- task2SwitchState,task4AnalogChannels[0],task4AnalogChannels[1]);
- task7.writeData(logData);
- task7.closeFile();
+ // Prompt user about error
+ printf("File not opened\r\nNot executing Cyclic Executive");
+
+ // Execute error code on LED
+ while(1)
+ {
+ ErrorLED = 1;
+ wait(1);
+ ErrorLED = 0;
+ wait(1);
+ }
+ }
+}
+
+Timer stampTime;
+
+#define TASK1_TICKS 40
+#define TASK2_TICKS 12
+#define TASK3_TICKS 12
+#define TASK4_TICKS 16
+#define TASK5_TICKS 80
+#define TASK6_TICKS 32
+#define TASK7_TICKS 200
+
+#define HIGH 1
+
+//void CyclicExec()
+//{
+// slotCounter++;
+// switch(slotCounter)
+// {
+// case 1:
+// if(cyclicTicks % TASK1_TICKS == 0)
+// {
+//// printf("T1\r\n");
+// task1Frequency = task1.ReadFrequency();
+// }
+// break;
+//
+// case 2:
+// if(cyclicTicks % TASK2_TICKS == 0)
+// {
+//// printf("T2\r\n");
+// task2SwitchState = task2_switch1.digitalInState();
+// }
+// break;
+//
+// case 3:
+// if(cyclicTicks % TASK3_TICKS == 0)
+// {
+//// printf("T3 ------ \r\n");
+// LenPin = 1;
+// task3.OutputWatchdogPulse();
+// LenPin = 0;
+// }
+// break;
+//
+// case 4:
+// if(cyclicTicks % TASK4_TICKS == 0)
+// {
+//// printf("T4\r\n");
+// float *analogReading = task4.returnAnalogReadings();
+// task4AnalogChannels[0] = *(analogReading);
+// task4AnalogChannels[1]= *(analogReading+1);
+// }
+// break;
+//
+// case 5:
+// if(cyclicTicks % TASK5_TICKS == 0)
+// {
+//// printf("T5\r\n");
+// task5.updateDisplay( task1Frequency,
+// task2SwitchState,
+// task6ErrorState,
+// task4AnalogChannels[0],
+// task4AnalogChannels[1] );
+// }
+// break;
+//
+// case 10:
+// if(cyclicTicks % TASK6_TICKS == 0)
+// {
+//// printf("T6\r\n");
+// task6ErrorState = task6.updateErrorCode( task2SwitchState,
+// task4AnalogChannels[0],
+// task4AnalogChannels[1] );
+// }
+// break;
+//
+// case 11:
+// if(cyclicTicks % TASK7_TICKS == 0)
+// {
+//// printf("T7\r\n");
+// int a = sprintf( logData,"Freq=%d,SW1=%d,A1=%1.3f,A2=%1.3f\n",
+// task1Frequency,
+// task2SwitchState,
+// task4AnalogChannels[0],
+// task4AnalogChannels[1] );
+// task7.writeData(logData);
+// }
+// break;
+//
+// case 12:
+// slotCounter = 0;
+// cyclicTicks++;
+// break;
+// }
+// if(SDRemoval == HIGH)
+// {
+// printf("Shutting File");
+// task7.closeFile();
+// }
+//
+//
+//}
+
+Timer task1t;
+Timer task2t;
+Timer task3t;
+Timer task4t;
+Timer task5t;
+Timer task6t;
+
+void CyclicExec()
+{
+ cyclicTicks++;
+ if(cyclicTicks % 200 == 0)
+ {
+ stampTime.stop();
+ printf("T7\r\n");
+ int a = sprintf( logData,"Time=%1.2f,Freq=%d,SW1=%d,A1=%1.3f,A2=%1.3f\n",
+ stampTime.read(),
+ task1Frequency,
+ task2SwitchState,
+ task4AnalogChannels[0],
+ task4AnalogChannels[1] );
+ task7.writeData(logData);
+ stampTime.reset();
+ stampTime.start();
+ }
+
+ if(cyclicTicks % 80 == 0)
+ {
+ task5t.stop();
+ printf("T5 %1.2f\r\n",task5t.read());
+ task5.updateDisplay( task1Frequency,
+ task2SwitchState,
+ task6ErrorState,
+ task4AnalogChannels[0],
+ task4AnalogChannels[1] );
+ task5t.reset();
+ task5t.start();
+ }
+
+ if(cyclicTicks % 40 == 0)
+ {
+ task1t.stop();
+ printf("T1 %d\r\n",task1t.read_ms());
+ task1Frequency = task1.ReadFrequency();
+ task1t.reset();
+ task1t.start();
}
- while(1) {
- myled = 1;
- wait(0.2);
- myled = 0;
- wait(0.2);
+ if(cyclicTicks % 32 == 0)
+ {
+ task6t.stop();
+ printf("T6 %d\r\n",task6t.read_ms());
+ task6ErrorState = task6.updateErrorCode( task2SwitchState,
+ task4AnalogChannels[0],
+ task4AnalogChannels[1] );
+ task6t.reset();
+ task6t.start();
+ }
+
+ if(cyclicTicks % 16 == 0)
+ {
+ task4t.stop();
+ printf("T4 %d\r\n",task4t.read_ms());
+ float *analogReading = task4.returnAnalogReadings();
+ task4AnalogChannels[0] = *(analogReading);
+ task4AnalogChannels[1]= *(analogReading+1);
+ task4t.reset();
+ task4t.start();
}
-}
\ No newline at end of file
+
+ if(cyclicTicks & 13 == 0)
+ {
+ printf("IM IN TASK 3!!!!!!!!!!!!!!!!!!!!!");
+ task3t.stop();
+ printf("T3 %d\r\n",task3t.read_ms());
+ task3.OutputWatchdogPulse();
+ taskNum = 2;
+ task3t.reset();
+ task3t.start();
+ }
+
+ if(cyclicTicks % 12 == 0)
+ {
+ printf("IM IN TASK 2!!!!!!!!!!!!!!!!!!!!!");
+ task2t.stop();
+ printf("T2 %d\r\n",task2t.read_ms());
+ task2SwitchState = task2_switch1.digitalInState();
+ taskNum = 3;
+ task2t.reset();
+ task2t.start();
+ }
+
+ if(SDRemoval == HIGH)
+ {
+ printf("SD Removed");
+ task7.closeFile();
+ }
+}
+