123 lines
3.3 KiB
C
123 lines
3.3 KiB
C
#ifndef _DEVICE_H_
|
|
#define _DEVICE_H_
|
|
|
|
#define MAX_DEVICES 8
|
|
|
|
#define SAMPLE_ARRAY_SZ 1000
|
|
|
|
#include "utility.h"
|
|
#include "params.h"
|
|
|
|
typedef enum device_state_t
|
|
{
|
|
/** The counter has not yet been created or has been destroyed */
|
|
device_idle = 0,
|
|
/** The counter has not yet been started or has been stopped */
|
|
device_stopped,
|
|
/** The counter is counting */
|
|
device_running,
|
|
/** the counter has been paused */
|
|
device_paused
|
|
} DEVICE_STATE;
|
|
|
|
/**
|
|
* Logical counter sample
|
|
*/
|
|
typedef struct sample_t
|
|
{
|
|
/** sample number */
|
|
int sample_counter;
|
|
/** poll number */
|
|
int poll_counter;
|
|
/** time of last read */
|
|
struct timeval timestamp;
|
|
/** logical counter value */
|
|
uint64 counter_value;
|
|
/** extended physical counter value */
|
|
uint64 count64;
|
|
/** counts between current and previous */
|
|
int count_delta;
|
|
/** number of polls */
|
|
int num_polls;
|
|
/** this data is valid */
|
|
bool valid;
|
|
/** time between current and previous */
|
|
double time_delta;
|
|
/** computed */
|
|
double counter_rate;
|
|
/** computed */
|
|
double average_rate;
|
|
/** computed */
|
|
double minimum_rate;
|
|
/** computed */
|
|
double maximum_rate;
|
|
} SAMPLE, *pSAMPLE;
|
|
|
|
typedef struct counter_t
|
|
{
|
|
char name[64];
|
|
DEVICE_STATE state;
|
|
/** time of last start */
|
|
struct timeval start_time;
|
|
/** time of last stop */
|
|
struct timeval stop_time;
|
|
/** time of this read */
|
|
struct timeval current_time;
|
|
/** time of last read */
|
|
struct timeval previous_time;
|
|
/** time of next sample closure */
|
|
struct timeval sample_timer;
|
|
/** time of next report generation */
|
|
struct timeval report_timer;
|
|
/** accumulated runtime */
|
|
struct timeval accumulated;
|
|
/** Current value of logical 64-bit counter */
|
|
uint64 current_count;
|
|
/** an array of samples to be used for reporting */
|
|
SAMPLE sample_array[SAMPLE_ARRAY_SZ];
|
|
/** calculated values for reporting */
|
|
SAMPLE report;
|
|
/** index into the sample array of the current sample */
|
|
int sample_index;
|
|
/** number of polls */
|
|
int poll_counter;
|
|
/** number of samples */
|
|
int sample_counter;
|
|
/** is a terminal count exception due */
|
|
bool terminal_due;
|
|
/** error: 0:none, 1:low, 2:high */
|
|
int range_error;
|
|
/** is a range exception gate active */
|
|
bool range_gated;
|
|
/** Extended physical counter value */
|
|
uint64 count64;
|
|
/** Control parameters */
|
|
PARAMETERS params;
|
|
/** active value of parameter source */
|
|
int source;
|
|
/** active value of parameter output_line */
|
|
int output_line;
|
|
struct device_private_t* private_data;
|
|
} DEVICE, *pDEVICE;
|
|
|
|
void make_report(DEVICE* device);
|
|
void device_sample(DEVICE* device);
|
|
void device_send(DEVICE* device, int n);
|
|
void device_read(DEVICE* device, int n);
|
|
void device_print(DEVICE* device, FILE* fd);
|
|
void device_report(DEVICE* device);
|
|
int device_init(DEVICE** cpp, char* name);
|
|
int device_start(DEVICE* device);
|
|
int device_stop(DEVICE* device);
|
|
int device_pause(DEVICE* device);
|
|
int device_resume(DEVICE* device);
|
|
int device_command(void* device, const char* cmd);
|
|
int device_poll(DEVICE* device);
|
|
void device_term(DEVICE* device);
|
|
bool device_fatal(int error);
|
|
void device_errmsg(char* buff, int len);
|
|
double device_time_to_next_sample(DEVICE* device);
|
|
double device_time_to_next_report(DEVICE* device);
|
|
|
|
#endif
|