1.0

Dependencies:   EthernetInterface mbed-rtos

Telemetry.cpp

Committer:
HMFK03LST1
Date:
2015-10-31
Revision:
2:e19b937a29c1
Parent:
0:c0179f2ad295
Child:
3:94a735c744ff

File content as of revision 2:e19b937a29c1:

/*------------------------------------------------*/
/*Autor: Sebastian Donner                         */
/*------------------------------------------------*/

#include "Telemetry.h"

//Debug Schnittstelle
#ifdef DEBUG
Serial debug(USBTX, USBRX);
#endif

//Konstruktoren
EthernetInterface   eth;
TCPSocketConnection sock_tcp;
UDPSocket           sock_udp_send;  //send socket
UDPSocket           sock_udp_rec;   //receive socket


    

//Globale Variable
bool InitSucceed = false;

Telemetry::Telemetry()
{
    
}

#ifdef DEBUG
void Telemetry::InitUSBSerialConnection()
{
    serial.baud(115200);
}
#endif

char Telemetry::do_cs(char* buffer)
{
    char ck_a=0;
    char ck_b=0;

    for(int i=0; i < (buffer[0]-1); i++)
    {
        ck_a += buffer[i];
        ck_b += ck_a;
    }
    
    return ck_b;
}


//Funktion überladen. Ohne Parameter DHCP und 10 Sekunden Timeout. Mit Parameter kein DHCP und 3 Sekunden Timeout
bool Telemetry::InitEthernetConnection()
{   
    bool ReturnValue = false;
    #ifdef DEBUG
    debug.printf("Initalisiere LAN Verbindung mit DHCP\r\n\r\n");
    #endif
    
    //Schnittstelle nur einmal initialisieren, sonst gibt es Fehler!
    if (!InitSucceed)
    {
        if (eth.init()==0)  //Init Interface
        {
            InitSucceed = true;
            ReturnValue = true;
        }
    }
    
    //Nur wenn Initialisierung erfolgreich war!
    if (InitSucceed)
    {
        #ifdef DEBUG
        serial.printf("Verbinde\r\n\r\n");
        #endif
        ip_self = eth.getIPAddress();
        
        if (eth.connect(8000)==0) //CONNECT
        {
            printf("IP Adresse: %s\r\n\r\n", eth.getIPAddress());
            ReturnValue = true;
        }
        else
        {
            ReturnValue = false;
        }
    }
    
    #ifdef DEBUG
    if (ReturnValue == false)
    {
        serial.printf("DHCP fail!\r\n\r\n");
    }
    #endif
    
    return ReturnValue;
}

bool Telemetry::InitEthernetConnection(const char* IPAdress, const char* SubNetMask, const char* GateWay)
{   
    bool ReturnValue = false;
    //#ifdef DEBUG
    printf("Initalisiere LAN Verbindung ohne DHCP\r\n\r\n");
    printf("IP: %s - GateWay: %s - SubNetMask: %s\r\n\r\n",IPAdress, GateWay, SubNetMask);
    //#endif
    
    //Schnittstelle nur einmal initialisieren, sonst gibt es Fehler!
    if (!InitSucceed)
    {
        if (eth.init(IPAdress, SubNetMask, GateWay)==0)  //Init Interface
        {
            InitSucceed = true;
            ReturnValue = true;
        }
    }
    
    //Nur wenn Initialisierung erfolgreich war!
    if (InitSucceed)
    {   
        if (eth.connect(2000)==0) //CONNECT
        {
            #ifdef DEBUG
            serial.printf("Init success!");
            #endif
            
            ReturnValue = true;
        }
        else
        {
            ReturnValue = false;
        }
    }
    
    #ifdef DEBUG
    if (ReturnValue == false)
    {
        serial.printf("Init fail!");
    }
    #endif
    
    return ReturnValue;
}


void Telemetry::CloseEthernetConnection()
{
    eth.disconnect();
    InitSucceed = false;
    
    #ifdef DEBUG
    serial.printf("LAN Stack close\r\n\r\n");
    #endif
}

void Telemetry::ConnectSocket_tcp(Endpoint Host)
{
    sock_tcp.connect(Host.get_address(), Host.get_port());
    sock_tcp.set_blocking(false, 0);
    #ifdef DEBUG
    serial.printf("Open TCP Socket to IP: %s:%d.\r\n\r\n",Host.get_address(), Host.get_port());
    #endif
}

void Telemetry::ConnectSocket_udp_rec(int Port)
{
    sock_udp_rec.bind(Port);
    sock_udp_rec.set_blocking(false, 0);  

    #ifdef DEBUG
    serial.printf("Open UDP_receive Socket on Port:%d.\r\n\r\n",Port);
    #endif
}

void Telemetry::ConnectSocket_udp_send()
{
    sock_udp_send.init();
 
    #ifdef DEBUG
    serial.printf("Open UDP_send Socket.\r\n\r\n");
    #endif
}


void Telemetry::CloseSocket_tcp()
{
    sock_tcp.close();

    #ifdef DEBUG
    serial.printf("TCP Socket closed.\r\n\r\n");
    #endif
}


void Telemetry::CloseSocket_udp_send()
{
    sock_udp_send.close();

    #ifdef DEBUG
    serial.printf("UDP send Socket closed.\r\n\r\n");
    #endif
}


void Telemetry::CloseSocket_udp_rec()
{
 sock_udp_rec.close();   
  #ifdef DEBUG
    serial.printf("UDP receive Socket closed.\r\n\r\n");
  #endif
}

int Telemetry::Rec_Data_UDP(char *buffer, int size)
{
  return sock_udp_rec.receiveFrom(input_Host, buffer, size);    
}


bool Telemetry::Rec_Struct_UDP(char *buffer)
{
  sock_udp_rec.receiveFrom(input_Host, buffer, 255);    
  if (buffer[buffer[0]-1] == do_cs(buffer)) return true;
  else return false;
}


int Telemetry::Rec_Data_TCP(char *buffer,int size)
{ 
        return sock_tcp.receive(buffer, size);
}


void Telemetry::Send_Data_UDP(Endpoint Server, char* Daten, int size )
{
    // convert String to char*
    //(string Daten)
    //const char *DataBuf = Daten.c_str();
    //char DataPaket[Daten.length()];
    //strcpy(DataPaket,DataBuf);
    
    sock_udp_send.sendTo(Server, Daten, size);   

    #ifdef DEBUG
    serial.printf("UDP Paket gesendet.\r\n\r\n");
    #endif
}


void Telemetry::Send_Struct_UDP(Endpoint Server, char* Daten)
{   
    Daten[(*Daten - 1)] = do_cs(Daten);
    sock_udp_send.sendTo(Server, Daten, *Daten);   
}



void Telemetry::Send_Data_TCP(char* Host, string Daten, string Username, string Passwort)
{
    
    //Datenpaket schnüren
    string DATEN = "Username=" + Username + "&Passwort=" + Passwort + "&Paket=" + Daten;
    
    string POST = "POST /H2MClient/h2m_client.php HTTP/1.1\r\n";
    
    string HostString = Host;
    string HOST = "Host: " + HostString + "\r\n";
    
    string CONTENTTYPE = "Content-Type: application/x-www-form-urlencoded\r\n";
    
    string Length;
    stringstream convert;
    convert << DATEN.length();
    Length = convert.str();
    string CONTENTLENGTH = "Content-Length: " + Length + "\r\n\r\n";
    
    
    string datenpaket = POST + HOST + CONTENTTYPE + CONTENTLENGTH + DATEN + "\r\n";
    
    //Umwandeln in char*
    const char *DataBuf = datenpaket.c_str();
    char DataPaket[datenpaket.length()];
    strcpy(DataPaket,DataBuf);

    #ifdef DEBUG
    serial.printf("----\r\n%s----\r\n\r\n",DataPaket);
    serial.printf("Sende Paket.\r\n\r\n");
    #endif
    
    sock_tcp.send_all(DataPaket, sizeof(DataPaket)-1);
    
    #ifdef DEBUG
    serial.printf("Paket gesendet.\r\n\r\n");
    #endif
    
    #ifdef LED
    ledwfa = 0;
    #endif
}