PageRenderTime 52ms CodeModel.GetById 29ms RepoModel.GetById 0ms app.codeStats 0ms

/firmware/lib/serial_handler.c

https://github.com/schneider42/uberbus
C | 112 lines | 94 code | 13 blank | 5 comment | 19 complexity | 74a18c40281c249c4d9ddbc43dba6a66 MD5 | raw file
  1. #include <stdint.h>
  2. #include <string.h>
  3. #include "ubconfig.h"
  4. #include "usart.h"
  5. #include "serial_handler.h"
  6. uint8_t buffer[SERIAL_BUFFERLEN];
  7. //uint8_t serial_buffer[SERIAL_BUFFERLEN];
  8. inline void serial_putcenc(uint8_t c)
  9. {
  10. if(c == SERIAL_ESCAPE)
  11. uart1_putc(SERIAL_ESCAPE);
  12. uart1_putc(c);
  13. }
  14. void serial_putsenc(char * s)
  15. {
  16. while(*s){
  17. if(*s == SERIAL_ESCAPE)
  18. uart1_putc(SERIAL_ESCAPE);
  19. uart1_putc(*s++);
  20. }
  21. }
  22. void serial_putenc(uint8_t * d, uint16_t n)
  23. {
  24. uint16_t i;
  25. for(i=0;i<n;i++){
  26. if(*d == SERIAL_ESCAPE)
  27. uart1_putc(SERIAL_ESCAPE);
  28. uart1_putc(*d++);
  29. }
  30. }
  31. inline void serial_putStart(void)
  32. {
  33. uart1_putc(SERIAL_ESCAPE);
  34. uart1_putc(SERIAL_START);
  35. }
  36. inline void serial_putStop(void)
  37. {
  38. uart1_putc(SERIAL_ESCAPE);
  39. uart1_putc(SERIAL_END);
  40. }
  41. #ifdef USEDEBUG
  42. void serial_sendFrames(char * s)
  43. {
  44. serial_putStart();
  45. serial_putsenc(s);
  46. serial_putStop();
  47. }
  48. #endif
  49. void serial_sendFramec(uint8_t s)
  50. {
  51. serial_putStart();
  52. serial_putcenc(s);
  53. serial_putStop();
  54. }
  55. uint16_t serial_readline(uint8_t * buf, uint8_t max)
  56. {
  57. uint16_t l;
  58. l = readline();
  59. if( l ){
  60. if( l > max )
  61. l = max;
  62. memcpy(buf,buffer,l);
  63. }
  64. return l;
  65. }
  66. uint16_t readline( void )
  67. {
  68. static int fill = 0;
  69. static uint8_t escaped = 0;
  70. int i = uart1_getc();
  71. uint8_t data;
  72. if ( i & UART_NO_DATA ){
  73. return 0;
  74. }
  75. data = i&0xFF;
  76. /*serial_putStart();
  77. serial_putcenc('D');
  78. serial_putcenc(data);
  79. serial_putStop();*/
  80. if(data == SERIAL_ESCAPE){
  81. if(!escaped){
  82. escaped = 1;
  83. return 0;
  84. }
  85. escaped = 0;
  86. }else if(escaped){
  87. escaped = 0;
  88. if(data == SERIAL_START){
  89. fill = 0;
  90. return 0;
  91. }else if( data == SERIAL_END){
  92. return fill;
  93. }
  94. }
  95. buffer[fill++] = data;
  96. if(fill >= SERIAL_BUFFERLEN)
  97. fill = SERIAL_BUFFERLEN -1;
  98. return 0;
  99. }