X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=server%2Fbbb_pin.c;h=4569578ecc7844fbba8d143be74fc450b2526e3d;hb=3f7f78dd3e12308da13213dcedc92bbcb3ecb51e;hp=f8ba011c9c8377126faa0dc0b422b18fd13dbef8;hpb=f5e2b07860f26bde42b9a9eb41ef68138ff2a379;p=matches%2FMCTX3420.git diff --git a/server/bbb_pin.c b/server/bbb_pin.c index f8ba011..4569578 100644 --- a/server/bbb_pin.c +++ b/server/bbb_pin.c @@ -9,6 +9,8 @@ #include #include #include +#include +#include "options.h" /** * Structure to represent a GPIO pin @@ -26,7 +28,7 @@ typedef struct */ typedef struct { - FILE * file_value; + int fd_value; } ADC_Pin; /** @@ -59,7 +61,9 @@ static char g_buffer[BUFSIZ] = ""; void GPIO_Export(int pin) { if (pin < 0 || pin > GPIO_NUM_PINS) - Fatal("Invalid pin number %d", pin); + { + Abort("Invalid pin number %d", pin); + } @@ -67,7 +71,9 @@ void GPIO_Export(int pin) sprintf(g_buffer, "%s/export", GPIO_DEVICE_PATH); FILE * export = fopen(g_buffer, "w"); if (export == NULL) - Fatal("Couldn't open %s to export GPIO pin %d - %s", g_buffer, pin, strerror(errno)); + { + Abort("Couldn't open %s to export GPIO pin %d - %s", g_buffer, pin, strerror(errno)); + } fprintf(export, "%d", pin); fclose(export); @@ -76,14 +82,21 @@ void GPIO_Export(int pin) sprintf(g_buffer, "%s/gpio%d/direction", GPIO_DEVICE_PATH, pin); g_gpio[pin].fd_direction = open(g_buffer, O_RDWR); if (g_gpio[pin].fd_direction < 0) - Fatal("Couldn't open %s for GPIO pin %d - %s", g_buffer, pin, strerror(errno)); + { + Abort("Couldn't open %s for GPIO pin %d - %s", g_buffer, pin, strerror(errno)); + } // Setup value file descriptor sprintf(g_buffer, "%s/gpio%d/value", GPIO_DEVICE_PATH, pin); g_gpio[pin].fd_value = open(g_buffer, O_RDWR); if (g_gpio[pin].fd_value < 0) - Fatal("Couldn't open %s for GPIO pin %d - %s", g_buffer, pin, strerror(errno)); + { + Abort("Couldn't open %s for GPIO pin %d - %s", g_buffer, pin, strerror(errno)); + } + + Log(LOGDEBUG, "Exported GPIO%d", pin); + //sleep(1); } /** @@ -93,7 +106,9 @@ void GPIO_Unexport(int pin) { if (pin < 0 || pin > GPIO_NUM_PINS) - Fatal("Invalid pin number %d", pin); + { + Abort("Invalid pin number %d", pin); + } // Close file descriptors close(g_gpio[pin].fd_value); @@ -105,7 +120,9 @@ void GPIO_Unexport(int pin) sprintf(g_buffer, "%s/unexport", GPIO_DEVICE_PATH); FILE * export = fopen(g_buffer, "w"); if (export == NULL) - Fatal("Couldn't open %s to export GPIO pin %d - %s", g_buffer, pin, strerror(errno)); + { + Abort("Couldn't open %s to export GPIO pin %d - %s", g_buffer, pin, strerror(errno)); + } fprintf(export, "%d", pin); fclose(export); @@ -121,37 +138,49 @@ void GPIO_Unexport(int pin) void PWM_Export(int pin) { if (pin < 0 || pin > PWM_NUM_PINS) - Fatal("Invalid pin number %d", pin); + { + Abort("Invalid pin number %d", pin); + } // Export the pin sprintf(g_buffer, "%s/export", PWM_DEVICE_PATH); FILE * export = fopen(g_buffer, "w"); if (export == NULL) - Fatal("Couldn't open %s to export PWM pin %d - %s", g_buffer, pin, strerror(errno)); + { + Abort("Couldn't open %s to export PWM pin %d - %s", g_buffer, pin, strerror(errno)); + } - fprintf(export, "%d", pin); + fprintf(export, "%d\n", pin); fclose(export); // Open file descriptors sprintf(g_buffer, "%s/pwm%d/run", PWM_DEVICE_PATH, pin); g_pwm[pin].fd_run = open(g_buffer, O_WRONLY); if (g_pwm[pin].fd_run < 0) - Fatal("Couldn't open %s for PWM pin %d - %s", g_buffer, pin, strerror(errno)); + { + Abort("Couldn't open %s for PWM pin %d - %s", g_buffer, pin, strerror(errno)); + } sprintf(g_buffer, "%s/pwm%d/polarity",PWM_DEVICE_PATH, pin); g_pwm[pin].fd_polarity = open(g_buffer, O_WRONLY); if (g_pwm[pin].fd_polarity < 0) - Fatal("Couldn't open %s for PWM pin %d - %s", g_buffer, pin, strerror(errno)); + { + Abort("Couldn't open %s for PWM pin %d - %s", g_buffer, pin, strerror(errno)); + } sprintf(g_buffer, "%s/pwm%d/period_ns",PWM_DEVICE_PATH, pin); g_pwm[pin].file_period = fopen(g_buffer, "w"); if (g_pwm[pin].file_period == NULL) - Fatal("Couldn't open %s for PWM pin %d - %s", g_buffer, pin, strerror(errno)); + { + Abort("Couldn't open %s for PWM pin %d - %s", g_buffer, pin, strerror(errno)); + } sprintf(g_buffer, "%s/pwm%d/duty_ns",PWM_DEVICE_PATH, pin); g_pwm[pin].file_duty = fopen(g_buffer, "w"); if (g_pwm[pin].file_duty == NULL) - Fatal("Couldn't open %s for PWM pin %d - %s", g_buffer, pin, strerror(errno)); + { + Abort("Couldn't open %s for PWM pin %d - %s", g_buffer, pin, strerror(errno)); + } // Don't buffer the streams setbuf(g_pwm[pin].file_period, NULL); @@ -167,7 +196,9 @@ void PWM_Export(int pin) void PWM_Unexport(int pin) { if (pin < 0 || pin > PWM_NUM_PINS) - Fatal("Invalid pin number %d", pin); + { + Abort("Invalid pin number %d", pin); + } // Close the file descriptors close(g_pwm[pin].fd_polarity); @@ -179,7 +210,9 @@ void PWM_Unexport(int pin) sprintf(g_buffer, "%s/unexport", PWM_DEVICE_PATH); FILE * export = fopen(g_buffer, "w"); if (export == NULL) - Fatal("Couldn't open %s to unexport PWM pin %d - %s", g_buffer, pin, strerror(errno)); + { + Abort("Couldn't open %s to unexport PWM pin %d - %s", g_buffer, pin, strerror(errno)); + } fprintf(export, "%d", pin); fclose(export); @@ -194,22 +227,16 @@ void PWM_Unexport(int pin) */ void ADC_Export() { - - FILE * export = fopen(ADC_EXPORT_PATH, "w"); - if (export == NULL) - Fatal("Couldn't open %s to export ADCs - %s", ADC_EXPORT_PATH, strerror(errno)); - - fprintf(export, "cape-bone-iio"); - fclose(export); - for (int i = 0; i < ADC_NUM_PINS; ++i) { - sprintf(g_buffer, "%s/AIN%d", ADC_DEVICE_PATH, i); - g_adc[i].file_value = fopen(g_buffer, "r"); - if (g_adc[i].file_value == NULL) - Fatal("Couldn't open ADC %d device file %s - %s", i, g_buffer, strerror(errno)); + sprintf(g_buffer, "%s/AIN%d", g_options.adc_device_path, i); + g_adc[i].fd_value = open(g_buffer, O_RDONLY); + if (g_adc[i].fd_value < 0) + { + Abort("Couldn't open ADC %d device file %s - %s", i, g_buffer, strerror(errno)); + } - setbuf(g_adc[i].file_value, NULL); + //setbuf(g_adc[i].file_value, NULL); } } @@ -220,7 +247,7 @@ void ADC_Export() void ADC_Unexport() { for (int i = 0; i < ADC_NUM_PINS; ++i) - fclose(g_adc[i].file_value); + close(g_adc[i].fd_value); } /** @@ -229,12 +256,16 @@ void ADC_Unexport() */ void GPIO_Set(int pin, bool value) { - if (pwrite(g_gpio[pin].fd_direction, "out", 3*sizeof(char), 0) != 3) - Fatal("Couldn't set GPIO %d direction - %s", pin, strerror(errno)); + if (pwrite(g_gpio[pin].fd_direction, "out", 3, 0) != 3) + { + Abort("Couldn't set GPIO %d direction - %s", pin, strerror(errno)); + } char c = '0' + (value); - if (pwrite(g_gpio[pin].fd_value, &c, 1*sizeof(char), 0) != 1) - Fatal("Couldn't read GPIO %d value - %s", pin, strerror(errno)); + if (pwrite(g_gpio[pin].fd_value, &c, 1, 0) != 1) + { + Abort("Couldn't read GPIO %d value - %s", pin, strerror(errno)); + } } @@ -244,11 +275,11 @@ void GPIO_Set(int pin, bool value) */ bool GPIO_Read(int pin) { - if (pwrite(g_gpio[pin].fd_direction, "in", 2*sizeof(char), 0) != 2) - Fatal("Couldn't set GPIO %d direction - %s", pin, strerror(errno)); + if (pwrite(g_gpio[pin].fd_direction, "in", 2, 0) != 2) + Log(LOGERR,"Couldn't set GPIO %d direction - %s", pin, strerror(errno)); char c = '0'; - if (pread(g_gpio[pin].fd_value, &c, 1*sizeof(char), 0) != 1) - Fatal("Couldn't read GPIO %d value - %s", pin, strerror(errno)); + if (pread(g_gpio[pin].fd_value, &c, 1, 0) != 1) + Log(LOGERR,"Couldn't read GPIO %d value - %s", pin, strerror(errno)); return (c == '1'); @@ -264,25 +295,32 @@ bool GPIO_Read(int pin) void PWM_Set(int pin, bool polarity, long period, long duty) { // Have to stop PWM before changing it - if (pwrite(g_pwm[pin].fd_run, "0", 1*sizeof(char), 0) != 1) - Fatal("Couldn't stop PWM %d - %s", pin, strerror(errno)); + if (pwrite(g_pwm[pin].fd_run, "0", 1, 0) != 1) + { + Abort("Couldn't stop PWM %d - %s", pin, strerror(errno)); + } char c = '0' + polarity; - if (pwrite(g_pwm[pin].fd_polarity, &c, 1*sizeof(char), 0) != 1) - Fatal("Couldn't set PWM %d polarity - %s", pin, strerror(errno)); - + if (pwrite(g_pwm[pin].fd_polarity, &c, 1, 0) != 1) + { + Abort("Couldn't set PWM %d polarity - %s", pin, strerror(errno)); + } rewind(g_pwm[pin].file_period); rewind(g_pwm[pin].file_duty); if (fprintf(g_pwm[pin].file_duty, "%lu", duty) == 0) - Fatal("Couldn't set duty cycle for PWM %d - %s", pin, strerror(errno)); - + { + Abort("Couldn't set duty cycle for PWM %d - %s", pin, strerror(errno)); + } if (fprintf(g_pwm[pin].file_period, "%lu", period) == 0) - Fatal("Couldn't set period for PWM %d - %s", pin, strerror(errno)); - - if (pwrite(g_pwm[pin].fd_run, "1", 1*sizeof(char), 0) != 1) - Fatal("Couldn't start PWM %d - %s", pin, strerror(errno)); + { + Abort("Couldn't set period for PWM %d - %s", pin, strerror(errno)); + } + if (pwrite(g_pwm[pin].fd_run, "1", 1, 0) != 1) + { + Abort("Couldn't start PWM %d - %s", pin, strerror(errno)); + } } @@ -292,9 +330,10 @@ void PWM_Set(int pin, bool polarity, long period, long duty) */ void PWM_Stop(int pin) { - if (pwrite(g_pwm[pin].fd_run, "0", 1*sizeof(char), 0) != 1) - Fatal("Couldn't stop PWM %d - %s", pin, strerror(errno)); - + if (pwrite(g_pwm[pin].fd_run, "0", 1, 0) != 1) + { + Abort("Couldn't stop PWM %d - %s", pin, strerror(errno)); + } } /** @@ -302,25 +341,28 @@ void PWM_Stop(int pin) * @param id - The ID of the ADC pin to read * @returns - The reading of the ADC channel */ -long ADC_Read(int id) +int ADC_Read(int id) { - - //Log(LOGDEBUG, "Called for pin %d", id); - char adc_val[ADC_DIGITS] = ""; - rewind(g_adc[id].file_value); - fgets(adc_val, sizeof(adc_val)/sizeof(char), g_adc[id].file_value); - for(int i = ADC_DIGITS-1; i > 0; --i) + char adc_str[ADC_DIGITS] = ""; + lseek(g_adc[id].fd_value, 0, SEEK_SET); + + int i = 0; + for (i = 0; i < ADC_DIGITS-1; ++i) { - if (adc_val[i] == '\n') - adc_val[i] = '\0'; + if (read(g_adc[id].fd_value, adc_str+i, 1) != 1) + break; + if (adc_str[i] == '\n') + { + adc_str[i] = '\0'; + break; + } } char * end; - long val = strtol(adc_val, &end, 10); + int val = strtol(adc_str, &end, 10); if (*end != '\0') { - Log(LOGERR, "Reading ADC%d gives %s - invalid!", id, adc_val); - } - //Log(LOGDEBUG, "Returns %lu", val); - return val; + Log(LOGERR, "Read non integer from ADC %d - %s", id, adc_str); + } + return val; }