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