PikaStdTask_Task.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #include "PikaStdTask_Task.h"
  2. #include "BaseObj.h"
  3. #include "PikaVM.h"
  4. extern PikaObj* __pikaMain;
  5. void PikaStdTask_Task___init__(PikaObj* self) {
  6. pikaVM_runAsm(self,
  7. "B0\n"
  8. "0 RUN calls_always.__init__\n"
  9. "0 RUN calls_when.__init__\n"
  10. "0 RUN assert_when.__init__\n"
  11. "0 RUN calls_period.__init__\n"
  12. "0 RUN assert_period.__init__\n"
  13. "0 RUN time_period.__init__\n");
  14. obj_setPtr(__pikaMain, "__calls_always", obj_getPtr(self, "calls_always"));
  15. obj_setPtr(__pikaMain, "__calls_when", obj_getPtr(self, "calls_when"));
  16. obj_setPtr(__pikaMain, "__assert_when", obj_getPtr(self, "assert_when"));
  17. obj_setPtr(__pikaMain, "__calls_period", obj_getPtr(self, "calls_period"));
  18. obj_setPtr(__pikaMain, "__assert_period",
  19. obj_getPtr(self, "assert_period"));
  20. obj_setPtr(__pikaMain, "__time_period", obj_getPtr(self, "time_period"));
  21. }
  22. void PikaStdTask_Task_call_always(PikaObj* self, Arg* fun_todo) {
  23. obj_setArg(self, "fun_todo", fun_todo);
  24. pikaVM_runAsm(self, "B0\n1 REF fun_todo\n0 RUN calls_always.append\n");
  25. }
  26. void PikaStdTask_Task_call_when(PikaObj* self, Arg* fun_todo, Arg* fun_when) {
  27. obj_setArg(self, "fun_todo", fun_todo);
  28. obj_setArg(self, "fun_when", fun_when);
  29. pikaVM_runAsm(self,
  30. "B0\n"
  31. "1 REF fun_todo\n"
  32. "0 RUN calls_when.append\n"
  33. "B0\n"
  34. "1 REF fun_when\n"
  35. "0 RUN assert_when.append\n");
  36. }
  37. void PikaStdTask_Task_call_period_ms(PikaObj* self,
  38. Arg* fun_todo,
  39. int period_ms) {
  40. obj_setArg(self, "fun_todo", fun_todo);
  41. obj_setInt(self, "period_ms", period_ms);
  42. pikaVM_runAsm(self,
  43. "B0\n"
  44. "1 REF fun_todo\n"
  45. "0 RUN calls_period.append\n"
  46. "B0\n"
  47. "1 REF period_ms\n"
  48. "0 RUN assert_period.append\n"
  49. "B0\n"
  50. "1 REF 0\n"
  51. "0 RUN time_period.append\n");
  52. }
  53. void PikaStdTask_Task_run_once(PikaObj* self) {
  54. obj_run(self, "platformGetTick()");
  55. /* transfer the tick to pikaMain */
  56. obj_setInt(__pikaMain, "__tick", obj_getInt(self, "tick"));
  57. /* Python
  58. __len = __calls_period.len()
  59. for i in range(0, __len):
  60. if __len == 0:
  61. break
  62. time = __time_period[i]
  63. if __tick > __time_period[i]:
  64. todo = __calls_period[i]
  65. todo()
  66. __time_period[i] = __tick + __assert_period[i]
  67. */
  68. pikaVM_runAsm(__pikaMain,
  69. "B0\n"
  70. "0 RUN __calls_period.len\n"
  71. "0 OUT __len\n"
  72. "B0\n"
  73. "2 NUM 0\n"
  74. "2 REF __len\n"
  75. "1 RUN range\n"
  76. "0 RUN iter\n"
  77. "0 OUT _l0\n"
  78. "0 REF _r1\n"
  79. "0 REF _r2\n"
  80. "0 REF _r3\n"
  81. "0 OUT _l0.a1\n"
  82. "0 OUT _l0.a2\n"
  83. "0 OUT _l0.a3\n"
  84. "B0\n"
  85. "0 RUN _l0.__next__\n"
  86. "0 OUT i\n"
  87. "0 EST i\n"
  88. "0 JEZ 2\n"
  89. "B1\n"
  90. "1 REF __len\n"
  91. "1 NUM 0\n"
  92. "0 OPT ==\n"
  93. "0 JEZ 1\n"
  94. "B2\n"
  95. "0 BRK\n"
  96. "B1\n"
  97. "1 REF __time_period\n"
  98. "1 REF i\n"
  99. "0 RUN __get__\n"
  100. "0 OUT time\n"
  101. "B1\n"
  102. "1 REF __tick\n"
  103. "2 REF __time_period\n"
  104. "2 REF i\n"
  105. "1 RUN __get__\n"
  106. "0 OPT >\n"
  107. "0 JEZ 1\n"
  108. "B2\n"
  109. "1 REF __calls_period\n"
  110. "1 REF i\n"
  111. "0 RUN __get__\n"
  112. "0 OUT todo\n"
  113. "B2\n"
  114. "0 RUN todo\n"
  115. "B2\n"
  116. "1 REF __time_period\n"
  117. "1 REF i\n"
  118. "2 REF __tick\n"
  119. "3 REF __assert_period\n"
  120. "3 REF i\n"
  121. "2 RUN __get__\n"
  122. "1 OPT +\n"
  123. "1 STR __time_period\n"
  124. "0 RUN __set__\n"
  125. "B0\n"
  126. "0 JMP -1\n"
  127. "B0\n"
  128. "0 DEL _l0\n"
  129. "B0 \n");
  130. /* Python
  131. __len = __calls_when.len()
  132. for i in range(0, __len):
  133. if __len == 0:
  134. break
  135. when = __assert_when[i]
  136. if when():
  137. todo = __calls_when[i]
  138. todo()
  139. */
  140. pikaVM_runAsm(__pikaMain,
  141. "B0\n"
  142. "0 RUN __calls_when.len\n"
  143. "0 OUT __len\n"
  144. "B0\n"
  145. "2 NUM 0\n"
  146. "2 REF __len\n"
  147. "1 RUN range\n"
  148. "0 RUN iter\n"
  149. "0 OUT _l0\n"
  150. "0 REF _r1\n"
  151. "0 REF _r2\n"
  152. "0 REF _r3\n"
  153. "0 OUT _l0.a1\n"
  154. "0 OUT _l0.a2\n"
  155. "0 OUT _l0.a3\n"
  156. "B0\n"
  157. "0 RUN _l0.__next__\n"
  158. "0 OUT i\n"
  159. "0 EST i\n"
  160. "0 JEZ 2\n"
  161. "B1\n"
  162. "1 REF __len\n"
  163. "1 NUM 0\n"
  164. "0 OPT ==\n"
  165. "0 JEZ 1\n"
  166. "B2\n"
  167. "0 BRK\n"
  168. "B1\n"
  169. "1 REF __assert_when\n"
  170. "1 REF i\n"
  171. "0 RUN __get__\n"
  172. "0 OUT when\n"
  173. "B1\n"
  174. "0 RUN when\n"
  175. "0 JEZ 1\n"
  176. "B2\n"
  177. "1 REF __calls_when\n"
  178. "1 REF i\n"
  179. "0 RUN __get__\n"
  180. "0 OUT todo\n"
  181. "B2\n"
  182. "0 RUN todo\n"
  183. "B0\n"
  184. "0 JMP -1\n"
  185. "B0\n"
  186. "0 DEL _l0\n"
  187. "B0\n");
  188. }
  189. void PikaStdTask_Task_run_always(PikaObj* self) {
  190. while (1) {
  191. PikaStdTask_Task_run_once(self);
  192. }
  193. }
  194. void PikaStdTask_Task_platformGetTick(PikaObj* self) {
  195. obj_setErrorCode(self, 1);
  196. obj_setSysOut(self, "[error] platform method need to be override.");
  197. }