#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

int main(int argc, char *argv[]) {

    setbuf(stdout,NULL);

	srand ( time(NULL) );
	int socketDescriptor;
	struct sockaddr_in serverAddress;
	unsigned short int serverPort = 51236;

    int active[9];
    active[0]=0;
    active[1]=0;  // pri spusteni vsechny snimace vypnuty
    active[2]=0;
    active[3]=0;
    active[4]=0;
    active[5]=0;
    active[6]=0;
    active[7]=0;
    active[8]=0;

    float value[9];
    value[0]=0;
    value[1]=0;   // pri spusteni zadna spotreba
    value[2]=0;
    value[3]=0;
    value[4]=0;
    value[5]=0;
    value[6]=0;
    value[7]=0;
    value[8]=0;

    int odpoj = 0;

    int typpaketu = 0;
    int idsnimace = 0;
    float data = 0;
    char msg[16];

	if ((socketDescriptor = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
	    printf("Nemohu vytvorit socket! Adresa nebo port jsou jiz vyuzivany.");
		exit(1);
	}
	serverAddress.sin_family = AF_INET;
	serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
	serverAddress.sin_port = serverPort;



    while(1){
        idsnimace = (rand() % 9) + 1;    // vygeneruj nahodne cislo snimace 1 od do 9

        if (active[idsnimace-1] == 0)
        {
          typpaketu=1;   //pripojeni snimace
          active[idsnimace-1]=1;   //nastavim si ho jako aktivni, aby se posilaly data
          value[idsnimace-1] = ((float)(rand() % 100)/100.0);  // nastaveni nahodne spotreba pri zapnuti - pro pozdejsi zmenu
          data=0; // avsak neodesli zadna data
        }
        else
        {
          odpoj = rand() % 128; // sance 1/128 ze se nasimuluje odpojeni snimace
          if (odpoj==66)
          {
            typpaketu=3;   //odpojeni snimace
            active[idsnimace-1]=0;  // nastavim si ho jako neaktivni, aby se pri dalsim generovani ohlasil jako pripojovany
            data=0;  //zadne data

          }
          else
          {
            typpaketu=2;   //odeslani dat
            value[idsnimace-1] += (((float)(rand() % 10)-5.0)/100.0);  // nahodna zmena hodnoty spotreby v rozmezi -10 az 10
            if (value[idsnimace-1]<0) {value[idsnimace-1]=-(value[idsnimace-1]);}
            data=value[idsnimace-1];
          }
        }

        sprintf (msg, "%d;000%d;%.2f", typpaketu, idsnimace, data);

        printf("%d;000%d;%.2f \n", typpaketu, idsnimace, data);

     	if (sendto(socketDescriptor, msg, strlen(msg), 0, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0) {
		  printf("Nemohu odeslat data! \n");
		  exit(1);
	    }

	    sleep(1);

    }


	return 0;
}
