
Code for Browonout Generator box
main.cpp@4:44760dafcab7, 2020-02-14 (annotated)
- 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?
User | Revision | Line number | New 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 | } |