DataHandler.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO.Ports;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Windows.Forms;
  8. namespace FietsClientV2
  9. {
  10. //alle data die ontvagen wordt van de fiets gaat als eerst door de DataHandler klasse heen voordat hij verwerkt wordt door de model klasse.
  11. // TLDR: ontvangt fiets data
  12. class DataHandler
  13. {
  14. // vaste waarden
  15. public static readonly string COMMAND = "CU";
  16. public static readonly string CMD_TIME = "PT";
  17. public static readonly string CMD_DISTANCE = "PD";
  18. public static readonly string CMD_POWER = "PW";
  19. public static readonly string CMD_ENERGY = "PE";
  20. public static readonly string RESET = "RS";
  21. public static readonly string STATUS = "ST";
  22. // private fields
  23. private string portname;
  24. private int baudrate = 9600;
  25. private string bufferOut;
  26. private string[] bufferIn;
  27. // public fields
  28. public enum State { notConnected, connected, reset, command }
  29. public enum ReturnData { ERROR, ACK, RUN, STATUS }
  30. public State state = State.notConnected;
  31. public ReturnData returnData;
  32. private SerialPort ComPort;
  33. // custom events
  34. public delegate void DataDelegate(string[] data);
  35. public static event DataDelegate IncomingDataEvent;
  36. public delegate void ErrorDelegate(string error);
  37. public static event ErrorDelegate IncomingErrorEvent;
  38. public DataHandler()
  39. {
  40. }
  41. private static void OnIncomingDataEvent(string[] data)
  42. {
  43. DataDelegate handler = IncomingDataEvent;
  44. if (handler != null) handler(data);
  45. }
  46. public static void OnIncomingErrorEvent(string error)
  47. {
  48. ErrorDelegate handler = IncomingErrorEvent;
  49. if (handler != null) handler(error);
  50. }
  51. public void initComm(string portname)
  52. {
  53. if (ComPort != null)
  54. {
  55. ComPort.Close();
  56. state = State.notConnected;
  57. }
  58. this.portname = portname;
  59. try
  60. {
  61. ComPort = new SerialPort(this.portname, this.baudrate);
  62. ComPort.Open();
  63. state = State.connected;
  64. ComPort.WriteLine(RESET);
  65. state = State.reset;
  66. ComPort.DataReceived += new SerialDataReceivedEventHandler(ComPort_DataReceived);
  67. }
  68. catch (Exception)
  69. {
  70. OnIncomingErrorEvent("WrongComPort");
  71. try { ComPort.Close(); } catch (Exception) { } // probeer om de ComPort wel te sluiten.
  72. state = State.notConnected;
  73. }
  74. }
  75. public void closeComm()
  76. {
  77. ComPort.Close();
  78. }
  79. public void sendData(string data)
  80. {
  81. bufferOut = data;
  82. ComPort.WriteLine(data);
  83. }
  84. private void ComPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
  85. {
  86. string buffer = ComPort.ReadLine();
  87. buffer = buffer.TrimEnd('\r');
  88. switch (buffer) //kijk wat er binnenkomt
  89. {
  90. case "ERROR": //wanneer "Error"
  91. returnData = ReturnData.ERROR;
  92. handleError();
  93. break;
  94. case "ACK": // ACK betekent acknowledged.
  95. returnData = ReturnData.ACK;
  96. break;
  97. case "RUN":
  98. returnData = ReturnData.RUN;
  99. break;
  100. default: // alle andere waarden.
  101. returnData = ReturnData.STATUS;
  102. handleBikeValues(buffer);
  103. break;
  104. }
  105. }
  106. int trycount = 0;
  107. private void handleError()
  108. {
  109. if (bufferOut == "RS" && trycount < 3)
  110. {
  111. sendData("RS"); //gewoon nog een keer proberen tot 3 keer toe, net zolang totdat hij werkt.
  112. trycount++;
  113. }
  114. }
  115. private void handleBikeValues(string buffer)
  116. {
  117. bufferIn = buffer.Split('\t');
  118. OnIncomingDataEvent(bufferIn);
  119. }
  120. public bool checkBikeState(bool commandMode)
  121. {
  122. if (ComPort == null || !ComPort.IsOpen)
  123. {
  124. OnIncomingErrorEvent("NotConnectedToBike");
  125. state = State.notConnected;
  126. return false;
  127. }
  128. switch (state)
  129. {
  130. case State.reset:
  131. if (commandMode) setCommandMode();
  132. if (returnData != ReturnData.ERROR)
  133. return true;
  134. return false;
  135. case State.connected:
  136. if (commandMode) setCommandMode();
  137. return true;
  138. case State.command:
  139. return true;
  140. case State.notConnected:
  141. OnIncomingErrorEvent("NotConnectedToBike");
  142. Console.WriteLine("ERROR: not connected to bike.");
  143. return false;
  144. default:
  145. OnIncomingErrorEvent("NotConnectedToBike");
  146. Console.WriteLine("ERROR: unknown error.");
  147. return false;
  148. }
  149. }
  150. public void setCommandMode()
  151. {
  152. sendData(COMMAND);
  153. }
  154. }
  155. }