PikaStdDevice_UART.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. #include "PikaStdDevice_UART.h"
  2. #include "PikaStdDevice_common.h"
  3. static pika_dev* _get_dev(PikaObj* self) {
  4. pika_dev* dev = PIKA_HAL_OBJ2DEV(self);
  5. if (NULL != dev) {
  6. return dev;
  7. }
  8. int id = obj_getInt(self, "id");
  9. char id_str[32] = {0};
  10. sprintf(id_str, "UART%d", id);
  11. dev = pika_hal_open(PIKA_HAL_UART, id_str);
  12. if (NULL == dev) {
  13. __platform_printf("Error: open UART '%s' failed.\r\n", id_str);
  14. }
  15. obj_setPtr(self, "pika_dev", dev);
  16. return dev;
  17. }
  18. void PikaStdDevice_UART_enable(PikaObj* self) {
  19. pika_dev* dev = _get_dev(self);
  20. if (NULL == dev) {
  21. __platform_printf("Error: open UART '%d' failed.\r\n",
  22. (int)obj_getInt(self, "id"));
  23. return;
  24. }
  25. pika_hal_UART_config cfg = {0};
  26. cfg.baudrate = obj_getInt(self, "baudRate");
  27. cfg.flow_control = obj_getInt(self, "flowControl");
  28. cfg.stop_bits = obj_getInt(self, "stopBits");
  29. cfg.parity = (PIKA_HAL_UART_PARITY)obj_getInt(self, "parity");
  30. cfg.data_bits = obj_getInt(self, "dataBits");
  31. if (!strEqu(obj_getStr(self, "TXpin"), "none")) {
  32. cfg.TX = pika_hal_open(PIKA_HAL_GPIO, obj_getStr(self, "TXpin"));
  33. if (NULL == cfg.TX) {
  34. __platform_printf("Error: open GPIO '%s' failed.\r\n",
  35. obj_getStr(self, "TXpin"));
  36. }
  37. }
  38. if (!strEqu(obj_getStr(self, "RXpin"), "none")) {
  39. cfg.RX = pika_hal_open(PIKA_HAL_GPIO, obj_getStr(self, "RXpin"));
  40. if (NULL == cfg.RX) {
  41. __platform_printf("Error: open GPIO '%s' failed.\r\n",
  42. obj_getStr(self, "RXpin"));
  43. }
  44. }
  45. if (!strEqu(obj_getStr(self, "RTSpin"), "none")) {
  46. cfg.RTS = pika_hal_open(PIKA_HAL_GPIO, obj_getStr(self, "RTSpin"));
  47. if (NULL == cfg.RTS) {
  48. __platform_printf("Error: open GPIO '%s' failed.\r\n",
  49. obj_getStr(self, "RTSpin"));
  50. }
  51. }
  52. if (!strEqu(obj_getStr(self, "CTSpin"), "none")) {
  53. cfg.CTS = pika_hal_open(PIKA_HAL_GPIO, obj_getStr(self, "CTSpin"));
  54. if (NULL == cfg.CTS) {
  55. __platform_printf("Error: open GPIO '%s' failed.\r\n",
  56. obj_getStr(self, "CTSpin"));
  57. }
  58. }
  59. int err = -1;
  60. err = pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
  61. if (err != 0) {
  62. __platform_printf("Error: config UART '%d' failed.\r\n",
  63. (int)obj_getInt(self, "id"));
  64. return;
  65. }
  66. err = pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
  67. if (err != 0) {
  68. __platform_printf("Error: enable UART '%d' failed.\r\n",
  69. (int)obj_getInt(self, "id"));
  70. return;
  71. }
  72. }
  73. void PikaStdDevice_UART_disable(PikaObj* self) {
  74. pika_dev* dev = _get_dev(self);
  75. if (NULL == dev) {
  76. __platform_printf("Error: open UART '%d' failed.\r\n",
  77. (int)obj_getInt(self, "id"));
  78. return;
  79. }
  80. pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
  81. }
  82. void PikaStdDevice_UART_init(PikaObj* self) {
  83. /* const */
  84. obj_setInt(self, "FLOW_CONTROL_NONE", PIKA_HAL_UART_FLOW_CONTROL_NONE);
  85. obj_setInt(self, "FLOW_CONTROL_RTS", PIKA_HAL_UART_FLOW_CONTROL_RTS);
  86. obj_setInt(self, "FLOW_CONTROL_CTS", PIKA_HAL_UART_FLOW_CONTROL_CTS);
  87. obj_setInt(self, "FLOW_CONTROL_RTS_CTS",
  88. PIKA_HAL_UART_FLOW_CONTROL_RTS_CTS);
  89. obj_setInt(self, "SIGNAL_RX", PIKA_HAL_UART_EVENT_SIGNAL_RX);
  90. obj_setInt(self, "SIGNAL_TX", PIKA_HAL_UART_EVENT_SIGNAL_TX);
  91. obj_setInt(self, "STOP_BITS_1", PIKA_HAL_UART_STOP_BITS_1);
  92. obj_setInt(self, "STOP_BITS_2", PIKA_HAL_UART_STOP_BITS_2);
  93. obj_setInt(self, "STOP_BITS_1_5", PIKA_HAL_UART_STOP_BITS_1_5);
  94. obj_setInt(self, "PARITY_NONE", PIKA_HAL_UART_PARITY_NONE);
  95. obj_setInt(self, "PARITY_ODD", PIKA_HAL_UART_PARITY_ODD);
  96. obj_setInt(self, "PARITY_EVEN", PIKA_HAL_UART_PARITY_EVEN);
  97. /* default */
  98. obj_setInt(self, "baudRate", 115200);
  99. obj_setInt(self, "id", 1);
  100. obj_setStr(self, "readBuff", "");
  101. obj_setInt(self, "flowControl", PIKA_HAL_UART_FLOW_CONTROL_NONE);
  102. obj_setStr(self, "TXpin", "none");
  103. obj_setStr(self, "RXpin", "none");
  104. obj_setStr(self, "RTSpin", "none");
  105. obj_setStr(self, "CTSpin", "none");
  106. obj_setInt(self, "dataBits", 8);
  107. obj_setInt(self, "parity", PIKA_HAL_UART_PARITY_NONE);
  108. obj_setInt(self, "stopBits", PIKA_HAL_UART_STOP_BITS_1);
  109. }
  110. void PikaStdDevice_UART___init__(PikaObj* self) {
  111. PikaStdDevice_UART_init(self);
  112. }
  113. char* PikaStdDevice_UART_read(PikaObj* self, int length) {
  114. int len = length;
  115. obj_setBytes(self, "_readData", NULL, len + 1);
  116. char* buff = (char*)obj_getBytes(self, "_readData");
  117. pika_dev* dev = _get_dev(self);
  118. int len_get = pika_hal_read(dev, buff, len);
  119. buff[len_get] = 0;
  120. obj_setStr(self, "readData", buff);
  121. return obj_getStr(self, "readData");
  122. }
  123. Arg* PikaStdDevice_UART_readBytes(PikaObj* self, int length) {
  124. int len = length;
  125. obj_setBytes(self, "_readData", NULL, len + 1);
  126. uint8_t* buff = obj_getBytes(self, "_readData");
  127. pika_dev* dev = _get_dev(self);
  128. int len_get = pika_hal_read(dev, buff, len);
  129. obj_setBytes(self, "readData", buff, len_get);
  130. return arg_copy(obj_getArg(self, "readData"));
  131. }
  132. void PikaStdDevice_UART_setBaudRate(PikaObj* self, int baudRate) {
  133. obj_setInt(self, "baudRate", baudRate);
  134. }
  135. void PikaStdDevice_UART_setFlowControl(PikaObj* self, int flowControl) {
  136. obj_setInt(self, "flowControl", flowControl);
  137. }
  138. void PikaStdDevice_UART_setDataBits(PikaObj* self, int dataBits) {
  139. obj_setInt(self, "dataBits", dataBits);
  140. }
  141. void PikaStdDevice_UART_setParity(PikaObj* self, int parity) {
  142. obj_setInt(self, "parity", parity);
  143. }
  144. void PikaStdDevice_UART_setStopBits(PikaObj* self, int stopBits) {
  145. obj_setInt(self, "stopBits", stopBits);
  146. }
  147. void PikaStdDevice_UART_setId(PikaObj* self, int id) {
  148. obj_setInt(self, "id", id);
  149. }
  150. void PikaStdDevice_UART_write(PikaObj* self, char* data) {
  151. pika_dev* dev = _get_dev(self);
  152. pika_hal_write(dev, data, strlen(data));
  153. }
  154. void PikaStdDevice_UART_writeBytes(PikaObj* self, uint8_t* data, int length) {
  155. int len = length;
  156. pika_dev* dev = _get_dev(self);
  157. pika_hal_write(dev, data, len);
  158. }
  159. void PikaStdDevice_UART_setCallback(PikaObj* self,
  160. Arg* eventCallBack,
  161. int filter) {
  162. #if PIKA_EVENT_ENABLE
  163. pika_dev* dev = _get_dev(self);
  164. _PikaStdDevice_setCallback(self, eventCallBack, (uintptr_t)dev);
  165. /* regist event to pika_hal */
  166. pika_hal_UART_config cfg_cb = {0};
  167. cfg_cb.event_callback = _PikaStdDevice_UART_event_handler;
  168. cfg_cb.event_callback_filter = filter;
  169. cfg_cb.event_callback_ena = PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE;
  170. pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg_cb);
  171. #else
  172. obj_setErrorCode(self, 1);
  173. obj_setSysOut(self, "[error] PIKA_EVENT_ENABLE is disabled.");
  174. #endif
  175. }
  176. void PikaStdDevice_UART_setCallBack(PikaObj* self,
  177. Arg* eventCallBack,
  178. int filter) {
  179. pika_platform_printf(
  180. "Warning: setCallBack is deprecated, use setCallback instead.\r\n");
  181. PikaStdDevice_UART_setCallback(self, eventCallBack, filter);
  182. }
  183. void PikaStdDevice_UART_close(PikaObj* self) {
  184. pika_dev* dev = _get_dev(self);
  185. pika_hal_UART_config* cfg = (pika_hal_UART_config*)dev->ioctl_config;
  186. if (NULL != cfg->TX) {
  187. pika_hal_close(cfg->TX);
  188. cfg->TX = NULL;
  189. }
  190. if (NULL != cfg->RX) {
  191. pika_hal_close(cfg->RX);
  192. cfg->RX = NULL;
  193. }
  194. if (NULL != cfg->RTS) {
  195. pika_hal_close(cfg->RTS);
  196. cfg->RTS = NULL;
  197. }
  198. if (NULL != cfg->CTS) {
  199. pika_hal_close(cfg->CTS);
  200. cfg->CTS = NULL;
  201. }
  202. pika_hal_close(dev);
  203. }
  204. void PikaStdDevice_UART_setPinCTS(PikaObj* self, char* pin) {
  205. obj_setStr(self, "CTSpin", pin);
  206. }
  207. void PikaStdDevice_UART_setPinRTS(PikaObj* self, char* pin) {
  208. obj_setStr(self, "RTSpin", pin);
  209. }
  210. void PikaStdDevice_UART_setPinRX(PikaObj* self, char* pin) {
  211. obj_setStr(self, "RXpin", pin);
  212. }
  213. void PikaStdDevice_UART_setPinTX(PikaObj* self, char* pin) {
  214. obj_setStr(self, "TXpin", pin);
  215. }