/lib/mass/mass.c

https://github.com/tonymathew/Beagle-node · C · 460 lines · 323 code · 86 blank · 51 comment · 17 complexity · 55d99ed9b7bac4a5fb2c6d5ae11d5ab0 MD5 · raw file

  1. #include <Nordic/reg24le1.h>
  2. #include <EPL/epl_uart.h>
  3. #include <HAL/hal_nrf.h>
  4. #include <EPL/epl_utils.h>
  5. #include <mass/mass.h>
  6. extern unsigned char id;
  7. extern unsigned char xdata group_id;
  8. extern unsigned int xdata pkt_seq;
  9. extern unsigned char rf_ack_idx;
  10. extern volatile unsigned char return_flag;
  11. extern struct radio_buffer xdata rf_buf;
  12. extern unsigned char xdata result_buf[RF_BUF_LEN];
  13. extern unsigned char rf_rx_addr[5];
  14. extern unsigned char rf_rx_addr2[5];
  15. extern unsigned char xdata bm0[BITMAP_LEN];
  16. //Cindy - test OK 20091011
  17. void get_data()
  18. {
  19. #pragma asm
  20. ; Pop ret address to ret directly back to while loop
  21. POP B
  22. POP B
  23. #pragma endasm
  24. /* Set xdata as data space */
  25. MEMCON = 0x00;
  26. #pragma asm
  27. MOV DPTR,#rf_buf+05H
  28. WHILE_LOOP:
  29. MOV A, R2
  30. JZ END_GET_DATA
  31. DEC R2
  32. MOV A, @R0
  33. MOVX @DPTR,A
  34. INC R0
  35. INC DPTR
  36. SJMP WHILE_LOOP
  37. END_GET_DATA:
  38. #pragma endasm
  39. #ifdef DEBUG
  40. epl_uart_putint(1);
  41. #endif
  42. }
  43. //Cindy - test OK 20091011
  44. void set_data()
  45. {
  46. #pragma asm
  47. ; Pop ret address to ret directly back to main while loop
  48. POP B
  49. POP B
  50. #pragma endasm
  51. /* Set xdata as data space */
  52. MEMCON = 0x00;
  53. #pragma asm
  54. MOV DPTR,#rf_buf+0FH
  55. WHILE_LOOP?3:
  56. MOV A, R2
  57. JZ END_SET_DATA
  58. DEC R2
  59. ; Copy data from rf_buf
  60. MOVX A, @DPTR
  61. //MOV A,#01H
  62. ; Write into designated location in IDATA
  63. MOV @R0, A
  64. INC R0
  65. INC DPTR
  66. SJMP WHILE_LOOP?3
  67. END_SET_DATA:
  68. #pragma endasm
  69. #ifdef DEBUG
  70. epl_uart_putint(2);
  71. #endif
  72. }
  73. //---------------Cindy - ¼È®É¤£·|¥Î¨ìªºfunc--------------------------//
  74. //­nget flash program memoryªº­È
  75. void get_ram()
  76. {
  77. #pragma asm
  78. ; Pop ret address to ret directly back to main while loop
  79. POP B
  80. POP B
  81. #pragma endasm
  82. /* Set xdata as data space */
  83. MEMCON = 0x00;
  84. #pragma asm
  85. //Cindy - R0 stores len, DPTR stores ram_addr
  86. ; Write into address starting from rf_buf.buffer[4]
  87. MOV R1, #LOW(rf_buf+05H)
  88. ; while(len--)
  89. WHILE_LOOP?2:
  90. MOV A, R0
  91. JZ END_GET_RAM
  92. DEC R0
  93. MOVX A, @DPTR
  94. MOVX @R1, A
  95. INC DPTR
  96. INC R1
  97. SJMP WHILE_LOOP?2
  98. END_GET_RAM:
  99. #pragma endasm
  100. }
  101. //---------------------------------------------------------------------//
  102. //Cindy - test OK 20091011
  103. void ret_char()
  104. {
  105. #pragma asm
  106. ; Pop ret address to ret directly back to main while loop
  107. POP B
  108. POP B
  109. #pragma endasm
  110. /* Set xdata as data space */
  111. MEMCON = 0x00;
  112. #pragma asm
  113. MOV R5,rf_ack_idx
  114. MOV A,R5
  115. RLC A
  116. SUBB A,ACC
  117. MOV R6,A
  118. MOV A,#LOW (rf_buf+01H)
  119. ADD A,R5
  120. MOV DPL,A
  121. MOV A,#HIGH (rf_buf+01H)
  122. ADDC A,R6
  123. MOV DPH,A
  124. MOV A, R7
  125. MOVX @DPTR,A
  126. ; rf_ack_idx++;
  127. INC rf_ack_idx
  128. #pragma endasm
  129. #ifdef DEBUG
  130. epl_uart_putint(4);
  131. #endif
  132. }
  133. //Cindy - test OK 20091011
  134. void ret_int()
  135. {
  136. #pragma asm
  137. ; Pop ret address to ret directly back to main while loop
  138. POP B
  139. POP B
  140. #pragma endasm
  141. /* Set xdata as data space */
  142. MEMCON = 0x00;
  143. #pragma asm
  144. MOV R5,rf_ack_idx
  145. MOV A,R5
  146. RLC A
  147. SUBB A,ACC
  148. MOV R4,A
  149. MOV A,#LOW (rf_buf+01H)
  150. ADD A,R5
  151. MOV DPL,A
  152. MOV A,#HIGH (rf_buf+01H)
  153. ADDC A,R4
  154. MOV DPH,A
  155. MOV A, R6
  156. MOVX @DPTR,A
  157. INC DPTR
  158. MOV A, R7
  159. MOVX @DPTR,A
  160. ; rf_ack_idx += 2;
  161. INC rf_ack_idx
  162. INC rf_ack_idx
  163. #pragma endasm
  164. #ifdef DEBUG
  165. epl_uart_putint(5);
  166. #endif
  167. }
  168. //Cindy - test OK 20091011
  169. void ret_long()
  170. {
  171. #pragma asm
  172. ; Pop ret address to ret directly back to main while loop
  173. POP B
  174. POP B
  175. #pragma endasm
  176. /* Set xdata as data space */
  177. MEMCON = 0x00;
  178. #pragma asm
  179. MOV R3,rf_ack_idx
  180. MOV A,R3
  181. RLC A
  182. SUBB A,ACC
  183. MOV R2,A
  184. MOV A,#LOW (rf_buf+01H)
  185. ADD A,R3
  186. MOV DPL,A
  187. MOV A,#HIGH (rf_buf+01H)
  188. ADDC A,R2
  189. MOV DPH,A
  190. MOV A, R4
  191. MOVX @DPTR,A
  192. INC DPTR
  193. MOV A, R5
  194. MOVX @DPTR,A
  195. INC DPTR
  196. MOV A, R6
  197. MOVX @DPTR,A
  198. INC DPTR
  199. MOV A, R7
  200. MOVX @DPTR,A
  201. ; rf_ack_idx += 4;
  202. MOV A,#04H
  203. ADD A,rf_ack_idx
  204. MOV rf_ack_idx,A
  205. #pragma endasm
  206. #ifdef DEBUG
  207. epl_uart_putint(6);
  208. #endif
  209. }
  210. //Cindy - test OK 20091011
  211. void ret_ptr()
  212. {
  213. #pragma asm
  214. ; Pop ret address to ret directly back to main while loop
  215. POP B
  216. POP B
  217. #pragma endasm
  218. /* Set xdata as data space */
  219. MEMCON = 0x00;
  220. #pragma asm
  221. MOV R5,rf_ack_idx
  222. MOV A,R5
  223. RLC A
  224. SUBB A,ACC
  225. MOV R6,A
  226. MOV A,#LOW (rf_buf+01H)
  227. ADD A,R5
  228. MOV DPL,A
  229. MOV A,#HIGH (rf_buf+01H)
  230. ADDC A,R6
  231. MOV DPH,A
  232. MOV A, R1
  233. MOVX @DPTR,A
  234. INC DPTR
  235. MOV A, R2
  236. MOVX @DPTR,A
  237. INC DPTR
  238. MOV A, R3
  239. MOVX @DPTR,A
  240. ; rf_ack_idx += 3;
  241. MOV A,#03H
  242. ADD A,rf_ack_idx
  243. MOV rf_ack_idx,A
  244. #pragma endasm
  245. #ifdef DEBUG
  246. epl_uart_putint(7);
  247. #endif
  248. }
  249. //Cindy -
  250. void ret_func()
  251. {
  252. unsigned int i;
  253. unsigned char j;
  254. #pragma asm
  255. ; Pop ret address to ret directly back to while loop
  256. POP B
  257. POP B
  258. #pragma endasm
  259. /* Set xdata as data space */
  260. MEMCON = 0x00;
  261. #ifdef DEBUG
  262. epl_uart_putchar('f');
  263. #endif
  264. //Return Function result to host //
  265. result_buf[0] = rf_buf.buffer[7];
  266. result_buf[1] = group_id;
  267. // Delay to avoid collision //
  268. if(rf_buf.buffer[8]){
  269. // Delay to avoid collision //
  270. /*for(i = 0;i < group_id * 100 ;i++){
  271. for(j = 0;j < 140;j++)
  272. ;
  273. }*/
  274. epl_mdelay(group_id*10);
  275. }
  276. return_flag = 1;
  277. }
  278. //Cindy -
  279. void set_rfaddr()
  280. {
  281. unsigned char i;
  282. #pragma asm
  283. ; Pop ret address to ret directly back to while loop
  284. POP B
  285. POP B
  286. #pragma endasm
  287. /* Set xdata as data space */
  288. MEMCON = 0x00;
  289. #ifdef DEBUG
  290. epl_uart_putchar('c');
  291. #endif
  292. //Reset pkt sequence number
  293. //pkt_seq = 0;
  294. // Change group rf addr //
  295. rf_rx_addr2[0] = rf_buf.buffer[7];
  296. rf_rx_addr2[1] = rf_buf.buffer[8];
  297. hal_nrf_set_address(HAL_NRF_PIPE0, rf_rx_addr2);
  298. // Initialize bitmap //
  299. for(i = 0; i < rf_buf.buffer[10]; i++){
  300. bm0[i] = 0;
  301. }
  302. // Initialize group id //
  303. group_id = rf_buf.buffer[11];
  304. }
  305. //Cindy -
  306. void ret_bitmap()
  307. {
  308. unsigned int i;
  309. unsigned char j, delay;
  310. #pragma asm
  311. ; Pop ret address to ret directly back to while loop
  312. POP B
  313. POP B
  314. #pragma endasm
  315. /* Set xdata as data space */
  316. MEMCON = 0x00;
  317. #ifdef DEBUG
  318. epl_uart_putchar('r');
  319. #endif
  320. delay = rf_buf.buffer[9];
  321. //Return Bitmap to host //
  322. rf_buf.buffer[0] = rf_buf.buffer[7];
  323. rf_buf.buffer[1] = group_id;
  324. for( i=rf_buf.buffer[8] ; i >0 ; i--){
  325. rf_buf.buffer[i+1] = bm0[i-1];
  326. }
  327. if(delay){
  328. // Delay to avoid collision //
  329. /*for(i = 0;i < group_id * 100 ;i++){
  330. for(j = 0;j < 140;j++)
  331. ;
  332. }
  333. */
  334. epl_mdelay(group_id*10);
  335. }
  336. }
  337. //Cindy -
  338. void set_bitmap()
  339. {
  340. unsigned int i;
  341. #pragma asm
  342. ; Pop ret address to ret directly back to while loop
  343. POP B
  344. POP B
  345. #pragma endasm
  346. /* Set xdata as data space */
  347. MEMCON = 0x00;
  348. #ifdef DEBUG
  349. epl_uart_putchar('y');
  350. #endif
  351. // Initialize bitmap //
  352. for(i = 0; i < rf_buf.buffer[7]; i++){
  353. bm0[i] = 0;
  354. }
  355. }
  356. //Cindy - test OK 20091011
  357. void put_addr()
  358. {
  359. /* Set xdata as data space */
  360. MEMCON = 0x00;
  361. #ifdef DEBUG
  362. epl_uart_putint(0);
  363. #endif
  364. /* Set ACK packet SRC address */
  365. rf_buf.buffer[0] = id;
  366. rf_buf.buffer[1] = EXECUTE_SUCCESS;
  367. rf_buf.buffer[2] = rf_rx_addr[0];
  368. rf_buf.buffer[3] = rf_rx_addr[1];
  369. rf_buf.buffer[4] = rf_rx_addr[2];
  370. //Cindy - ¬°¤°»ò¬O7?
  371. rf_ack_idx = 7;
  372. /* Set xdata as code space */
  373. MEMCON = 0x01;
  374. }