Vorlage für Projekt

Dependencies:   EthernetInterface mbed-rtos

Fork of Telemetrie_eth_h2m by Hochschule München

Telemetry.cpp

Committer:
HMFK03LST1
Date:
2017-11-09
Revision:
14:e05e0e5177e7
Parent:
12:f34b079ae15c

File content as of revision 14:e05e0e5177e7:

 /** Ethernet Interface for send/receive Datastructs over udp 
 *
 *
 * By Sebastian Donner
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use,
 * copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following
 * conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 */

#include "Telemetry.h"

/**Debug Schnittstelle
*/
#ifdef DEBUG
Serial debug(USBTX, USBRX);
debug.baud(115200);
#endif

/**Konstruktoren
*/
EthernetInterface   eth;
TCPSocketConnection sock_tcp;
UDPSocket           sock_udp_client;  //send socket
UDPSocket           sock_udp_server;  //receive socket


    

/** Create a new Ethernet interface
  *
  */
Telemetry::Telemetry(PinName ora, PinName gre):orange(ora),green(gre)
{ 
    InitSucceed = false;
    green = 0;
    orange = 0;
}


/** Init a Serial Debug interface
  *
  */
#ifdef DEBUG
void Telemetry::InitUSBSerialConnection()
{
    serial.baud(115200);
}
#endif




/** Init Ethernet interface
  * mit DHCP max. 10 Sekunden 
*/
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;
        }
    }
    
    //Nur wenn Initialisierung erfolgreich war!
    if (InitSucceed)
    {
        #ifdef DEBUG
        serial.printf("Verbinde\r\n\r\n");
        #endif
        ip_self = eth.getIPAddress();
        
        if (eth.connect(10000)==0) //CONNECT
        {
            #ifdef DEBUG
            printf("IP Adresse: %s\r\n\r\n", eth.getIPAddress());
            #endif
            ReturnValue = true;
            green = 1;
        }
        else
        {
            #ifdef DEBUG
            serial.printf("DHCP fail!\r\n\r\n");
            #endif
            ReturnValue = false;
        }
    }
    
    return ReturnValue;
}


/** Init Ethernet interface
  * ohne DHCP max. 2.5 Sekunden
  * @param IPAddress Interface IP 
*/
bool Telemetry::InitEthernetConnection(const char* IPAddress, 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(IPAddress, SubNetMask, GateWay)==0)  //Init Interface
        {
            InitSucceed = true;
        }
    }
    
    //Nur wenn Initialisierung erfolgreich war!
    if (InitSucceed)
    {   
        if (eth.connect(2500)==0) //CONNECT
        {
            green = 1;
            #ifdef DEBUG
            serial.printf("Init success!");
            #endif
            ip_self = eth.getIPAddress();
            ReturnValue = true;
        }
        else
        {
            #ifdef DEBUG
            serial.printf("Init fail!");
            #endif
            ReturnValue = false;
        }
    }    
    
    return ReturnValue;
}


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


//! Connect Port TCP 
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
}


//! Connect Port UDP receive 
void Telemetry::ConnectSocket_UDP_Client()
{
    sock_udp_client.init();
    sock_udp_client.set_blocking(false, 0);  

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


//! Connect Port UDP send
void Telemetry::ConnectSocket_UDP_Server(int Port)
{
    sock_udp_server.init();
    sock_udp_server.bind(Port);
    #ifdef DEBUG
    serial.printf("Open UDP_Server on Port: %d.\r\n\r\n",Port);
    #endif
}


//! Close Port TCP
void Telemetry::CloseSocket_TCP()
{
    sock_tcp.close();

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


//! Close Port UDP receive
void Telemetry::CloseSocket_UDP_Client()
{
 sock_udp_client.close();   
  #ifdef DEBUG
    serial.printf("UDP Client Socket closed.\r\n\r\n");
  #endif
}


//! Close Port UDP send
void Telemetry::CloseSocket_UDP_Server()
{
    sock_udp_server.close();

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


//! Struct Check Sum calc
uint8_t Telemetry::do_cs(uint8_t* buffer)
{
    uint8_t ck_a=0;
    uint8_t ck_b=0;

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


//! Read UDP Packet on Client Port
int Telemetry::Rec_Data_UDP_Client(char *buffer, int size)
{
  return sock_udp_client.receiveFrom(input_Client, buffer, size);    
}

//! Read UDP Packet on Server Port
int Telemetry::Rec_Data_UDP_Server(char *buffer, int size)
{
  return sock_udp_server.receiveFrom(input_Server, buffer, size);    
}

    
//! Check UDP Packet of containing Struct
bool Telemetry::Rec_Struct(uint8_t *buffer)
{    
  orange = !orange;
  if (buffer[buffer[0]-1] == do_cs(buffer)) return true;
  else return false;
}


//! Read TCP Packet
int Telemetry::Rec_Data_TCP(char *buffer,int size)
{ 
        orange = !orange;
        return sock_tcp.receive(buffer, size);
}


//! Send UDP Packet as Client
void Telemetry::Send_Data_UDP_Client(Endpoint Server, char* Daten, int size )
{   
    sock_udp_client.sendTo(Server, Daten, size);   
    orange = !orange;
    #ifdef DEBUG
    serial.printf("UDP Paket gesendet.\r\n\r\n");
    #endif
}

//! Send UDP Packet as Server
void Telemetry::Send_Data_UDP_Server(Endpoint Client, char* Daten, int size )
{   
    sock_udp_server.sendTo(Client, Daten, size);   
    orange = !orange;
    #ifdef DEBUG
    serial.printf("UDP Paket gesendet.\r\n\r\n");
    #endif
}

//! Send Struct as UDP Client
void Telemetry::Send_Struct_UDP_Client(Endpoint Server, uint8_t* Daten)
{   
    Daten[(*Daten - 1)] = do_cs(Daten);
    sock_udp_client.sendTo(Server, (char*)Daten, *Daten);   
    orange = !orange;
}

//! Send Struct as UDP Server
void Telemetry::Send_Struct_UDP_Server(Endpoint Client, uint8_t* Daten)
{   
    Daten[(*Daten - 1)] = do_cs(Daten);
    sock_udp_server.sendTo(Client, (char*)Daten, *Daten);   
    orange = !orange;
}

//! Send TCP Packet
void Telemetry::Send_Data_TCP(char* Host, char* Buffer)
{
    
    /* 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(Buffer, sizeof(Buffer)-1);
    
    #ifdef DEBUG
    serial.printf("Paket gesendet.\r\n\r\n");
    #endif
}