
Code for Browonout Generator box
main.cpp@10:a0212b37673b, 2020-02-17 (annotated)
- Committer:
- el16ba
- Date:
- Mon Feb 17 16:16:19 2020 +0000
- Revision:
- 10:a0212b37673b
- Parent:
- 9:71eab0a4ceef
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 | 6:3f5d21480f11 | 21 | Timeout toOn; |
el16ba | 6:3f5d21480f11 | 22 | Timeout toOff; |
el16ba | 2:018630ec52d1 | 23 | Ticker tickOn; |
el16ba | 2:018630ec52d1 | 24 | Ticker tickOff; |
el16ba | 0:9dd5634b94f3 | 25 | |
el16ba | 0:9dd5634b94f3 | 26 | Serial pc(USBTX, USBRX); // for PC debug |
el16ba | 0:9dd5634b94f3 | 27 | LocalFileSystem fs("local"); |
el16ba | 0:9dd5634b94f3 | 28 | |
el16ba | 2:018630ec52d1 | 29 | #define NUMCONFIGPARAM 3 |
el16ba | 0:9dd5634b94f3 | 30 | |
el16ba | 2:018630ec52d1 | 31 | bool flg_start = 0; |
el16ba | 2:018630ec52d1 | 32 | bool flg_END = false; |
el16ba | 6:3f5d21480f11 | 33 | bool flg_loop0 = false; |
el16ba | 6:3f5d21480f11 | 34 | bool flg_loop1 = false; |
el16ba | 2:018630ec52d1 | 35 | long double configData[NUMCONFIGPARAM]; |
el16ba | 2:018630ec52d1 | 36 | string strData[NUMCONFIGPARAM]; |
el16ba | 0:9dd5634b94f3 | 37 | |
el16ba | 3:16478dd3d1f3 | 38 | //function prototypes |
el16ba | 3:16478dd3d1f3 | 39 | void init(); |
el16ba | 3:16478dd3d1f3 | 40 | bool is_num_char(char c); |
el16ba | 3:16478dd3d1f3 | 41 | bool print_config(); |
el16ba | 3:16478dd3d1f3 | 42 | void get_config_data(); |
el16ba | 4:44760dafcab7 | 43 | void power(char pwr = 0); |
el16ba | 4:44760dafcab7 | 44 | void cycle_wait(long double tOn = configData[0], long double tOff = configData[2]); |
el16ba | 6:3f5d21480f11 | 45 | void cycle_loopw(long double tOn = configData[0], long double tOff = configData[2]); |
el16ba | 5:a8297e5f4de1 | 46 | string read_serial_input(); |
el16ba | 5:a8297e5f4de1 | 47 | bool is_num_str(string str); |
el16ba | 5:a8297e5f4de1 | 48 | long double get_num_input(); |
el16ba | 7:fb8b01ec74a8 | 49 | void powerOn(); |
el16ba | 7:fb8b01ec74a8 | 50 | void powerOff(); |
el16ba | 6:3f5d21480f11 | 51 | void cycle_timeout(long double tOn = configData[0], long double tOff = configData[2]); |
el16ba | 6:3f5d21480f11 | 52 | void cycle_loopto(long double tOn = configData[0], long double tOff = configData[2]); |
el16ba | 7:fb8b01ec74a8 | 53 | void loop_tick (); |
el16ba | 6:3f5d21480f11 | 54 | void cycle_looptick(long double tOn = configData[0], long double tOff = configData[2]); |
el16ba | 7:fb8b01ec74a8 | 55 | void serial_mode(); |
el16ba | 3:16478dd3d1f3 | 56 | |
el16ba | 3:16478dd3d1f3 | 57 | |
el16ba | 0:9dd5634b94f3 | 58 | //returns if the given character is a number or decimal point character |
el16ba | 3:16478dd3d1f3 | 59 | bool is_num_char(char c) |
el16ba | 0:9dd5634b94f3 | 60 | { |
el16ba | 0:9dd5634b94f3 | 61 | bool isChar = false; |
el16ba | 0:9dd5634b94f3 | 62 | if((c >= '0' and c <= '9') or c == '.') { |
el16ba | 0:9dd5634b94f3 | 63 | isChar = true; |
el16ba | 0:9dd5634b94f3 | 64 | } |
el16ba | 0:9dd5634b94f3 | 65 | return isChar; |
el16ba | 0:9dd5634b94f3 | 66 | } |
el16ba | 0:9dd5634b94f3 | 67 | |
el16ba | 0:9dd5634b94f3 | 68 | //From: https://os.mbed.com/questions/83075/Is-it-possible-to-read-a-small-text-file/ |
el16ba | 0:9dd5634b94f3 | 69 | //Reads config.txt from local drive |
el16ba | 3:16478dd3d1f3 | 70 | bool print_config() |
el16ba | 0:9dd5634b94f3 | 71 | { |
el16ba | 0:9dd5634b94f3 | 72 | bool flg_error; |
el16ba | 3:16478dd3d1f3 | 73 | pc.printf("Opening file 'config.txt'... "); |
el16ba | 0:9dd5634b94f3 | 74 | FILE* fp = fopen("/local/config.txt", "r"); |
el16ba | 3:16478dd3d1f3 | 75 | pc.printf("%s\n\r", (!fp ? "Fail :(" : "OK")); |
el16ba | 4:44760dafcab7 | 76 | pc.printf("\r\n==========\r\n"); |
el16ba | 0:9dd5634b94f3 | 77 | if (!fp) { |
el16ba | 0:9dd5634b94f3 | 78 | error("error: %s (%d)\n", strerror(errno), -errno); |
el16ba | 0:9dd5634b94f3 | 79 | flg_error = 1; |
el16ba | 0:9dd5634b94f3 | 80 | } |
el16ba | 0:9dd5634b94f3 | 81 | while (!feof(fp)) { |
el16ba | 0:9dd5634b94f3 | 82 | int c = fgetc(fp); |
el16ba | 3:16478dd3d1f3 | 83 | pc.printf("%c", c); |
el16ba | 0:9dd5634b94f3 | 84 | } |
el16ba | 0:9dd5634b94f3 | 85 | |
el16ba | 0:9dd5634b94f3 | 86 | fclose(fp); |
el16ba | 4:44760dafcab7 | 87 | pc.printf("\r\n==========\r\n"); |
el16ba | 0:9dd5634b94f3 | 88 | return flg_error; |
el16ba | 0:9dd5634b94f3 | 89 | } |
el16ba | 0:9dd5634b94f3 | 90 | |
el16ba | 0:9dd5634b94f3 | 91 | //Reads reads and converts data from config file |
el16ba | 3:16478dd3d1f3 | 92 | //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 | 93 | void get_config_data() |
el16ba | 0:9dd5634b94f3 | 94 | { |
el16ba | 3:16478dd3d1f3 | 95 | pc.printf("Get Config Data \r\n"); |
el16ba | 2:018630ec52d1 | 96 | char c; //Current character being read |
el16ba | 2:018630ec52d1 | 97 | char strData_index = 0; |
el16ba | 2:018630ec52d1 | 98 | char* pEnd; |
el16ba | 2:018630ec52d1 | 99 | bool isReading = false; |
el16ba | 2:018630ec52d1 | 100 | bool isNumChar; |
el16ba | 2:018630ec52d1 | 101 | string currentStr; |
el16ba | 0:9dd5634b94f3 | 102 | FILE* fp = fopen("/local/config.txt", "r"); |
el16ba | 6:3f5d21480f11 | 103 | |
el16ba | 3:16478dd3d1f3 | 104 | while (!feof(fp)) { //loop till end of file |
el16ba | 3:16478dd3d1f3 | 105 | |
el16ba | 0:9dd5634b94f3 | 106 | c = fgetc(fp); |
el16ba | 3:16478dd3d1f3 | 107 | isNumChar = is_num_char(c); |
el16ba | 3:16478dd3d1f3 | 108 | if(isNumChar) { //at number character? |
el16ba | 2:018630ec52d1 | 109 | currentStr.push_back(c); |
el16ba | 2:018630ec52d1 | 110 | isReading = true; |
el16ba | 3:16478dd3d1f3 | 111 | } else if(!isNumChar and isReading) { //at end of number string? |
el16ba | 2:018630ec52d1 | 112 | isReading = false; |
el16ba | 2:018630ec52d1 | 113 | strData[strData_index] = currentStr; |
el16ba | 2:018630ec52d1 | 114 | configData[strData_index] = strtod(currentStr.c_str(), &pEnd); |
el16ba | 2:018630ec52d1 | 115 | strData_index++; |
el16ba | 2:018630ec52d1 | 116 | currentStr = ""; |
el16ba | 2:018630ec52d1 | 117 | } |
el16ba | 3:16478dd3d1f3 | 118 | if (strData_index >= NUMCONFIGPARAM ) { //Read all nessesary data? |
el16ba | 2:018630ec52d1 | 119 | break; |
el16ba | 2:018630ec52d1 | 120 | } |
el16ba | 3:16478dd3d1f3 | 121 | |
el16ba | 3:16478dd3d1f3 | 122 | } |
el16ba | 3:16478dd3d1f3 | 123 | fclose(fp); |
el16ba | 3:16478dd3d1f3 | 124 | pc.printf("Data: %Lf, %Lf, %Lf\r\n",configData[0],configData[1],configData[2]); |
el16ba | 3:16478dd3d1f3 | 125 | } |
el16ba | 3:16478dd3d1f3 | 126 | |
el16ba | 5:a8297e5f4de1 | 127 | //initialization function |
el16ba | 3:16478dd3d1f3 | 128 | void init() |
el16ba | 3:16478dd3d1f3 | 129 | { |
el16ba | 3:16478dd3d1f3 | 130 | pc.printf("Initializing \r\n"); |
el16ba | 3:16478dd3d1f3 | 131 | do21 = 0; |
el16ba | 3:16478dd3d1f3 | 132 | led1 = 0; |
el16ba | 3:16478dd3d1f3 | 133 | pc.baud(9600); |
el16ba | 3:16478dd3d1f3 | 134 | print_config(); |
el16ba | 3:16478dd3d1f3 | 135 | get_config_data(); |
el16ba | 3:16478dd3d1f3 | 136 | } |
el16ba | 3:16478dd3d1f3 | 137 | |
el16ba | 5:a8297e5f4de1 | 138 | //Sets the pin to control te machines power and its representative LED |
el16ba | 4:44760dafcab7 | 139 | void power(char pwr) |
el16ba | 3:16478dd3d1f3 | 140 | { |
el16ba | 3:16478dd3d1f3 | 141 | do21 = pwr; |
el16ba | 3:16478dd3d1f3 | 142 | led1 = pwr; |
el16ba | 3:16478dd3d1f3 | 143 | } |
el16ba | 3:16478dd3d1f3 | 144 | |
el16ba | 5:a8297e5f4de1 | 145 | //runs a power cycle using sleep commands |
el16ba | 4:44760dafcab7 | 146 | void cycle_wait(long double tOn, long double tOff) |
el16ba | 3:16478dd3d1f3 | 147 | { |
el16ba | 3:16478dd3d1f3 | 148 | power(1); |
el16ba | 3:16478dd3d1f3 | 149 | ThisThread::sleep_for(tOn); |
el16ba | 3:16478dd3d1f3 | 150 | power(0); |
el16ba | 3:16478dd3d1f3 | 151 | ThisThread::sleep_for(tOff); |
el16ba | 3:16478dd3d1f3 | 152 | power(1); |
el16ba | 3:16478dd3d1f3 | 153 | } |
el16ba | 3:16478dd3d1f3 | 154 | |
el16ba | 5:a8297e5f4de1 | 155 | //runs an infinate powercycle loop |
el16ba | 6:3f5d21480f11 | 156 | void cycle_loopw(long double tOn, long double tOff) |
el16ba | 3:16478dd3d1f3 | 157 | { |
el16ba | 3:16478dd3d1f3 | 158 | while(1) { |
el16ba | 3:16478dd3d1f3 | 159 | cycle_wait(tOn,tOff); |
el16ba | 0:9dd5634b94f3 | 160 | } |
el16ba | 0:9dd5634b94f3 | 161 | } |
el16ba | 0:9dd5634b94f3 | 162 | |
el16ba | 6:3f5d21480f11 | 163 | // ouputs a string from the serial input using a |
el16ba | 4:44760dafcab7 | 164 | string read_serial_input() |
el16ba | 4:44760dafcab7 | 165 | { |
el16ba | 4:44760dafcab7 | 166 | bool flg_read = true; |
el16ba | 4:44760dafcab7 | 167 | char c; |
el16ba | 4:44760dafcab7 | 168 | string str = ""; |
el16ba | 4:44760dafcab7 | 169 | |
el16ba | 4:44760dafcab7 | 170 | while(flg_read) { |
el16ba | 4:44760dafcab7 | 171 | c = pc.getc(); |
el16ba | 4:44760dafcab7 | 172 | pc.putc(c); |
el16ba | 4:44760dafcab7 | 173 | if(c == 8 or c == 127) { //If back space or delete remove last character |
el16ba | 4:44760dafcab7 | 174 | str.pop_back(); |
el16ba | 5:a8297e5f4de1 | 175 | } else if (c == '\n') { //If new line character |
el16ba | 5:a8297e5f4de1 | 176 | str.pop_back(); // removes return carriage character |
el16ba | 4:44760dafcab7 | 177 | flg_read = false; |
el16ba | 4:44760dafcab7 | 178 | break; |
el16ba | 5:a8297e5f4de1 | 179 | // } else if(c < ' ') { //If none visible character, bar backspace or delete |
el16ba | 4:44760dafcab7 | 180 | // flg_read = false; |
el16ba | 4:44760dafcab7 | 181 | // break; |
el16ba | 4:44760dafcab7 | 182 | } else { |
el16ba | 4:44760dafcab7 | 183 | str.push_back(c); |
el16ba | 4:44760dafcab7 | 184 | } |
el16ba | 4:44760dafcab7 | 185 | } |
el16ba | 4:44760dafcab7 | 186 | return str; |
el16ba | 4:44760dafcab7 | 187 | } |
el16ba | 4:44760dafcab7 | 188 | |
el16ba | 5:a8297e5f4de1 | 189 | //outputs if a string is comprised entirely of number characters |
el16ba | 4:44760dafcab7 | 190 | bool is_num_str(string str) |
el16ba | 4:44760dafcab7 | 191 | { |
el16ba | 4:44760dafcab7 | 192 | bool isNumC = false; |
el16ba | 4:44760dafcab7 | 193 | bool output = true; |
el16ba | 4:44760dafcab7 | 194 | for(int i = 0; i < str.length(); i++) { |
el16ba | 4:44760dafcab7 | 195 | isNumC = is_num_char(str[i]); |
el16ba | 4:44760dafcab7 | 196 | if(!isNumC) { |
el16ba | 4:44760dafcab7 | 197 | output = false; |
el16ba | 4:44760dafcab7 | 198 | } |
el16ba | 4:44760dafcab7 | 199 | } |
el16ba | 4:44760dafcab7 | 200 | return output; |
el16ba | 4:44760dafcab7 | 201 | } |
el16ba | 4:44760dafcab7 | 202 | |
el16ba | 5:a8297e5f4de1 | 203 | //gets a string of only number characters from the serial input |
el16ba | 4:44760dafcab7 | 204 | long double get_num_input() |
el16ba | 4:44760dafcab7 | 205 | { |
el16ba | 4:44760dafcab7 | 206 | long double output; |
el16ba | 4:44760dafcab7 | 207 | bool flg_gotStr = false; |
el16ba | 4:44760dafcab7 | 208 | string str_v = ""; |
el16ba | 4:44760dafcab7 | 209 | char* pEnd; |
el16ba | 4:44760dafcab7 | 210 | |
el16ba | 4:44760dafcab7 | 211 | while(!flg_gotStr) { |
el16ba | 4:44760dafcab7 | 212 | pc.puts("value: "); |
el16ba | 4:44760dafcab7 | 213 | str_v = read_serial_input(); |
el16ba | 4:44760dafcab7 | 214 | if (is_num_str(str_v)) { |
el16ba | 4:44760dafcab7 | 215 | output = strtod(str_v.c_str(), &pEnd); |
el16ba | 4:44760dafcab7 | 216 | flg_gotStr = true; |
el16ba | 4:44760dafcab7 | 217 | break; |
el16ba | 4:44760dafcab7 | 218 | } else { |
el16ba | 4:44760dafcab7 | 219 | pc.printf("entry contained non number characters please try again: \r\n"); |
el16ba | 4:44760dafcab7 | 220 | } |
el16ba | 4:44760dafcab7 | 221 | |
el16ba | 4:44760dafcab7 | 222 | } |
el16ba | 4:44760dafcab7 | 223 | return output; |
el16ba | 4:44760dafcab7 | 224 | } |
el16ba | 4:44760dafcab7 | 225 | |
el16ba | 7:fb8b01ec74a8 | 226 | //power on call back function, as callbacks donot support functions with parameters |
el16ba | 6:3f5d21480f11 | 227 | void powerOn() |
el16ba | 6:3f5d21480f11 | 228 | { |
el16ba | 6:3f5d21480f11 | 229 | power(1); |
el16ba | 6:3f5d21480f11 | 230 | flg_loop1 = true; |
el16ba | 6:3f5d21480f11 | 231 | } |
el16ba | 7:fb8b01ec74a8 | 232 | |
el16ba | 7:fb8b01ec74a8 | 233 | //power off call back function, as callbacks donot support functions with parameters |
el16ba | 6:3f5d21480f11 | 234 | void powerOff() |
el16ba | 7:fb8b01ec74a8 | 235 | |
el16ba | 6:3f5d21480f11 | 236 | { |
el16ba | 6:3f5d21480f11 | 237 | power(0); |
el16ba | 6:3f5d21480f11 | 238 | flg_loop0 = true; |
el16ba | 6:3f5d21480f11 | 239 | } |
el16ba | 4:44760dafcab7 | 240 | |
el16ba | 6:3f5d21480f11 | 241 | |
el16ba | 6:3f5d21480f11 | 242 | //powercycles the machine utilizing timouts for time keeping |
el16ba | 6:3f5d21480f11 | 243 | void cycle_timeout(long double tOn, long double tOff) |
el16ba | 7:fb8b01ec74a8 | 244 | |
el16ba | 6:3f5d21480f11 | 245 | { |
el16ba | 6:3f5d21480f11 | 246 | long int t1,t2; |
el16ba | 8:8d47dafb7f11 | 247 | toOn.detach(); |
el16ba | 8:8d47dafb7f11 | 248 | toOff.detach(); |
el16ba | 8:8d47dafb7f11 | 249 | t1 = tOn*1000; |
el16ba | 8:8d47dafb7f11 | 250 | t2 = (tOff*1000) + t1; |
el16ba | 6:3f5d21480f11 | 251 | flg_loop0 = false; |
el16ba | 6:3f5d21480f11 | 252 | flg_loop1 = false; |
el16ba | 6:3f5d21480f11 | 253 | power(1); |
el16ba | 6:3f5d21480f11 | 254 | toOn.attach_us(&powerOff,t1); |
el16ba | 6:3f5d21480f11 | 255 | toOff.attach_us(&powerOn,t2); |
el16ba | 6:3f5d21480f11 | 256 | } |
el16ba | 6:3f5d21480f11 | 257 | |
el16ba | 6:3f5d21480f11 | 258 | //powercycles the machine, utilizing timouts for time keeping |
el16ba | 6:3f5d21480f11 | 259 | void cycle_loopto(long double tOn, long double tOff) |
el16ba | 6:3f5d21480f11 | 260 | { |
el16ba | 6:3f5d21480f11 | 261 | bool flg_lend = true; |
el16ba | 6:3f5d21480f11 | 262 | string str = ""; |
el16ba | 8:8d47dafb7f11 | 263 | flg_loop0 = 0; |
el16ba | 8:8d47dafb7f11 | 264 | flg_loop1 = 0; |
el16ba | 9:71eab0a4ceef | 265 | |
el16ba | 8:8d47dafb7f11 | 266 | cycle_timeout(tOn,tOff); |
el16ba | 6:3f5d21480f11 | 267 | while(flg_lend) { |
el16ba | 10:a0212b37673b | 268 | led2 = !led2; //does not run without led2 flashing for unknown reasons |
el16ba | 6:3f5d21480f11 | 269 | if(flg_loop0 and flg_loop1) { |
el16ba | 6:3f5d21480f11 | 270 | cycle_timeout(tOn,tOff); |
el16ba | 6:3f5d21480f11 | 271 | } |
el16ba | 6:3f5d21480f11 | 272 | } |
el16ba | 6:3f5d21480f11 | 273 | } |
el16ba | 6:3f5d21480f11 | 274 | |
el16ba | 6:3f5d21480f11 | 275 | //call back function for cycle_looptick |
el16ba | 7:fb8b01ec74a8 | 276 | void loop_tick () |
el16ba | 7:fb8b01ec74a8 | 277 | { |
el16ba | 6:3f5d21480f11 | 278 | toOn.attach(&powerOn, (configData[2]/1000) ); |
el16ba | 6:3f5d21480f11 | 279 | powerOff(); |
el16ba | 6:3f5d21480f11 | 280 | flg_loop0 = 1; |
el16ba | 6:3f5d21480f11 | 281 | } |
el16ba | 6:3f5d21480f11 | 282 | |
el16ba | 6:3f5d21480f11 | 283 | //Allows the user to set the machine to powercycle and exit the loop via serial commands |
el16ba | 7:fb8b01ec74a8 | 284 | //utilizes a ticker and a timeout for time keeping |
el16ba | 7:fb8b01ec74a8 | 285 | void cycle_looptick(long double tOn, long double tOff) |
el16ba | 7:fb8b01ec74a8 | 286 | { |
el16ba | 6:3f5d21480f11 | 287 | long double t1,t2; |
el16ba | 6:3f5d21480f11 | 288 | bool flg_exit = false; |
el16ba | 6:3f5d21480f11 | 289 | string str; |
el16ba | 6:3f5d21480f11 | 290 | t1 = tOn/1000; |
el16ba | 6:3f5d21480f11 | 291 | t2 = (tOff/1000); |
el16ba | 6:3f5d21480f11 | 292 | power(1); |
el16ba | 6:3f5d21480f11 | 293 | tickOff.attach(&loop_tick, t1+t2); |
el16ba | 6:3f5d21480f11 | 294 | |
el16ba | 7:fb8b01ec74a8 | 295 | while(!flg_exit) { |
el16ba | 7:fb8b01ec74a8 | 296 | flg_loop0 = 0; |
el16ba | 7:fb8b01ec74a8 | 297 | flg_loop1 = 0; |
el16ba | 7:fb8b01ec74a8 | 298 | str = read_serial_input(); |
el16ba | 7:fb8b01ec74a8 | 299 | if (str == "end") { |
el16ba | 7:fb8b01ec74a8 | 300 | tickOff.detach(); |
el16ba | 8:8d47dafb7f11 | 301 | toOn.detach(); |
el16ba | 7:fb8b01ec74a8 | 302 | pc.printf("loop ended\r\n"); |
el16ba | 7:fb8b01ec74a8 | 303 | power(1); |
el16ba | 7:fb8b01ec74a8 | 304 | flg_exit = true; |
el16ba | 7:fb8b01ec74a8 | 305 | break; |
el16ba | 7:fb8b01ec74a8 | 306 | } else { |
el16ba | 7:fb8b01ec74a8 | 307 | pc.printf("Unknown Command, enter \"end\" to end loop\r\n"); |
el16ba | 7:fb8b01ec74a8 | 308 | str = ""; |
el16ba | 7:fb8b01ec74a8 | 309 | } |
el16ba | 6:3f5d21480f11 | 310 | } |
el16ba | 6:3f5d21480f11 | 311 | } |
el16ba | 6:3f5d21480f11 | 312 | |
el16ba | 6:3f5d21480f11 | 313 | |
el16ba | 6:3f5d21480f11 | 314 | |
el16ba | 6:3f5d21480f11 | 315 | // Allows the user to operate the LPC1768 via serial communications |
el16ba | 0:9dd5634b94f3 | 316 | void serial_mode() |
el16ba | 0:9dd5634b94f3 | 317 | { |
el16ba | 3:16478dd3d1f3 | 318 | pc.printf("Serial Mode \r\n"); |
el16ba | 0:9dd5634b94f3 | 319 | bool flg_read = true; |
el16ba | 0:9dd5634b94f3 | 320 | char c; |
el16ba | 4:44760dafcab7 | 321 | string str_c = ""; |
el16ba | 1:8cad7e957324 | 322 | |
el16ba | 3:16478dd3d1f3 | 323 | while(flg_read) { |
el16ba | 4:44760dafcab7 | 324 | str_c = read_serial_input(); |
el16ba | 6:3f5d21480f11 | 325 | if (str_c == "on") { // turns machine on |
el16ba | 4:44760dafcab7 | 326 | power(1); |
el16ba | 5:a8297e5f4de1 | 327 | pc.printf("power on\r\n"); |
el16ba | 6:3f5d21480f11 | 328 | |
el16ba | 6:3f5d21480f11 | 329 | } else if(str_c == "off") { // turns machine off |
el16ba | 4:44760dafcab7 | 330 | power(0); |
el16ba | 5:a8297e5f4de1 | 331 | pc.printf("power off\r\n"); |
el16ba | 6:3f5d21480f11 | 332 | |
el16ba | 5:a8297e5f4de1 | 333 | } else if(str_c == "cyclew") { // runs a powercycle |
el16ba | 4:44760dafcab7 | 334 | cycle_wait(); |
el16ba | 4:44760dafcab7 | 335 | pc.printf("cycled \r\n"); |
el16ba | 6:3f5d21480f11 | 336 | |
el16ba | 6:3f5d21480f11 | 337 | } else if(str_c == "loopw") { // runs a continuous powercycle loop |
el16ba | 8:8d47dafb7f11 | 338 | pc.printf("Looping. Restart unit to end loop \r\n"); |
el16ba | 6:3f5d21480f11 | 339 | cycle_loopw(); |
el16ba | 6:3f5d21480f11 | 340 | |
el16ba | 6:3f5d21480f11 | 341 | } else if (str_c == "cycleto") { |
el16ba | 6:3f5d21480f11 | 342 | cycle_timeout(); |
el16ba | 7:fb8b01ec74a8 | 343 | while(flg_loop0 == 0 or flg_loop1 == 0) { |
el16ba | 6:3f5d21480f11 | 344 | led2 = !led2; |
el16ba | 6:3f5d21480f11 | 345 | ThisThread::sleep_for(100); |
el16ba | 6:3f5d21480f11 | 346 | } |
el16ba | 6:3f5d21480f11 | 347 | printf("cycleto finish\r\n"); |
el16ba | 6:3f5d21480f11 | 348 | |
el16ba | 6:3f5d21480f11 | 349 | } else if (str_c == "loopto") { |
el16ba | 8:8d47dafb7f11 | 350 | pc.printf("starting loopto, Restart unit to end loop \r\n"); |
el16ba | 6:3f5d21480f11 | 351 | cycle_loopto(); |
el16ba | 6:3f5d21480f11 | 352 | |
el16ba | 6:3f5d21480f11 | 353 | } else if (str_c == "looptick") { |
el16ba | 6:3f5d21480f11 | 354 | pc.printf("starting looptick \r\n"); |
el16ba | 6:3f5d21480f11 | 355 | cycle_looptick(); |
el16ba | 7:fb8b01ec74a8 | 356 | |
el16ba | 5:a8297e5f4de1 | 357 | } else if(str_c == "newval") { // cahnges cycle time values |
el16ba | 4:44760dafcab7 | 358 | pc.printf("enter your new on and off times(ms)\r\n"); |
el16ba | 4:44760dafcab7 | 359 | pc.puts("Time on\r\n"); |
el16ba | 4:44760dafcab7 | 360 | configData[0] = get_num_input(); |
el16ba | 6:3f5d21480f11 | 361 | pc.puts("Time off\r\n"); |
el16ba | 4:44760dafcab7 | 362 | configData[2] = get_num_input(); |
el16ba | 4:44760dafcab7 | 363 | pc.printf("Data: %Lf, %Lf, %Lf\r\n",configData[0],configData[1],configData[2]); |
el16ba | 7:fb8b01ec74a8 | 364 | |
el16ba | 0:9dd5634b94f3 | 365 | } else { |
el16ba | 6:3f5d21480f11 | 366 | pc.printf("Unknown command: [%s], see README for commands \r\n", str_c.c_str()); |
el16ba | 0:9dd5634b94f3 | 367 | } |
el16ba | 4:44760dafcab7 | 368 | str_c = ""; |
el16ba | 0:9dd5634b94f3 | 369 | } |
el16ba | 3:16478dd3d1f3 | 370 | |
el16ba | 0:9dd5634b94f3 | 371 | } |
el16ba | 0:9dd5634b94f3 | 372 | |
el16ba | 0:9dd5634b94f3 | 373 | int main() |
el16ba | 0:9dd5634b94f3 | 374 | { |
el16ba | 0:9dd5634b94f3 | 375 | init(); |
el16ba | 4:44760dafcab7 | 376 | |
el16ba | 1:8cad7e957324 | 377 | while(!flg_END) { |
el16ba | 3:16478dd3d1f3 | 378 | switch((int)configData[1]) { |
el16ba | 3:16478dd3d1f3 | 379 | case(1): //Cut the power to the machine once |
el16ba | 3:16478dd3d1f3 | 380 | cycle_wait(); |
el16ba | 3:16478dd3d1f3 | 381 | pc.printf("cycled \r\n"); |
el16ba | 3:16478dd3d1f3 | 382 | break; |
el16ba | 1:8cad7e957324 | 383 | |
el16ba | 3:16478dd3d1f3 | 384 | case(2): //Cut the power to the machine in a loop |
el16ba | 8:8d47dafb7f11 | 385 | pc.printf("Beginning power cycle loop, to end loop press restart button \r\n"); |
el16ba | 6:3f5d21480f11 | 386 | cycle_loopw(); |
el16ba | 3:16478dd3d1f3 | 387 | break; |
el16ba | 3:16478dd3d1f3 | 388 | |
el16ba | 3:16478dd3d1f3 | 389 | case(3): //Launch in serial command mode |
el16ba | 3:16478dd3d1f3 | 390 | serial_mode(); |
el16ba | 3:16478dd3d1f3 | 391 | break; |
el16ba | 1:8cad7e957324 | 392 | } |
el16ba | 3:16478dd3d1f3 | 393 | |
el16ba | 0:9dd5634b94f3 | 394 | } |
el16ba | 0:9dd5634b94f3 | 395 | |
el16ba | 3:16478dd3d1f3 | 396 | pc.printf("Program End \r\n"); |
el16ba | 3:16478dd3d1f3 | 397 | |
el16ba | 0:9dd5634b94f3 | 398 | return 0; |
el16ba | 3:16478dd3d1f3 | 399 | } |