/*************************************************************
 gccli.c
 GC monitor clients using UDP protocol.  These subroutines gets 
 called whenever there is alarm information to send.
 Authors: Kate Scholberg, Alec Habig                            
 *************************************************************/


#include        "sysdef.h"
#include	"inet.h"
#include        "packets.h"
#include        "math.h"

/* If the sent packet is not 
   echoed back right away, there is an error message. */

/* Pass params by reference for Fortran */

int gccli(int* datetime,u_short level,ULONG significance, 
	   u_short experiment)
{
  return gccli_(datetime,&level,&significance,&experiment);
}

/* For calling from Fortran */

int gccli_(int* datetime,u_short* level,ULONG* significance, 
	   u_short* experiment)
{

/* Send an alarm packet to the server */
/* Return 1 for successful send */

  int                ret_value;
  int	             sockfd;       /* socket file descriptor */
  struct sockaddr_in serv_addr;    /* socket address to server */
  char inputline[MAXLINE];         /* I/O buffers */
  char	sendline[MAXLINE];
  int whichpack;                   /* which packet ID to send */
  int	n;                         /* size of buffer */

  static int sequence = 0;

  struct alarm_packet alarm;

  u_short expt;
  u_short signif;  

  /* Info for feeding to socket */

  signif = *significance;
  

/* Set up sockets */

  if (open_clientside_socket(&sockfd,&serv_addr)) {
    fprintf(stderr,"Can't open socket\n");
    return(0);
  }

  fprintf(stdout,"Socket opened...\n");

  bzero(&alarm,sizeof(alarm));
  alarm.packet_id = PID_ALARM;
  alarm.experiment = *experiment;
  alarm.datetime[0] = datetime[0];
  alarm.datetime[1] = datetime[1];
  alarm.datetime[2] = datetime[2];
  alarm.level = *level;
  alarm.signif = *significance;
  n = pack_alarm(sendline,++sequence,&alarm);

/* send packets to the server */

  ret_value = send_packet(sockfd, &serv_addr, sendline, n);

  if (ret_value == 1)
  {
    fprintf(stdout,"Sent the alarm packet successfully!\n");
    fflush(stdout);
  }
  else
  {
    fprintf(stdout,"Alarm packet send failed!\n");
    fflush(stdout);
  }
  close(sockfd);


  return(ret_value);
}


int gcpingcli(int* datetime, 
	   u_short experiment)
{
  return gcpingcli_(datetime,&experiment);
}



int gcpingcli_(int* datetime, u_short* experiment)
{

/* Send a check packet to the server */
/* Return 1 for successful send */

  int                ret_value;
  int	             sockfd;       /* socket file descriptor */
  struct sockaddr_in serv_addr;    /* socket address to server */
  char inputline[MAXLINE];         /* I/O buffers */
  char	sendline[MAXLINE];
  int whichpack;                   /* which packet ID to send */
  int	n;                         /* size of buffer */

  static int sequence = 0;

  struct check_packet check;

/* Set up sockets */

  if (open_clientside_socket(&sockfd,&serv_addr)) {
    fprintf(stderr,"Can't open socket\n");
    return(0);
  }

  fprintf(stdout,"Socket opened...\n");

  bzero(&check,sizeof(check));
  check.packet_id = PID_CHECK;
  check.datetime[0] = datetime[0];
  check.datetime[1] = datetime[1];
  check.datetime[2] = datetime[2];

  check.experiment = *experiment;
  n = pack_check(sendline,++sequence,&check);

/* send packets to the server */

  ret_value = send_packet(sockfd, &serv_addr, sendline, n);

  if (ret_value == 1)
  {
    fprintf(stdout,"Sent the check packet!\n");
    fflush(stdout);
  }
  else
  {
    fprintf(stdout,"Check packet send failed!\n");
    fflush(stdout);
  }

  close(sockfd);

  return(ret_value);
}
