Code for Browonout Generator box

Committer:
el16ba
Date:
Tue Feb 11 14:59:35 2020 +0000
Revision:
2:018630ec52d1
Parent:
1:8cad7e957324
Child:
3:16478dd3d1f3
Cleaned up file reader and bug found. serial Mode->cycle->exit->crash. after preforming a cycle from serial mode the exit command causes a crash.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el16ba 0:9dd5634b94f3 1
el16ba 0:9dd5634b94f3 2 #include "mbed.h"
el16ba 0:9dd5634b94f3 3 #include <string>
el16ba 0:9dd5634b94f3 4 #include <stdio.h>
el16ba 0:9dd5634b94f3 5 #include <stdlib.h>
el16ba 2:018630ec52d1 6 #include <FileHandle.h>
el16ba 2:018630ec52d1 7 #include <vector>
el16ba 0:9dd5634b94f3 8
el16ba 2:018630ec52d1 9 DigitalOut led1(LED1);
el16ba 2:018630ec52d1 10 DigitalOut led2(LED2);
el16ba 2:018630ec52d1 11 DigitalOut led3(LED3);
el16ba 2:018630ec52d1 12 DigitalOut led4(LED4);
el16ba 2:018630ec52d1 13 DigitalOut do21(p21);
el16ba 2:018630ec52d1 14 InterruptIn di22(p22,PullDown); //removing di22 and its related calls and functions causes a major fault for unknown reasons so it has been left in dispite not being used.
el16ba 2:018630ec52d1 15 Ticker tickOn;
el16ba 2:018630ec52d1 16 Ticker tickOff;
el16ba 0:9dd5634b94f3 17
el16ba 0:9dd5634b94f3 18 Serial pc(USBTX, USBRX); // for PC debug
el16ba 0:9dd5634b94f3 19 LocalFileSystem fs("local");
el16ba 0:9dd5634b94f3 20
el16ba 2:018630ec52d1 21 #define NUMCONFIGPARAM 3
el16ba 0:9dd5634b94f3 22
el16ba 2:018630ec52d1 23 bool flg_start = 0;
el16ba 2:018630ec52d1 24 bool flg_END = false;
el16ba 2:018630ec52d1 25 long double configData[NUMCONFIGPARAM];
el16ba 2:018630ec52d1 26 string strData[NUMCONFIGPARAM];
el16ba 0:9dd5634b94f3 27
el16ba 0:9dd5634b94f3 28 //returns if the given character is a number or decimal point character
el16ba 0:9dd5634b94f3 29 bool Is_Num_Char(char c)
el16ba 0:9dd5634b94f3 30 {
el16ba 0:9dd5634b94f3 31 bool isChar = false;
el16ba 0:9dd5634b94f3 32 if((c >= '0' and c <= '9') or c == '.') {
el16ba 0:9dd5634b94f3 33 isChar = true;
el16ba 0:9dd5634b94f3 34 }
el16ba 0:9dd5634b94f3 35 return isChar;
el16ba 0:9dd5634b94f3 36 }
el16ba 0:9dd5634b94f3 37
el16ba 0:9dd5634b94f3 38 //From: https://os.mbed.com/questions/83075/Is-it-possible-to-read-a-small-text-file/
el16ba 0:9dd5634b94f3 39 //Reads config.txt from local drive
el16ba 0:9dd5634b94f3 40 bool Print_Config()
el16ba 0:9dd5634b94f3 41 {
el16ba 0:9dd5634b94f3 42 bool flg_error;
el16ba 0:9dd5634b94f3 43 printf("Opening file 'config.txt'... ");
el16ba 0:9dd5634b94f3 44 FILE* fp = fopen("/local/config.txt", "r");
el16ba 0:9dd5634b94f3 45 printf("%s\n\r", (!fp ? "Fail :(" : "OK"));
el16ba 0:9dd5634b94f3 46 if (!fp) {
el16ba 0:9dd5634b94f3 47 error("error: %s (%d)\n", strerror(errno), -errno);
el16ba 0:9dd5634b94f3 48 flg_error = 1;
el16ba 0:9dd5634b94f3 49 }
el16ba 0:9dd5634b94f3 50 while (!feof(fp)) {
el16ba 0:9dd5634b94f3 51 int c = fgetc(fp);
el16ba 0:9dd5634b94f3 52 printf("%c", c);
el16ba 0:9dd5634b94f3 53 }
el16ba 0:9dd5634b94f3 54
el16ba 0:9dd5634b94f3 55 fclose(fp);
el16ba 0:9dd5634b94f3 56 printf("\r\n===========\r\n");
el16ba 0:9dd5634b94f3 57 return flg_error;
el16ba 0:9dd5634b94f3 58 }
el16ba 0:9dd5634b94f3 59
el16ba 0:9dd5634b94f3 60 //Reads reads and converts data from config file
el16ba 0:9dd5634b94f3 61 void Get_Config_data()
el16ba 0:9dd5634b94f3 62 {
el16ba 2:018630ec52d1 63 // printf("Get Config data\r\n");
el16ba 2:018630ec52d1 64 // FILE* fp = fopen("/local/config.txt", "r");
el16ba 2:018630ec52d1 65 // char c;
el16ba 2:018630ec52d1 66 // char stateData = 0; //which data it is reading on duration, off duration e.t.c.
el16ba 2:018630ec52d1 67 // char stateRead = 0; //0 = parsing, 1 = reading data
el16ba 2:018630ec52d1 68 // char* pEnd;
el16ba 2:018630ec52d1 69 // string data;
el16ba 2:018630ec52d1 70 // printf("test");
el16ba 2:018630ec52d1 71 // while (!feof(fp)) {
el16ba 2:018630ec52d1 72 // c = fgetc(fp);
el16ba 2:018630ec52d1 73 // if (Is_Num_Char(c)) {
el16ba 2:018630ec52d1 74 // printf("Read in %d\r\n",c);
el16ba 2:018630ec52d1 75 // data.push_back(c);
el16ba 2:018630ec52d1 76 // stateRead = 1;
el16ba 2:018630ec52d1 77 // c = NULL;
el16ba 2:018630ec52d1 78 // } else if (stateRead == 1) {
el16ba 2:018630ec52d1 79 // //convert to double and add to Data
el16ba 2:018630ec52d1 80 // printf("stateData = %d\r\n",stateData);
el16ba 2:018630ec52d1 81 // strData[stateData] = data;
el16ba 2:018630ec52d1 82 // configData[stateData] = strtod(data.c_str(), &pEnd);
el16ba 2:018630ec52d1 83 // data.clear();
el16ba 2:018630ec52d1 84 // stateData++;
el16ba 2:018630ec52d1 85 // stateRead = 0;
el16ba 2:018630ec52d1 86 // }
el16ba 2:018630ec52d1 87 // }
el16ba 2:018630ec52d1 88 //
el16ba 2:018630ec52d1 89 // fclose(fp);
el16ba 2:018630ec52d1 90
el16ba 2:018630ec52d1 91
el16ba 2:018630ec52d1 92 printf("Get Config Data \r\n");
el16ba 2:018630ec52d1 93 char c; //Current character being read
el16ba 2:018630ec52d1 94 char strData_index = 0;
el16ba 2:018630ec52d1 95 char* pEnd;
el16ba 2:018630ec52d1 96 bool isReading = false;
el16ba 2:018630ec52d1 97 bool isNumChar;
el16ba 2:018630ec52d1 98 string currentStr;
el16ba 0:9dd5634b94f3 99 FILE* fp = fopen("/local/config.txt", "r");
el16ba 0:9dd5634b94f3 100
el16ba 0:9dd5634b94f3 101 while (!feof(fp)) {
el16ba 0:9dd5634b94f3 102 c = fgetc(fp);
el16ba 2:018630ec52d1 103 isNumChar = Is_Num_Char(c);
el16ba 2:018630ec52d1 104 if(isNumChar) {
el16ba 2:018630ec52d1 105 currentStr.push_back(c);
el16ba 2:018630ec52d1 106 isReading = true;
el16ba 2:018630ec52d1 107 // printf("num: %c\r\n", c);
el16ba 2:018630ec52d1 108 } else if(!isNumChar and isReading) {
el16ba 2:018630ec52d1 109 isReading = false;
el16ba 2:018630ec52d1 110 strData[strData_index] = currentStr;
el16ba 2:018630ec52d1 111 configData[strData_index] = strtod(currentStr.c_str(), &pEnd);
el16ba 2:018630ec52d1 112
el16ba 2:018630ec52d1 113 // printf("string added: %s, %i\r\n", currentStr.c_str(), strData_index);
el16ba 2:018630ec52d1 114
el16ba 2:018630ec52d1 115 strData_index++;
el16ba 2:018630ec52d1 116 currentStr = "";
el16ba 0:9dd5634b94f3 117
el16ba 2:018630ec52d1 118 }
el16ba 2:018630ec52d1 119 if (strData_index >= NUMCONFIGPARAM ) {
el16ba 2:018630ec52d1 120 break;
el16ba 2:018630ec52d1 121 }
el16ba 2:018630ec52d1 122
el16ba 0:9dd5634b94f3 123 }
el16ba 0:9dd5634b94f3 124 }
el16ba 0:9dd5634b94f3 125
el16ba 0:9dd5634b94f3 126 // Runs wait functions and divides by 10 to account for error in function
el16ba 0:9dd5634b94f3 127 // unused as calling function causes too much of a delay when below miliseconds
el16ba 0:9dd5634b94f3 128 void wait_fixed(float t)
el16ba 0:9dd5634b94f3 129 {
el16ba 0:9dd5634b94f3 130 thread_sleep_for(t / 10);
el16ba 0:9dd5634b94f3 131 }
el16ba 0:9dd5634b94f3 132
el16ba 0:9dd5634b94f3 133
el16ba 0:9dd5634b94f3 134 //Flips output
el16ba 0:9dd5634b94f3 135 void run_Cycle()
el16ba 0:9dd5634b94f3 136 {
el16ba 0:9dd5634b94f3 137 //printf("On \r\n");
el16ba 0:9dd5634b94f3 138 do21 = 1;
el16ba 0:9dd5634b94f3 139 led1 = 1;
el16ba 0:9dd5634b94f3 140 thread_sleep_for(configData[0]);
el16ba 0:9dd5634b94f3 141 //printf("Off \r\n");
el16ba 0:9dd5634b94f3 142 do21 = 0;
el16ba 0:9dd5634b94f3 143 led1 = 0;
el16ba 2:018630ec52d1 144 thread_sleep_for(configData[2]);
el16ba 2:018630ec52d1 145 do21 = 1;
el16ba 2:018630ec52d1 146 led1 = 1;
el16ba 2:018630ec52d1 147
el16ba 0:9dd5634b94f3 148 }
el16ba 0:9dd5634b94f3 149
el16ba 0:9dd5634b94f3 150 //interrupt function to start cycling
el16ba 0:9dd5634b94f3 151 void start()
el16ba 0:9dd5634b94f3 152 {
el16ba 0:9dd5634b94f3 153 flg_start = 1;
el16ba 0:9dd5634b94f3 154 }
el16ba 0:9dd5634b94f3 155
el16ba 0:9dd5634b94f3 156 //init function
el16ba 0:9dd5634b94f3 157 void init()
el16ba 0:9dd5634b94f3 158 {
el16ba 0:9dd5634b94f3 159 do21 = 0;
el16ba 0:9dd5634b94f3 160 di22.rise(&start);
el16ba 0:9dd5634b94f3 161 Print_Config();
el16ba 0:9dd5634b94f3 162 Get_Config_data();
el16ba 0:9dd5634b94f3 163 }
el16ba 0:9dd5634b94f3 164
el16ba 1:8cad7e957324 165 void cycle_loop()
el16ba 0:9dd5634b94f3 166 {
el16ba 0:9dd5634b94f3 167 while(1) {
el16ba 0:9dd5634b94f3 168 run_Cycle();
el16ba 0:9dd5634b94f3 169 }
el16ba 0:9dd5634b94f3 170 }
el16ba 0:9dd5634b94f3 171
el16ba 2:018630ec52d1 172 void switch_2()
el16ba 2:018630ec52d1 173 {
el16ba 2:018630ec52d1 174 do21 = !do21;
el16ba 2:018630ec52d1 175 led1 = !led1;
el16ba 2:018630ec52d1 176 }
el16ba 2:018630ec52d1 177
el16ba 2:018630ec52d1 178 void start_tick(float timeOnSec, float timeOffSec)
el16ba 2:018630ec52d1 179 {
el16ba 2:018630ec52d1 180 tickOn.attach(&switch_2, timeOnSec);
el16ba 2:018630ec52d1 181 tickOff.attach(&switch_2, timeOnSec + timeOffSec);
el16ba 2:018630ec52d1 182 }
el16ba 2:018630ec52d1 183
el16ba 2:018630ec52d1 184
el16ba 2:018630ec52d1 185 // Allows reads the USB input to allow serial commms to control the box
el16ba 0:9dd5634b94f3 186 void serial_mode()
el16ba 0:9dd5634b94f3 187 {
el16ba 0:9dd5634b94f3 188 bool flg_read = true;
el16ba 0:9dd5634b94f3 189 string str;
el16ba 0:9dd5634b94f3 190 char c;
el16ba 0:9dd5634b94f3 191 pc.baud(9600);
el16ba 0:9dd5634b94f3 192 pc.printf("Serial Mode\n\r");
el16ba 0:9dd5634b94f3 193 while(flg_read) {
el16ba 0:9dd5634b94f3 194 c = pc.getc();
el16ba 0:9dd5634b94f3 195 pc.putc(c);
el16ba 0:9dd5634b94f3 196 if (c == '\n') {
el16ba 1:8cad7e957324 197 if (str == "on\r") {
el16ba 0:9dd5634b94f3 198 do21 = 1;
el16ba 1:8cad7e957324 199 led1 = 1;
el16ba 1:8cad7e957324 200 pc.printf("power on\r\n");
el16ba 1:8cad7e957324 201
el16ba 1:8cad7e957324 202 } else if (str == "off\r") {
el16ba 0:9dd5634b94f3 203 do21 = 0;
el16ba 1:8cad7e957324 204 led1 = 0;
el16ba 1:8cad7e957324 205 pc.printf("power off\r\n");
el16ba 1:8cad7e957324 206
el16ba 1:8cad7e957324 207 } else if (str == "cycle\r") {
el16ba 0:9dd5634b94f3 208 run_Cycle();
el16ba 1:8cad7e957324 209 pc.printf("cycled\r\n");
el16ba 1:8cad7e957324 210
el16ba 1:8cad7e957324 211 } else if(str == "cycle2\r") {
el16ba 1:8cad7e957324 212 pc.printf("clycle loop, power cycle box to stop\r\n");
el16ba 1:8cad7e957324 213 cycle_loop();
el16ba 1:8cad7e957324 214
el16ba 2:018630ec52d1 215 } else if(str == "cycle3\r") {
el16ba 2:018630ec52d1 216 //start_tick();
el16ba 2:018630ec52d1 217
el16ba 2:018630ec52d1 218
el16ba 1:8cad7e957324 219 } else if( str == "exit\r") {
el16ba 1:8cad7e957324 220 flg_read = false;
el16ba 0:9dd5634b94f3 221 } else {
el16ba 1:8cad7e957324 222 pc.printf("unknown command, see README for command list\r\n");
el16ba 0:9dd5634b94f3 223 }
el16ba 1:8cad7e957324 224 str = "";
el16ba 0:9dd5634b94f3 225 } else {
el16ba 0:9dd5634b94f3 226 str.push_back(c);
el16ba 0:9dd5634b94f3 227 }
el16ba 0:9dd5634b94f3 228 }
el16ba 1:8cad7e957324 229 pc.printf("exit serial mode \r\n");
el16ba 0:9dd5634b94f3 230 }
el16ba 0:9dd5634b94f3 231
el16ba 0:9dd5634b94f3 232
el16ba 2:018630ec52d1 233
el16ba 0:9dd5634b94f3 234 int main()
el16ba 0:9dd5634b94f3 235 {
el16ba 0:9dd5634b94f3 236 int Mode;
el16ba 0:9dd5634b94f3 237 printf("STARTING\r\n");
el16ba 0:9dd5634b94f3 238 init();
el16ba 0:9dd5634b94f3 239 printf("Strings: On: %s, repeat: %s, Off: %s \r\n", strData[0].c_str(),strData[1].c_str(), strData[2].c_str() );
el16ba 1:8cad7e957324 240 printf("Data: %Lf, %Lf, %Lf\r\n",configData[0],configData[1],configData[2]);
el16ba 0:9dd5634b94f3 241
el16ba 1:8cad7e957324 242 while(!flg_END) {
el16ba 2:018630ec52d1 243 Mode = (int)configData[1];
el16ba 1:8cad7e957324 244 if(Mode == 0) {
el16ba 1:8cad7e957324 245 run_Cycle();
el16ba 1:8cad7e957324 246 } else if(Mode == 1) {
el16ba 1:8cad7e957324 247 cycle_loop();
el16ba 1:8cad7e957324 248 } else if(Mode == 2) {
el16ba 1:8cad7e957324 249 serial_mode();
el16ba 2:018630ec52d1 250 printf("1\r\n");
el16ba 1:8cad7e957324 251 Get_Config_data();
el16ba 2:018630ec52d1 252 printf("2\r\n");
el16ba 1:8cad7e957324 253 printf("Data: %Lf, %Lf, %Lf\r\n",configData[0],configData[1],configData[2]);
el16ba 1:8cad7e957324 254
el16ba 1:8cad7e957324 255 } else {
el16ba 1:8cad7e957324 256 printf("Invalid Mode");
el16ba 1:8cad7e957324 257 }
el16ba 0:9dd5634b94f3 258 }
el16ba 0:9dd5634b94f3 259
el16ba 0:9dd5634b94f3 260 printf("END \r\n");
el16ba 0:9dd5634b94f3 261 return 0;
el16ba 0:9dd5634b94f3 262 }