Code for Browonout Generator box

main.cpp

Committer:
el16ba
Date:
2020-02-11
Revision:
2:018630ec52d1
Parent:
1:8cad7e957324
Child:
3:16478dd3d1f3

File content as of revision 2:018630ec52d1:


#include "mbed.h"
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <FileHandle.h>
#include <vector>

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.
Ticker tickOn;
Ticker tickOff;

Serial pc(USBTX, USBRX);  // for PC debug
LocalFileSystem fs("local");

#define NUMCONFIGPARAM  3

bool flg_start = 0;
bool flg_END = false;
long double configData[NUMCONFIGPARAM];
string strData[NUMCONFIGPARAM];

//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");
//    char 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;
//    printf("test");
//    while (!feof(fp)) {
//        c = fgetc(fp);
//        if (Is_Num_Char(c)) {
//            printf("Read in %d\r\n",c);
//            data.push_back(c);
//            stateRead = 1;
//            c = NULL;
//        } else if (stateRead == 1) {
//            //convert to double and add to Data
//            printf("stateData = %d\r\n",stateData);
//            strData[stateData] = data;
//            configData[stateData] = strtod(data.c_str(), &pEnd);
//            data.clear();
//            stateData++;
//            stateRead = 0;
//        }
//    }
//
//    fclose(fp);


    printf("Get Config Data \r\n");
    char c; //Current character being read
    char strData_index = 0;
    char* pEnd;
    bool isReading = false;
    bool isNumChar;
    string currentStr;
    FILE*   fp = fopen("/local/config.txt", "r");

    while (!feof(fp)) {
        c = fgetc(fp);
        isNumChar = Is_Num_Char(c);
        if(isNumChar) {
            currentStr.push_back(c);
            isReading = true;
//            printf("num: %c\r\n", c);
        } else if(!isNumChar and isReading) {
            isReading = false;
            strData[strData_index] = currentStr;
            configData[strData_index] = strtod(currentStr.c_str(), &pEnd);
            
//            printf("string added: %s, %i\r\n", currentStr.c_str(), strData_index);
            
            strData_index++;
            currentStr = "";

        }
        if (strData_index >= NUMCONFIGPARAM ) {
            break;
        }
        
    }
}

// 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;
    thread_sleep_for(configData[2]);
    do21 = 1;
    led1 = 1;

}

//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();
    }
}

void switch_2()
{
    do21 = !do21;
    led1 = !led1;
}

void start_tick(float timeOnSec, float timeOffSec)
{
    tickOn.attach(&switch_2, timeOnSec);
    tickOff.attach(&switch_2, timeOnSec + timeOffSec);
}


// Allows reads the USB input to allow serial commms to control the box
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 == "cycle3\r") {
                //start_tick();


            } 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();
            printf("1\r\n");
            Get_Config_data();
            printf("2\r\n");
            printf("Data: %Lf, %Lf, %Lf\r\n",configData[0],configData[1],configData[2]);

        } else {
            printf("Invalid Mode");
        }
    }

    printf("END \r\n");
    return 0;
}