Advertisement
honey_the_codewitch

state machine

Dec 9th, 2022
968
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.05 KB | None | 0 0
  1. void update() {
  2.     if(!initialize()) {
  3.         return;
  4.     }
  5.     if(!use_interrupt) {
  6.         process_change(this);
  7.     }
  8.     if(m_pressed==1) {
  9.         return;
  10.     }
  11.     if(m_last_change_ms!=0 && !m_events.empty() && millis()-m_last_change_ms>= double_click_ms) {
  12.         event_entry_t ev;
  13.         event_entry_t ev_next;
  14.         uint32_t press_ms=0;
  15.         int state = 0;
  16.         int clicks = 0;
  17.         int longp = 0;
  18.         int done = 0;
  19.         while(!done) {
  20.             switch(state) {
  21.             case 0:
  22.                 if(!m_events.get(&ev)) {
  23.                     done = true;
  24.                     break;
  25.                 }
  26.                 if(ev.state==1) {
  27.                     // pressed
  28.                     state = 1;
  29.                     break;
  30.                 } else {
  31.                     // released
  32.                     if(m_on_boot_click!=nullptr) {
  33.                         m_on_boot_click(m_on_boot_click_state);
  34.                     }
  35.                     m_events.get(&ev);
  36.                     // pressed
  37.                     state = 1;
  38.                     break;
  39.                 }
  40.             case 1: // press state
  41.                 ++clicks;
  42.                 press_ms = ev.ms;
  43.                 if(!m_events.get(&ev)) {
  44.                     done = true;
  45.                     break;
  46.                 }
  47.                 state = 2;
  48.                 break;
  49.             case 2: // release state
  50.                 longp = !!(m_on_long_click && ev.ms-press_ms>=long_click_ms);
  51.                 if(!m_events.get(&ev)) {
  52.                     // flush the clicks
  53.                     if(m_on_click) {
  54.                         if(clicks>longp) {
  55.                             m_on_click(clicks-longp,m_on_click_state);
  56.                         }
  57.                     }
  58.                     if(longp) {
  59.                         m_on_long_click(m_on_long_click_state);
  60.                     }
  61.                     done = true;
  62.                     break;
  63.                 }
  64.                 state = 1;
  65.                 break;
  66.             }
  67.         }
  68.     }
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement