luat_statem.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #include "luat_statem.h"
  2. void luat_statem_init(luat_statem_t* sm) {
  3. memset(sm, 0, sizeof(luat_statem_t) + 4 * (sm->op_count - 1));
  4. }
  5. void luat_statem_addop(luat_statem_t* sm, uint8_t tp, uint8_t arg1, uint8_t arg2, uint8_t arg3) {
  6. sm->op_list[sm->pc].tp = tp;
  7. sm->op_list[sm->pc].arg1 = arg1;
  8. sm->op_list[sm->pc].arg2 = arg2;
  9. sm->op_list[sm->pc].arg3 = arg3;
  10. sm->pc ++;
  11. }
  12. void luat_statem_exec(luat_statem_t* sm) {
  13. luat_statm_op_t* op = NULL;
  14. int value = 0;
  15. for (sm->pc = 0; sm->pc < sm->op_count; sm->pc++)
  16. {
  17. op = (luat_statm_op_t*)(sm->op_list + sm->pc);
  18. if (op == NULL || op->tp == LUAT_SM_OP_END)
  19. break;
  20. switch (op->tp)
  21. {
  22. case LUAT_SM_OP_USLEEP:
  23. luat_timer_us_delay(op->arg1);
  24. break;
  25. case LUAT_SM_OP_GPIO_GET:
  26. value = luat_gpio_get(op->arg1);
  27. if (sm->gpio_input_offset < 256) {
  28. if (value) {
  29. sm->gpio_inputs[(sm->gpio_input_offset) /32] |= 1 << (sm->gpio_input_offset & 0x1F);
  30. }
  31. sm->gpio_input_offset ++;
  32. }
  33. break;
  34. case LUAT_SM_OP_GPIO_SET:
  35. luat_gpio_set(op->arg1, op->arg2);
  36. break;
  37. default:
  38. break;
  39. }
  40. }
  41. }