/*
 * RCS info
 * $Author: cmn $
 * $Locker:  $
 * $Date: 2007/09/04 19:49:25 $
 * $Id: pbd.h,v 1.55 2007/09/04 19:49:25 cmn Exp $
 * $Revision: 1.55 $
 * $State: Exp $
 */
/**********************************************************************

	Header file for the pbd task.

**********************************************************************/



# ifndef PBD_H
# define PBD_H

#include <stdio.h>
#include <math.h>
#include <string.h>

#include <infr.h>
#include <orpgerr.h>
#include <vcp.h>
#include <gen_stat_msg.h>
#include <basedata.h>
#include <generic_basedata.h>
#include <orpg.h>
#include <orpgrda.h>
#include <orpggdr.h>
#include <prod_gen_msg.h>
#include <siteadp.h>
#include <orpgsite.h>


#define PBD_MAX_SCANS           	80 	/* Maximum volume scan number for
                                      		   volume scan number. */

/* Mask values for PBD_start_volume_required and PBD_start_elevation_required. */
/* PBD_DONT_SEND_RADIAL and PBD_SEND_RADIAL are only to be used if the
   least significant short is none zero.... otherwise PBD_PROCESS_NORMAL is
   only used.  PBD_SEND_RADIAL indicates subsequent radial messages should be 
   processed through the RPG.  PBD_DONT_SEND_RADIALS indicates subsequent radials
   should not be processed through RPG. */
#define PBD_SEND_RADIAL			0x00020000	
#define PBD_DONT_SEND_RADIAL   		0x00010000 
#define PBD_PROCESS_NORMAL     		0x00000000 

/* Return values from PH_radial_validation. */
#define PBD_NEW_FAILURE			0xfffffffe	
#define PBD_CONTINUING_FAILURE   	0xffffffff	
#define PBD_NORMAL             		0x00000000 

/* Macro definitions for ALARM services. */
#define PBD_INACTVTY_ALRM_ID     	1
#define PBD_INACTVTY_ALARM_INTERVAL     300
#define PBD_INACTVTY_CONT 	     	1800 

#define PBD_INBUF_CHECK_ALRM_ID		2
#define PBD_INBUF_CHECK_ALARM_INTERVAL	4

/* Macro definitions for related to azimuth resolution. */
#define HALF_DEG_RADIALS		1
#define ONE_DEG_RADIALS			2
#define LR_MAXN_RADIALS			400
#define HR_MAXN_RADIALS			800

#define PBD_MISSING_AZIMUTH		-999.0
#define PBD_MISSING_ELEVATION		-999.0

#ifdef GLOBAL_DEFINED
#define EXTERN
#else
#define EXTERN extern
#endif

typedef struct Moment_info {

   int rda_surv_bin_off;                /* Offset to first good surveillance bin
                                           (RDA radial). */

   int rpg_surv_bin_off;                /* Offset to first good surveillance bin
                                           (RPG radial). */

   int num_surv_bins;                   /* Number of surveillance bins to copy. */

   int rda_dop_bin_off;                 /* Offset to first good Doppler bin
                                           (RDA radial). */

   int rpg_dop_bin_off;                 /* Offset to first good Doppler bin
                                           (RPG radial). */

   int num_dop_bins;                    /* Number of Doppler bins to copy. */

} Moment_info_t;

Moment_info_t Info;               /* Bin offset information. */

int PBD_verbose;                  /* Verbosity level. */
int PBD_response_LB;		 /* Data ID for RDA response LB. */
int PBD_radial_out_LB;		 /* Data ID for process basedata LB. */
int PBD_weather_mode;		 /* Current weather mode to be advertised 
                                            with volume status. */
int PBD_vcp_number;		 /* Current volume coverage pattern. */
int PBD_super_res_this_elev;	 /* Set to 1 if this elevation is super res, 0 otherwise. */

/* Data structure used to save Reflectivity Moment data for split cut processing. */
typedef struct Moment {

   Generic_moment_t mom;

   unsigned char ref[MAX_BASEDATA_REF_SIZE];

} Z_t;

Z_t PBD_saved_ref[HR_MAXN_RADIALS];  /* Save reflectivity data for split cut processing. */
int PBD_n_saved;                 /* Number of radials saved */
Generic_basedata_header_t PBD_Z_hdr[HR_MAXN_RADIALS];
                                        /* Generic basedata header. */
Generic_elev_t PBD_Z_elev[HR_MAXN_RADIALS];
                                        /* Generic elevation header. */

int PBD_saved_ind;		 /* Used of split cut processing: Match reflectivity radial. */
int PBD_max_num_radials;	 	 /* Maximum number of radials as a function of azimuth
                                            resolution. */
int PBD_rad_wx_mode;		 /* Current weather mode to be advertised 
                                            in radial. */
int PBD_volume_scan_number;	 /* Current RPG volume scan number.  Value 
                                            varies between 1- 80. Used to support legacy. */
int PBD_volume_seq_number;        /* Current RPG volume scan sequence number. 
                                            Monotonically increasing number.  Used to
                                            support ORPG. */
int PBD_start_volume_required;    /* Start of volume scan required flag.  This 
                                            flag consists of two parts.  The most significant
                                            short indicates whether or not the current radial
                                            should be processed or not.  The least significant
                                            short is either TRUE (1) or FALSE (0).  */
int PBD_start_elevation_required; /* Start of elevation scan required flag.  Definition
                                            is similar to PBD_start_volume_required flag. */
int PBD_verify_elevation;         /* Verify elevation flag. */
int PBD_expected_elev_num;        /* RDA elevation number expected for next start of 
                                            elevation. */  
int PBD_current_elev_num;         /* The current RDA elevation number. */
char PBD_alg_control;             /* Algorithm control flag. */
char PBD_aborted_volume;          /* Aborted volume scan. */
int PBD_rda_comm_inactivity;	 /* RDA communication inactivity flag. */
time_t PBD_time_of_last_message;	 /* Time of last comm manager message received. */
int PBD_spot_blank_bitmap;	 /* Spot blanking bitmap for Scan Summary. */

#define     RESTART_VOLUME               1
#define     RESTART_ELEVATION            2
int  PBD_volume_restart_commanded; /* Flag, if set, indicates a volume restart command
                                             was received. */
int  PBD_elevation_restart_commanded; /* Flag, if set, indicates an elevation restart
                                                command was received. */
 short PBD_rda_height;             /* RDA height, in meters MSL. */

float PBD_latitude;               /* RDA latitude, in deg. */

float PBD_longitude;              /* RDA latitude, in deg. */

#define PBD_RADAR_NAME_LEN               6
 char  PBD_radar_name[PBD_RADAR_NAME_LEN]; /* RDA ICAO. */

 int PBD_old_weather_mode;         /* Previous scans weather mode. */

 int PBD_old_vcp_number;           /* Previous scans VCP number. */

 VCP_ICD_msg_t PBD_rda_vcp_data;	 /* Local copy of the RDA VCP data. */

 int PBD_volume_status_updated;   /* Flag, when set, indicates the Volume Status
                                           has been updated. */

/* Values for RDA control status.  Control status value obtained from ORPGRDA API. */
#define RDA_CONTROL_UNKNOWN     0
#define RDA_CONTROL_REMOTE      CS_RPG_REMOTE
#define RDA_CONTROL_LOCAL       CS_LOCAL_ONLY
#define RDA_CONTROL_EITHER      CS_EITHER

/* Values for RDA status (Only one we care about).  Value obtained from ORPGRDA API. */
#define RDA_STATUS_UNKNOWN      0
#define RDA_STATUS_PLAYBACK     AR_PLAYBACK

/* Global Function Prototypes */

/* Modules defined in pbd_set_scan_summary.c */
void SSS_set_scan_summary( int volscan_num,  int rpgwmode, 
                           int rpg_num_elev_cuts, int rda_num_elev_cuts,
                           Base_data_header *rpg_hd );
void SSS_init_read_scan_summary();

/* Modules defined in pbd_process_data.c */
int PD_process_incomplete_radial( char *rda_msg, int waveform_type );
int PD_move_data( Generic_basedata_t *gbd, char *rpg_basedata );
int PD_process_rda_vcp_message( char *vcp_data );

/* Modules defined in pbd_process_header.h */
int PH_process_new_cut( Generic_basedata_t *gbd, int *wftype,
                        Vol_stat_gsm_t *vs_gsm, int *rpg_num_elev_cuts );
int PH_process_header( Generic_basedata_t *gbd, char *rpg_basedata );
int PH_get_rda_status ( int item );
int PH_send_rda_control_command( int elev_num, int command, int reason );
int PH_restart_scan( int parameter_1, int parameter_2 );
int PH_process_restart_command( int command );
int PH_radial_validation ( Generic_basedata_t *gbd,
                           int *vol_aborted, int *unexpected_bov ); 
void PH_radial_accounting (Base_data_header *rpg_hd);

/* Modules defined in pbd.c */
void PBD_abort (char *format, ... );

/* Modules defined in pbd_verbose.c */
void VM_write_vcp_data( Vcp_struct *vcp );

/* Modules defined in pbd_super_reso.c */
int SR_save_SuperRes_refl_data( char *rda_msg, unsigned short azm,
                                unsigned short elev );
int SR_restore_SuperRes_refl_data( char *rpg_msg, unsigned short azm, 
                                   unsigned short elev );

#endif

