Code for Browonout Generator box

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?

UserRevisionLine numberNew 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 }