51char *option[N_OPTIONS] =
57 "sdds2agilentArb [<inputFile>] [<outputFile>] [-pipe[=in][,out]]\n\n"
58 "Converts SDDS to Agilent Arbitrary Waveform files.\n"
59 "Program by Robert Soliday. (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")\n";
61int main(
int argc,
char *argv[]) {
64 unsigned long pipe_flags = 0;
65 char *input = NULL, *output = NULL;
76 short *waveform = NULL;
81 argc =
scanargs(&scanned, argc, argv);
83 fprintf(stderr,
"%s", usage);
86 for (i_arg = 1; i_arg < argc; i_arg++) {
87 if (scanned[i_arg].arg_type == OPTION) {
88 switch (
match_string(scanned[i_arg].list[0], option, N_OPTIONS, 0)) {
91 scanned[i_arg].n_items - 1, &pipe_flags)) {
92 fprintf(stderr,
"invalid -pipe syntax\n");
97 fprintf(stderr,
"invalid option seen\n");
98 fprintf(stderr,
"%s", usage);
103 input = scanned[i_arg].list[0];
105 output = scanned[i_arg].list[0];
107 fprintf(stderr,
"too many filenames\n");
108 fprintf(stderr,
"%s", usage);
119 NULL)) != SDDS_CHECK_OKAY) {
120 fprintf(stderr,
"error: Floating type column named I does not exist\n");
124 NULL)) != SDDS_CHECK_OKAY) {
125 fprintf(stderr,
"error: Floating type column named Q does not exist\n");
129 if (SDDS_ReadTable(&sdds_dataset) != 1) {
130 fprintf(stderr,
"error: No data found in SDDS file\n");
133 points = SDDS_RowCount(&sdds_dataset);
144 for (i = 0; i < points; i++) {
145 if (max_amp < i_wave[i])
147 else if (min_amp > i_wave[i])
149 if (max_amp < q_wave[i])
151 else if (min_amp > q_wave[i])
154 max_amp = fabs(max_amp);
155 min_amp = fabs(min_amp);
156 if (min_amp > max_amp)
159 scale = 32767 / max_amp;
160 waveform = malloc(
sizeof(
short) * points * 2);
161 for (i = 0; i < points; i++) {
162 waveform[2 * i] = (short)floor(i_wave[i] * scale + 0.5);
163 waveform[2 * i + 1] = (short)floor(q_wave[i] * scale + 0.5);
169 p_char = (
char *)&waveform[0];
170 for (i = 0; i < 2 * points; i++) {
172 *p_char = *(p_char + 1);
180 if (_setmode(_fileno(stdout), _O_BINARY) == -1) {
181 fprintf(stderr,
"error: unable to set stdout to binary mode\n");
187 fd = fopen(output,
"wb");
190 fprintf(stderr,
"unable to open output file for writing\n");
193 fwrite((
void *)waveform,
sizeof(
short), points * 2, fd);
SDDS (Self Describing Data Set) Data Types Definitions and Function Prototypes.
int32_t SDDS_CheckColumn(SDDS_DATASET *SDDS_dataset, char *name, char *units, int32_t type, FILE *fp_message)
Checks if a column exists in the SDDS dataset with the specified name, units, and type.
void SDDS_PrintErrors(FILE *fp, int32_t mode)
Prints recorded error messages to a specified file stream.
void SDDS_RegisterProgramName(const char *name)
Registers the executable program name for use in error messages.
int32_t SDDS_IsBigEndianMachine()
Determines whether the current machine uses big-endian byte ordering.
#define SDDS_ANY_FLOATING_TYPE
Special identifier used by SDDS_Check*() routines to accept any floating-point type.
long match_string(char *string, char **option, long n_options, long mode)
Matches a given string against an array of option strings based on specified modes.
int scanargs(SCANNED_ARG **scanned, int argc, char **argv)
long processPipeOption(char **item, long items, unsigned long *flags)
void processFilenames(char *programName, char **input, char **output, unsigned long pipeFlags, long noWarnings, long *tmpOutputUsed)
void free_scanargs(SCANNED_ARG **scanned, int argc)