Code for Browonout Generator box

Committer:
el16ba
Date:
Thu Feb 13 18:08:20 2020 +0000
Revision:
3:16478dd3d1f3
Parent:
2:018630ec52d1
Child:
4:44760dafcab7
Second version of Brown out generator code.

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 0:9dd5634b94f3 8
el16ba 3:16478dd3d1f3 9 DigitalOut led1(LED1, 0);
el16ba 3:16478dd3d1f3 10 DigitalOut led2(LED2, 0);
el16ba 3:16478dd3d1f3 11 DigitalOut led3(LED3, 0);
el16ba 3:16478dd3d1f3 12 DigitalOut led4(LED4, 0);
el16ba 3:16478dd3d1f3 13 DigitalOut do21(p21, 0);
el16ba 2:018630ec52d1 14 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 15 Ticker tickOn;
el16ba 2:018630ec52d1 16 Ticker tickOff;
el16ba 0:9dd5634b94f3 17
el16ba 0:9dd5634b94f3 18 Serial pc(USBTX, USBRX); // for PC debug
el16ba 0:9dd5634b94f3 19 LocalFileSystem fs("local");
el16ba 0:9dd5634b94f3 20
el16ba 2:018630ec52d1 21 #define NUMCONFIGPARAM 3
el16ba 0:9dd5634b94f3 22
el16ba 2:018630ec52d1 23 bool flg_start = 0;
el16ba 2:018630ec52d1 24 bool flg_END = false;
el16ba 2:018630ec52d1 25 long double configData[NUMCONFIGPARAM];
el16ba 2:018630ec52d1 26 string strData[NUMCONFIGPARAM];
el16ba 0:9dd5634b94f3 27
el16ba 3:16478dd3d1f3 28 //function prototypes
el16ba 3:16478dd3d1f3 29 void init();
el16ba 3:16478dd3d1f3 30 bool is_num_char(char c);
el16ba 3:16478dd3d1f3 31 bool print_config();
el16ba 3:16478dd3d1f3 32 void get_config_data();
el16ba 3:16478dd3d1f3 33
el16ba 3:16478dd3d1f3 34
el16ba 3:16478dd3d1f3 35
el16ba 3:16478dd3d1f3 36
el16ba 0:9dd5634b94f3 37 //returns if the given character is a number or decimal point character
el16ba 3:16478dd3d1f3 38 bool is_num_char(char c)
el16ba 0:9dd5634b94f3 39 {
el16ba 0:9dd5634b94f3 40 bool isChar = false;
el16ba 0:9dd5634b94f3 41 if((c >= '0' and c <= '9') or c == '.') {
el16ba 0:9dd5634b94f3 42 isChar = true;
el16ba 0:9dd5634b94f3 43 }
el16ba 0:9dd5634b94f3 44 return isChar;
el16ba 0:9dd5634b94f3 45 }
el16ba 0:9dd5634b94f3 46
el16ba 0:9dd5634b94f3 47 //From: https://os.mbed.com/questions/83075/Is-it-possible-to-read-a-small-text-file/
el16ba 0:9dd5634b94f3 48 //Reads config.txt from local drive
el16ba 3:16478dd3d1f3 49 bool print_config()
el16ba 0:9dd5634b94f3 50 {
el16ba 0:9dd5634b94f3 51 bool flg_error;
el16ba 3:16478dd3d1f3 52 pc.printf("Opening file 'config.txt'... ");
el16ba 0:9dd5634b94f3 53 FILE* fp = fopen("/local/config.txt", "r");
el16ba 3:16478dd3d1f3 54 pc.printf("%s\n\r", (!fp ? "Fail :(" : "OK"));
el16ba 0:9dd5634b94f3 55 if (!fp) {
el16ba 0:9dd5634b94f3 56 error("error: %s (%d)\n", strerror(errno), -errno);
el16ba 0:9dd5634b94f3 57 flg_error = 1;
el16ba 0:9dd5634b94f3 58 }
el16ba 0:9dd5634b94f3 59 while (!feof(fp)) {
el16ba 0:9dd5634b94f3 60 int c = fgetc(fp);
el16ba 3:16478dd3d1f3 61 pc.printf("%c", c);
el16ba 0:9dd5634b94f3 62 }
el16ba 0:9dd5634b94f3 63
el16ba 0:9dd5634b94f3 64 fclose(fp);
el16ba 3:16478dd3d1f3 65 pc.printf("\r\n===========\r\n");
el16ba 0:9dd5634b94f3 66 return flg_error;
el16ba 0:9dd5634b94f3 67 }
el16ba 0:9dd5634b94f3 68
el16ba 0:9dd5634b94f3 69 //Reads reads and converts data from config file
el16ba 3:16478dd3d1f3 70 //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 71 void get_config_data()
el16ba 0:9dd5634b94f3 72 {
el16ba 3:16478dd3d1f3 73 pc.printf("Get Config Data \r\n");
el16ba 2:018630ec52d1 74 char c; //Current character being read
el16ba 2:018630ec52d1 75 char strData_index = 0;
el16ba 2:018630ec52d1 76 char* pEnd;
el16ba 2:018630ec52d1 77 bool isReading = false;
el16ba 2:018630ec52d1 78 bool isNumChar;
el16ba 2:018630ec52d1 79 string currentStr;
el16ba 3:16478dd3d1f3 80
el16ba 0:9dd5634b94f3 81 FILE* fp = fopen("/local/config.txt", "r");
el16ba 0:9dd5634b94f3 82
el16ba 3:16478dd3d1f3 83 while (!feof(fp)) { //loop till end of file
el16ba 3:16478dd3d1f3 84
el16ba 0:9dd5634b94f3 85 c = fgetc(fp);
el16ba 3:16478dd3d1f3 86 isNumChar = is_num_char(c);
el16ba 3:16478dd3d1f3 87 if(isNumChar) { //at number character?
el16ba 2:018630ec52d1 88 currentStr.push_back(c);
el16ba 2:018630ec52d1 89 isReading = true;
el16ba 3:16478dd3d1f3 90 } else if(!isNumChar and isReading) { //at end of number string?
el16ba 2:018630ec52d1 91 isReading = false;
el16ba 2:018630ec52d1 92 strData[strData_index] = currentStr;
el16ba 2:018630ec52d1 93 configData[strData_index] = strtod(currentStr.c_str(), &pEnd);
el16ba 2:018630ec52d1 94 strData_index++;
el16ba 2:018630ec52d1 95 currentStr = "";
el16ba 2:018630ec52d1 96 }
el16ba 3:16478dd3d1f3 97 if (strData_index >= NUMCONFIGPARAM ) { //Read all nessesary data?
el16ba 2:018630ec52d1 98 break;
el16ba 2:018630ec52d1 99 }
el16ba 3:16478dd3d1f3 100
el16ba 3:16478dd3d1f3 101 }
el16ba 3:16478dd3d1f3 102 fclose(fp);
el16ba 3:16478dd3d1f3 103 ThisThread::sleep_for(5000);
el16ba 3:16478dd3d1f3 104 pc.printf("Data: %Lf, %Lf, %Lf\r\n",configData[0],configData[1],configData[2]);
el16ba 3:16478dd3d1f3 105 }
el16ba 3:16478dd3d1f3 106
el16ba 3:16478dd3d1f3 107 void init()
el16ba 3:16478dd3d1f3 108 {
el16ba 3:16478dd3d1f3 109 pc.printf("Initializing \r\n");
el16ba 3:16478dd3d1f3 110 do21 = 0;
el16ba 3:16478dd3d1f3 111 led1 = 0;
el16ba 3:16478dd3d1f3 112 pc.baud(9600);
el16ba 3:16478dd3d1f3 113 print_config();
el16ba 3:16478dd3d1f3 114 get_config_data();
el16ba 3:16478dd3d1f3 115 }
el16ba 3:16478dd3d1f3 116
el16ba 3:16478dd3d1f3 117 void power(char pwr = 0)
el16ba 3:16478dd3d1f3 118 {
el16ba 3:16478dd3d1f3 119 do21 = pwr;
el16ba 3:16478dd3d1f3 120 led1 = pwr;
el16ba 3:16478dd3d1f3 121 }
el16ba 3:16478dd3d1f3 122
el16ba 3:16478dd3d1f3 123 void cycle_wait(long double tOn = configData[0], long double tOff = configData[2])
el16ba 3:16478dd3d1f3 124 {
el16ba 3:16478dd3d1f3 125 power(1);
el16ba 3:16478dd3d1f3 126 ThisThread::sleep_for(tOn);
el16ba 3:16478dd3d1f3 127 power(0);
el16ba 3:16478dd3d1f3 128 ThisThread::sleep_for(tOff);
el16ba 3:16478dd3d1f3 129 power(1);
el16ba 3:16478dd3d1f3 130 }
el16ba 3:16478dd3d1f3 131
el16ba 3:16478dd3d1f3 132 void cycle_loop(long double tOn = configData[0], long double tOff = configData[2])
el16ba 3:16478dd3d1f3 133 {
el16ba 3:16478dd3d1f3 134 while(1) {
el16ba 3:16478dd3d1f3 135 cycle_wait(tOn,tOff);
el16ba 0:9dd5634b94f3 136 }
el16ba 0:9dd5634b94f3 137 }
el16ba 0:9dd5634b94f3 138
el16ba 0:9dd5634b94f3 139 void serial_mode()
el16ba 0:9dd5634b94f3 140 {
el16ba 3:16478dd3d1f3 141 pc.printf("Serial Mode \r\n");
el16ba 3:16478dd3d1f3 142
el16ba 0:9dd5634b94f3 143 bool flg_read = true;
el16ba 0:9dd5634b94f3 144 char c;
el16ba 3:16478dd3d1f3 145 string str = "";
el16ba 1:8cad7e957324 146
el16ba 3:16478dd3d1f3 147 while(flg_read) {
el16ba 3:16478dd3d1f3 148 if (c == '\n') {
el16ba 3:16478dd3d1f3 149 if(str == "cyclew\r"){
el16ba 3:16478dd3d1f3 150 cycle_wait();
el16ba 3:16478dd3d1f3 151 }else if(str == "loop\r") {
el16ba 1:8cad7e957324 152 cycle_loop();
el16ba 3:16478dd3d1f3 153 }else{
el16ba 3:16478dd3d1f3 154 pc.printf("Unknown command, see README for commands \r\n");
el16ba 0:9dd5634b94f3 155 }
el16ba 1:8cad7e957324 156 str = "";
el16ba 0:9dd5634b94f3 157 } else {
el16ba 0:9dd5634b94f3 158 str.push_back(c);
el16ba 0:9dd5634b94f3 159 }
el16ba 0:9dd5634b94f3 160 }
el16ba 3:16478dd3d1f3 161
el16ba 0:9dd5634b94f3 162 }
el16ba 0:9dd5634b94f3 163
el16ba 0:9dd5634b94f3 164 int main()
el16ba 0:9dd5634b94f3 165 {
el16ba 0:9dd5634b94f3 166 init();
el16ba 1:8cad7e957324 167 while(!flg_END) {
el16ba 3:16478dd3d1f3 168 switch((int)configData[1]) {
el16ba 3:16478dd3d1f3 169 case(1): //Cut the power to the machine once
el16ba 3:16478dd3d1f3 170 cycle_wait();
el16ba 3:16478dd3d1f3 171 pc.printf("cycled \r\n");
el16ba 3:16478dd3d1f3 172 break;
el16ba 1:8cad7e957324 173
el16ba 3:16478dd3d1f3 174 case(2): //Cut the power to the machine in a loop
el16ba 3:16478dd3d1f3 175 pc.printf("Begining Power cycle loop, to end loop press restart button \r\n");
el16ba 3:16478dd3d1f3 176 cycle_loop();
el16ba 3:16478dd3d1f3 177 break;
el16ba 3:16478dd3d1f3 178
el16ba 3:16478dd3d1f3 179 case(3): //Launch in serial command mode
el16ba 3:16478dd3d1f3 180 serial_mode();
el16ba 3:16478dd3d1f3 181 break;
el16ba 1:8cad7e957324 182 }
el16ba 3:16478dd3d1f3 183
el16ba 0:9dd5634b94f3 184 }
el16ba 0:9dd5634b94f3 185
el16ba 3:16478dd3d1f3 186 pc.printf("Program End \r\n");
el16ba 3:16478dd3d1f3 187
el16ba 3:16478dd3d1f3 188
el16ba 3:16478dd3d1f3 189
el16ba 0:9dd5634b94f3 190 return 0;
el16ba 3:16478dd3d1f3 191 }