Subversion Repositories AFRtranscoder

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2.  
  3. #include "libTinyWB/tinyWB.h"
  4.  
  5. #include "libSerial/serialCalls.H"
  6.  
  7. #define CHARS_PER_FRAME 9
  8. #define START_CODE 1
  9.  
  10. /// @brief time between character bursts
  11. static const uint32_t GAP_TIME_MS = 40;
  12.  
  13.  
  14. /// @brief Time of last reception of a character
  15. static uint32_t lastCharTime = 0;
  16.  
  17. static uint8_t characterIndex = 0;
  18.  
  19. /// @note Documentation from  DIY-EFI
  20. /// Data Rate: 115200 baud
  21. /// Length: 8 bytes
  22. /// Data Format :
  23. /// byte0 = AFR*10 (so 148 = 14.8 AFR)
  24. /// byte1 = Temp in C of the sensor
  25. /// byte2-7 = not used
  26. ///  The TinyWB is based on the SLCFree by 14point7
  27. /// actually this document is wrong - below is the decode from using protocol analyser.
  28. /// when the lambda sensor is not connected, the unit outputs something like 1,200 gap of 50mS and repeats#
  29. ///
  30. /// when the lambda sensor is connected, the unit outputs this pattern
  31.  
  32. //[0] 0.0000000000,1,,   sync ?
  33. //[1] 0.0000867750,200,, afr
  34. //[2] 0.0001735250,41,,  temperature
  35. //[3] 0.0002603000,2,,   filler
  36. //[4] 0.0003471000,3,,   filler
  37. //[5] 0.0004338750,4,,   filler
  38. //[6] 0.0005206750,5,,   filler
  39. //[7] 0.0006074500,6,,   filler
  40. //[8] 0.0006942250,200,, afr again ? at byte 8.
  41.  
  42.  
  43.  
  44. // store first two characters, ignore the rest
  45. static char afrCode = 0;
  46. static char tempCode = 0;
  47.  
  48. char pollTinyWB(struct usart_ctl *instance, float *AFRvalue, float *temperature)
  49. {
  50.     int valid = 0;
  51.     // PollSerial returns non zero if characters are in the serial input buffer
  52.      while (PollSerial(instance))
  53.     {
  54.         // deal with time-based synchronisation - 8 byte bursts with gaps
  55.         uint32_t now = HAL_GetTick();
  56.         if (now - lastCharTime > GAP_TIME_MS)
  57.         {
  58.             characterIndex = 0;
  59.         }
  60.         lastCharTime = now;
  61.         // GetCharSerial is implemented as a blocking read from a USART : but because it is
  62.         // only called when PollSerial is true, it is never going to block.
  63.         char c = GetCharSerial(instance);
  64.         if (characterIndex < CHARS_PER_FRAME)
  65.  
  66.             switch (characterIndex)
  67.             {
  68.             case 0:
  69.                 if (c != 1)
  70.                     goto fail;
  71.                 characterIndex++;
  72.                 break;
  73.             // for characters 1 and 2 store in buffer
  74.             case 1:
  75.                 afrCode = c;
  76.                 characterIndex++;
  77.                 break;
  78.             case 2:
  79.                 tempCode = c;
  80.                 characterIndex++;
  81.                 break;
  82.  
  83.             case 3:
  84.             case 4:
  85.             case 5:
  86.             case 6:
  87.             case 7:
  88.                 if (c != characterIndex - 1)
  89.                     goto fail;
  90.                 characterIndex++;
  91.                 break;
  92.  
  93.             case CHARS_PER_FRAME - 1:
  94.                 *AFRvalue = afrCode / 10.0;
  95.                 *temperature = tempCode;
  96.                 valid = 1; // have valid readings
  97.                
  98.             fail:
  99.                 characterIndex = 0;
  100.                 break;
  101.             }
  102.     }
  103.  
  104.     return valid;
  105. }
  106.