You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

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