
Code for Browonout Generator box
main.cpp
- Committer:
- el16ba
- Date:
- 2020-02-07
- Revision:
- 1:8cad7e957324
- Parent:
- 0:9dd5634b94f3
- Child:
- 2:018630ec52d1
File content as of revision 1:8cad7e957324:
/* #include "mbed.h" #include <string> #include <stdio.h> #include <stdlib.h> DigitalOut led1(LED1, 0); DigitalOut led2(LED2, 0); DigitalOut led3(LED3, 0); DigitalOut led4(LED4, 0); DigitalOut do21(p21, 0); Serial pc(USBTX, USBRX); // for PC debug LocalFileSystem fs("local"); long double configData[3]; string strData[3]; //returns if the given character is a number or decimal point character bool Is_Num_Char(char c) { bool isChar = false; if((c >= '0' and c <= '9') or c == '.') { isChar = true; } return isChar; } //From: https://os.mbed.com/questions/83075/Is-it-possible-to-read-a-small-text-file/ //Reads config.txt from local drive bool Print_Config() { bool flg_error; printf("Opening file 'config.txt'... "); FILE* fp = fopen("/local/config.txt", "r"); printf("%s\n\r", (!fp ? "Fail :(" : "OK")); if (!fp) { error("error: %s (%d)\n", strerror(errno), -errno); flg_error = 1; } while (!feof(fp)) { int c = fgetc(fp); printf("%c", c); } fclose(fp); printf("\r\n===========\r\n"); return flg_error; } //Reads reads and converts data from config file void Get_Config_data() { printf("Get Config data\r\n"); FILE* fp = fopen("/local/config.txt", "r"); int c; char stateData = 0; //which data it is reading on duration, off duration e.t.c. char stateRead = 0; //0 = parsing, 1 = reading data char* pEnd; string data; while (!feof(fp)) { c = fgetc(fp); if (Is_Num_Char(c)) { data.push_back(c); stateRead = 1; c = NULL; } else if (stateRead == 1) { //convert to double and add to Data strData[stateData] = data; configData[stateData] = strtod(data.c_str(), &pEnd); data.clear(); stateData++; stateRead = 0; } } fclose(fp); //configData[0] = configData[0] /10; //wait functions //configData[2] = configData[2] /10; } //init function void init() { Print_Config(); //Get_Config_data(); } int main() { printf("STARTING\r\n"); init(); //printf("Strings: On: %s, repeat: %s, Off: %s \r\n", strData[0].c_str(),strData[1].c_str(), strData[2].c_str() ); //printf("Data: %Lf, %Lf, %Lf\r\n",configData[0]*10,configData[1],configData[2]*10); //multiplying back to real values printf("END \r\n"); return 0; } */ #include "mbed.h" #include <string> #include <stdio.h> #include <stdlib.h> DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); DigitalOut do21(p21); 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. Serial pc(USBTX, USBRX); // for PC debug LocalFileSystem fs("local"); bool flg_start = 0; bool flg_END = false; long double configData[3]; string strData[3]; //returns if the given character is a number or decimal point character bool Is_Num_Char(char c) { bool isChar = false; if((c >= '0' and c <= '9') or c == '.') { isChar = true; } return isChar; } //From: https://os.mbed.com/questions/83075/Is-it-possible-to-read-a-small-text-file/ //Reads config.txt from local drive bool Print_Config() { bool flg_error; printf("Opening file 'config.txt'... "); FILE* fp = fopen("/local/config.txt", "r"); printf("%s\n\r", (!fp ? "Fail :(" : "OK")); if (!fp) { error("error: %s (%d)\n", strerror(errno), -errno); flg_error = 1; } while (!feof(fp)) { int c = fgetc(fp); printf("%c", c); } fclose(fp); printf("\r\n===========\r\n"); return flg_error; } //Reads reads and converts data from config file void Get_Config_data() { printf("Get Config data\r\n"); FILE* fp = fopen("/local/config.txt", "r"); int c; char stateData = 0; //which data it is reading on duration, off duration e.t.c. char stateRead = 0; //0 = parsing, 1 = reading data char* pEnd; string data; while (!feof(fp)) { c = fgetc(fp); if (Is_Num_Char(c)) { data.push_back(c); stateRead = 1; c = NULL; } else if (stateRead == 1) { //convert to double and add to Data strData[stateData] = data; configData[stateData] = strtod(data.c_str(), &pEnd); data.clear(); stateData++; stateRead = 0; } } fclose(fp); } // Runs wait functions and divides by 10 to account for error in function // unused as calling function causes too much of a delay when below miliseconds void wait_fixed(float t) { thread_sleep_for(t / 10); } //Flips output void run_Cycle() { //printf("On \r\n"); do21 = 1; led1 = 1; thread_sleep_for(configData[0]); //printf("Off \r\n"); do21 = 0; led1 = 0; } //interrupt function to start cycling void start() { flg_start = 1; } //init function void init() { do21 = 0; di22.rise(&start); Print_Config(); Get_Config_data(); } void cycle_loop() { while(1) { run_Cycle(); thread_sleep_for(configData[2]); } } void serial_mode() { bool flg_read = true; string str; char c; pc.baud(9600); pc.printf("Serial Mode\n\r"); while(flg_read) { c = pc.getc(); pc.putc(c); if (c == '\n') { if (str == "on\r") { do21 = 1; led1 = 1; pc.printf("power on\r\n"); } else if (str == "off\r") { do21 = 0; led1 = 0; pc.printf("power off\r\n"); } else if (str == "cycle\r") { run_Cycle(); pc.printf("cycled\r\n"); } else if(str == "cycle2\r") { pc.printf("clycle loop, power cycle box to stop\r\n"); cycle_loop(); } else if( str == "exit\r") { flg_read = false; } else { pc.printf("unknown command, see README for command list\r\n"); } str = ""; } else { str.push_back(c); } } pc.printf("exit serial mode \r\n"); } int main() { int Mode; printf("STARTING\r\n"); init(); printf("Strings: On: %s, repeat: %s, Off: %s \r\n", strData[0].c_str(),strData[1].c_str(), strData[2].c_str() ); printf("Data: %Lf, %Lf, %Lf\r\n",configData[0],configData[1],configData[2]); while(!flg_END) { Mode = (int)configData[1]; if(Mode == 0) { run_Cycle(); } else if(Mode == 1) { cycle_loop(); } else if(Mode == 2) { serial_mode(); Get_Config_data(); printf("Data: %Lf, %Lf, %Lf\r\n",configData[0],configData[1],configData[2]); } else { printf("Invalid Mode"); } } printf("END \r\n"); return 0; }