Code:
#ifndef __DATAFILE_H
#define __DATAFILE_H
#define VERSION_HEADER_STRING "Data Generated by ADACS Version %s\nDates are listed as JDO\n"
#define ADACS_VERSION_NUMBER "2.0.2"
#define VERSION_HEADER_VARS ADACS_VERSION_NUMBER
#ifndef DONOTDEFINEBITFUNCS
#define setbit(b, d) do {\
b |= (1 << (d));\
} while (0)
#define clearbit(b, d) do {\
b &= ~(1 << (d));\
} while (0)
#define testbit(b, d) (b & (1 << (d)))
#endif
#include <stdio.h>
#include <stdlib.h>
// Universal Data.
extern char *ERRORSTRING[];
extern char *GATESTRING[];
extern char *FLOWSTRING[];
extern char *TEMPSTRING[];
extern char *PRINTFILE[];
//PRINTFILE enum:
enum TMRI_PRINTFILE_LINES{
PFLINE_FIRST = 0,
PFLINE_ACAMS_PARAMETERS = PFLINE_FIRST, // 0
PFLINE_AGT_METH_CONC, // 1
PFLINE_NUMAGTS_UNIT, // 2
PFLINE_T_ELAPASED_SPEC, // 3
PFLINE_TMP_AMB, // 4
PFLINE_TMP_FLAME, // 5
PFLINE_TMP_BLOCK, // 6
PFLINE_TMP_VALVE, // 7
PFLINE_TMP_PCT, // 8
PFLINE_TMP_PCT_LO, // 9
PFLINE_TMP_PCT_HI, // 10
PFLINE_TMP_COL, // 11
PFLINE_TMP_COL1_LO, // 12
PFLINE_TMP_COL1_STEP, // 13
PFLINE_TMP_COL1_HI, // 14
PFLINE_TMP_COL2_LO, // 15
PFLINE_TMP_COL2_STEP, // 16
PFLINE_TMP_COL2_HI, // 17
PFLINE_FLOW_N2, // 18
PFLINE_FLOW_H2, // 19
PFLINE_FLOW_AIR, // 20
PFLINE_FLOW_SAM, // 21
PFLINE_FLOW_SAM_AVG, // 22
PFLINE_TIME_CYCLE, // 23
PFLINE_TIME_PURGE, // 24
PFLINE_TIME_SAMPLE, // 25
PFLINE_TIME_DESORB, // 26
PFLINE_TIME_COL1, // 27
PFLINE_TIME_COL2, // 28
PFLINE_TIME_ZERO, // 29
PFLINE_TIME_AGENT, // 30
PFLINE_TIME_INJECT, // 31
PFLINE_VOLT_PMT, // 32
PFLINE_ELEC_PMTSIG, // 33
PFLINE_ELEC_BUCK_COARSE, // 34
PFLINE_ELEC_BUCK_FINE, // 35
PFLINE_PK_HT, // 36
PFLINE_PK_RT, // 37
PFLINE_PK_FWHM, // 38
PFLINE_PK_BL, // 39
PFLINE_CAL_HT, // 40
PFLINE_CAL_NUM, // 41
PFLINE_CAL_TIMESTAMP, // 42
PFLINE_CAL_ALARM, // 43
PFLINE_SPLIT_CNTRL_STAT, // 44
PFLINE_SPLIT_GATE, // 45
PFLINE_SPLIT_DELTAFLOW, // 46
PFLINE_SPLIT_FLOW_MAIN, // 47
PFLINE_SPLIT_FLOW_VENT, // 48
PFLINE_SPLIT_PRES_MAIN, // 49
PFLINE_SPLIT_PRES_VENT, // 50
PFLINE_SPLIT_FIRST = PFLINE_SPLIT_CNTRL_STAT,
PFLINE_SPLIT_LAST = PFLINE_SPLIT_PRES_VENT,
PFLINE_NL_SEPARATOR, // 51
PFLINE_LAST = PFLINE_NL_SEPARATOR
};
// Universal enums
enum TMRI_BYTES {
BYTE_FIRST = 0,
BYTE_NUMAGENTS = BYTE_FIRST,
BYTE_WHICHAGENT,
BYTE_PACKEDBITS,
BYTE_LAST = BYTE_PACKEDBITS
};
#define PACKED_ALARM 0x01 // only one bit
#define PACKED_ERRORS 0x02 // only one bit
#define PACKED_NUMCALS 0x1c // three bits
#define PACKED_COMPLETECHROM 0x20 // only one bit
enum TMRI_STATE_FLAGS{
SFLAG_FIRST = 0,
SFLAG_CALMODE = SFLAG_FIRST,
SFLAG_CHALLENGE,
SFLAG_REPAIR,
SFLAG_SERVICE,
SFLAG_ADJUSTMODE,
SFLAG_NORMAL,
SFLAG_LAST = SFLAG_NORMAL
};
#define NUM_STATE_FLAGS (SFLAG_LAST - SFLAG_FIRST + 1)
#define NUM_STATE_FLAGS_BYTES (NUM_STATE_FLAGS / 8 + ((NUM_STATE_FLAGS % 8) ? 1:0))
#define setstateflags(flags, which) setbit(flags[which / 8], which % 8)
#define clearstateflags(flags, which) clearbit(flags[which / 8], which % 8)
#define teststateflags(flags, which) testbit(flags[which / 8], which % 8)
enum TMRI_CHROM_SHORTS {
CHROM_SHORTS_FIRST = 0,
CHROM_SHORTS_CHROMLEN = CHROM_SHORTS_FIRST,
CHROM_SHORTS_RC0S, // Real start of Agent gate for Agent 0
CHROM_SHORTS_RC0E, // Real end of Agent gate for Agent 0
CHROM_SHORTS_RC1S, // Real start of Agent gate for Agent 1
CHROM_SHORTS_RC1E, // Real end of Agent gate for Agent 1
CHROM_SHORTS_LAST = CHROM_SHORTS_RC1E
};
enum TMRI_DATES{
DATE_FIRST = 0,
DATE_DATE = DATE_FIRST,
DATE_CALDATE,
DATE_LAST = DATE_CALDATE
};
enum TMRI_ERRORS {
ERROR_FIRST = 0,
ERROR_RPCT = ERROR_FIRST,
ERROR_RCOL,
ERROR_TFFL,
ERROR_TPCT, // Placeholder, never used.
ERROR_TAMB,
ERROR_TFBL,
ERROR_TVAL,
ERROR_TCOL, // Placeholder, never used.
ERROR_TPLO,
ERROR_TPHI,
ERROR_TC1L,
ERROR_TC1H,
ERROR_TC1R, // Placeholder, never used.
ERROR_TC2L,
ERROR_TC2H,
ERROR_TC2R, // Placeholder, never used.
ERROR_FHYD,
ERROR_FNIT,
ERROR_FAIR,
ERROR_FSAM,
ERROR_VPMT,
ERROR_PNIT,
ERROR_PHYD,
ERROR_PAIR,
ERROR_SCNT, // Placeholder, never used.
ERROR_STIM, // Placeholder, never used.
ERROR_SDFL, // Placeholder, never used.
ERROR_SSFL,
ERROR_SVFL,
ERROR_SSPR,
ERROR_SVPR,
ERROR_SCBL,
ERROR_SPWR,
ERROR_UMAN,
ERROR_LAST = ERROR_UMAN
};
enum TMRI_FLOATS {
FLOAT_FIRST = 0,
FLOAT_CONCENTRATION = FLOAT_FIRST,
FLOAT_COLUMN1STEP,
FLOAT_COLUMN2STEP,
FLOAT_PMTSIG,
FLOAT_COARSEZERO,
FLOAT_FINEZERO,
FLOAT_PKHEIGHT,
FLOAT_PKHT = FLOAT_PKHEIGHT,
FLOAT_RETTIME,
FLOAT_FWHM,
FLOAT_BASELINE,
FLOAT_CALHT,
FLOAT_ALARMSETPOINT,
FLOAT_LAST = FLOAT_ALARMSETPOINT
};
enum TMRI_FLOWS {
FLOW_FIRST = 0,
FLOW_NITROGEN = FLOW_FIRST,
FLOW_N2 = FLOW_NITROGEN,
FLOW_NIT = FLOW_NITROGEN,
FLOW_HYDROGEN,
FLOW_H2 = FLOW_HYDROGEN,
FLOW_HYD = FLOW_HYDROGEN,
FLOW_AIR,
FLOW_SAMPLE,
FLOW_SAM = FLOW_SAMPLE,
FLOW_LAST = FLOW_SAMPLE
};
enum TMRI_GATES {
GATE_FIRST = 0,
GATE_CYCLE = GATE_FIRST,
GATE_TOTAL = GATE_CYCLE,
GATE_PURGE,
GATE_SAMPLE,
GATE_SAM = GATE_SAMPLE,
GATE_DESORB,
GATE_COLUMN1,
GATE_COL1 = GATE_COLUMN1,
GATE_COLUMN2,
GATE_COL2 = GATE_COLUMN2,
GATE_ZERO,
GATE_AGENT,
GATE_INJECT,
GATE_LAST = GATE_INJECT
};
enum TMRI_HEADER{
HEADER_FIRST = 0,
HEADER_NAME = HEADER_FIRST,
HEADER_VERSION = 4,
HEADER_CODE = 6,
HEADER_TYPE = HEADER_CODE,
HEADER_LAST
};
enum TMRI_SHORTS{
SHORT_FIRST = 0,
SHORT_UNITID = SHORT_FIRST,
SHORT_ELAPSEDTIME,
SHORT_SAMPLEAVERAGE,
SHORT_POINTSLEN,
SHORT_LAST = SHORT_POINTSLEN
};
enum TMRI_TEMPERATURES {
TMP_FIRST = 0,
TMP_AMBIENT = TMP_FIRST,
TMP_AMB = TMP_AMBIENT,
TMP_FPD_FLAME,
TMP_FLAME = TMP_FPD_FLAME,
TMP_FPD_BLOCK,
TMP_BLOCK = TMP_FPD_BLOCK,
TMP_VALVE,
TMP_PCT,
TMP_PCT_LOW,
TMP_PCT_HIGH,
TMP_COLUMN,
TMP_COL = TMP_COLUMN,
TMP_COLUMN1_LOW,
TMP_COL1_LOW = TMP_COLUMN1_LOW,
TMP_COLUMN1_HIGH,
TMP_COL1_HIGH = TMP_COLUMN1_HIGH,
TMP_COLUMN2_LOW,
TMP_COL2_LOW = TMP_COLUMN2_LOW,
TMP_COLUMN2_HIGH,
TMP_COL2_HIGH = TMP_COLUMN2_HIGH,
TMP_LAST = TMP_COLUMN2_HIGH
};
enum TMRI_TIMES{
TIME_FIRST = 0,
TIME_TIME = TIME_FIRST,
TIME_CALTIME,
TIME_LAST = TIME_CALTIME
};
enum TMRI_TYPES{
TYPE_FIRST = 0,
TYPE_PARAMREC = TYPE_FIRST,
TYPE_CHROM,
TYPE_CHROMREC = TYPE_CHROM,
TYPE_ERRORS,
TYPE_ERRORREC = TYPE_ERRORS,
TYPE_LAST = TYPE_ERRORS
};
// Universal Definitions (these don't need to be Universal, but oh well)
#define FILETYPE_LEN (HEADER_LAST - HEADER_FIRST + 1)
#define BYTES_LEN (BYTE_LAST - BYTE_FIRST + 1)
#define CHROM_LEN 249
#define EXTRABITS_LEN (CHROM_LEN / 8 + ((CHROM_LEN % 8) ? 1:0))
#define SHORTS_LEN (SHORT_LAST - SHORT_FIRST + 1)
#define FLOATS_LEN (FLOAT_LAST - FLOAT_FIRST + 1)
#define DATES_LEN (DATE_LAST - DATE_FIRST + 1)
#define TIMES_LEN (TIME_LAST - TIME_FIRST + 1)
#define TEMPERATURES_LEN (TMP_LAST - TMP_FIRST + 1)
#define TMP_LEN TEMPERATURES_LEN
#define FLOWS_LEN (FLOW_LAST - FLOW_FIRST + 1)
#define GATES_LEN (GATE_LAST - GATE_FIRST + 1)
#define CHROM_SHORTS_LEN (CHROM_SHORTS_LAST - CHROM_SHORTS_FIRST + 1)
#define CUR_FILECODE 0
// Universal Data structures.
#ifndef DONOTDEFINEPACK
#define __PACK1 __attribute__((aligned (1),packed))
#endif
struct TMRI_Date{
short year;
char month, day;
} __PACK1;
typedef struct TMRI_Date TMRI_DATE;
struct TMRI_Time{
char hour, minute, second;
} __PACK1;
typedef struct TMRI_Time TMRI_TIME;
struct TMRI_ShrtSAT{
short setpoint, actual, tolerance;
} __PACK1;
typedef struct TMRI_ShrtSAT TMRI_SHRTSAT;
struct TMRI_ShrtSE{
short start, end;
} __PACK1;
typedef struct TMRI_ShrtSE TMRI_SHRTSE;
//Rev 1 addition of Splitter data.
enum SPLIT_FLOATS{
SPLT_F_FIRST = 0,
SPLT_F_PRESS_SETPT_MAIN = SPLT_F_FIRST,
SPLT_F_PRESS_SETPT_VENT,
SPLT_F_PRESS_ACT_MAIN,
SPLT_F_PRESS_ACT_VENT,
SPLT_F_PRESS_ERROR_MIN_MAIN,
SPLT_F_PRESS_ERROR_MIN_VENT,
SPLT_F_PRESS_ERROR_MAX_MAIN,
SPLT_F_PRESS_ERROR_MAX_VENT,
SPLT_F_FLOW_SETPT_MAIN,
SPLT_F_FLOW_SETPT_VENT,
SPLT_F_FLOW_ACT_MAIN,
SPLT_F_FLOW_ACT_VENT,
SPLT_F_FLOW_DELTA,
SPLT_F_LAST = SPLT_F_FLOW_DELTA
};
#define SPLT_FLOATS_LEN (SPLT_F_LAST - SPLT_F_FIRST + 1)
enum SPLIT_FLAGS{
FSPLT_FIRST = 0,
FSPLT_EXISTS = FSPLT_FIRST,
FSPLT_ON,
FSPLT_LAST = FSPLT_ON
};
#define SPLT_FLAGS_LEN (FSPLT_LAST - FSPLT_FIRST + 1)
#define SPLT_FLAGS_BYTES (SPLT_FLAGS_LEN / 8 + ((SPLT_FLAGS_LEN % 8) ? 1:0))
struct TMRI_Splt{
float floats[SPLT_FLOATS_LEN];
char flags[SPLT_FLAGS_BYTES];
short flowtol[2]; // Vent and main flow tol.
TMRI_SHRTSE times;
} __PACK1;
typedef struct TMRI_Splt TMRI_SPLT;
struct TMRI_ParamRec_R1{
char filetype[FILETYPE_LEN];
float floats[FLOATS_LEN];
short shorts[SHORTS_LEN], chrom[CHROM_LEN];
TMRI_DATE dates[DATES_LEN];
TMRI_TIME times[TIMES_LEN];
TMRI_SHRTSAT temperatures[TMP_LEN];
TMRI_SHRTSAT flows[FLOWS_LEN];
TMRI_SHRTSAT pmtvoltage;
TMRI_SHRTSE gates[GATES_LEN];
char agentname[3], methodname[5], bytes[BYTES_LEN], extrabits[EXTRABITS_LEN];
int startofcycle; // Rev 1. Secs since EPOC, time cycle started.
TMRI_SPLT split; // Rev 1. Splitter information.
unsigned char flags[NUM_STATE_FLAGS_BYTES]; // Rev 1. Numerous flags giving the ACAMS state.
} __PACK1;
typedef struct TMRI_ParamRec_R1 TMRI_PARAMREC_R1;
struct TMRI_ParamRec_R0{
char filetype[FILETYPE_LEN];
float floats[FLOATS_LEN];
short shorts[SHORTS_LEN], chrom[CHROM_LEN];
TMRI_DATE dates[DATES_LEN];
TMRI_TIME times[TIMES_LEN];
TMRI_SHRTSAT temperatures[TMP_LEN];
TMRI_SHRTSAT flows[FLOWS_LEN];
TMRI_SHRTSAT pmtvoltage;
TMRI_SHRTSE gates[GATES_LEN];
char agentname[3], methodname[5], bytes[BYTES_LEN], extrabits[EXTRABITS_LEN];
} __PACK1;
typedef struct TMRI_ParamRec_R0 TMRI_PARAMREC_R0;
#define TMRI_PARAMREC_VERSION 1
struct TMRI_ChromRec_R0 {
char filetype[FILETYPE_LEN]; // adf + file code.
short shorts[CHROM_SHORTS_LEN], *chrom;
char *extrabits;
} __PACK1;
typedef struct TMRI_ChromRec_R0 TMRI_CHROMREC_R0;
#define TMRI_CHROMREC_VERSION 0
struct TMRI_ErrorDetail_R0{
char code[1]; // (ERRORS & 0xff)
short time; // Cycle Time
} __PACK1;
typedef struct TMRI_ErrorDetail_R0 TMRI_ERRORDETAIL_R0;
struct TMRI_ErrorDetail_R1{
char code; // (ERRORS & 0xff) // Rev 1, removed the array changed to just byte.
TMRI_TIME time; // Cycle Time // Rev 1, changed to a TMRI_TIME.
} __PACK1;
typedef struct TMRI_ErrorDetail_R1 TMRI_ERRORDETAIL_R1;
typedef TMRI_ERRORDETAIL_R1 TMRI_ERRORDETAIL;
struct TMRI_Errors_R0 {
char filetype[FILETYPE_LEN];
short len;
TMRI_ERRORDETAIL_R0 *list;
} __PACK1;
typedef struct TMRI_Errors_R0 TMRI_ERRORS_R0, TMRI_ERRORREC_R0;
struct TMRI_Errors_R1 {
char filetype[FILETYPE_LEN];
short len;
TMRI_ERRORDETAIL_R1 *list;
} __PACK1;
typedef struct TMRI_Errors_R1 TMRI_ERRORS_R1, TMRI_ERRORREC_R1;
#define TMRI_ERRORREC_VERSION 1
// Universal struct Type defs (to set the current REC needed).
#define LARGEST_PARAMREC_SIZE (sizeof(TMRI_PARAMREC_R0))
typedef TMRI_PARAMREC_R1 TMRI_PARAMREC;
typedef TMRI_CHROMREC_R0 TMRI_CHROMREC;
typedef TMRI_ERRORREC_R1 TMRI_ERRORS, TMRI_ERRORREC;