/imraa/imraa_io.c

https://gitlab.com/mraa/mraa · C · 161 lines · 144 code · 9 blank · 8 comment · 64 complexity · f1332cf38680b58a1bdc11fb9bb63087 MD5 · raw file

  1. /*
  2. * Author: Brendan Le Foll <brendan.le.foll@intel.com>
  3. * Copyright (c) 2015-2016 Intel Corporation.
  4. *
  5. * SPDX-License-Identifier: MIT
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <stdint.h>
  11. #include <stdbool.h>
  12. #include <unistd.h>
  13. #include <error.h>
  14. #include <sys/types.h>
  15. #include <json-c/json.h>
  16. #include <pwd.h>
  17. #include <mraa/uart.h>
  18. #include <mraa/gpio.h>
  19. #include <mraa/i2c.h>
  20. #include <mraa/pwm.h>
  21. #include <mraa_internal.h>
  22. #include <imraa_arduino.h>
  23. #define SYSFS_CLASS_GPIO "/sys/class/gpio"
  24. #define MAX_SIZE 64
  25. typedef struct mraa_io_objects_t {
  26. const char* type;
  27. int index;
  28. bool raw;
  29. const char* label;
  30. const char* user;
  31. } mraa_io_objects_t;
  32. void
  33. imraa_handle_IO(struct json_object* jobj)
  34. {
  35. struct mraa_io_objects_t* mraa_io_obj;
  36. struct json_object* ioarray;
  37. int ionum = 0;
  38. int i;
  39. if (json_object_object_get_ex(jobj, "IO", &ioarray) == true) {
  40. ionum = json_object_array_length(ioarray);
  41. printf("Length of IO array is %d\n", ionum);
  42. mraa_io_obj = (mraa_io_objects_t*) calloc(ionum, sizeof(mraa_io_objects_t));
  43. if (!mraa_io_obj) {
  44. printf("imraa_handle_IO malloc failed\n");
  45. exit(1);
  46. }
  47. int index2 = -1;
  48. // optional index for io configuration;
  49. if (json_object_is_type(ioarray, json_type_array)) {
  50. for (i = 0; i < ionum; i++) {
  51. struct json_object* ioobj = json_object_array_get_idx(ioarray, i);
  52. struct json_object* x;
  53. if (json_object_object_get_ex(ioobj, "type", &x) == true) {
  54. mraa_io_obj[i].type = json_object_get_string(x);
  55. }
  56. if (json_object_object_get_ex(ioobj, "index", &x) == true) {
  57. mraa_io_obj[i].index = json_object_get_int(x);
  58. }
  59. if (json_object_object_get_ex(ioobj, "raw", &x) == true) {
  60. mraa_io_obj[i].raw = json_object_get_boolean(x);
  61. }
  62. if (json_object_object_get_ex(ioobj, "label", &x) == true) {
  63. mraa_io_obj[i].label = json_object_get_string(x);
  64. }
  65. if (json_object_object_get_ex(ioobj, "index2", &x) == true) {
  66. index2 = json_object_get_int(x);
  67. }
  68. if (json_object_object_get_ex(ioobj, "user", &x) == true) {
  69. mraa_io_obj[i].user = json_object_get_string(x);
  70. }
  71. // starting io configuration
  72. if (strcmp(mraa_io_obj[i].type, "gpio") == 0) {
  73. mraa_gpio_context gpio = NULL;
  74. if (mraa_io_obj[i].raw) {
  75. gpio = mraa_gpio_init_raw(mraa_io_obj[i].index);
  76. } else {
  77. gpio = mraa_gpio_init(mraa_io_obj[i].index);
  78. }
  79. if (gpio != NULL) {
  80. if (mraa_io_obj[i].user != NULL) {
  81. int sysfs_gpio_pin = mraa_gpio_get_pin_raw(gpio);
  82. if (sysfs_gpio_pin >= 0) {
  83. char bu[MAX_SIZE];
  84. snprintf(bu, MAX_SIZE, SYSFS_CLASS_GPIO "/gpio%d/value", sysfs_gpio_pin);
  85. struct passwd* user = getpwnam(mraa_io_obj[i].user);
  86. if (user != NULL) {
  87. if (chown(bu, user->pw_uid, user->pw_gid) == -1) {
  88. fprintf(stderr, "Couldn't change ownership of file %s to %d:%d\n", bu, user->pw_uid, user->pw_gid);
  89. } else {
  90. fprintf(stderr, "Invalid user %s\n", mraa_io_obj[i].user);
  91. }
  92. }
  93. }
  94. mraa_result_t r = mraa_gpio_owner(gpio, 0);
  95. if (r != MRAA_SUCCESS) {
  96. mraa_result_print(r);
  97. }
  98. }
  99. mraa_gpio_close(gpio);
  100. } else if (strcmp(mraa_io_obj[i].type, "i2c") == 0) {
  101. mraa_i2c_context i2c = NULL;
  102. if (mraa_io_obj[i].raw) {
  103. i2c = mraa_i2c_init_raw(mraa_io_obj[i].index);
  104. } else {
  105. i2c = mraa_i2c_init(mraa_io_obj[i].index);
  106. }
  107. if (i2c != NULL) {
  108. mraa_i2c_stop(i2c);
  109. }
  110. } else if (strcmp(mraa_io_obj[i].type, "pwm") == 0) {
  111. mraa_pwm_context pwm = NULL;
  112. if (mraa_io_obj[i].raw) {
  113. pwm = mraa_pwm_init_raw(index2, mraa_io_obj[i].index);
  114. } else {
  115. pwm = mraa_pwm_init(mraa_io_obj[i].index);
  116. }
  117. if (pwm != NULL) {
  118. mraa_result_t r = mraa_pwm_owner(pwm, 0);
  119. if (r != MRAA_SUCCESS) {
  120. mraa_result_print(r);
  121. }
  122. mraa_pwm_close(pwm);
  123. }
  124. } else if (strcmp(mraa_io_obj[i].type, "spi") == 0) {
  125. mraa_spi_context spi = NULL;
  126. if (mraa_io_obj[i].raw) {
  127. spi = mraa_spi_init_raw(mraa_io_obj[i].index, index2);
  128. } else {
  129. spi = mraa_spi_init(mraa_io_obj[i].index);
  130. }
  131. if (spi != NULL) {
  132. mraa_spi_stop(spi);
  133. }
  134. } else if (strcmp(mraa_io_obj[i].type, "uart") == 0) {
  135. mraa_uart_context uart = NULL;
  136. if (mraa_io_obj[i].raw) {
  137. uart = mraa_uart_init_raw(mraa_io_obj[i].label);
  138. } else {
  139. uart = mraa_uart_init(mraa_io_obj[i].index);
  140. }
  141. if (uart != NULL) {
  142. mraa_uart_stop(uart);
  143. }
  144. }
  145. }
  146. }
  147. } else {
  148. fprintf(stderr, "IO array incorrectly parsed\n");
  149. }
  150. free(mraa_io_obj);
  151. }
  152. }