#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>

int main (int argc, char **argv)
{
  int Ret;
  unsigned char ReceiveBuf[6553];
  int           BufLength = 6553;
  int           temp;
  float         ftemp;

  int sockfd;
  struct sockaddr_in server_addr, client_addr;

  char *ip;// = strdup(argv[1]);
  int port = atoi(argv[1]);

  if ( (sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0 ) {
    printf("can't open dgram socket\n", errno);
  }

  memset((void*)&client_addr, 0, sizeof(client_addr));

  // Set up client info
  client_addr.sin_family      = AF_INET;
  client_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  client_addr.sin_port        = htons(port);

  // Bind client socket
  if ( bind(sockfd, (struct sockaddr *)&client_addr, sizeof(client_addr)) < 0) {
    printf("can't bind dgram socket\n", errno);
  }

  printf("We are ready to receive datagrams from any interface on ip/port %d...\n",
	 port);

  while(1) {
    int serveraddrsize = sizeof(server_addr);

    if ((Ret = recvfrom(sockfd, ReceiveBuf, BufLength, 0,
			(struct sockaddr *)&server_addr, &serveraddrsize )) < 0) {
      printf("ERROR: recvfrom failed with error %d\n", errno);
      break;
    }

    printf("%c%c%c - ",ReceiveBuf[0],ReceiveBuf[1],ReceiveBuf[2]);
    if(ReceiveBuf[2]=='Z') {
      printf("No Data, ");
    }
    else {
      printf("%s %s%s, ",&ReceiveBuf[8],&ReceiveBuf[20],&ReceiveBuf[112]);
      printf("%d Beams, ",(ReceiveBuf[70]<<8)|ReceiveBuf[71]);

      //Ping Latency
      temp = (ReceiveBuf[118]<<8) | ReceiveBuf[119];
      ftemp = temp/10.0;
      printf("PL=%3.1fms, ",ftemp);

      //Data Latency
      temp = (ReceiveBuf[120]<<8) | ReceiveBuf[121];
      ftemp = temp/10.0;
      printf("DL=%3.1fms, ",ftemp);

      //Center Ping Time Offset
      temp = (ReceiveBuf[126]<<8) | ReceiveBuf[127];
      ftemp = temp/10.0;
      printf("CP=%3.1fms",ftemp);

    }
    printf("\n");
  }

  return 0;
}
