lib_Transmission_Serial_example

Dependencies:   lib_Transmission

main.cpp

Committer:
YSI
Date:
2021-02-12
Revision:
3:63567efc8429
Parent:
0:5d2c38c99ce6
Child:
4:0e42ea16a9cb

File content as of revision 3:63567efc8429:

#include "main.h"

int main(void)
{
    setup();
    while(1) Led = transmission.recv();
}

void setup(void)
{
    Led = Transmission::RED_DISCONNECTED;
    uc.mac = transmission.ip(true);//, "192.168.1.25", 80);
    for(string name : { "22:42:9d:a3:be:be ELINS-UC-A K64F YANNIC.SIMON@UNIVERSITE-PARIS-SACLAY.FR",
                        "00:02:f7:f3:01:b8 ELINS-UC-B LPC1768 YANNIC.SIMON@UNIVERSITE-PARIS-SACLAY.FR",
                        "00:80:e1:44:00:3a ELINS-UC-C.visiteur H743ZI2 YANNIC.SIMON@UNIVERSITE-PARIS-SACLAY.FR"})
    {
        stringstream streamnames(name);
        for(int line = 0; getline(streamnames, name, ' '); line += ((name == uc.mac) || (line > 0))?1:0)
        {
            switch(line)
            {
                case 1: uc.name = name;                                 break;
                case 2: uc.spec = name;                                 break;
                case 3: case 4: case 5: case 6: uc.mail[line-3] = name; break;
                default:                                                break;
            }
        }
    }
    if(uc.name.empty()) uc.name = uc.mac;
    else if(uc.name.find(".") != string::npos)
    {
        uc.vlan = uc.name.substr(uc.name.find("."));
        uc.name = uc.name.substr(0, uc.name.find("."));
    }
}

void init(void)
{
    set_time(transmission.ntp());
    notify("CONNECTION");
}

string csv_time(const bool& second)
{
    time_t TimeStamp = time(NULL);
    if(TimeStamp < 1600000000) set_time(TimeStamp = transmission.ntp("ntp.u-psud.fr"));
    struct tm * tmTimeStamp = localtime(&TimeStamp);
    char timeLogs[22] = {0};
    strftime(timeLogs, 21, second?"%F;%T;":"%F;%R;", tmTimeStamp);
    return timeLogs;
}

string html(enumHTML CONTENT)
{
    map<string, string> BgColor {{"OK", "lime"}, {"WARNING", "orange"}, {"ERROR", "red"}, {"MISSING", "white"}, {"LOST", "black"}};
    stringstream buffer;
    buffer.precision(3);
    switch(CONTENT)
    {
        case HEAD:  buffer << "Content-Type: text/html; charset=utf-8\r\nAccess-Control-Allow-Origin: *\r\n\r\n"; break;
        case OPEN:  buffer << "<!DOCTYPE html>\r\n<html>\r\n\t<head>\r\n\t\t<title>" << MBED_PROJECT << " : " << uc.name << "</title>\r\n\t</head>\r\n\t<body style=background-color:dimgray>\r\n\t\t<center>"; break;
        case CLOSE: buffer << "\r\n\t\t</center>\r\n\t</body>\r\n</html>"; break;
        case BODY:
            buffer << "<!DOCTYPE html>\r\n<html>\r\n\t<head>\r\n\t\t<title>" << MBED_PROJECT << " : " << uc.name << "</title>\r\n\t\t<meta http-equiv=refresh content=1>\r\n\t</head>";
            buffer << "\r\n\t<body style=background-color:dimgray>\r\n\t\t<center>\r\n\t\t\t<h1>" << MBED_PROJECT << " : " << uc.name << "</h1>";
            buffer << "\r\n\t\t\t<h3>" << csv_time() << "</h3>\r\n\t\t\t<a href=request><button type=button>Request</button></a>\r\n\t\t</center>\r\n\t</body>\r\n</html>";
        break;
        case SMTP:
            buffer << "MIME-Version: 1.0\r\nMessage-Id: <Mbed." << uc.name << "." << time(NULL) << "@UNIVERSITE-PARIS-SACLAY.FR>\r\nContent-Type: multipart/mixed; boundary=\"boundaryUPT0\"\r\n";
            buffer << "\r\n--boundaryUPT0\r\nContent-Type: multipart/alternative; boundary=boundaryUPT1\r\n\r\n";
            buffer << "\r\n--boundaryUPT1\r\nContent-Type: text/plain; charset=utf-8\r\n\r\n";
            buffer << MBED_PROJECT << " : " << uc.name;
            buffer << "\r\n\r\nReal-time monitoring display (from the local network) : http://" << uc.name << uc.vlan << ".lps.u-psud.fr/";
            buffer << "\r\n--boundaryUPT1\r\nContent-Type: text/html; charset=utf-8\r\n\r\n";
            buffer << "<html>\r\n\t<body>\r\n\t\t<center>\r\n\t\t\t<h1>" << MBED_PROJECT << " : " << uc.name << "</h1>\r\n\t\t\t<table style=color:white;border-collapse:collapse>";
            buffer << "\r\n\t\t\t</table>\r\n\t\t</center>\r\n\t\t<footer><p>Real-time monitoring display (from the local network) : http://" << uc.name << uc.vlan << ".lps.u-psud.fr/</p></footer>\r\n\t</body>\r\n</html>";
            buffer << "\r\n--boundaryUPT1\r\n\r\n--boundaryUPT0\r\nContent-Type: text/csv\r\nContent-disposition: attachment; filename=";
            buffer << "time.csv;\r\n\r\n" << csv_time() << "\r\n--boundaryUPT0\r\n";
        break;
    }
    return buffer.str();
}

string notify(const string& EVENT, const string& STATUS)
{
    string ACK, PROJECT(MBED_PROJECT), HTML(html(SMTP)), SUBJECT("[Alert]" + PROJECT + " " + uc.spec + " : " + EVENT + (STATUS.empty()?"":" - ") + STATUS);
    for(const string &MAIL : uc.mail) if(!MAIL.empty()) if(!transmission.smtp(MAIL.c_str(), uc.name.c_str(), SUBJECT.c_str(), HTML.c_str())) ACK += " ERROR[ " + MAIL + " ]";
    return ACK.empty()?"OK":ACK;
}

string str_precision(float value)
{
    ostringstream buffer;
    buffer.precision(3);
    buffer << value;
    return buffer.str();
}

void processing(string cmd, Transmission::enum_trans_to to)
{
    for (unsigned int i = 0; i < cmd.size(); i++) if ((cmd[i] >= 'a') && (cmd[i] <= 'z')) cmd[i] += 'A' - 'a';
    stringstream srecv(cmd), ssend;
    ssend.precision(3);
    while(getline(srecv, cmd, ';'))
    {
        if(ssend.str().size() > 0) ssend << ' ';
        if(cmd.empty());
        else if(cmd == "*IDN?")
        {
            ssend << MBED_PROJECT << ", Mbed OS " << MBED_VERSION << ", Version dated, " << __DATE__ << ", " << __TIME__;
        }
        else if(cmd.find("GET /*IDN? HTTP") != string::npos)
        {
            ssend << HTTP_RETURN_OK << html(HEAD) << MBED_PROJECT << ", Mbed OS " << MBED_VERSION << ", Version dated, " << __DATE__ << ", " << __TIME__;
        }
        else if(cmd.find("GET /REQUEST HTTP") != string::npos)
        {
            ssend << HTTP_RETURN_OK << html(HEAD) << html(OPEN) << "\r\n\t\t\t<p>EMAIL REQUEST " << notify("REQUESTE") << "</p>\r\n\t\t\t<a href=/><button type=button>Return</button></a>" << html(CLOSE);
        }
        else if(cmd.find("GET / HTTP") != string::npos)
        {
            ssend << HTTP_RETURN_OK << html(HEAD) << html(BODY);
        }
        else if(cmd.find("GET /FAVICON.ICO HTTP") != string::npos)
        {
            ssend << HTTP_RETURN_OK << "Content-type: image/x-icon\r\n\r\n";
            for(char c : HTTP_FAVICON) ssend << c;
        }
        else if(cmd.find("GET /") != string::npos)
        {
            ssend << HTTP_RETURN_NO_CONTENT << html(HEAD);
        }
        else if(cmd.find("HEAD /") != string::npos)
        {
            ssend << HTTP_RETURN_OK << html(HEAD);
        }
        else if(cmd.find("HOST: ") != string::npos)
        {
            if(to == Transmission::TCP) to = Transmission::HTTP;
        }
        else if(cmd == "MAC?")
        {
            ssend << "MAC[" << uc.mac << "], NAME[" << uc.name << "]";
        }
        else if(cmd == "IP?")
        {
            ssend << "IP[" << transmission.ip() << "]";
        }
        else if(cmd == "ETH?")
        {
            ssend << "ETH:" << ((eth.get_connection_status() == NSAPI_STATUS_GLOBAL_UP)?"UP":"DOWN");
        }
        else if(cmd.find("ETH:IP ") != string::npos)
        {
            string param(cmd.substr(cmd.find(' ')+1));
            string IP(param.substr(0, param.find(':')));
            stringstream istr(param.substr(param.find(':')+1));
            uint16_t PORT;
            istr >> PORT;
            transmission.ip(true, IP.c_str(), PORT);
        }
        else if(cmd == "ETH:DHCP")
        {
            transmission.ip(true);
        }
        else if(cmd == "ETH:OFF")
        {
            transmission.ip(false);
        }
        else if(cmd == "EMAIL?")
        {
            ssend << "EMAIL REQUEST " << notify("REQUESTE");
        }
        else if(cmd.find('?') != string::npos) ssend << "incorrect requeste [" << cmd << "]";
    }
    transmission.send(ssend.str(), to);
}