Code for Browonout Generator box

Committer:
el16ba
Date:
Fri Feb 14 12:20:31 2020 +0000
Revision:
4:44760dafcab7
Parent:
3:16478dd3d1f3
Child:
5:a8297e5f4de1
Reformatted previous functions and added new value changing functionality to change wait times in serial mode due to previously stated bug being unable to be resolved.

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 4:44760dafcab7 8 #include <iostream>
el16ba 4:44760dafcab7 9 #include <cstdio>
el16ba 4:44760dafcab7 10 #include <cstdlib>
el16ba 0:9dd5634b94f3 11
el16ba 3:16478dd3d1f3 12 DigitalOut led1(LED1, 0);
el16ba 3:16478dd3d1f3 13 DigitalOut led2(LED2, 0);
el16ba 3:16478dd3d1f3 14 DigitalOut led3(LED3, 0);
el16ba 3:16478dd3d1f3 15 DigitalOut led4(LED4, 0);
el16ba 3:16478dd3d1f3 16 DigitalOut do21(p21, 0);
el16ba 2:018630ec52d1 17 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 18 Ticker tickOn;
el16ba 2:018630ec52d1 19 Ticker tickOff;
el16ba 0:9dd5634b94f3 20
el16ba 0:9dd5634b94f3 21 Serial pc(USBTX, USBRX); // for PC debug
el16ba 0:9dd5634b94f3 22 LocalFileSystem fs("local");
el16ba 0:9dd5634b94f3 23
el16ba 2:018630ec52d1 24 #define NUMCONFIGPARAM 3
el16ba 0:9dd5634b94f3 25
el16ba 2:018630ec52d1 26 bool flg_start = 0;
el16ba 2:018630ec52d1 27 bool flg_END = false;
el16ba 2:018630ec52d1 28 long double configData[NUMCONFIGPARAM];
el16ba 2:018630ec52d1 29 string strData[NUMCONFIGPARAM];
el16ba 0:9dd5634b94f3 30
el16ba 3:16478dd3d1f3 31 //function prototypes
el16ba 3:16478dd3d1f3 32 void init();
el16ba 3:16478dd3d1f3 33 bool is_num_char(char c);
el16ba 3:16478dd3d1f3 34 bool print_config();
el16ba 3:16478dd3d1f3 35 void get_config_data();
el16ba 4:44760dafcab7 36 void power(char pwr = 0);
el16ba 4:44760dafcab7 37 void cycle_wait(long double tOn = configData[0], long double tOff = configData[2]);
el16ba 4:44760dafcab7 38 void cycle_loop(long double tOn = configData[0], long double tOff = configData[2]);
el16ba 4:44760dafcab7 39 void serial_mode();
el16ba 3:16478dd3d1f3 40
el16ba 3:16478dd3d1f3 41
el16ba 0:9dd5634b94f3 42 //returns if the given character is a number or decimal point character
el16ba 3:16478dd3d1f3 43 bool is_num_char(char c)
el16ba 0:9dd5634b94f3 44 {
el16ba 0:9dd5634b94f3 45 bool isChar = false;
el16ba 0:9dd5634b94f3 46 if((c >= '0' and c <= '9') or c == '.') {
el16ba 0:9dd5634b94f3 47 isChar = true;
el16ba 0:9dd5634b94f3 48 }
el16ba 0:9dd5634b94f3 49 return isChar;
el16ba 0:9dd5634b94f3 50 }
el16ba 0:9dd5634b94f3 51
el16ba 0:9dd5634b94f3 52 //From: https://os.mbed.com/questions/83075/Is-it-possible-to-read-a-small-text-file/
el16ba 0:9dd5634b94f3 53 //Reads config.txt from local drive
el16ba 3:16478dd3d1f3 54 bool print_config()
el16ba 0:9dd5634b94f3 55 {
el16ba 0:9dd5634b94f3 56 bool flg_error;
el16ba 3:16478dd3d1f3 57 pc.printf("Opening file 'config.txt'... ");
el16ba 0:9dd5634b94f3 58 FILE* fp = fopen("/local/config.txt", "r");
el16ba 3:16478dd3d1f3 59 pc.printf("%s\n\r", (!fp ? "Fail :(" : "OK"));
el16ba 4:44760dafcab7 60 pc.printf("\r\n==========\r\n");
el16ba 0:9dd5634b94f3 61 if (!fp) {
el16ba 0:9dd5634b94f3 62 error("error: %s (%d)\n", strerror(errno), -errno);
el16ba 0:9dd5634b94f3 63 flg_error = 1;
el16ba 0:9dd5634b94f3 64 }
el16ba 0:9dd5634b94f3 65 while (!feof(fp)) {
el16ba 0:9dd5634b94f3 66 int c = fgetc(fp);
el16ba 3:16478dd3d1f3 67 pc.printf("%c", c);
el16ba 0:9dd5634b94f3 68 }
el16ba 0:9dd5634b94f3 69
el16ba 0:9dd5634b94f3 70 fclose(fp);
el16ba 4:44760dafcab7 71 pc.printf("\r\n==========\r\n");
el16ba 0:9dd5634b94f3 72 return flg_error;
el16ba 0:9dd5634b94f3 73 }
el16ba 0:9dd5634b94f3 74
el16ba 0:9dd5634b94f3 75 //Reads reads and converts data from config file
el16ba 3:16478dd3d1f3 76 //Once a timed function (e.g. wait(), sleep_for(), ticker, timer e.t.c) is called opening another File pointer will cause the LPC1768 to crash with a Hard Fault.
el16ba 3:16478dd3d1f3 77 void get_config_data()
el16ba 0:9dd5634b94f3 78 {
el16ba 3:16478dd3d1f3 79 pc.printf("Get Config Data \r\n");
el16ba 2:018630ec52d1 80 char c; //Current character being read
el16ba 2:018630ec52d1 81 char strData_index = 0;
el16ba 2:018630ec52d1 82 char* pEnd;
el16ba 2:018630ec52d1 83 bool isReading = false;
el16ba 2:018630ec52d1 84 bool isNumChar;
el16ba 2:018630ec52d1 85 string currentStr;
el16ba 3:16478dd3d1f3 86
el16ba 0:9dd5634b94f3 87 FILE* fp = fopen("/local/config.txt", "r");
el16ba 0:9dd5634b94f3 88
el16ba 3:16478dd3d1f3 89 while (!feof(fp)) { //loop till end of file
el16ba 3:16478dd3d1f3 90
el16ba 0:9dd5634b94f3 91 c = fgetc(fp);
el16ba 3:16478dd3d1f3 92 isNumChar = is_num_char(c);
el16ba 3:16478dd3d1f3 93 if(isNumChar) { //at number character?
el16ba 2:018630ec52d1 94 currentStr.push_back(c);
el16ba 2:018630ec52d1 95 isReading = true;
el16ba 3:16478dd3d1f3 96 } else if(!isNumChar and isReading) { //at end of number string?
el16ba 2:018630ec52d1 97 isReading = false;
el16ba 2:018630ec52d1 98 strData[strData_index] = currentStr;
el16ba 2:018630ec52d1 99 configData[strData_index] = strtod(currentStr.c_str(), &pEnd);
el16ba 2:018630ec52d1 100 strData_index++;
el16ba 2:018630ec52d1 101 currentStr = "";
el16ba 2:018630ec52d1 102 }
el16ba 3:16478dd3d1f3 103 if (strData_index >= NUMCONFIGPARAM ) { //Read all nessesary data?
el16ba 2:018630ec52d1 104 break;
el16ba 2:018630ec52d1 105 }
el16ba 3:16478dd3d1f3 106
el16ba 3:16478dd3d1f3 107 }
el16ba 3:16478dd3d1f3 108 fclose(fp);
el16ba 3:16478dd3d1f3 109 pc.printf("Data: %Lf, %Lf, %Lf\r\n",configData[0],configData[1],configData[2]);
el16ba 3:16478dd3d1f3 110 }
el16ba 3:16478dd3d1f3 111
el16ba 3:16478dd3d1f3 112 void init()
el16ba 3:16478dd3d1f3 113 {
el16ba 3:16478dd3d1f3 114 pc.printf("Initializing \r\n");
el16ba 3:16478dd3d1f3 115 do21 = 0;
el16ba 3:16478dd3d1f3 116 led1 = 0;
el16ba 3:16478dd3d1f3 117 pc.baud(9600);
el16ba 3:16478dd3d1f3 118 print_config();
el16ba 3:16478dd3d1f3 119 get_config_data();
el16ba 3:16478dd3d1f3 120 }
el16ba 3:16478dd3d1f3 121
el16ba 4:44760dafcab7 122 void power(char pwr)
el16ba 3:16478dd3d1f3 123 {
el16ba 3:16478dd3d1f3 124 do21 = pwr;
el16ba 3:16478dd3d1f3 125 led1 = pwr;
el16ba 3:16478dd3d1f3 126 }
el16ba 3:16478dd3d1f3 127
el16ba 4:44760dafcab7 128 void cycle_wait(long double tOn, long double tOff)
el16ba 3:16478dd3d1f3 129 {
el16ba 3:16478dd3d1f3 130 power(1);
el16ba 3:16478dd3d1f3 131 ThisThread::sleep_for(tOn);
el16ba 3:16478dd3d1f3 132 power(0);
el16ba 3:16478dd3d1f3 133 ThisThread::sleep_for(tOff);
el16ba 3:16478dd3d1f3 134 power(1);
el16ba 3:16478dd3d1f3 135 }
el16ba 3:16478dd3d1f3 136
el16ba 4:44760dafcab7 137 void cycle_loop(long double tOn, long double tOff)
el16ba 3:16478dd3d1f3 138 {
el16ba 3:16478dd3d1f3 139 while(1) {
el16ba 3:16478dd3d1f3 140 cycle_wait(tOn,tOff);
el16ba 0:9dd5634b94f3 141 }
el16ba 0:9dd5634b94f3 142 }
el16ba 0:9dd5634b94f3 143
el16ba 4:44760dafcab7 144 string read_serial_input()
el16ba 4:44760dafcab7 145 {
el16ba 4:44760dafcab7 146 bool flg_read = true;
el16ba 4:44760dafcab7 147 char c;
el16ba 4:44760dafcab7 148 string str = "";
el16ba 4:44760dafcab7 149
el16ba 4:44760dafcab7 150 while(flg_read) {
el16ba 4:44760dafcab7 151 c = pc.getc();
el16ba 4:44760dafcab7 152 pc.putc(c);
el16ba 4:44760dafcab7 153 if(c == 8 or c == 127) { //If back space or delete remove last character
el16ba 4:44760dafcab7 154 str.pop_back();
el16ba 4:44760dafcab7 155 } else if (c == '\n') {
el16ba 4:44760dafcab7 156 str.pop_back();
el16ba 4:44760dafcab7 157 flg_read = false;
el16ba 4:44760dafcab7 158 break;
el16ba 4:44760dafcab7 159
el16ba 4:44760dafcab7 160 // } else if(c < ' ') { //If none visible character, bar backspace or delete
el16ba 4:44760dafcab7 161 // flg_read = false;
el16ba 4:44760dafcab7 162 // break;
el16ba 4:44760dafcab7 163 } else {
el16ba 4:44760dafcab7 164 str.push_back(c);
el16ba 4:44760dafcab7 165 }
el16ba 4:44760dafcab7 166 }
el16ba 4:44760dafcab7 167 return str;
el16ba 4:44760dafcab7 168 }
el16ba 4:44760dafcab7 169
el16ba 4:44760dafcab7 170 bool is_num_str(string str)
el16ba 4:44760dafcab7 171 {
el16ba 4:44760dafcab7 172 bool isNumC = false;
el16ba 4:44760dafcab7 173 bool output = true;
el16ba 4:44760dafcab7 174 for(int i = 0; i < str.length(); i++) {
el16ba 4:44760dafcab7 175 isNumC = is_num_char(str[i]);
el16ba 4:44760dafcab7 176 if(!isNumC) {
el16ba 4:44760dafcab7 177 output = false;
el16ba 4:44760dafcab7 178 }
el16ba 4:44760dafcab7 179 }
el16ba 4:44760dafcab7 180 return output;
el16ba 4:44760dafcab7 181 }
el16ba 4:44760dafcab7 182
el16ba 4:44760dafcab7 183 long double get_num_input()
el16ba 4:44760dafcab7 184 {
el16ba 4:44760dafcab7 185 long double output;
el16ba 4:44760dafcab7 186 bool flg_gotStr = false;
el16ba 4:44760dafcab7 187 string str_v = "";
el16ba 4:44760dafcab7 188 char* pEnd;
el16ba 4:44760dafcab7 189
el16ba 4:44760dafcab7 190 while(!flg_gotStr) {
el16ba 4:44760dafcab7 191 pc.puts("value: ");
el16ba 4:44760dafcab7 192 str_v = read_serial_input();
el16ba 4:44760dafcab7 193 if (is_num_str(str_v)) {
el16ba 4:44760dafcab7 194 output = strtod(str_v.c_str(), &pEnd);
el16ba 4:44760dafcab7 195 flg_gotStr = true;
el16ba 4:44760dafcab7 196 break;
el16ba 4:44760dafcab7 197 } else {
el16ba 4:44760dafcab7 198 pc.printf("entry contained non number characters please try again: \r\n");
el16ba 4:44760dafcab7 199 }
el16ba 4:44760dafcab7 200
el16ba 4:44760dafcab7 201 }
el16ba 4:44760dafcab7 202 return output;
el16ba 4:44760dafcab7 203 }
el16ba 4:44760dafcab7 204
el16ba 4:44760dafcab7 205
el16ba 4:44760dafcab7 206
el16ba 0:9dd5634b94f3 207 void serial_mode()
el16ba 0:9dd5634b94f3 208 {
el16ba 3:16478dd3d1f3 209 pc.printf("Serial Mode \r\n");
el16ba 3:16478dd3d1f3 210
el16ba 0:9dd5634b94f3 211 bool flg_read = true;
el16ba 4:44760dafcab7 212 bool flg_read2 = true;
el16ba 0:9dd5634b94f3 213 char c;
el16ba 4:44760dafcab7 214 string str_c = "";
el16ba 1:8cad7e957324 215
el16ba 3:16478dd3d1f3 216 while(flg_read) {
el16ba 4:44760dafcab7 217 str_c = read_serial_input();
el16ba 4:44760dafcab7 218 if (str_c == "on"){
el16ba 4:44760dafcab7 219 power(1);
el16ba 4:44760dafcab7 220 pc.printf("on\r\n");
el16ba 4:44760dafcab7 221 } else if(str_c == "off"){
el16ba 4:44760dafcab7 222 power(0);
el16ba 4:44760dafcab7 223 pc.printf("off\r\n");
el16ba 4:44760dafcab7 224 } else if(str_c == "cyclew") {
el16ba 4:44760dafcab7 225 cycle_wait();
el16ba 4:44760dafcab7 226 pc.printf("cycled \r\n");
el16ba 4:44760dafcab7 227 } else if(str_c == "loop") {
el16ba 4:44760dafcab7 228 pc.printf("Looping restart unit to end loop\r\n");
el16ba 4:44760dafcab7 229 cycle_loop();
el16ba 4:44760dafcab7 230 } else if(str_c == "newval") {
el16ba 4:44760dafcab7 231 pc.printf("enter your new on and off times(ms)\r\n");
el16ba 4:44760dafcab7 232 pc.puts("Time on\r\n");
el16ba 4:44760dafcab7 233 configData[0] = get_num_input();
el16ba 4:44760dafcab7 234 pc.puts("Time off\r\n");
el16ba 4:44760dafcab7 235 configData[2] = get_num_input();
el16ba 4:44760dafcab7 236 pc.printf("Data: %Lf, %Lf, %Lf\r\n",configData[0],configData[1],configData[2]);
el16ba 0:9dd5634b94f3 237 } else {
el16ba 4:44760dafcab7 238 pc.printf("Unknown command, see README for commands \r\n");
el16ba 0:9dd5634b94f3 239 }
el16ba 4:44760dafcab7 240 str_c = "";
el16ba 0:9dd5634b94f3 241 }
el16ba 3:16478dd3d1f3 242
el16ba 0:9dd5634b94f3 243 }
el16ba 0:9dd5634b94f3 244
el16ba 0:9dd5634b94f3 245 int main()
el16ba 0:9dd5634b94f3 246 {
el16ba 0:9dd5634b94f3 247 init();
el16ba 4:44760dafcab7 248
el16ba 1:8cad7e957324 249 while(!flg_END) {
el16ba 3:16478dd3d1f3 250 switch((int)configData[1]) {
el16ba 3:16478dd3d1f3 251 case(1): //Cut the power to the machine once
el16ba 3:16478dd3d1f3 252 cycle_wait();
el16ba 3:16478dd3d1f3 253 pc.printf("cycled \r\n");
el16ba 3:16478dd3d1f3 254 break;
el16ba 1:8cad7e957324 255
el16ba 3:16478dd3d1f3 256 case(2): //Cut the power to the machine in a loop
el16ba 3:16478dd3d1f3 257 pc.printf("Begining Power cycle loop, to end loop press restart button \r\n");
el16ba 3:16478dd3d1f3 258 cycle_loop();
el16ba 3:16478dd3d1f3 259 break;
el16ba 3:16478dd3d1f3 260
el16ba 3:16478dd3d1f3 261 case(3): //Launch in serial command mode
el16ba 3:16478dd3d1f3 262 serial_mode();
el16ba 3:16478dd3d1f3 263 break;
el16ba 1:8cad7e957324 264 }
el16ba 3:16478dd3d1f3 265
el16ba 0:9dd5634b94f3 266 }
el16ba 0:9dd5634b94f3 267
el16ba 3:16478dd3d1f3 268 pc.printf("Program End \r\n");
el16ba 3:16478dd3d1f3 269
el16ba 0:9dd5634b94f3 270 return 0;
el16ba 3:16478dd3d1f3 271 }