PageRenderTime 23ms CodeModel.GetById 32ms RepoModel.GetById 0ms app.codeStats 0ms

/firmware/devtools/ubrfsniffer/serial_handler.c

https://github.com/schneider42/uberbus
C | 110 lines | 92 code | 13 blank | 5 comment | 19 complexity | 050ae17211a051dfc51216dbb8b26271 MD5 | raw file
  1. #include <avr/io.h>
  2. #include <stdint.h>
  3. #include <string.h>
  4. #include "uart.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. void serial_sendFrames(char * s)
  42. {
  43. serial_putStart();
  44. serial_putsenc(s);
  45. serial_putStop();
  46. }
  47. void serial_sendFramec(uint8_t s)
  48. {
  49. serial_putStart();
  50. serial_putcenc(s);
  51. serial_putStop();
  52. }
  53. uint16_t serial_readline(uint8_t * buf, uint16_t max)
  54. {
  55. uint16_t l;
  56. l = readline();
  57. if( l ){
  58. if( l > max )
  59. l = max;
  60. memcpy(buf,buffer,l);
  61. }
  62. return l;
  63. }
  64. uint16_t readline( void )
  65. {
  66. static int fill = 0;
  67. static uint8_t escaped = 0;
  68. int i = uart1_getc();
  69. uint8_t data;
  70. if ( i & UART_NO_DATA ){
  71. return 0;
  72. }
  73. data = i&0xFF;
  74. /*serial_putStart();
  75. serial_putcenc('D');
  76. serial_putcenc(data);
  77. serial_putStop();*/
  78. if(data == SERIAL_ESCAPE){
  79. if(!escaped){
  80. escaped = 1;
  81. return 0;
  82. }
  83. escaped = 0;
  84. }else if(escaped){
  85. escaped = 0;
  86. if(data == SERIAL_START){
  87. fill = 0;
  88. return 0;
  89. }else if( data == SERIAL_END){
  90. return fill;
  91. }
  92. }
  93. buffer[fill++] = data;
  94. if(fill >= SERIAL_BUFFERLEN)
  95. fill = SERIAL_BUFFERLEN -1;
  96. return 0;
  97. }