Code for Browonout Generator box

Committer:
el16ba
Date:
Fri Feb 07 12:28:58 2020 +0000
Revision:
1:8cad7e957324
Parent:
0:9dd5634b94f3
Child:
2:018630ec52d1
Basic serial command control is not implemented, will ad digitally cancelled power cycling next.

Who changed what in which revision?

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