Code for Browonout Generator box

Committer:
el16ba
Date:
Thu Feb 06 17:49:34 2020 +0000
Revision:
0:9dd5634b94f3
Child:
1:8cad7e957324
Working basic power cycling functionality with beginnings of infrastructure for serial command functionality.

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 0:9dd5634b94f3 128 long double configData[3];
el16ba 0:9dd5634b94f3 129 string strData[3];
el16ba 0:9dd5634b94f3 130
el16ba 0:9dd5634b94f3 131 //returns if the given character is a number or decimal point character
el16ba 0:9dd5634b94f3 132 bool Is_Num_Char(char c)
el16ba 0:9dd5634b94f3 133 {
el16ba 0:9dd5634b94f3 134 bool isChar = false;
el16ba 0:9dd5634b94f3 135 if((c >= '0' and c <= '9') or c == '.') {
el16ba 0:9dd5634b94f3 136 isChar = true;
el16ba 0:9dd5634b94f3 137 }
el16ba 0:9dd5634b94f3 138 return isChar;
el16ba 0:9dd5634b94f3 139 }
el16ba 0:9dd5634b94f3 140
el16ba 0:9dd5634b94f3 141 //From: https://os.mbed.com/questions/83075/Is-it-possible-to-read-a-small-text-file/
el16ba 0:9dd5634b94f3 142 //Reads config.txt from local drive
el16ba 0:9dd5634b94f3 143 bool Print_Config()
el16ba 0:9dd5634b94f3 144 {
el16ba 0:9dd5634b94f3 145 bool flg_error;
el16ba 0:9dd5634b94f3 146 printf("Opening file 'config.txt'... ");
el16ba 0:9dd5634b94f3 147 FILE* fp = fopen("/local/config.txt", "r");
el16ba 0:9dd5634b94f3 148 printf("%s\n\r", (!fp ? "Fail :(" : "OK"));
el16ba 0:9dd5634b94f3 149 if (!fp) {
el16ba 0:9dd5634b94f3 150 error("error: %s (%d)\n", strerror(errno), -errno);
el16ba 0:9dd5634b94f3 151 flg_error = 1;
el16ba 0:9dd5634b94f3 152 }
el16ba 0:9dd5634b94f3 153 while (!feof(fp)) {
el16ba 0:9dd5634b94f3 154 int c = fgetc(fp);
el16ba 0:9dd5634b94f3 155 printf("%c", c);
el16ba 0:9dd5634b94f3 156 }
el16ba 0:9dd5634b94f3 157
el16ba 0:9dd5634b94f3 158 fclose(fp);
el16ba 0:9dd5634b94f3 159 printf("\r\n===========\r\n");
el16ba 0:9dd5634b94f3 160 return flg_error;
el16ba 0:9dd5634b94f3 161 }
el16ba 0:9dd5634b94f3 162
el16ba 0:9dd5634b94f3 163 //Reads reads and converts data from config file
el16ba 0:9dd5634b94f3 164 void Get_Config_data()
el16ba 0:9dd5634b94f3 165 {
el16ba 0:9dd5634b94f3 166 printf("Get Config data\r\n");
el16ba 0:9dd5634b94f3 167 FILE* fp = fopen("/local/config.txt", "r");
el16ba 0:9dd5634b94f3 168 int c;
el16ba 0:9dd5634b94f3 169 char stateData = 0; //which data it is reading on duration, off duration e.t.c.
el16ba 0:9dd5634b94f3 170 char stateRead = 0; //0 = parsing, 1 = reading data
el16ba 0:9dd5634b94f3 171 char* pEnd;
el16ba 0:9dd5634b94f3 172 string data;
el16ba 0:9dd5634b94f3 173
el16ba 0:9dd5634b94f3 174 while (!feof(fp)) {
el16ba 0:9dd5634b94f3 175 c = fgetc(fp);
el16ba 0:9dd5634b94f3 176 if (Is_Num_Char(c)) {
el16ba 0:9dd5634b94f3 177 data.push_back(c);
el16ba 0:9dd5634b94f3 178 stateRead = 1;
el16ba 0:9dd5634b94f3 179 c = NULL;
el16ba 0:9dd5634b94f3 180 } else if (stateRead == 1) {
el16ba 0:9dd5634b94f3 181 //convert to double and add to Data
el16ba 0:9dd5634b94f3 182 strData[stateData] = data;
el16ba 0:9dd5634b94f3 183 configData[stateData] = strtod(data.c_str(), &pEnd);
el16ba 0:9dd5634b94f3 184 data.clear();
el16ba 0:9dd5634b94f3 185 stateData++;
el16ba 0:9dd5634b94f3 186 stateRead = 0;
el16ba 0:9dd5634b94f3 187 }
el16ba 0:9dd5634b94f3 188 }
el16ba 0:9dd5634b94f3 189
el16ba 0:9dd5634b94f3 190 fclose(fp);
el16ba 0:9dd5634b94f3 191
el16ba 0:9dd5634b94f3 192
el16ba 0:9dd5634b94f3 193 }
el16ba 0:9dd5634b94f3 194
el16ba 0:9dd5634b94f3 195 // Runs wait functions and divides by 10 to account for error in function
el16ba 0:9dd5634b94f3 196 // unused as calling function causes too much of a delay when below miliseconds
el16ba 0:9dd5634b94f3 197 void wait_fixed(float t)
el16ba 0:9dd5634b94f3 198 {
el16ba 0:9dd5634b94f3 199 thread_sleep_for(t / 10);
el16ba 0:9dd5634b94f3 200 }
el16ba 0:9dd5634b94f3 201
el16ba 0:9dd5634b94f3 202
el16ba 0:9dd5634b94f3 203 //Flips output
el16ba 0:9dd5634b94f3 204 void run_Cycle()
el16ba 0:9dd5634b94f3 205 {
el16ba 0:9dd5634b94f3 206 //printf("On \r\n");
el16ba 0:9dd5634b94f3 207 do21 = 1;
el16ba 0:9dd5634b94f3 208 led1 = 1;
el16ba 0:9dd5634b94f3 209 thread_sleep_for(configData[0]);
el16ba 0:9dd5634b94f3 210
el16ba 0:9dd5634b94f3 211 //printf("Off \r\n");
el16ba 0:9dd5634b94f3 212 do21 = 0;
el16ba 0:9dd5634b94f3 213 led1 = 0;
el16ba 0:9dd5634b94f3 214 }
el16ba 0:9dd5634b94f3 215
el16ba 0:9dd5634b94f3 216 //interrupt function to start cycling
el16ba 0:9dd5634b94f3 217 void start()
el16ba 0:9dd5634b94f3 218 {
el16ba 0:9dd5634b94f3 219 flg_start = 1;
el16ba 0:9dd5634b94f3 220 }
el16ba 0:9dd5634b94f3 221
el16ba 0:9dd5634b94f3 222 //init function
el16ba 0:9dd5634b94f3 223 void init()
el16ba 0:9dd5634b94f3 224 {
el16ba 0:9dd5634b94f3 225 do21 = 0;
el16ba 0:9dd5634b94f3 226 di22.rise(&start);
el16ba 0:9dd5634b94f3 227 Print_Config();
el16ba 0:9dd5634b94f3 228 Get_Config_data();
el16ba 0:9dd5634b94f3 229 }
el16ba 0:9dd5634b94f3 230
el16ba 0:9dd5634b94f3 231 void cycle()
el16ba 0:9dd5634b94f3 232 {
el16ba 0:9dd5634b94f3 233 while(1) {
el16ba 0:9dd5634b94f3 234 run_Cycle();
el16ba 0:9dd5634b94f3 235 thread_sleep_for(configData[2]);
el16ba 0:9dd5634b94f3 236 }
el16ba 0:9dd5634b94f3 237 }
el16ba 0:9dd5634b94f3 238
el16ba 0:9dd5634b94f3 239 void serial_mode()
el16ba 0:9dd5634b94f3 240 {
el16ba 0:9dd5634b94f3 241 bool flg_read = true;
el16ba 0:9dd5634b94f3 242 string str;
el16ba 0:9dd5634b94f3 243 char c;
el16ba 0:9dd5634b94f3 244 pc.baud(9600);
el16ba 0:9dd5634b94f3 245 pc.printf("Serial Mode\n\r");
el16ba 0:9dd5634b94f3 246 while(flg_read) {
el16ba 0:9dd5634b94f3 247 c = pc.getc();
el16ba 0:9dd5634b94f3 248 pc.putc(c);
el16ba 0:9dd5634b94f3 249 if (c == '\n') {
el16ba 0:9dd5634b94f3 250 if (str == "on") {
el16ba 0:9dd5634b94f3 251 do21 = 1;
el16ba 0:9dd5634b94f3 252 printf("on\r\n");
el16ba 0:9dd5634b94f3 253 } else if (str == "off") {
el16ba 0:9dd5634b94f3 254 do21 = 0;
el16ba 0:9dd5634b94f3 255 printf("off\r\n");
el16ba 0:9dd5634b94f3 256 } else if (str == "cycle") {
el16ba 0:9dd5634b94f3 257 run_Cycle();
el16ba 0:9dd5634b94f3 258 printf("cycled\r\n");
el16ba 0:9dd5634b94f3 259 } else if(str == "cycle2") {
el16ba 0:9dd5634b94f3 260 cycle();
el16ba 0:9dd5634b94f3 261 } else {
el16ba 0:9dd5634b94f3 262 str = "";
el16ba 0:9dd5634b94f3 263 flg_read = false;
el16ba 0:9dd5634b94f3 264 }
el16ba 0:9dd5634b94f3 265
el16ba 0:9dd5634b94f3 266 } else {
el16ba 0:9dd5634b94f3 267 str.push_back(c);
el16ba 0:9dd5634b94f3 268 }
el16ba 0:9dd5634b94f3 269 }
el16ba 0:9dd5634b94f3 270 }
el16ba 0:9dd5634b94f3 271
el16ba 0:9dd5634b94f3 272
el16ba 0:9dd5634b94f3 273 int main()
el16ba 0:9dd5634b94f3 274 {
el16ba 0:9dd5634b94f3 275 int Mode;
el16ba 0:9dd5634b94f3 276 printf("STARTING\r\n");
el16ba 0:9dd5634b94f3 277 init();
el16ba 0:9dd5634b94f3 278 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 279 printf("Data: %Lf, %Lf, %Lf\r\n",configData[0],configData[1],configData[2]);
el16ba 0:9dd5634b94f3 280 // Mode = (int)configData[1];
el16ba 0:9dd5634b94f3 281 // if(Mode == 0) {
el16ba 0:9dd5634b94f3 282 // run_Cycle();
el16ba 0:9dd5634b94f3 283 // } else if(Mode == 1) {
el16ba 0:9dd5634b94f3 284 // cycle();
el16ba 0:9dd5634b94f3 285 // } else if(Mode == 2) {
el16ba 0:9dd5634b94f3 286 // serial_mode();
el16ba 0:9dd5634b94f3 287 // } else {
el16ba 0:9dd5634b94f3 288 // printf("Invalid Mode");
el16ba 0:9dd5634b94f3 289 // }
el16ba 0:9dd5634b94f3 290
el16ba 0:9dd5634b94f3 291 while((int)configData[1] != 0) {
el16ba 0:9dd5634b94f3 292 run_Cycle();
el16ba 0:9dd5634b94f3 293 thread_sleep_for(configData[2]);
el16ba 0:9dd5634b94f3 294 }
el16ba 0:9dd5634b94f3 295 run_Cycle();
el16ba 0:9dd5634b94f3 296
el16ba 0:9dd5634b94f3 297 printf("END \r\n");
el16ba 0:9dd5634b94f3 298 return 0;
el16ba 0:9dd5634b94f3 299 }
el16ba 0:9dd5634b94f3 300
el16ba 0:9dd5634b94f3 301