PikaStdTask_Task.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  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. obj_run(self,
  7. "calls.__init__()\n"
  8. "is_period = 0\n");
  9. obj_setPtr(__pikaMain, "__calls", obj_getPtr(self, "calls"));
  10. }
  11. void PikaStdTask_Task_call_always(PikaObj* self, Arg* fun_todo) {
  12. obj_setArg(self, "fun_todo", fun_todo);
  13. obj_run(self,
  14. "calls.append('always')\n"
  15. "calls.append(fun_todo)\n");
  16. }
  17. void PikaStdTask_Task_call_when(PikaObj* self, Arg* fun_todo, Arg* fun_when) {
  18. obj_setArg(self, "fun_todo", fun_todo);
  19. obj_setArg(self, "fun_when", fun_when);
  20. obj_run(self,
  21. "calls.append('when')\n"
  22. "calls.append(fun_when)\n"
  23. "calls.append(fun_todo)\n");
  24. }
  25. void PikaStdTask_Task_call_period_ms(PikaObj* self,
  26. Arg* fun_todo,
  27. int period_ms) {
  28. obj_setArg(self, "fun_todo", fun_todo);
  29. obj_setInt(self, "period_ms", period_ms);
  30. obj_run(self,
  31. "calls.append('period_ms')\n"
  32. "calls.append(period_ms)\n"
  33. "calls.append(fun_todo)\n"
  34. "calls.append(0)\n"
  35. "is_period = 1\n");
  36. }
  37. void PikaStdTask_Task_run_once(PikaObj* self) {
  38. /* transfer the tick to pikaMain */
  39. obj_setInt(__pikaMain, "__tick", obj_getInt(self, "tick"));
  40. /* Python
  41. obj_run(__pikaMain,
  42. "len = __calls.len()\n"
  43. "mode = 'none'\n"
  44. "info_index = 0\n"
  45. "for i in range(0, len):\n"
  46. " if len == 0:\n"
  47. " break\n"
  48. " if info_index == 0:\n"
  49. " mode = __calls[i]\n"
  50. " info_index = 1\n"
  51. " elif info_index == 1:\n"
  52. " if mode == 'always':\n"
  53. " todo = __calls[i]\n"
  54. " todo()\n"
  55. " info_index = 0\n"
  56. " elif mode == 'when':\n"
  57. " when = __calls[i]\n"
  58. " info_index = 2\n"
  59. " elif mode == 'period_ms':\n"
  60. " period_ms = __calls[i]\n"
  61. " info_index = 2\n"
  62. " elif info_index == 2:\n"
  63. " if mode == 'when':\n"
  64. " if when():\n"
  65. " todo = __calls[i]\n"
  66. " todo()\n"
  67. " info_index = 0\n"
  68. " elif mode == 'period_ms':\n"
  69. " todo = __calls[i]\n"
  70. " info_index = 3\n"
  71. " elif info_index == 3:\n"
  72. " if mode == 'period_ms':\n"
  73. " if __tick > __calls[i]:\n"
  74. " todo()\n"
  75. " __calls[i] = __tick + period_ms\n"
  76. " info_index = 0\n"
  77. "\n");
  78. */
  79. pikaVM_runAsm(__pikaMain,
  80. "B0\n"
  81. "0 RUN __calls.len\n"
  82. "0 OUT len\n"
  83. "B0\n"
  84. "0 STR none\n"
  85. "0 OUT mode\n"
  86. "B0\n"
  87. "0 NUM 0\n"
  88. "0 OUT info_index\n"
  89. "B0\n"
  90. "2 NUM 0\n"
  91. "2 REF len\n"
  92. "1 RUN range\n"
  93. "0 RUN iter\n"
  94. "0 OUT _l0\n"
  95. "0 REF _r1\n"
  96. "0 REF _r2\n"
  97. "0 REF _r3\n"
  98. "0 OUT _l0.a1\n"
  99. "0 OUT _l0.a2\n"
  100. "0 OUT _l0.a3\n"
  101. "B0\n"
  102. "0 RUN _l0.__next__\n"
  103. "0 OUT i\n"
  104. "0 EST i\n"
  105. "0 JEZ 2\n"
  106. "B1\n"
  107. "1 REF len\n"
  108. "1 NUM 0\n"
  109. "0 OPT ==\n"
  110. "0 JEZ 1\n"
  111. "B2\n"
  112. "0 BRK\n"
  113. "B1\n"
  114. "1 REF info_index\n"
  115. "1 NUM 0\n"
  116. "0 OPT ==\n"
  117. "0 JEZ 1\n"
  118. "B2\n"
  119. "1 REF __calls\n"
  120. "1 REF i\n"
  121. "0 RUN __get__\n"
  122. "0 OUT mode\n"
  123. "B2\n"
  124. "0 NUM 1\n"
  125. "0 OUT info_index\n"
  126. "B1\n"
  127. "0 NEL 1\n"
  128. "1 REF info_index\n"
  129. "1 NUM 1\n"
  130. "0 OPT ==\n"
  131. "0 JEZ 1\n"
  132. "B2\n"
  133. "1 REF mode\n"
  134. "1 STR always\n"
  135. "0 OPT ==\n"
  136. "0 JEZ 1\n"
  137. "B3\n"
  138. "1 REF __calls\n"
  139. "1 REF i\n"
  140. "0 RUN __get__\n"
  141. "0 OUT todo\n"
  142. "B3\n"
  143. "0 RUN todo\n"
  144. "B3\n"
  145. "0 NUM 0\n"
  146. "0 OUT info_index\n"
  147. "B2\n"
  148. "0 NEL 1\n"
  149. "1 REF mode\n"
  150. "1 STR when\n"
  151. "0 OPT ==\n"
  152. "0 JEZ 1\n"
  153. "B3\n"
  154. "1 REF __calls\n"
  155. "1 REF i\n"
  156. "0 RUN __get__\n"
  157. "0 OUT when\n"
  158. "B3\n"
  159. "0 NUM 2\n"
  160. "0 OUT info_index\n"
  161. "B2\n"
  162. "0 NEL 1\n"
  163. "1 REF mode\n"
  164. "1 STR period_ms\n"
  165. "0 OPT ==\n"
  166. "0 JEZ 1\n"
  167. "B3\n"
  168. "1 REF __calls\n"
  169. "1 REF i\n"
  170. "0 RUN __get__\n"
  171. "0 OUT period_ms\n"
  172. "B3\n"
  173. "0 NUM 2\n"
  174. "0 OUT info_index\n"
  175. "B1\n"
  176. "0 NEL 1\n"
  177. "1 REF info_index\n"
  178. "1 NUM 2\n"
  179. "0 OPT ==\n"
  180. "0 JEZ 1\n"
  181. "B2\n"
  182. "1 REF mode\n"
  183. "1 STR when\n"
  184. "0 OPT ==\n"
  185. "0 JEZ 1\n"
  186. "B3\n"
  187. "0 RUN when\n"
  188. "0 JEZ 1\n"
  189. "B4\n"
  190. "1 REF __calls\n"
  191. "1 REF i\n"
  192. "0 RUN __get__\n"
  193. "0 OUT todo\n"
  194. "B4\n"
  195. "0 RUN todo\n"
  196. "B3\n"
  197. "0 NUM 0\n"
  198. "0 OUT info_index\n"
  199. "B2\n"
  200. "0 NEL 1\n"
  201. "1 REF mode\n"
  202. "1 STR period_ms\n"
  203. "0 OPT ==\n"
  204. "0 JEZ 1\n"
  205. "B3\n"
  206. "1 REF __calls\n"
  207. "1 REF i\n"
  208. "0 RUN __get__\n"
  209. "0 OUT todo\n"
  210. "B3\n"
  211. "0 NUM 3\n"
  212. "0 OUT info_index\n"
  213. "B1\n"
  214. "0 NEL 1\n"
  215. "1 REF info_index\n"
  216. "1 NUM 3\n"
  217. "0 OPT ==\n"
  218. "0 JEZ 1\n"
  219. "B2\n"
  220. "1 REF mode\n"
  221. "1 STR period_ms\n"
  222. "0 OPT ==\n"
  223. "0 JEZ 1\n"
  224. "B3\n"
  225. "1 REF __tick\n"
  226. "2 REF __calls\n"
  227. "2 REF i\n"
  228. "1 RUN __get__\n"
  229. "0 OPT >\n"
  230. "0 JEZ 1\n"
  231. "B4\n"
  232. "0 RUN todo\n"
  233. "B4\n"
  234. "1 REF __calls\n"
  235. "1 REF i\n"
  236. "2 REF __tick\n"
  237. "2 REF period_ms\n"
  238. "1 OPT +\n"
  239. "1 STR __calls\n"
  240. "0 RUN __set__\n"
  241. "B3\n"
  242. "0 NUM 0\n"
  243. "0 OUT info_index\n"
  244. "B0\n"
  245. "0 JMP -1\n"
  246. "B0\n"
  247. "0 DEL _l0\n"
  248. "B0\n");
  249. }
  250. void __Task_update_tick(PikaObj* self) {
  251. if (obj_getInt(self, "is_perod")) {
  252. pikaVM_runAsm(self, "B0\n0 RUN platformGetTick\n");
  253. }
  254. }
  255. void PikaStdTask_Task_run_forever(PikaObj* self) {
  256. while (1) {
  257. __Task_update_tick(self);
  258. PikaStdTask_Task_run_once(self);
  259. }
  260. }
  261. void PikaStdTask_Task_run_until_ms(PikaObj* self, int until_ms) {
  262. while (1) {
  263. __Task_update_tick(self);
  264. PikaStdTask_Task_run_once(self);
  265. if (obj_getInt(self, "tick") > until_ms) {
  266. return;
  267. }
  268. }
  269. }
  270. void PikaStdTask_Task_platformGetTick(PikaObj* self) {
  271. obj_setErrorCode(self, 1);
  272. obj_setSysOut(self, "[error] platform method need to be override.");
  273. }