RGB_Controller.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. #include "RGB_Controller.h"
  2. extern Default_SX1276_t Default_SX1276;
  3. extern SX1276_t SX1276;
  4. extern SX1276_hw_t SX1276_hw;
  5. void RGB_Response_Func(uint8_t* data);
  6. uint8_t RGB_BufCal(uint8_t srcid);
  7. void RGB_Alarm_Operate(void);
  8. void RGB_Data_Stack(uint8_t* rgb_buf);
  9. uint16_t RGB_Location_Address_Check(uint8_t id);
  10. uint8_t SensorID_Cnt = 0;
  11. uint8_t SensorID_buf[8] = {0,};
  12. uint16_t RGB_SensorRedLimit_Buf[9]={0,};
  13. uint16_t RGB_SensorGreenLimit_Buf[9]={0,};
  14. uint16_t RGB_SensorBlueLimit_Buf[9]={0,};
  15. uint8_t LED_Alarm[9] = {0,};
  16. uint8_t RGB_Location_Buf[9][50] = {0};
  17. void RGB_Data_Init(void){
  18. MyControllerID = M24C32_Data_Read(&hi2c2,MY_ID_ADDRESS);
  19. for(uint8_t i = 0; i < 8; i++){
  20. RGB_SensorRedLimit_Buf[i + 1] = (M24C32_Data_Read(&hi2c2,RGB1_LIMIT_RED_H_ADDRESS + (6 * i)) << 8);
  21. RGB_SensorRedLimit_Buf[i + 1] |= M24C32_Data_Read(&hi2c2,RGB1_LIMIT_RED_L_ADDRESS + (6 * i));
  22. }
  23. for(uint8_t i = 0; i < 8; i++){
  24. RGB_SensorGreenLimit_Buf[i + 1] = (M24C32_Data_Read(&hi2c2,RGB1_LIMIT_GREEN_H_ADDRESS + (6 * i)) << 8);
  25. RGB_SensorGreenLimit_Buf[i + 1] |= M24C32_Data_Read(&hi2c2,RGB1_LIMIT_GREEN_L_ADDRESS + (6 * i));
  26. }
  27. for(uint8_t i = 0; i < 8; i++){
  28. RGB_SensorBlueLimit_Buf[i + 1] = (M24C32_Data_Read(&hi2c2,RGB1_LIMIT_BLUE_H_ADDRESS + (6 * i)) << 8);
  29. RGB_SensorBlueLimit_Buf[i + 1] |= M24C32_Data_Read(&hi2c2,RGB1_LIMIT_BLUE_L_ADDRESS + (6 * i));
  30. }
  31. for(uint8_t i = 0; i < 8; i++){
  32. for(uint8_t aa= 0; aa < 50; aa++)
  33. RGB_Location_Buf[i + 1][aa] = M24C32_Data_Read(&hi2c2,RGB_Location_Address_Check(i + 1) + aa);
  34. }
  35. printf("MY id is %d \n",MyControllerID);
  36. for(uint8_t i = 1; i <= 8; i++){
  37. printf("RGB_SensorRedLimit_Buf[%d] : %04x\n",i,RGB_SensorRedLimit_Buf[i]);
  38. printf("RGB_SensorGreenLimit_Buf[%d] : %04x\n",i,RGB_SensorGreenLimit_Buf[i]);
  39. printf("RGB_SensorBlueLimit_Buf[%d] : %04x\n",i,RGB_SensorBlueLimit_Buf[i]);
  40. }
  41. if(M24C32_Data_Read(&hi2c2,RGB_LORA_FREQ_ADDRESS) == 0xFF){
  42. /*NOP*/
  43. }else{
  44. Default_SX1276.frequency = M24C32_Data_Read(&hi2c2,RGB_LORA_FREQ_ADDRESS);
  45. Default_SX1276.power = M24C32_Data_Read(&hi2c2,RGB_LORA_PABOOST_ADDRESS);
  46. Default_SX1276.LoRa_Rate = M24C32_Data_Read(&hi2c2,RGB_LORA_SF_ADDRESS);
  47. Default_SX1276.LoRa_BW = M24C32_Data_Read(&hi2c2,RGB_LORA_BANDWIDTH_ADDRESS);
  48. Default_SX1276.LoRa_Lna = M24C32_Data_Read(&hi2c2,RGB_LORA_LNA_ADDRESS);
  49. }
  50. }
  51. uint16_t RGB_Limit_Address_Check(uint8_t id){
  52. uint16_t ret = 0;
  53. switch(id){
  54. case 1: ret = RGB1_LIMIT_RED_H_ADDRESS;break;
  55. case 2: ret = RGB2_LIMIT_RED_H_ADDRESS;break;
  56. case 3: ret = RGB3_LIMIT_RED_H_ADDRESS;break;
  57. case 4: ret = RGB4_LIMIT_RED_H_ADDRESS;break;
  58. case 5: ret = RGB5_LIMIT_RED_H_ADDRESS;break;
  59. case 6: ret = RGB6_LIMIT_RED_H_ADDRESS;break;
  60. case 7: ret = RGB7_LIMIT_RED_H_ADDRESS;break;
  61. case 8: ret = RGB8_LIMIT_RED_H_ADDRESS;break;
  62. }
  63. return ret;
  64. }
  65. uint16_t RGB_Location_Address_Check(uint8_t id){
  66. uint16_t ret = 0;
  67. switch(id){
  68. case 1: ret = RGB1_LOCATION_ADDRESS;break;
  69. case 2: ret = RGB2_LOCATION_ADDRESS;break;
  70. case 3: ret = RGB3_LOCATION_ADDRESS;break;
  71. case 4: ret = RGB4_LOCATION_ADDRESS;break;
  72. case 5: ret = RGB5_LOCATION_ADDRESS;break;
  73. case 6: ret = RGB6_LOCATION_ADDRESS;break;
  74. case 7: ret = RGB7_LOCATION_ADDRESS;break;
  75. case 8: ret = RGB8_LOCATION_ADDRESS;break;
  76. }
  77. return ret;
  78. }
  79. void RGB_Response_Func(uint8_t* data){
  80. RGB_CMD_T type = data[bluecell_type];
  81. uint16_t temp = 0;
  82. LoraDataRequest_t Lora_Tempdata;
  83. #if 0
  84. for(uint8_t i = 0; i < 10; i++){
  85. printf("%02x ",data[i]);
  86. }
  87. #endif
  88. switch(type){
  89. case RGB_Status_Data_Request:
  90. Uart2_Data_Send(data,RGB_SensorDataRequest_Length);
  91. break;
  92. case RGB_ControllerID_SET:
  93. Uart1_Data_Send(data,RGB_ControllerID_SET_Length);
  94. M24C32_Data_Write(&hi2c2,&MyControllerID,MY_ID_ADDRESS,1); // EEPROM Controller ID Save
  95. break;
  96. case RGB_SensorID_SET:
  97. Uart2_Data_Send(data,RGB_SensorIDAutoSetRequest_Length);
  98. break;
  99. case RGB_Status_Data_Response:
  100. Uart1_Data_Send(data,data[bluecell_length] + 3);
  101. break;
  102. case RGB_ControllerLimitSet:
  103. Uart1_Data_Send(data,data[bluecell_length] + 3);
  104. M24C32_Data_Write(&hi2c2,&data[bluecell_red_H],RGB_Limit_Address_Check(data[bluecell_dstid]),6); // EEPROM Controller ID Save
  105. break;
  106. case RGB_Sensor_Start:
  107. case RGB_Sensor_Check:
  108. Uart2_Data_Send(data,RGB_SensorIDAutoSetRequest_Length);
  109. break;
  110. case RGB_Sensor_Ack:
  111. Uart2_Data_Send(data,data[bluecell_length] + 3);
  112. break;
  113. case RGB_Reset:
  114. case RGB_SensorID_SET_Success:
  115. case RGB_ID_Allocate_Request:
  116. case RGB_Lora_ControllerIDAmount_Report:
  117. break;
  118. case RGB_Location_Report:
  119. M24C32_Data_Write(&hi2c2,&data[Location_stx],RGB_Location_Address_Check(data[bluecell_srcid]),data[bluecell_length] + 3); // EEPROM Controller ID Save
  120. break;
  121. case RGB_Location_Response:
  122. data[bluecell_length] = M24C32_Data_Read(&hi2c2,RGB_Location_Address_Check(data[bluecell_dstid]) + 2); // EEPROM Controller ID Save
  123. temp = RGB_Location_Address_Check(data[bluecell_srcid]);
  124. for(uint8_t i = 0; i < (data[bluecell_length] + 3); i++){
  125. data[i] = M24C32_Data_Read(&hi2c2,(temp + i)); // EEPROM Controller ID Save
  126. }
  127. data[bluecell_type] = RGB_Location_Response;
  128. data[data[bluecell_length] + 1] = STH30_CreateCrc(&data[bluecell_type],data[bluecell_length]);
  129. Uart1_Data_Send(data,data[bluecell_length] + 3);
  130. break;
  131. case RGB_ControllerID_GET:
  132. Uart1_Data_Send(data,data[bluecell_length] + 3);
  133. break;
  134. case RGB_ControllerLimitGet:
  135. Uart1_Data_Send(data,data[bluecell_length] + 3);
  136. break;
  137. case RGB_Lora_DataResponse:
  138. memcpy(&Lora_Tempdata.Request_stx,&data[bluecell_stx],data[bluecell_length] + 3);
  139. if(Lora_Tempdata.Request_dstid == MyControllerID)
  140. LoraDataSendSet(1);
  141. else
  142. return;
  143. break;
  144. case RGB_Lora_ConfigSet:
  145. data[bluecell_type] = RGB_Lora_ConfigGet;
  146. Default_SX1276.frequency = data[3];
  147. Default_SX1276.LoRa_Pa_boost = data[4];
  148. Default_SX1276.LoRa_Rate = data[5];
  149. Default_SX1276.LoRa_BW = data[6];
  150. Default_SX1276.LoRa_Lna = data[7];
  151. Lora_Initialize();
  152. M24C32_Data_Write(&hi2c2,&data[bluecell_srcid],RGB_LORA_FREQ_ADDRESS,data[bluecell_length] - 2); // EEPROM Controller ID Save
  153. case RGB_Lora_ConfigGet:
  154. Uart1_Data_Send(data,data[bluecell_length] + 3);
  155. break;
  156. default:break;
  157. }
  158. }
  159. void RGB_Sensor_LED_Alarm_ON(uint8_t id ){
  160. switch(id){
  161. case 0:// 모든 LED의 전원을 ON
  162. HAL_GPIO_WritePin(LED_CH1_GPIO_Port,LED_CH1_Pin,GPIO_PIN_RESET);
  163. HAL_GPIO_WritePin(LED_CH2_GPIO_Port,LED_CH2_Pin,GPIO_PIN_RESET);
  164. HAL_GPIO_WritePin(LED_CH3_GPIO_Port,LED_CH3_Pin,GPIO_PIN_RESET);
  165. HAL_GPIO_WritePin(LED_CH4_GPIO_Port,LED_CH4_Pin,GPIO_PIN_RESET);
  166. HAL_GPIO_WritePin(LED_CH5_GPIO_Port,LED_CH5_Pin,GPIO_PIN_RESET);
  167. HAL_GPIO_WritePin(LED_CH6_GPIO_Port,LED_CH6_Pin,GPIO_PIN_RESET);
  168. HAL_GPIO_WritePin(LED_CH7_GPIO_Port,LED_CH7_Pin,GPIO_PIN_RESET);
  169. HAL_GPIO_WritePin(LED_CH8_GPIO_Port,LED_CH8_Pin,GPIO_PIN_RESET);
  170. break;
  171. case 1:
  172. HAL_GPIO_WritePin(LED_CH1_GPIO_Port,LED_CH1_Pin,GPIO_PIN_RESET);
  173. break;
  174. case 2:
  175. HAL_GPIO_WritePin(LED_CH2_GPIO_Port,LED_CH2_Pin,GPIO_PIN_RESET);
  176. break;
  177. case 3:
  178. HAL_GPIO_WritePin(LED_CH3_GPIO_Port,LED_CH3_Pin,GPIO_PIN_RESET);
  179. break;
  180. case 4:
  181. HAL_GPIO_WritePin(LED_CH4_GPIO_Port,LED_CH4_Pin,GPIO_PIN_RESET);
  182. break;
  183. case 5:
  184. HAL_GPIO_WritePin(LED_CH5_GPIO_Port,LED_CH5_Pin,GPIO_PIN_RESET);
  185. break;
  186. case 6:
  187. HAL_GPIO_WritePin(LED_CH6_GPIO_Port,LED_CH6_Pin,GPIO_PIN_RESET);
  188. break;
  189. case 7:
  190. HAL_GPIO_WritePin(LED_CH7_GPIO_Port,LED_CH7_Pin,GPIO_PIN_RESET);
  191. break;
  192. case 8:
  193. HAL_GPIO_WritePin(LED_CH8_GPIO_Port,LED_CH8_Pin,GPIO_PIN_RESET);
  194. break;
  195. }
  196. }
  197. void RGB_Sensor_LED_Alarm_OFF(uint8_t id ){
  198. switch(id){
  199. case 0:// 모든 LED의 전원을 OFF
  200. HAL_GPIO_WritePin(LED_CH1_GPIO_Port,LED_CH1_Pin,GPIO_PIN_SET);
  201. HAL_GPIO_WritePin(LED_CH2_GPIO_Port,LED_CH2_Pin,GPIO_PIN_SET);
  202. HAL_GPIO_WritePin(LED_CH3_GPIO_Port,LED_CH3_Pin,GPIO_PIN_SET);
  203. HAL_GPIO_WritePin(LED_CH4_GPIO_Port,LED_CH4_Pin,GPIO_PIN_SET);
  204. HAL_GPIO_WritePin(LED_CH5_GPIO_Port,LED_CH5_Pin,GPIO_PIN_SET);
  205. HAL_GPIO_WritePin(LED_CH6_GPIO_Port,LED_CH6_Pin,GPIO_PIN_SET);
  206. HAL_GPIO_WritePin(LED_CH7_GPIO_Port,LED_CH7_Pin,GPIO_PIN_SET);
  207. HAL_GPIO_WritePin(LED_CH8_GPIO_Port,LED_CH8_Pin,GPIO_PIN_SET);
  208. break;
  209. case 1:
  210. HAL_GPIO_WritePin(LED_CH1_GPIO_Port,LED_CH1_Pin,GPIO_PIN_SET);
  211. break;
  212. case 2:
  213. HAL_GPIO_WritePin(LED_CH2_GPIO_Port,LED_CH2_Pin,GPIO_PIN_SET);
  214. break;
  215. case 3:
  216. HAL_GPIO_WritePin(LED_CH3_GPIO_Port,LED_CH3_Pin,GPIO_PIN_SET);
  217. break;
  218. case 4:
  219. HAL_GPIO_WritePin(LED_CH4_GPIO_Port,LED_CH4_Pin,GPIO_PIN_SET);
  220. break;
  221. case 5:
  222. HAL_GPIO_WritePin(LED_CH5_GPIO_Port,LED_CH5_Pin,GPIO_PIN_SET);
  223. break;
  224. case 6:
  225. HAL_GPIO_WritePin(LED_CH6_GPIO_Port,LED_CH6_Pin,GPIO_PIN_SET);
  226. break;
  227. case 7:
  228. HAL_GPIO_WritePin(LED_CH7_GPIO_Port,LED_CH7_Pin,GPIO_PIN_SET);
  229. break;
  230. case 8:
  231. HAL_GPIO_WritePin(LED_CH8_GPIO_Port,LED_CH8_Pin,GPIO_PIN_SET);
  232. break;
  233. }
  234. }
  235. void RGB_Alarm_Operate(void){
  236. uint8_t temp_warning = 0;
  237. for(uint8_t i = 1; i <= (SensorID_Cnt); i++){
  238. if(LED_Alarm[SensorID_buf[i]] == 1){
  239. HAL_GPIO_WritePin(LED_ALARM_GPIO_Port, LED_ALARM_Pin, GPIO_PIN_SET); //표지 LED
  240. RGB_Sensor_LED_Alarm_ON(SensorID_buf[i]);
  241. temp_warning = 1;
  242. }else{
  243. RGB_Sensor_LED_Alarm_OFF(SensorID_buf[i]);
  244. }
  245. }
  246. if(temp_warning == 0){ // 8개의 Sensor가 전부 정상일 때 만 동작
  247. HAL_GPIO_WritePin(LED_ALARM_GPIO_Port, LED_ALARM_Pin, GPIO_PIN_RESET); //표지 LED
  248. RGB_Sensor_LED_Alarm_OFF(0); //모든 Sensor가 정상일 때는 LED 가 켜지지 않는다.
  249. }
  250. }
  251. void RGB_Alarm_Check(uint8_t* data){
  252. static uint16_t Sensor_red[9] = {0,};
  253. static uint16_t Sensor_green[9] = {0,};
  254. static uint16_t Sensor_blue[9] = {0,};
  255. static uint8_t Prev_Alarm_occur;
  256. uint8_t Alarm_occur = 0;
  257. Sensor_red[data[bluecell_srcid]] = ((data[bluecell_red_H + 2] << 8)| data[bluecell_red_L + 2]);
  258. Sensor_green[data[bluecell_srcid]] = ((data[bluecell_green_H + 2] << 8)| data[bluecell_green_L + 2]);
  259. Sensor_blue[data[bluecell_srcid]] = ((data[bluecell_blue_H + 2] << 8)| data[bluecell_blue_L + 2]);
  260. for(uint8_t i = 1; i <= (SensorID_Cnt); i++){
  261. if(RGB_SensorRedLimit_Buf[SensorID_buf[i]] >= Sensor_red[SensorID_buf[i]]
  262. || RGB_SensorGreenLimit_Buf[SensorID_buf[i]] >= Sensor_green[SensorID_buf[i]]
  263. || RGB_SensorBlueLimit_Buf[SensorID_buf[i]] >= Sensor_blue[SensorID_buf[i]]) {
  264. LED_Alarm[SensorID_buf[i]] = 1;
  265. Alarm_occur = 1;
  266. }else{
  267. LED_Alarm[SensorID_buf[i]] = 0;
  268. }
  269. }
  270. RGB_Data_Stack(&LED_Alarm[1]);
  271. if(Prev_Alarm_occur != Alarm_occur){
  272. // LoraDataSendSet(LoraTx_mode);//경고 발생 시 바로 Data 전송 하는 Option
  273. Prev_Alarm_occur = Alarm_occur;
  274. }
  275. }
  276. uint8_t RGB_DeviceStatusCheck(void){
  277. uint8_t ret = 0;
  278. for(uint8_t i = 1; i <= SensorID_Cnt; i++){
  279. if(SensorID_buf[i] > 0){
  280. ret += 0x01 << (SensorID_buf[i] - 1);
  281. }
  282. }
  283. return ret;
  284. }
  285. uint8_t Lora_Buf[100] = {0,};
  286. #if 0 // PYJ.2019.04.14_BEGIN -- //Uart Value Data
  287. void RGB_Data_Stack(uint8_t* rgb_buf){
  288. uint8_t mynumcnt = RGB_BufCal(rgb_buf[bluecell_srcid]);
  289. Lora_Buf[bluecell_stx] = 0xbe;
  290. Lora_Buf[bluecell_type] = RGB_Lora_Data_Report;
  291. Lora_Buf[bluecell_length] = Lora_Max_Amount + 2; //length 1byte + type 1byte + RGB Data 60byte
  292. Lora_Buf[bluecell_srcid] = MyControllerID;
  293. Lora_Buf[mynumcnt] = rgb_buf[bluecell_srcid];
  294. Lora_Buf[mynumcnt + 1] = rgb_buf[bluecell_red_H + 2];
  295. Lora_Buf[mynumcnt + 2] = rgb_buf[bluecell_red_L + 2];
  296. Lora_Buf[mynumcnt + 3] = rgb_buf[bluecell_green_H + 2];
  297. Lora_Buf[mynumcnt + 4] = rgb_buf[bluecell_green_L + 2];
  298. Lora_Buf[mynumcnt + 5] = rgb_buf[bluecell_blue_H + 2];
  299. Lora_Buf[mynumcnt + 6] = rgb_buf[bluecell_blue_L + 2];
  300. LoraDataSendSet(1);
  301. }
  302. uint8_t RGB_BufCal(uint8_t srcid){
  303. uint8_t ret = 0;
  304. switch(srcid){
  305. case 1:ret = 4;break;
  306. case 2:ret = 11;break;
  307. case 3:ret = 18;break;
  308. case 4:ret = 25;break;
  309. case 5:ret = 32;break;
  310. case 6:ret = 39;break;
  311. case 7:ret = 46;break;
  312. case 8:ret = 53;break;
  313. }
  314. return ret;
  315. }
  316. #else //Uart Flag Data
  317. /*
  318. 현재 Controller 가지고 있는 RGB Sensor ID Check
  319. 현재 비정상적인 동작을 하는 Sensor 에대한 Flag 정보
  320. */
  321. void RGB_Data_Stack(uint8_t* rgb_buf){
  322. memset(&Lora_Buf[0],0x00,8);
  323. /*********************FIX DATA*************************************/
  324. Lora_Buf[bluecell_stx] = 0xbe;
  325. Lora_Buf[bluecell_srcid + 4] = 0xeb;
  326. Lora_Buf[bluecell_type] = RGB_Lora_DataResponse;
  327. Lora_Buf[bluecell_length] = Lora_Max_Amount;// RGB Data 5byte
  328. Lora_Buf[bluecell_srcid] = MyControllerID;
  329. /*********************FIX DATA*************************************/
  330. if(RGB_BufCal(SensorID_buf[1]) == 0){//아무런 Device가 존재 하지않을 때
  331. printf("Not Exist Device \n");
  332. return;
  333. }
  334. for(uint8_t i = 1; i <= (SensorID_Cnt); i++){
  335. Lora_Buf[bluecell_srcid + 1] |= 0x01 << (SensorID_buf[i] - 1);
  336. }
  337. for(uint8_t i = 0; i < 8; i++){
  338. Lora_Buf[bluecell_srcid + 2] |= rgb_buf[i] << i ;
  339. }
  340. Lora_Buf[bluecell_srcid + 3]= STH30_CreateCrc(&Lora_Buf[bluecell_type],Lora_Buf[bluecell_length]);
  341. }
  342. /*
  343. RGB_Data_Stack에 Lora에 Data를 보내기 위해 Buffer에 Data를 쌓을 때
  344. ID 마다 Location Cnt
  345. */
  346. uint8_t RGB_BufCal(uint8_t srcid){
  347. uint8_t ret = 0;
  348. switch(srcid){
  349. case 1:ret = 4;break;
  350. case 2:ret = 7;break;
  351. case 3:ret = 10;break;
  352. case 4:ret = 13;break;
  353. case 5:ret = 16;break;
  354. case 6:ret = 29;break;
  355. case 7:ret = 32;break;
  356. case 8:ret = 35;break;
  357. }
  358. return ret;
  359. }
  360. uint8_t RGB_LimitData_Get(uint8_t id){
  361. switch(id){
  362. }
  363. }
  364. #endif // PYJ.2019.04.14_END --
  365. uint8_t datalosscnt[9] = {0,};
  366. static uint8_t temp_sensorid;
  367. void RGB_Controller_Func(uint8_t* data){
  368. RGB_CMD_T type = data[bluecell_type];
  369. // static uint8_t temp_sensorid;
  370. uint8_t Result_buf[100] = {0,};
  371. uint8_t i = 0;
  372. switch(type){
  373. case RGB_Status_Data_Request:
  374. data[bluecell_srcid + 1] = SensorID_buf[temp_sensorid++];
  375. if(temp_sensorid > (SensorID_Cnt)){
  376. temp_sensorid = 0;
  377. }
  378. datalosscnt[data[bluecell_srcid + 1]]++;
  379. if(datalosscnt[data[bluecell_srcid + 1]] > 3 && data[bluecell_srcid + 1] != 0){
  380. RGB_SensorIDAutoSet(1);
  381. memset(&SensorID_buf[0],0x00,8);
  382. }
  383. data[5] = STH30_CreateCrc(&data[bluecell_type],data[bluecell_length]);
  384. memcpy(&Result_buf[bluecell_stx],&data[bluecell_stx],RGB_SensorDataRequest_Length);
  385. break;
  386. case RGB_ControllerID_SET:
  387. memcpy(&Result_buf[bluecell_stx],&data[bluecell_stx],data[bluecell_length] + 3);
  388. MyControllerID = data[bluecell_srcid]; // �긽��諛⑹쓽 SRC ID�뒗 �굹�쓽 DST ID�씠�떎.
  389. break;
  390. case RGB_SensorID_SET:
  391. RGB_SensorIDAutoSet(1);
  392. memcpy(&Result_buf[bluecell_stx],&data[bluecell_stx],data[bluecell_length] + 3);
  393. Result_buf[5] = STH30_CreateCrc(&Result_buf[bluecell_type],Result_buf[bluecell_length]);
  394. break;
  395. case RGB_SensorID_SET_Success:
  396. printf("Recognize %d Sensor\n",data[bluecell_length + 1]);
  397. SensorID_Cnt++;
  398. SensorID_buf[SensorID_Cnt] = data[bluecell_length + 1];
  399. break;
  400. case RGB_Status_Data_Response:
  401. datalosscnt[data[bluecell_srcid]] = 0;
  402. data[bluecell_length] += 1;
  403. RGB_Alarm_Check(&data[bluecell_stx]);
  404. memcpy(&Result_buf[bluecell_stx],&data[bluecell_stx],data[bluecell_length] + 3);
  405. Result_buf[Result_buf[bluecell_length] - 1] = RGB_DeviceStatusCheck();// Device On OFF status Send byte
  406. Result_buf[Result_buf[bluecell_length] + 0] = Lora_Buf[bluecell_srcid + 2];
  407. Result_buf[Result_buf[bluecell_length] + 1] = STH30_CreateCrc(&Result_buf[bluecell_type],Result_buf[bluecell_length]);
  408. Result_buf[Result_buf[bluecell_length] + 2] = 0xeb;
  409. break;
  410. case RGB_ControllerLimitSet:
  411. memcpy(&Result_buf[bluecell_stx],&data[bluecell_stx],data[bluecell_length] + 3);
  412. RGB_SensorRedLimit_Buf[data[bluecell_dstid]] = ((data[bluecell_red_H] << 8) |data[bluecell_red_L]);
  413. RGB_SensorGreenLimit_Buf[data[bluecell_dstid]] = ((data[bluecell_green_H] << 8) |data[bluecell_green_L]);
  414. RGB_SensorBlueLimit_Buf[data[bluecell_dstid]] = ((data[bluecell_blue_H] << 8) |data[bluecell_blue_L]);
  415. Result_buf[bluecell_crc] = STH30_CreateCrc(&Result_buf[bluecell_type],Result_buf[bluecell_length]);
  416. break;
  417. case RGB_Reset:
  418. NVIC_SystemReset();
  419. break;
  420. case RGB_ID_Allocate_Request:
  421. break;
  422. case RGB_Location_Report:
  423. memcpy(&Result_buf[bluecell_stx],&data[bluecell_stx],data[bluecell_length] + 3);
  424. break;
  425. case RGB_Location_Response:
  426. Result_buf[bluecell_type] = RGB_Location_Response;
  427. Result_buf[bluecell_srcid] = data[bluecell_srcid];
  428. break;
  429. case RGB_ControllerID_GET:
  430. Result_buf[bluecell_stx] = 0xbe;
  431. Result_buf[bluecell_type] = RGB_ControllerID_GET;
  432. Result_buf[bluecell_length] = 3;
  433. Result_buf[bluecell_srcid] = MyControllerID;
  434. Result_buf[bluecell_srcid + 1] = STH30_CreateCrc(&Result_buf[bluecell_type],Result_buf[bluecell_length]);
  435. Result_buf[bluecell_srcid + 2] = 0xeb;
  436. break;
  437. case RGB_ControllerLimitGet:
  438. Result_buf[bluecell_stx] = 0xbe;
  439. Result_buf[bluecell_type] = RGB_ControllerLimitGet;
  440. Result_buf[bluecell_length] = 8;
  441. Result_buf[bluecell_srcid + 0] = (RGB_SensorRedLimit_Buf[data[bluecell_srcid]] & 0xFF00) >> 8;
  442. Result_buf[bluecell_srcid + 1] = RGB_SensorRedLimit_Buf[data[bluecell_srcid]] & 0x00FF;
  443. Result_buf[bluecell_srcid + 2] = (RGB_SensorGreenLimit_Buf[data[bluecell_srcid]] & 0xFF00) >> 8;
  444. Result_buf[bluecell_srcid + 3] = RGB_SensorGreenLimit_Buf[data[bluecell_srcid]] & 0x00FF;
  445. Result_buf[bluecell_srcid + 4] = (RGB_SensorBlueLimit_Buf[data[bluecell_srcid]] & 0xFF00) >> 8;
  446. Result_buf[bluecell_srcid + 5] = RGB_SensorBlueLimit_Buf[data[bluecell_srcid]] & 0x00FF;
  447. Result_buf[bluecell_srcid + 6] = STH30_CreateCrc(&Result_buf[bluecell_type],Result_buf[bluecell_length]);
  448. Result_buf[bluecell_srcid + 7] = 0xeb;
  449. break;
  450. case RGB_Lora_DataRequest:
  451. memcpy(&Result_buf[bluecell_stx],&data[bluecell_stx],data[bluecell_length] + 3);
  452. Result_buf[bluecell_type] = RGB_Lora_DataResponse;
  453. break;
  454. case RGB_Lora_ConfigSet:
  455. SX1276_hw_Reset(&SX1276_hw);
  456. memcpy(&Result_buf[bluecell_stx],&data[bluecell_stx],data[bluecell_length] + 3);
  457. data[(data[bluecell_length] + 3)]=STH30_CreateCrc(&Result_buf[bluecell_type],Result_buf[bluecell_length]);
  458. break;
  459. case RGB_Lora_ConfigGet:
  460. Result_buf[bluecell_stx] = 0xbe;
  461. Result_buf[bluecell_type] = RGB_ControllerLimitGet;
  462. Result_buf[bluecell_length] = 7;
  463. Result_buf[bluecell_srcid + 0] = SX1276.frequency;
  464. Result_buf[bluecell_srcid + 1] = SX1276.LoRa_Pa_boost;
  465. Result_buf[bluecell_srcid + 2] = SX1276.LoRa_BW;
  466. Result_buf[bluecell_srcid + 3] = SX1276.LoRa_Rate;
  467. Result_buf[bluecell_srcid + 4] = SX1276.LoRa_Lna;
  468. Result_buf[bluecell_srcid + 5] = STH30_CreateCrc(&Result_buf[bluecell_type],Result_buf[bluecell_length]);
  469. Result_buf[bluecell_srcid + 6] = 0xeb;
  470. break;
  471. default:
  472. break;
  473. }
  474. RGB_Response_Func(&Result_buf[bluecell_stx]);
  475. return;
  476. }