Dependencies:   EthernetInterface MODSERIAL mbed-rtos mbed

Fork of UDPEchoServer by Mbed

main.cpp

Committer:
vibe
Date:
2018-09-07
Revision:
8:115dc06a8764
Parent:
7:42bc53611fc7

File content as of revision 8:115dc06a8764:

#include "mbed.h"
#include "EthernetInterface.h"
#include "MODSERIAL.h"
#include "IO.h"

extern "C" void mbed_reset();

char Version[50] = "# AF_IO V05    22.07.2018\r\n";
char NoPower[50] = "# Keine 24V Versorgung ! \r\n";
char LineStr[50] = "####################################\r\n";

MODSERIAL USB(USBTX, USBRX);  // HardwareBuffer tx, rx
I2C I2CIO(p28, p27);          // I2C DigIOs onBoard
InterruptIn INTI2C01(p21);    // I2C DigIn  Interupt
InterruptIn INT_TMC1(p11);    // I2C DigIn  Interupt
InterruptIn INT_TMC2(p12);    // I2C DigIn  Interupt
int IOBase_IOs  = 0x40;       // I2C Adresse 
SPI spi(p5, p6, p7);          // DA-Wandler  mosi, miso, sclk

IO mIO;                       // Init IO-Modul
//EthernetInterface eth;
//UDPSocket server;
//Endpoint  client;
//const int SERVER_PORT = 50020;

DigitalOut  led1(LED1);
DigitalOut  led2(LED2);
DigitalOut  led3(LED3);
DigitalOut  DAC_CS1(p13);     // DA-Wandler
DigitalOut  TriggerOut(p18);  // AD-Wandler Mesurement

DigitalOut  US1_Pos(p14);
DigitalOut  US1_Gnd(p22);
DigitalOut  US2_Pos(p23);
DigitalOut  US2_Gnd(p24);

Timeout     US_ResetTeach;
bool        US_TeachDone=false;
bool        US_TeachAktiv=false;

bool        DataAsyncSend=true;
bool        DataSyncRunning = false;

AnalogIn    ain1(p20);        // US-Sensor1
AnalogIn    ain2(p19);        // US-Sensor2
AnalogIn    ain3(p17);        // P17 - Faulhaber MotorError
AnalogIn    ain4(p16);        // 24V
AnalogIn    ain5(p15);        // 5V

double U_Analog1  = 0;        // US-Sensor1
double U_Analog2  = 0;        // US-Sensor2
double U_Analog3  = 0;        // P17
double U_Analog4  = 0;        // 24V
double U_Analog5  = 0;        // 5V

bool   DigIN_Change = false;
char   DigIN01      = 0;        // 8 Bit Input
char   DigOUT01     = 0;        // 8 Bit Output

int    MainLoopCnt  = 0;
int    MainLoopCnt2 = 0;
int    MainLoopCnt3 = 0;

//char   UDP_CharBuf[256];
bool   EthernetConnection = false;

Ticker AnalogDataTimer;
int    AD_uSek   = 4000;
int    DataPoints= 500;
double Data1[1000];
double Data2[1000];
int    Coordinate[1000];
int    DataCnt=0;
int    DataOutCnt=0;
double GainFactor=1.6f;

//#####################################################################################
// Init Hardware
//#####################################################################################
void Init_HW()
{
   US1_Pos=false;
   US1_Gnd=false;
   US2_Pos=false;
   US2_Gnd=false;

   USB.baud(57600);wait_ms(100);
   USB.printf("\r\n");wait_ms(100);
   USB.printf(LineStr);wait_ms(100);
   USB.printf(Version);wait_ms(100);
   USB.printf(LineStr);wait_ms(100);

   int ret = mIO.Init_I2C_IOs();
   USB.printf("# Init I2C: %d\r\n",ret); wait_ms(100);   
   DigOUT01 = 0;
   USB.printf("# Init SPI\r\n"); wait_ms(100);
   spi.format(16,0);
   spi.frequency(50000);
   wait_ms(50);
   U_Analog1 = ain1.read()* 3.3f;
   U_Analog2 = ain2.read()* 3.3f; 
   U_Analog3 = ain3.read()* 3.3f; 
   U_Analog4 = ain4.read()* (24/0.76);; 
   U_Analog5 = ain5.read()* (5/0.76);
   USB.printf("# Analog IN: %1.2f %1.2f %1.1f %1.1f %1.1f \r\n",U_Analog1,U_Analog2,U_Analog3,U_Analog4,U_Analog5);
   wait_ms(10); 
}

//#############################################################################
// IO - Write Output
//############################################################################# 
void WR_IO()
{
   DigOUT01 = mIO.WR_Output(1,DigOUT01);       // 8 Bit 
}

//#############################################################################
// IO - Read Input Change Interrupt 
//############################################################################# 
void RD_IO()
{
   wait_ms(5);                                 // Taste entprellen !
   DigIN01  = mIO.RD_Input(0);                 // 8 Bit 
   DigIN_Change=true;
}

//#############################################################################
// US-Sensor Read - Timer Interrupt
//############################################################################# 
void GetAnalogData() 
{
  Data1[DataCnt] = ain1.read()* 3.3f*GainFactor;
  Data2[DataCnt] = ain2.read()* 3.3f*GainFactor;
  if (DataCnt<DataPoints) { DataCnt+=1; }
  led3=!led3;
  TriggerOut=led3;//!=TriggerOut;
}

//#############################################################################
// US-Sensor Read - Position Interrupt - Trinamic X-Achse
//############################################################################# 
void GetAnalogDataX()
{
  Data1[DataCnt] = ain1.read()* 3.3f*GainFactor; 
  Data2[DataCnt] = ain2.read()* 3.3f*GainFactor; 
  Coordinate[DataCnt] = 0; 
  if (DataCnt<1000) { DataCnt+=1; }
}

//#############################################################################
// US-Sensor Read - Position Interrupt - Trinamic Y-Achse
//############################################################################# 
void GetAnalogDataY()
{
  Data1[DataCnt] = ain1.read()* 3.3f*GainFactor; 
  Data2[DataCnt] = ain2.read()* 3.3f*GainFactor; 
  Coordinate[DataCnt] = 1; 
  if (DataCnt<1000) { DataCnt+=1; }
}


//#############################################################################
// DataArray Send Data
//############################################################################# 
void SendAnalogData(int anz)
{
  USB.printf("# Send Data...\r\n");wait_ms(10);
  for (int i=0;i<anz-9;i+=10) 
  { 
     for (int ii=0;ii<10;ii++) 
     { 
        USB.printf("&%1.3f %1.3f ",Data1[i+ii],Data2[i+ii]); 
     }     
     USB.printf("\r\n"); 
  }     
  USB.printf("# Messungen: %d\r\n",anz);//wait_ms(10);
}

//#############################################################################
// US-Sensor TeachInputs
//############################################################################# 
void USRes()
{ 
  US1_Gnd=false;
  US1_Pos=false; 
  US2_Gnd=false;
  US2_Pos=false; 
  US_TeachDone=true;
}

//##################################################################################
// USB Steuerbefehle vom PC ausführen
//##################################################################################
void ReadPC_Command()
{ 
   char s[20]={'\0'};
   char Header = '\0';
   char Command = '\0';
   int  CharAnz = USB.rxBufferGetCount();
   // USB.printf("# BufCnt: %d =%s\r\n",CharAnz, s);
   int digout=0;
   //int value=0; 
   double mSek =0;
   if (CharAnz>2) 
   { 
      Header = USB.getc();
      Command = USB.getc();
      USB.move(s,CharAnz-3);  
      if (Header =='%')
      {
        switch(Command) 
        { 
            case 'D':   DataAsyncSend=true;  USB.printf("# Async US_Data Start\r\n"); 
                        break;  
            case 'd':   DataAsyncSend=false; USB.printf("# Async US_Data Stopp\r\n"); 
                        break;  
            case 'o':   sscanf (s,"%d",&digout);
                        DigOUT01 = digout & 0xFF;
                        USB.printf("%%OK o%d\r\n",DigOUT01);
                        WR_IO();
                        break;  
            case 'r' :  USB.printf("!OK reset\r\n");wait_ms(100);
                        DigOUT01=0;
                        WR_IO();
                        mbed_reset();wait_ms(100);
                        break;
            case 's':   USB.printf("# Start Measurement\r\n");
                        DataAsyncSend=false;
                        DataCnt=0;
                        DataOutCnt=0;
                        AnalogDataTimer.attach_us(&GetAnalogData, AD_uSek);
                        DataSyncRunning=true;
                        break;  
            case 'p':   AnalogDataTimer.detach();
                        SendAnalogData(DataCnt);
                        break;  
            case 'a':   U_Analog1 = ain1.read()* 3.3f;
                        U_Analog2 = ain2.read()* 3.3f; 
                        U_Analog3 = ain3.read()* 3.3f; 
                        U_Analog4 = ain4.read()* (24/0.76);; 
                        U_Analog5 = ain5.read()* (5/0.76);
                        USB.printf("# Analog IN: %1.2f %1.2f %1.1f %1.1f %1.1f \r\n",U_Analog1,U_Analog2,U_Analog3,U_Analog4,U_Analog5);
                        wait_ms(10);
                        break;  
         }
      }
      if (Header =='!')
      {
        switch(Command) 
        { 
            case 't':   sscanf (s,"%lf",&mSek);
                        if (mSek<1) { mSek=1;  }
                        if (mSek>50){ mSek=50; }
                        AD_uSek = mSek*1000;
                        USB.printf("# Set to %d uSek/Mess\r\n",AD_uSek);wait_ms(100);
                        break;  
            case 'a':   USB.printf("# US-Sensor1 Cal. Max.Signal\r\n"); US1_Pos=true; US_ResetTeach.attach(&USRes,3.0); US_TeachAktiv=true;
                        break;  
            case 'b':   USB.printf("# US-Sensor1 Cal. Min.Signal\r\n"); US1_Gnd=true; US_ResetTeach.attach(&USRes,3.0); US_TeachAktiv=true;
                        break;  
            case 'c':   USB.printf("# US-Sensor2 Cal. Max.Signal\r\n"); US2_Pos=true; US_ResetTeach.attach(&USRes,3.0); US_TeachAktiv=true;
                        break;  
            case 'd':   USB.printf("# US-Sensor2 Cal. Min.Signal\r\n"); US2_Gnd=true; US_ResetTeach.attach(&USRes,3.0); US_TeachAktiv=true;
                        break;  
         }
      }
      USB.rxBufferFlush();
   }
}

int main (void) 
{
    Init_HW();
    US_ResetTeach.attach(&USRes,0.1);
    RD_IO();
    //Init_Ethernet();
    INTI2C01.fall(&RD_IO);
    //INT_TMC1.fall(&GetAnalogDataX);
    //INT_TMC2.fall(&GetAnalogDataY);
    wait_ms(200); 
    US_TeachDone=false;

    while (true)                                              // Loop    
    {  // USB Kommando ?   ######################################## 
       if (USB.rxGetLastChar()=='\n') { ReadPC_Command(); }   
       // DigIn Interupt ? ########################################
       if (DigIN_Change) { DigIN_Change=false; USB.printf("# Dig.IN: %d\r\n", DigIN01);  wait_ms(10); }
       // Send US-Data to PC ######################################
       if (DataAsyncSend)
         { // Send Async Data (100mSek)############################
           if (MainLoopCnt2<100){ MainLoopCnt2++; }
           else         
             { MainLoopCnt2=0; led2=!led2;
               DataCnt=0;
               DataOutCnt=0;
               GetAnalogData();
               USB.printf("$ %1.3f %1.3f\r\n",Data1[0],Data2[0]); 
             }
         }
       else
         { // Send Sync Data from DataArray(Timer/Interrupt)##########
           if (DataCnt>=DataOutCnt+10)        
             {  //USB.printf("# %d %d ",DataCnt,DataOutCnt);
                for (int ii=0;ii<10;ii++) 
                  { USB.printf("&%1.3f %1.3f ",Data1[DataOutCnt+ii],Data2[DataOutCnt+ii]); }     
                USB.printf("\r\n");wait_ms(10);
                DataOutCnt+=10; 
             }
         }
       // DataArray full   ########################################
       if (DataSyncRunning & DataCnt>=DataPoints)                               
         { AnalogDataTimer.detach();
           DataSyncRunning=false;
           USB.printf("# Stopp Measurement\r\n");
           led3=false;
           TriggerOut=false;
         }
       // SlowLoop (500mSek) #####################################
       if (MainLoopCnt<500){ MainLoopCnt++; }                 
       else         
         { MainLoopCnt=0; led1=!led1;
           if(US_TeachDone) { US_TeachDone=false;US_TeachAktiv=false; USB.printf("# US Teach done...\r\n", DigIN01);}
           WR_IO();
           //if (EthernetConnection) { Call_UDP_Server(); }
         }
       wait_ms(1);
    }
    
}