Barnaby Ayriss
/
LPC_Buhler_BrownoutGen_copy
preliminary brownout generator code
main.cpp@100:dd9492604669, 2020-02-04 (annotated)
- Committer:
- el16ba
- Date:
- Tue Feb 04 17:37:01 2020 +0000
- Revision:
- 100:dd9492604669
- Parent:
- 99:69dcd2885fbc
functioning first draft
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mbed_official | 82:abf1b1785bd7 | 1 | |
Jonathan Austin |
0:2757d7abb7d9 | 2 | #include "mbed.h" |
el16ba | 99:69dcd2885fbc | 3 | #include <string> |
el16ba | 99:69dcd2885fbc | 4 | #include <stdio.h> |
el16ba | 99:69dcd2885fbc | 5 | #include <stdlib.h> |
Jonathan Austin |
0:2757d7abb7d9 | 6 | |
Jonathan Austin |
0:2757d7abb7d9 | 7 | DigitalOut led1(LED1); |
el16ba | 99:69dcd2885fbc | 8 | DigitalOut led2(LED2); |
el16ba | 99:69dcd2885fbc | 9 | DigitalOut led3(LED3); |
el16ba | 99:69dcd2885fbc | 10 | DigitalOut led4(LED4); |
el16ba | 99:69dcd2885fbc | 11 | DigitalOut do21(p21); |
el16ba | 99:69dcd2885fbc | 12 | InterruptIn di22(p22,PullDown); |
Jonathan Austin |
0:2757d7abb7d9 | 13 | |
el16ba | 99:69dcd2885fbc | 14 | |
el16ba | 99:69dcd2885fbc | 15 | Serial pc(USBTX, USBRX); // for PC debug |
el16ba | 99:69dcd2885fbc | 16 | LocalFileSystem fs("local"); |
el16ba | 99:69dcd2885fbc | 17 | |
el16ba | 99:69dcd2885fbc | 18 | bool flg_start = 0; |
el16ba | 99:69dcd2885fbc | 19 | long double configData[3]; |
el16ba | 99:69dcd2885fbc | 20 | string strData[3]; |
el16ba | 99:69dcd2885fbc | 21 | |
el16ba | 99:69dcd2885fbc | 22 | //returns if the given character is a number or decimal point character |
el16ba | 99:69dcd2885fbc | 23 | bool Is_Num_Char(char c) |
el16ba | 99:69dcd2885fbc | 24 | { |
el16ba | 99:69dcd2885fbc | 25 | bool isChar = false; |
el16ba | 99:69dcd2885fbc | 26 | if((c >= '0' and c <= '9') or c == '.') { |
el16ba | 99:69dcd2885fbc | 27 | isChar = true; |
el16ba | 99:69dcd2885fbc | 28 | } |
el16ba | 99:69dcd2885fbc | 29 | return isChar; |
el16ba | 99:69dcd2885fbc | 30 | } |
el16ba | 99:69dcd2885fbc | 31 | |
el16ba | 99:69dcd2885fbc | 32 | //From: https://os.mbed.com/questions/83075/Is-it-possible-to-read-a-small-text-file/ |
el16ba | 99:69dcd2885fbc | 33 | //Reads config.txt from local drive |
el16ba | 99:69dcd2885fbc | 34 | bool Print_Config() |
el16ba | 99:69dcd2885fbc | 35 | { |
el16ba | 99:69dcd2885fbc | 36 | bool flg_error; |
el16ba | 99:69dcd2885fbc | 37 | printf("Opening file 'config.txt'... "); |
el16ba | 99:69dcd2885fbc | 38 | FILE* fp = fopen("/local/config.txt", "r"); |
el16ba | 99:69dcd2885fbc | 39 | printf("%s\n\r", (!fp ? "Fail :(" : "OK")); |
el16ba | 99:69dcd2885fbc | 40 | if (!fp) { |
el16ba | 99:69dcd2885fbc | 41 | error("error: %s (%d)\n", strerror(errno), -errno); |
el16ba | 99:69dcd2885fbc | 42 | flg_error = 1; |
el16ba | 99:69dcd2885fbc | 43 | } |
el16ba | 99:69dcd2885fbc | 44 | while (!feof(fp)) { |
el16ba | 99:69dcd2885fbc | 45 | int c = fgetc(fp); |
el16ba | 99:69dcd2885fbc | 46 | printf("%c", c); |
el16ba | 99:69dcd2885fbc | 47 | } |
el16ba | 99:69dcd2885fbc | 48 | |
el16ba | 99:69dcd2885fbc | 49 | fclose(fp); |
el16ba | 99:69dcd2885fbc | 50 | printf("\r\n===========\r\n"); |
el16ba | 99:69dcd2885fbc | 51 | return flg_error; |
el16ba | 99:69dcd2885fbc | 52 | } |
mbed_official | 88:bea4f2daa48c | 53 | |
el16ba | 99:69dcd2885fbc | 54 | //Reads reads and converts data from config file |
el16ba | 99:69dcd2885fbc | 55 | void Get_Config_data() |
el16ba | 99:69dcd2885fbc | 56 | { |
el16ba | 99:69dcd2885fbc | 57 | printf("Get Config data\r\n"); |
el16ba | 99:69dcd2885fbc | 58 | FILE* fp = fopen("/local/config.txt", "r"); |
el16ba | 99:69dcd2885fbc | 59 | int c; |
el16ba | 100:dd9492604669 | 60 | char stateData = 0; //which data it is reading on duration, off duration e.t.c. |
el16ba | 99:69dcd2885fbc | 61 | char stateRead = 0; //0 = parsing, 1 = reading data |
el16ba | 99:69dcd2885fbc | 62 | char* pEnd; |
el16ba | 99:69dcd2885fbc | 63 | string data; |
el16ba | 99:69dcd2885fbc | 64 | |
el16ba | 99:69dcd2885fbc | 65 | while (!feof(fp)) { |
el16ba | 99:69dcd2885fbc | 66 | c = fgetc(fp); |
el16ba | 99:69dcd2885fbc | 67 | if (Is_Num_Char(c)) { |
el16ba | 99:69dcd2885fbc | 68 | data.push_back(c); |
el16ba | 99:69dcd2885fbc | 69 | stateRead = 1; |
el16ba | 99:69dcd2885fbc | 70 | c = NULL; |
el16ba | 99:69dcd2885fbc | 71 | } else if (stateRead == 1) { |
el16ba | 99:69dcd2885fbc | 72 | //convert to double and add to Data |
el16ba | 99:69dcd2885fbc | 73 | strData[stateData] = data; |
el16ba | 99:69dcd2885fbc | 74 | configData[stateData] = strtod(data.c_str(), &pEnd); |
el16ba | 99:69dcd2885fbc | 75 | data.clear(); |
el16ba | 99:69dcd2885fbc | 76 | stateData++; |
el16ba | 99:69dcd2885fbc | 77 | stateRead = 0; |
el16ba | 99:69dcd2885fbc | 78 | } |
el16ba | 99:69dcd2885fbc | 79 | } |
el16ba | 99:69dcd2885fbc | 80 | |
el16ba | 99:69dcd2885fbc | 81 | fclose(fp); |
el16ba | 100:dd9492604669 | 82 | |
el16ba | 100:dd9492604669 | 83 | configData[0] = configData[0] /10; //wait functions |
el16ba | 100:dd9492604669 | 84 | configData[2] = configData[2] /10; |
el16ba | 100:dd9492604669 | 85 | |
el16ba | 99:69dcd2885fbc | 86 | } |
el16ba | 99:69dcd2885fbc | 87 | |
el16ba | 100:dd9492604669 | 88 | // Runs wait functions and divides by 10 to account for error in function |
el16ba | 100:dd9492604669 | 89 | // unused as calling function causes too much of a delay when below miliseconds |
el16ba | 100:dd9492604669 | 90 | void wait_fixed(float t){ |
el16ba | 100:dd9492604669 | 91 | wait(t / 10); |
el16ba | 100:dd9492604669 | 92 | } |
el16ba | 100:dd9492604669 | 93 | |
el16ba | 100:dd9492604669 | 94 | |
el16ba | 99:69dcd2885fbc | 95 | //Flips output |
el16ba | 99:69dcd2885fbc | 96 | void run_Cycle() |
el16ba | 99:69dcd2885fbc | 97 | { |
el16ba | 100:dd9492604669 | 98 | //printf("On \r\n"); |
el16ba | 99:69dcd2885fbc | 99 | do21 = 1; |
el16ba | 99:69dcd2885fbc | 100 | led1 = 1; |
el16ba | 100:dd9492604669 | 101 | wait(configData[0]); |
el16ba | 100:dd9492604669 | 102 | |
el16ba | 100:dd9492604669 | 103 | //printf("Off \r\n"); |
el16ba | 99:69dcd2885fbc | 104 | do21 = 0; |
el16ba | 99:69dcd2885fbc | 105 | led1 = 0; |
el16ba | 99:69dcd2885fbc | 106 | } |
el16ba | 99:69dcd2885fbc | 107 | |
el16ba | 99:69dcd2885fbc | 108 | //interrupt function to start cycling |
el16ba | 99:69dcd2885fbc | 109 | void start() |
el16ba | 99:69dcd2885fbc | 110 | { |
el16ba | 99:69dcd2885fbc | 111 | flg_start = 1; |
el16ba | 99:69dcd2885fbc | 112 | } |
el16ba | 99:69dcd2885fbc | 113 | |
el16ba | 99:69dcd2885fbc | 114 | //init function |
el16ba | 99:69dcd2885fbc | 115 | void init() |
el16ba | 99:69dcd2885fbc | 116 | { |
el16ba | 99:69dcd2885fbc | 117 | do21 = 0; |
el16ba | 99:69dcd2885fbc | 118 | di22.rise(&start); |
el16ba | 99:69dcd2885fbc | 119 | Print_Config(); |
el16ba | 99:69dcd2885fbc | 120 | Get_Config_data(); |
el16ba | 99:69dcd2885fbc | 121 | } |
el16ba | 99:69dcd2885fbc | 122 | |
mbed_official | 82:abf1b1785bd7 | 123 | int main() |
mbed_official | 82:abf1b1785bd7 | 124 | { |
el16ba | 99:69dcd2885fbc | 125 | printf("STARTING\r\n"); |
el16ba | 99:69dcd2885fbc | 126 | init(); |
el16ba | 100:dd9492604669 | 127 | printf("Strings: On: %s, repeat: %s, Off: %s \r\n", strData[0].c_str(),strData[1].c_str(), strData[2].c_str() ); |
el16ba | 100:dd9492604669 | 128 | printf("Data: %Lf, %Lf, %Lf\r\n",configData[0]*10,configData[1],configData[2]*10); //multiplying back to real values |
mbed_official | 82:abf1b1785bd7 | 129 | |
mbed_official | 82:abf1b1785bd7 | 130 | |
el16ba | 99:69dcd2885fbc | 131 | while((int)configData[1] != 0) { |
el16ba | 99:69dcd2885fbc | 132 | run_Cycle(); |
el16ba | 100:dd9492604669 | 133 | wait(configData[2]); |
Jonathan Austin |
0:2757d7abb7d9 | 134 | } |
el16ba | 99:69dcd2885fbc | 135 | run_Cycle(); |
el16ba | 100:dd9492604669 | 136 | |
el16ba | 99:69dcd2885fbc | 137 | printf("END \r\n"); |
el16ba | 99:69dcd2885fbc | 138 | return 0; |
el16ba | 99:69dcd2885fbc | 139 | } |