school project

Dependencies:   C12832 EthernetInterface LM75B mbed-rtos mbed

main.cpp

Committer:
RianDeRous
Date:
2017-04-28
Revision:
0:9aa59e25b651

File content as of revision 0:9aa59e25b651:

#include "mbed.h"
#include "C12832.h"
#include "LM75B.h"
#include "EthernetInterface.h"



DigitalOut aliveLed(LED1);

PwmOut led(p24);
PwmOut buzzer(p26);
LM75B tmp(p28,p27);
C12832 lcd(p5, p7, p6, p8, p11);
AnalogIn pot(p20);
Serial pc(USBTX,USBRX);
TCPSocketServer server;

InterruptIn joyStickUp(p12);
InterruptIn joyStickDown(p15);
DigitalIn joyStickCenter(p14);
DigitalIn joyStickLeft(p13);
DigitalIn joyStickRight(p16);

EthernetInterface eth;

bool stop;
char temp [50];
char ids[20];
char CRC;
char destination[15];

float currentTemperature;
char potentiometer;

unsigned char targetId;

const unsigned int id = 107; //ip address = 192.168.1.107


bool checkCRC()
{
    pc.printf("check CRC: CRC correct\n\r");
    return true;
}

char calcCRC()
{
    pc.printf("calculate crc\n\r");
    return 0xab;
}

void sendBuffer(int id, char* buffer,int length)
{
    pc.printf("send buffer to 192.168.1.%3d with a length of %2d\n\r",id,length);
    if(!stop) {
        sprintf("192.168.1.%3d",destination, 100+targetId);
        TCPSocketConnection client2;
        client2.connect(destination,4000);
        client2.send_all(buffer, length);
    }
}

/*-----------------------------------------------------------------------------
*  interrupt routines for joystick up, down & center
*-----------------------------------------------------------------------------*/
void joyStickUpISR(void)
{
    aliveLed=!aliveLed;
    if(targetId<16) targetId++;
    //pc.printf("Next Node: 192.168.1.%3d",100+targetId);
}

void joyStickDownISR(void)
{
    aliveLed=!aliveLed;
    if(targetId>0) targetId--;
    //pc.printf("Next Node: 192.168.1.%3d",100+targetId);
}

void joyStickEnter()
{
    char firstFrame[11];
    firstFrame[0]=0xAA;
    firstFrame[1]=0x55;
    firstFrame[2]=0;
    firstFrame[3]=targetId;
    firstFrame[4]=pot.read();
    firstFrame[5]=107;
  //  int a, b;
   // tmp.readRaw(&a,&b);
    firstFrame[6]=9;
    firstFrame[7]=8;
    firstFrame[8]=calcCRC();
    firstFrame[9]=0xaa;
    firstFrame[10]=0x55;

    stop=false;

    aliveLed=!aliveLed;

    char buffer [16];

    //sprintf (buffer, "192.168.1.%03d", 100+targetId, 16);
    pc.printf("sending first frame to 192.1681.100 ");
    pc.printf(buffer);
    pc.printf("\n\r");
    TCPSocketConnection client2;

   // pc.printf("destination: %s", buffer);
      while (client2.connect("192.168.1.100", 4000) < 0) {
        pc.printf("Unable to connect to (%s) on port (%d)\n\r", "192.168.1.100", 4000);
    }
     char hello[] = "Hello World";
      int succes = client2.send_all(hello,sizeof(hello)-1);
    //int succes = client2.send_all(firstFrame,sizeof(firstFrame));

    if(succes>0) {
        pc.printf("%d bytes transmitted succesfully\n\r",succes);
    } else {
        pc.printf("ERROR SENDING FIRST FRAME\n\r");
    }
    pc.printf("\n\r");
   client2.close();
}

/*------------------------------------------------------------------------------
 play the first n notes
------------------------------------------------------------------------------*/

double frequencies[] =    { 110,110,110,98,130,110,98,130,110,165,165,165,175,130,104,98,130};
int length[] =         { 480,480,480,360,120,480,360,120,960,480,480,480,360,120,480,360,120};
char delay[] =          { 100,100,100,075,100,100,075,100,100,100,100,100,075,100,100,075,100};

void playTune(int n)
{
    pc.printf("play %d notes from tune\n\r", n);
    for(int i = 0; i<n; i++) {
        buzzer.write(0.5);
        int period = 1000000/frequencies[i];
        buzzer.period_us(period);
        wait_ms(length[i]);
        buzzer.write(0);
        wait_ms(delay[i]);
    }
}

/*------------------------------------------------------------------------------
/ print ip address, target ip, temperature and potentiometer value on LCD
------------------------------------------------------------------------------*/

void printLCD(void)
{
    // pc.printf("update lcd\n\r");
    lcd.locate(0,8);
    lcd.printf("target =     192.168.1.%3d",100+targetId);
    lcd.locate(0,23);
    potentiometer = (char) 255*pot.read();
    // pc.printf("potvalue %d \r\n" , potentiometer);
    lcd.printf("pot is = %2d", potentiometer);

}


/*-----------------------------------------------------------------------------
/init routine
/
/ UART
/ -set the baudrate to 115200
/
/ Ethernet connection
/ set up ethernet connection with static ip 10.182.34.107 and make connection
/
/ LCD
/ clear LCD
/ run printLCD()
/
/ Add Interrupt to joystick up, down & center
/ PWM: init PWM for (R)G(B) led.
/ Tune: plays 3 notes from tune when finished
------------------------------------------------------------------------------*/


void init(void)
{
    pc.baud(9600);
    pc.printf("\n\n\r projectlab Rian De Rous \n\r\n");
    //setup an eternet connection. IP ADDRESS = 192.168.1.107
    //int result = eth.init("192.168.1.107","255.255.255.0","192.168.1.1");
    pc.printf("initialisatie ethernet connectie \n\r");
    // eth.init("192.168.1.107","255.255.255.0","192.168.1.1");
    eth.init("192.168.1.107", "255.255.255.0", "192.168.1.1");
    //pc.printf("IP Address is %s \n\r", eth.getIPAddress());
    pc.printf("try to connect\r\n");



    if(eth.connect()==0) {
        pc.printf("connectie geslaagd\r\n");
    } else {
        pc.printf("connectie gefaald\r\n");
    }


    server.bind(4000);
    server.listen();

    pc.printf("initialisatie lcd\n\r");
    //lcd initialisation
    lcd.cls();                                 // good practice to clear lcd on startup
    lcd.locate(0,0);
    lcd.printf("IP Address is %s \n\r", eth.getIPAddress());// print ip address to first line on lcd


    //add interrupt routines
    pc.printf("initialisatie interrupts\n\r");
    joyStickUp.rise(&joyStickUpISR);           // interrupt on joystick up     --> jump to joyStickUpISR       on Interrupt
    joyStickDown.rise(&joyStickDownISR);       // interrupt on joystick down   --> jump to joyStickDownISR     on Interrupt

    pc.printf("initialisatie tcp server\n\r");
    server.bind(4000);
    server.listen();

    pc.printf("initialisatie led");
    led.period_ms(1); // 1kHz pwm Out frequency to dim green led in RGB led.
    led.write(0.95);

    pc.printf("play tune!\n\r");
    playTune(0);

}

float tmpToFloat(char a, char b)
{
    pc.printf("convert 2 byte temperature value to a float");
    return float((a<<8)|b) / 256.0 ;
}

float averageTemperature(int n, char * temp)
{
    pc.printf("calculate average temperature\n\r");
    float avgtemp;

    for(int i=0; i<n; i++) {
        avgtemp+=tmpToFloat(temp[3*i],temp[3*i+1]);

    }
    avgtemp=avgtemp/n;
    lcd.locate(0,16);
    lcd.printf("average temp is = %.2f\n",avgtemp);
    return  avgtemp;
}

int main()
{
    init();
    while (true) {

        printLCD();
        if(joyStickCenter.read()==1) {
            joyStickEnter();
            wait(0.2);
        }
          if(joyStickLeft.read()==1) {
            playTune(10);
            wait(0.2);
        }
         if(joyStickRight.read()==1) {
              lcd.locate(64,23);
              lcd.printf("temp is %.2f°C\n",tmp.read());
            wait(0.2);
        }
        
        TCPSocketConnection client;
        server.accept(client);
        client.set_blocking(true, 15000); // Timeout after (1.5)s
      //  if(client.get_address()!=null) {
        //    printf("Connection from: %s \r\n", client.get_address());
       // }
        char buffer[256];
        while (true) {
            int n = client.receive(buffer, sizeof(buffer));
            if (n <= 0) break;

            int count=0;
            //check if frame starts with 0xAA55

            if(buffer[0]==0xaa && buffer[1]==0x55) {

                count = 5;
                //extract temperatures from buffer
                for(int i = 0; i<3* buffer[2]; i++, count++) {
                    temp[i]=buffer[count];
                }
                //extract CRC checksum from buffer
                count++;
                CRC = buffer[count];
                count++;

                int i = 6;
                stop = false;
                while(stop == false && i<(buffer[2]*3+6)) {
                    stop =true;
                    i+=3;
                }

                //check if packet is (in)valid
                if((buffer[count]==0x55 && buffer[count+1]==0xAA)) {

                    led.write(buffer[4]);
                    playTune(buffer[2]);

                    averageTemperature(buffer[2],temp);

                    if(!stop) {
                        buffer[2]++;
                        buffer[3]=targetId;
                        buffer[4]=pot.read();
                        count++;

                        buffer[count-1]=id;
                        int a, b;
                        tmp.readRaw(&a,&b);
                        buffer[count]=  a;  // nog om te zetten met complement
                        buffer[count+1]=b;
                        buffer[count+2]=calcCRC();
                        buffer[count+3]=0x55;
                        buffer[count+4]=0xAA;
                        sendBuffer(targetId, buffer,count +4);
                        if(!checkCRC()) {
                            //correct packet
                        }
                    }

                }
                stop = false;
            }
            client.close();
        }
    }

}