
Code for Browonout Generator box
main.cpp@3:16478dd3d1f3, 2020-02-13 (annotated)
- 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?
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 | 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 | } |