123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- #include <Arduino.h>
-
- #include "config.h"
- #include "config_pins.h"
- #include "lcd.h"
- #include "states.h"
-
- template <typename T>
- StateValue<T>::StateValue(State *_parent, T &_value, T _min, T _max) : State(_parent), value(_value) {
- min = _min;
- max = _max;
- heading = NULL;
- text = NULL;
- onEnterFunc = NULL;
- updateFunc = NULL;
- updateLiveFunc = NULL;
- }
-
- template <typename T>
- void StateValue<T>::setMax(T _max) {
- max = _max;
- }
-
- template <typename T>
- void StateValue<T>::onUpdate(UpdateFuncPtr func) {
- updateFunc = func;
- }
-
- template <typename T>
- void StateValue<T>::onLiveUpdate(UpdateFuncPtr func) {
- updateLiveFunc = func;
- }
-
- template <typename T>
- void StateValue<T>::display(void) {
- lcd_clear();
- if (heading == NULL) {
- lcd_set_heading(getTitle());
- } else {
- lcd_set_heading(heading);
- }
-
- String s = String(min) + F(" .. ") + String(value) + F(" .. ") + String(max);
-
- if (text != NULL) {
- s = text + String(F("\n")) + s;
- }
-
- lcd_set_text(s.c_str());
- }
-
-
- template <typename T>
- void StateValue<T>::enterState(void) {
- if (onEnterFunc != NULL) {
- onEnterFunc();
- }
- display();
- }
-
- template <typename T>
- void StateValue<T>::inState(StateMachineInput smi) {
- if (smi.encoder != 0) {
- float vf = smi.encoder;
- vf *= 1.0 + ((float)smi.rpm / ENCODER_RPM_VALUE_FACTOR);
- int v = vf;
- value -= v;
- if (value < min) {
- value = min;
- }
- if (value > max) {
- value = max;
- }
- if (updateLiveFunc != NULL) {
- updateLiveFunc(value);
- }
- display();
- }
- if (smi.click) {
- if (updateFunc != NULL) {
- updateFunc(value);
- }
- if (getChild() != NULL) {
- states_go_to(getChild());
- } else if (getParent() != NULL) {
- states_go_to(getParent());
- }
- }
- }
-
- template class StateValue<int>;
- template class StateValue<float>;
-
- // --------------------------------------
-
- template <typename T, size_t N>
- StateValues<T, N>::StateValues(State *_parent) : State(_parent) {
- heading = NULL;
- onEnterFunc = NULL;
- updateFunc = NULL;
- updateLiveFunc = NULL;
- pos = 0;
- editing = false;
- }
-
- template <typename T, size_t N>
- void StateValues<T, N>::setData(size_t index, const char *name, T *value, T min, T max) {
- if (index >= N) {
- return;
- }
- values[index] = value;
- mins[index] = min;
- maxs[index] = max;
- texts[index] = name;
- }
-
- template <typename T, size_t N>
- void StateValues<T, N>::onUpdate(UpdateFuncPtr func) {
- updateFunc = func;
- }
-
- template <typename T, size_t N>
- void StateValues<T, N>::onLiveUpdate(UpdateFuncPtr func) {
- updateLiveFunc = func;
- }
-
- template <typename T, size_t N>
- void StateValues<T, N>::display(void) {
- lcd_clear();
-
- if (heading == NULL) {
- lcd_set_heading(getTitle());
- } else {
- lcd_set_heading(heading);
- }
-
- for (size_t i = 0; i < (N + 1); i++) {
- String s;
-
- if (i == pos) {
- if (editing) {
- s = F("# ");
- } else {
- s = F("> ");
- }
- } else {
- s = F(" ");
- }
-
- if (i < N) {
- s += texts[i] + String(*(values[i])) + F(" (") + String(mins[i]) + F("/") + String(maxs[i]) + F(")");
- } else {
- if (getChild() != NULL) {
- s += F("Continue");
- } else {
- s += F("Done");
- }
- }
-
- lcd_set_menu_text(i, s.c_str());
- }
- }
-
- template <typename T, size_t N>
- void StateValues<T, N>::enterState(void) {
- pos = 0;
- if (onEnterFunc != NULL) {
- onEnterFunc();
- }
- display();
- }
-
- template <typename T, size_t N>
- void StateValues<T, N>::inState(StateMachineInput smi) {
- if (editing) {
- if (smi.encoder != 0) {
- float vf = smi.encoder;
- vf *= 1.0 + ((float)smi.rpm / ENCODER_RPM_VALUE_FACTOR);
- int v = vf;
- *(values[pos]) -= v;
-
- if (*(values[pos]) < mins[pos]) {
- *(values[pos]) = mins[pos];
- }
-
- if (*(values[pos]) > maxs[pos]) {
- *(values[pos]) = maxs[pos];
- }
-
- if (updateLiveFunc != NULL) {
- updateLiveFunc(pos, *(values[pos]));
- }
-
- display();
- }
- if (smi.click) {
- editing = false;
- display();
- }
- } else {
- if (smi.encoder != 0) {
- int tmp = pos;
- tmp -= smi.encoder;
-
- while (tmp < 0) {
- tmp += N + 1;
- }
-
- while (tmp >= (N + 1)) {
- tmp -= N + 1;
- }
-
- pos = tmp;
-
- display();
- }
- if (smi.click) {
- if (pos < N) {
- editing = true;
- display();
- } else {
- if (updateFunc != NULL) {
- for (size_t i = 0; i < N; i++) {
- updateFunc(i, *(values[i]));
- }
- }
-
- if (getChild() != NULL) {
- states_go_to(getChild());
- } else if (getParent() != NULL) {
- states_go_to(getParent());
- }
- }
- }
- }
- }
-
- template class StateValues<uint8_t, 2>;
- template class StateValues<float, 2>;
|