#include /* malloc free */ #include /* fprintf */ #include /* sin */ #include struct Fun *Fun(int adc_raw); void Fun_(struct Fun **fun_addr); int FunRead(const struct Fun *fun, int *read, size_t read_size); int main(int argc, char **argv); struct Fun { int adc_raw; double sinwave[256]; }; struct Fun *Fun(int adc_raw) { int i, size; struct Fun *fun; if(adc_raw < 0 || adc_raw > 1) return 0; fun = malloc(sizeof(struct Fun)); if(!fun) { Fun_(&fun); return 0; } fprintf(stderr, "Creating Fun at %p.\n", (void *)fun); fun->adc_raw = adc_raw; for(i = 0, size = sizeof(fun->sinwave) / sizeof(double); i < size; i++) fun->sinwave[i] = sin((i / (double)size) * 2 * M_PI); return fun; } void Fun_(struct Fun **fun_addr) { struct Fun *fun; if(!fun_addr || !(fun = *fun_addr)) return; fprintf(stderr, "Destroying Fun at %p.\n", (void *)fun); free(fun); fun = 0; *fun_addr = fun; } int FunRead(const struct Fun *fun, int *read, size_t read_size) { int i; if(!fun) return 0; fprintf(stderr, "Writing values?\n"); write_am9513_command(DISARM_COUNTERS | COUNTER_5); mode_D(5, SOURCE_F1, OUTPUT_TC_PULSE_HIGH, COUNT_DOWN); write_counter_load(5, 1 / (double)read_size); write_am9513_command(LOAD_AND_ARM_COUNTERS | COUNTER_5); fprintf(stderr, "Sampling %d values from ADC%d.\n", read_size, fun->adc_raw); adc_enable_external_start(); for(i = 0; i < read_size; i++) { read[i] = in_adc(fun->adc_raw); fprintf(stderr, "Read: %d\n", read[i]); } adc_disable_external_start(); return -1; } int main(int argc, char **argv) { int read[16]; const size_t read_size = sizeof(read) / sizeof(int); struct Fun *fun; fun = Fun(0); FunRead(fun, read, read_size); Fun_(&fun); return 0; } #if 0 struct axis { double min, max, delta, step, low, high; int start, stop, base; char *fmt, *label; }; struct graph { int left, right, bottom, top, width, height; struct axis x, y; } sample; const static int period = 1000; const static int array_size = 0; static int adc_raw; static int mode = 0; static short *array = 0; int idle_sample(void) { int i; /* important */ write_am9513_command(DISARM_COUNTERS | COUNTER_5); mode_D(5, SOURCE_F1, OUTPUT_TC_PULSE_HIGH, COUNT_DOWN); write_counter_load(5, period); write_am9513_command(LOAD_AND_ARM_COUNTERS | COUNTER_5); fprintf(stderr, "Sampling %d values from ADC%d\n", array_size, adc_raw); adc_enable_external_start(); for(i = 0; i < array_size; i++) array[i] = in_adc(adc_raw); adc_disable_external_start(); mode = 0; return 1; } #endif