Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 

368 wiersze
8.8 KiB

  1. /**********************************************************************
  2. Project: Automatic cat feeder
  3. Date: march 19 2006
  4. Author: Jean-Fran�ois Martel
  5. Target: PIC 18F252
  6. Compiler: Microchip mcc18
  7. Filename: Protocol.c
  8. File description: Communication protocol implementation.
  9. jean-francois.martel@polymtl.ca
  10. **********************************************************************/
  11. #include "define.h"
  12. #include "NetworkProtocol.h"
  13. #include "Uart.h"
  14. #include <string.h>
  15. #include "MasterCtrlInterface.h"
  16. #include "LoraNetworkInterface.h"
  17. #include "LTENetworkInterface.h"
  18. static char MyDeviceID = ID_SPRINKLER_DEVICE;
  19. char mFrameData[MAX_MESSAGE_SIZE+10];
  20. ProtocolData_t mAudioConsoleIFProtocolData;
  21. ProtocolData_t mMasterCtrlIFData;
  22. void ProtocolInit(int User)
  23. {
  24. ProtocolData_t *DataStruct;
  25. switch(User)
  26. {
  27. case NETWORK_PROTOCOL_USER_AUDIO_CONSOLE_IF:
  28. {
  29. DataStruct = &mAudioConsoleIFProtocolData;
  30. break;
  31. }
  32. case NETWORK_PROTOCOL_USER_MASTER_CTRL_IF:
  33. {
  34. DataStruct = &mMasterCtrlIFData;
  35. break;
  36. }
  37. default:
  38. return;
  39. break;
  40. }
  41. ResetStateMachine(DataStruct);
  42. }
  43. void StateMachine(unsigned char Data,ProtocolData_t *ProtocolData )
  44. {
  45. switch(ProtocolData->State)
  46. {
  47. case Initialization: //Reset all pointers and data...
  48. {
  49. ProtocolData->DataSize = 0;
  50. ProtocolData->BufPtr = 0;
  51. ProtocolData->RxPtr = 0;
  52. ProtocolData->Command = 0;
  53. ProtocolData->CRC = 0;
  54. ProtocolData->State = RxHeader;
  55. break;
  56. }
  57. case RxHeader: //Wait for data header...
  58. {
  59. if(Data == FRAME_HEADER)
  60. {
  61. ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
  62. ProtocolData->State = RxAdd;
  63. ProtocolData->CRC ^= Data;
  64. }
  65. else
  66. {
  67. ProtocolData->DataSize = 0;
  68. ResetStateMachine(ProtocolData);
  69. }
  70. break;
  71. }
  72. case RxAdd: //Sender Address.
  73. {
  74. ProtocolData->SenderAddress = Data;
  75. ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
  76. ProtocolData->State = RxID;
  77. ProtocolData->CRC ^= Data;
  78. break;
  79. }
  80. case RxID: //Sender ID
  81. {
  82. ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
  83. ProtocolData->State = RxMyID;
  84. ProtocolData->SenderID = Data;
  85. ProtocolData->CRC ^= Data;
  86. break;
  87. }
  88. case RxMyID:
  89. {
  90. // if(Data != MyDeviceID && Data != BROADCAST_VALUE) //Message is not for this type of device and it's not a broadcast
  91. // {
  92. // ResetStateMachine();
  93. // break;
  94. // }
  95. ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
  96. ProtocolData->State = RxMyAddress;
  97. ProtocolData->CRC ^= Data;
  98. break;
  99. }
  100. case RxMyAddress:
  101. {
  102. if(Data != MY_DEVICE_ADDRESS && Data != BROADCAST_VALUE) //Message is not for this device address and it's not a broadcast
  103. {
  104. ResetStateMachine(ProtocolData);
  105. break;
  106. }
  107. ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
  108. ProtocolData->State = RxFlags;
  109. ProtocolData->CRC ^= Data;
  110. break;
  111. }
  112. case RxFlags:
  113. {
  114. ProtocolData->Flags = Data;
  115. ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
  116. ProtocolData->State = RxCMD;
  117. ProtocolData->CRC ^= Data;
  118. break;
  119. }
  120. case RxCMD:
  121. {
  122. ProtocolData->Command = Data;
  123. ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
  124. ProtocolData->State = RxSize1;
  125. ProtocolData->CRC ^= Data;
  126. break;
  127. }
  128. case RxSize1: //Data size MSB
  129. {
  130. ProtocolData->DataSize = 0;
  131. ProtocolData->DataSize = (unsigned int)Data;
  132. ProtocolData->DataSize <<= 8;
  133. ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
  134. ProtocolData->State = RxSize2;
  135. ProtocolData->CRC ^= Data;
  136. break;
  137. }
  138. case RxSize2: //Data size
  139. {
  140. ProtocolData->DataSize |= (unsigned int)Data;
  141. ProtocolData->DataSize <<= 8;
  142. ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
  143. ProtocolData->State = RxSize3;
  144. ProtocolData->CRC ^= Data;
  145. break;
  146. }
  147. case RxSize3: //Data size
  148. {
  149. ProtocolData->DataSize |= (unsigned int)Data;
  150. ProtocolData->DataSize <<= 8;
  151. ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
  152. ProtocolData->State = RxSize4;
  153. ProtocolData->CRC ^= Data;
  154. break;
  155. }
  156. case RxSize4: //Data size LSB
  157. {
  158. ProtocolData->DataSize |= (unsigned int)Data;
  159. ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
  160. if(ProtocolData->DataSize > MAX_MESSAGE_SIZE)
  161. ResetStateMachine(ProtocolData);
  162. if(ProtocolData->DataSize == 0)
  163. ProtocolData->State = RxCRC;
  164. else
  165. ProtocolData->State = RxData;
  166. ProtocolData->CRC ^= Data;
  167. break;
  168. }
  169. case RxData:
  170. {
  171. ProtocolData->CRC ^= Data;
  172. ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
  173. ProtocolData->DataCtr++;
  174. if(ProtocolData->DataCtr == ProtocolData->DataSize)
  175. {
  176. ProtocolData->State = RxCRC;
  177. }
  178. break;
  179. }
  180. case RxCRC:
  181. {
  182. if(Data != ProtocolData->CRC)
  183. {
  184. ResetStateMachine(ProtocolData);
  185. // ProtocolAcknowledge(0,Command,0);
  186. break;
  187. }
  188. // NewMasterMessageReceived(mRxData);
  189. if(ProtocolData == &mAudioConsoleIFProtocolData)
  190. {
  191. // ExecuteLoraMasterCommand(ProtocolData->Command,ProtocolMsgDataPtr(ProtocolData),ProtocolData->DataSize);
  192. }
  193. else if(ProtocolData == &mMasterCtrlIFData)
  194. {
  195. // ExecuteLTEMasterCommand(ProtocolData->SenderID, ProtocolData->Command,ProtocolMsgDataPtr(ProtocolData),ProtocolData->DataSize);
  196. }
  197. ResetStateMachine(ProtocolData);
  198. break;
  199. }
  200. default:
  201. {
  202. ResetStateMachine(ProtocolData);
  203. break;
  204. }
  205. }
  206. }
  207. void ProtocolAnalyzeBuffer(unsigned char *Data, int size, int User)
  208. {
  209. int i = 0;
  210. for(i = 0; i < size; i++)
  211. {
  212. ProtocolAnalyzeNewData(Data[i],User);
  213. }
  214. }
  215. void ProtocolAnalyzeNewData(unsigned char Data, int User)
  216. {
  217. ProtocolData_t *DataStruct;
  218. switch(User)
  219. {
  220. case NETWORK_PROTOCOL_USER_AUDIO_CONSOLE_IF:
  221. {
  222. DataStruct = &mAudioConsoleIFProtocolData;
  223. break;
  224. }
  225. case NETWORK_PROTOCOL_USER_MASTER_CTRL_IF:
  226. {
  227. DataStruct = &mMasterCtrlIFData;
  228. break;
  229. }
  230. default:
  231. return;
  232. break;
  233. }
  234. // mRxData[RxPtr] = Data;
  235. // printf("%X",Data);
  236. StateMachine(Data, DataStruct);
  237. }
  238. void ResetStateMachine(ProtocolData_t *ProtocolData)
  239. {
  240. ProtocolData->DataSize = 0;
  241. ProtocolData->BufPtr = 0;
  242. ProtocolData->RxPtr = 0;
  243. ProtocolData->Command = 0;
  244. ProtocolData->CRC = 0;
  245. ProtocolData->State = RxHeader;
  246. ProtocolData->DataCtr = 0;
  247. ProtocolData->Flags = 0;
  248. ProtocolData->SenderAddress = 0;
  249. }
  250. void ProtocolExecCmd(void)
  251. {
  252. // switch(Command)
  253. // {
  254. // case RX_GET_STATUS:
  255. // {
  256. // unsigned char StatusByte =0;
  257. //// memcpy(&StatusByte, &IRRemoteStatus, sizeof(IRRemoteStatus));
  258. //// ProtocolSendCmd(TX_DEADBOLT_STATUS,&StatusByte,sizeof(StatusByte),1,0);
  259. //
  260. // break;
  261. // }
  262. // }
  263. }
  264. void ProtocolAcknowledge(unsigned char Answer,unsigned char Cmd, unsigned char Data)
  265. {
  266. unsigned char data[2];
  267. if(Answer == 1)
  268. {
  269. data[0] = PROTOCOL_ACK; //CMD
  270. }
  271. else
  272. {
  273. data[0] = PROTOCOL_NAK; //CMD
  274. }
  275. data[1] = Cmd;
  276. // ProtocolSendCmd(TX_NETWORK_ACK,&data[0],2,1,0);
  277. }
  278. unsigned char ProtocolCalcCrc(unsigned char* Buffer,unsigned char size)
  279. {
  280. unsigned char CRC = 0;
  281. unsigned char i;
  282. for(i = 0; i < size; i++)
  283. CRC ^= Buffer[i];
  284. return CRC;
  285. }
  286. unsigned char ProtocolIsReceiving(void)
  287. {
  288. // if(State == RxHeader)
  289. // return 0; // Idle...
  290. // else
  291. // return 1; //receiving from serial port
  292. }
  293. unsigned char* ProtocolGetFrame(unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags, int *FrameSize)
  294. {
  295. if(Size > MAX_MESSAGE_SIZE)
  296. {
  297. *FrameSize = 0;
  298. return &mFrameData[FRAME_HEADER_INDEX];
  299. }
  300. mFrameData[FRAME_HEADER_INDEX] = FRAME_HEADER; //header
  301. mFrameData[FRAME_SENDER_ADDRESS_INDEX] = MY_DEVICE_ADDRESS; //My Address
  302. mFrameData[FRAME_SENDER_DEVICE_ID_INDEX] = SenderDevice; //My ID
  303. mFrameData[FRAME_DEST_DEVICE_ID_INDEX] = DestDevice; //Destination ID
  304. mFrameData[FRAME_DEST_ADDRESS_INDEX] = DestAddress ;//Address; //Destination Address
  305. mFrameData[FRAME_FLAGS_INDEX] = Flags; //Flags
  306. mFrameData[FRAME_COMMAND_INDEX] = Cmd; //Command to send
  307. mFrameData[FRAME_SIZE1_INDEX] = (unsigned char)((Size >> 24) & 0xFF);
  308. mFrameData[FRAME_SIZE2_INDEX] = (unsigned char)((Size >> 16) & 0xFF);
  309. mFrameData[FRAME_SIZE3_INDEX] = (unsigned char)((Size >> 8) & 0xFF);
  310. mFrameData[FRAME_SIZE4_INDEX] = (unsigned char)(Size & 0xFF);
  311. memcpy((void*)&mFrameData[FRAME_DATA_INDEX],(void*)Data,Size); //Cmd data
  312. mFrameData[Size+FRAME_DATA_INDEX] = ProtocolCalcCrc(mFrameData,Size + FRAME_DATA_INDEX); // CRC
  313. *FrameSize = Size + FRAME_INDEX_NBR;
  314. return &mFrameData[FRAME_HEADER_INDEX];
  315. }
  316. unsigned char *ProtocolMsgDataPtr(ProtocolData_t *ProtocolData)
  317. {
  318. return &ProtocolData->mRxData[FRAME_DATA_INDEX];
  319. }