The codebase to run the *spark d-fuser controller www.sparkav.co.uk/dvimixer
Dependencies: SPK-TVOne DMX DmxArtNet NetServicesMin OSC PinDetect mRotaryEncoder iniparser mbed spk_oled_ssd1305 filter
spk_utils.h@5:f8b285ca41ba, 2012-07-19 (annotated)
- Committer:
- tobyspark
- Date:
- Thu Jul 19 10:46:53 2012 +0000
- Revision:
- 5:f8b285ca41ba
- Parent:
- 0:87aab40d5806
- Child:
- 8:d46cc49f0f37
v18 - DMX
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tobyspark | 0:87aab40d5806 | 1 | #include <string> |
tobyspark | 0:87aab40d5806 | 2 | #include <vector> |
tobyspark | 0:87aab40d5806 | 3 | |
tobyspark | 0:87aab40d5806 | 4 | class SPKIndexInRange { |
tobyspark | 0:87aab40d5806 | 5 | public: |
tobyspark | 0:87aab40d5806 | 6 | void operator = (int newIndex) { |
tobyspark | 0:87aab40d5806 | 7 | set(newIndex); |
tobyspark | 0:87aab40d5806 | 8 | } |
tobyspark | 0:87aab40d5806 | 9 | |
tobyspark | 0:87aab40d5806 | 10 | void operator ++ (int) { |
tobyspark | 0:87aab40d5806 | 11 | if (idx == max) idx = wrap ? min : max; |
tobyspark | 0:87aab40d5806 | 12 | else idx++; |
tobyspark | 0:87aab40d5806 | 13 | } |
tobyspark | 0:87aab40d5806 | 14 | |
tobyspark | 0:87aab40d5806 | 15 | void operator -- (int) { |
tobyspark | 0:87aab40d5806 | 16 | if (idx == min) idx = wrap ? max : min; |
tobyspark | 0:87aab40d5806 | 17 | else idx--; |
tobyspark | 0:87aab40d5806 | 18 | } |
tobyspark | 0:87aab40d5806 | 19 | |
tobyspark | 0:87aab40d5806 | 20 | void set (int newIndex) { |
tobyspark | 0:87aab40d5806 | 21 | if (newIndex > max) idx = max; |
tobyspark | 0:87aab40d5806 | 22 | else if (newIndex < min) idx = min; |
tobyspark | 0:87aab40d5806 | 23 | else idx = newIndex; |
tobyspark | 0:87aab40d5806 | 24 | } |
tobyspark | 0:87aab40d5806 | 25 | |
tobyspark | 0:87aab40d5806 | 26 | void set (int newMin, int newMax, int newIndex = 0, bool newWrap = false) { |
tobyspark | 0:87aab40d5806 | 27 | min = newMin; |
tobyspark | 0:87aab40d5806 | 28 | max = newMax; |
tobyspark | 0:87aab40d5806 | 29 | wrap = newWrap; |
tobyspark | 0:87aab40d5806 | 30 | set(newIndex); |
tobyspark | 0:87aab40d5806 | 31 | } |
tobyspark | 0:87aab40d5806 | 32 | |
tobyspark | 0:87aab40d5806 | 33 | void setMax(int newMax) { |
tobyspark | 0:87aab40d5806 | 34 | max = newMax; |
tobyspark | 0:87aab40d5806 | 35 | } |
tobyspark | 0:87aab40d5806 | 36 | |
tobyspark | 0:87aab40d5806 | 37 | SPKIndexInRange () { |
tobyspark | 0:87aab40d5806 | 38 | min = 0; |
tobyspark | 0:87aab40d5806 | 39 | max = 1; |
tobyspark | 0:87aab40d5806 | 40 | wrap = true; |
tobyspark | 0:87aab40d5806 | 41 | idx = 0; |
tobyspark | 0:87aab40d5806 | 42 | } |
tobyspark | 0:87aab40d5806 | 43 | |
tobyspark | 0:87aab40d5806 | 44 | SPKIndexInRange (int newMin, int newMax, int newIndex = 0, bool newWrap = false) { |
tobyspark | 0:87aab40d5806 | 45 | set(newMin, newMax, newIndex, newWrap); |
tobyspark | 0:87aab40d5806 | 46 | } |
tobyspark | 0:87aab40d5806 | 47 | |
tobyspark | 0:87aab40d5806 | 48 | int index() { |
tobyspark | 0:87aab40d5806 | 49 | return idx; |
tobyspark | 0:87aab40d5806 | 50 | } |
tobyspark | 0:87aab40d5806 | 51 | |
tobyspark | 0:87aab40d5806 | 52 | private: |
tobyspark | 0:87aab40d5806 | 53 | int idx; |
tobyspark | 0:87aab40d5806 | 54 | int min, max; |
tobyspark | 0:87aab40d5806 | 55 | bool wrap; |
tobyspark | 0:87aab40d5806 | 56 | }; |
tobyspark | 0:87aab40d5806 | 57 | |
tobyspark | 0:87aab40d5806 | 58 | enum SPKMenuType { menuOfMenus, payload }; |
tobyspark | 0:87aab40d5806 | 59 | |
tobyspark | 0:87aab40d5806 | 60 | class SPKMenu { |
tobyspark | 0:87aab40d5806 | 61 | public: |
tobyspark | 0:87aab40d5806 | 62 | SPKMenu() { |
tobyspark | 0:87aab40d5806 | 63 | selected.set(0, 0, 0, true); |
tobyspark | 0:87aab40d5806 | 64 | } |
tobyspark | 0:87aab40d5806 | 65 | |
tobyspark | 0:87aab40d5806 | 66 | virtual SPKMenuType type(void) = 0; |
tobyspark | 0:87aab40d5806 | 67 | |
tobyspark | 0:87aab40d5806 | 68 | std::string title; |
tobyspark | 0:87aab40d5806 | 69 | |
tobyspark | 5:f8b285ca41ba | 70 | // not carried into subclass... whats the c++ way of doing this? |
tobyspark | 5:f8b285ca41ba | 71 | SPKMenu& operator = (const int &newIndex) { |
tobyspark | 0:87aab40d5806 | 72 | selected = newIndex; |
tobyspark | 5:f8b285ca41ba | 73 | return *this; |
tobyspark | 0:87aab40d5806 | 74 | } |
tobyspark | 0:87aab40d5806 | 75 | |
tobyspark | 0:87aab40d5806 | 76 | void operator ++ () { |
tobyspark | 0:87aab40d5806 | 77 | selected++; |
tobyspark | 0:87aab40d5806 | 78 | } |
tobyspark | 0:87aab40d5806 | 79 | |
tobyspark | 0:87aab40d5806 | 80 | void operator -- () { |
tobyspark | 0:87aab40d5806 | 81 | selected--; |
tobyspark | 0:87aab40d5806 | 82 | } |
tobyspark | 0:87aab40d5806 | 83 | |
tobyspark | 0:87aab40d5806 | 84 | void addMenuItem (std::string menuText) { |
tobyspark | 0:87aab40d5806 | 85 | text.push_back(menuText); |
tobyspark | 0:87aab40d5806 | 86 | selected.setMax(text.size()-1); |
tobyspark | 0:87aab40d5806 | 87 | } |
tobyspark | 0:87aab40d5806 | 88 | |
tobyspark | 0:87aab40d5806 | 89 | int selectedIndex() { |
tobyspark | 0:87aab40d5806 | 90 | return selected.index(); |
tobyspark | 0:87aab40d5806 | 91 | } |
tobyspark | 0:87aab40d5806 | 92 | |
tobyspark | 0:87aab40d5806 | 93 | std::string selectedString() { |
tobyspark | 0:87aab40d5806 | 94 | return text[selected.index()]; |
tobyspark | 0:87aab40d5806 | 95 | } |
tobyspark | 0:87aab40d5806 | 96 | |
tobyspark | 0:87aab40d5806 | 97 | protected: |
tobyspark | 0:87aab40d5806 | 98 | SPKIndexInRange selected; |
tobyspark | 0:87aab40d5806 | 99 | std::vector<std::string> text; |
tobyspark | 0:87aab40d5806 | 100 | }; |
tobyspark | 0:87aab40d5806 | 101 | |
tobyspark | 0:87aab40d5806 | 102 | class SPKMenuOfMenus: public SPKMenu { |
tobyspark | 0:87aab40d5806 | 103 | public: |
tobyspark | 0:87aab40d5806 | 104 | SPKMenuOfMenus() : SPKMenu() {} |
tobyspark | 0:87aab40d5806 | 105 | |
tobyspark | 0:87aab40d5806 | 106 | virtual SPKMenuType type() { |
tobyspark | 0:87aab40d5806 | 107 | return menuOfMenus; |
tobyspark | 0:87aab40d5806 | 108 | } |
tobyspark | 0:87aab40d5806 | 109 | |
tobyspark | 0:87aab40d5806 | 110 | void addMenuItem(SPKMenu* menu) { |
tobyspark | 0:87aab40d5806 | 111 | SPKMenu::addMenuItem(menu->title); |
tobyspark | 0:87aab40d5806 | 112 | payload.push_back(menu); |
tobyspark | 0:87aab40d5806 | 113 | } |
tobyspark | 0:87aab40d5806 | 114 | |
tobyspark | 0:87aab40d5806 | 115 | SPKMenu* selectedMenu() { |
tobyspark | 0:87aab40d5806 | 116 | return payload[selected.index()]; |
tobyspark | 0:87aab40d5806 | 117 | } |
tobyspark | 0:87aab40d5806 | 118 | |
tobyspark | 0:87aab40d5806 | 119 | private: |
tobyspark | 0:87aab40d5806 | 120 | vector<SPKMenu*> payload; |
tobyspark | 0:87aab40d5806 | 121 | }; |
tobyspark | 0:87aab40d5806 | 122 | |
tobyspark | 0:87aab40d5806 | 123 | class SPKMenuPayload: public SPKMenu { |
tobyspark | 0:87aab40d5806 | 124 | public: |
tobyspark | 0:87aab40d5806 | 125 | SPKMenuPayload() : SPKMenu() { |
tobyspark | 0:87aab40d5806 | 126 | text.push_back("Cancel"); |
tobyspark | 0:87aab40d5806 | 127 | payload1.push_back(0); |
tobyspark | 0:87aab40d5806 | 128 | payload2.push_back(0); |
tobyspark | 0:87aab40d5806 | 129 | } |
tobyspark | 0:87aab40d5806 | 130 | |
tobyspark | 0:87aab40d5806 | 131 | virtual SPKMenuType type() { |
tobyspark | 0:87aab40d5806 | 132 | return payload; |
tobyspark | 0:87aab40d5806 | 133 | } |
tobyspark | 0:87aab40d5806 | 134 | |
tobyspark | 0:87aab40d5806 | 135 | void addMenuItem(std::string menuText, int32_t menuPayload1, int32_t menuPayload2) { |
tobyspark | 0:87aab40d5806 | 136 | SPKMenu::addMenuItem(menuText); |
tobyspark | 0:87aab40d5806 | 137 | payload1.push_back(menuPayload1); |
tobyspark | 0:87aab40d5806 | 138 | payload2.push_back(menuPayload2); |
tobyspark | 0:87aab40d5806 | 139 | } |
tobyspark | 0:87aab40d5806 | 140 | |
tobyspark | 0:87aab40d5806 | 141 | int32_t selectedPayload1() { |
tobyspark | 0:87aab40d5806 | 142 | return payload1[selected.index()]; |
tobyspark | 0:87aab40d5806 | 143 | } |
tobyspark | 0:87aab40d5806 | 144 | |
tobyspark | 0:87aab40d5806 | 145 | int32_t selectedPayload2() { |
tobyspark | 0:87aab40d5806 | 146 | return payload2[selected.index()]; |
tobyspark | 0:87aab40d5806 | 147 | } |
tobyspark | 5:f8b285ca41ba | 148 | |
tobyspark | 5:f8b285ca41ba | 149 | SPKMenuPayload& operator = (const int &newIndex) { |
tobyspark | 5:f8b285ca41ba | 150 | selected = newIndex; |
tobyspark | 5:f8b285ca41ba | 151 | return *this; |
tobyspark | 5:f8b285ca41ba | 152 | } |
tobyspark | 5:f8b285ca41ba | 153 | |
tobyspark | 5:f8b285ca41ba | 154 | |
tobyspark | 0:87aab40d5806 | 155 | private: |
tobyspark | 0:87aab40d5806 | 156 | vector<int32_t> payload1; |
tobyspark | 0:87aab40d5806 | 157 | vector<int32_t> payload2; |
tobyspark | 0:87aab40d5806 | 158 | }; |
tobyspark | 0:87aab40d5806 | 159 | |
tobyspark | 0:87aab40d5806 | 160 | class SPKSign { |
tobyspark | 0:87aab40d5806 | 161 | public: |
tobyspark | 0:87aab40d5806 | 162 | SPKSign(PinName signWrite, PinName signError) { |
tobyspark | 0:87aab40d5806 | 163 | writeDO = new DigitalOut(signWrite); |
tobyspark | 0:87aab40d5806 | 164 | errorDO = new DigitalOut(signError); |
tobyspark | 0:87aab40d5806 | 165 | } |
tobyspark | 0:87aab40d5806 | 166 | |
tobyspark | 0:87aab40d5806 | 167 | ~SPKSign() { |
tobyspark | 0:87aab40d5806 | 168 | delete writeDO; |
tobyspark | 0:87aab40d5806 | 169 | delete errorDO; |
tobyspark | 0:87aab40d5806 | 170 | } |
tobyspark | 0:87aab40d5806 | 171 | |
tobyspark | 0:87aab40d5806 | 172 | void serialWrite() { |
tobyspark | 0:87aab40d5806 | 173 | signWriteTimeout.detach(); |
tobyspark | 0:87aab40d5806 | 174 | signWriteTimeout.attach(this, &SPKSign::writeOff, 0.25); |
tobyspark | 0:87aab40d5806 | 175 | *writeDO = 1; |
tobyspark | 0:87aab40d5806 | 176 | } |
tobyspark | 0:87aab40d5806 | 177 | |
tobyspark | 0:87aab40d5806 | 178 | void serialError() { |
tobyspark | 0:87aab40d5806 | 179 | signErrorTimeout.detach(); |
tobyspark | 0:87aab40d5806 | 180 | signErrorTimeout.attach(this, &SPKSign::errorOff, 0.25); |
tobyspark | 0:87aab40d5806 | 181 | *errorDO = 1; |
tobyspark | 0:87aab40d5806 | 182 | } |
tobyspark | 0:87aab40d5806 | 183 | |
tobyspark | 0:87aab40d5806 | 184 | private: |
tobyspark | 0:87aab40d5806 | 185 | void writeOff() { |
tobyspark | 0:87aab40d5806 | 186 | *writeDO = 0; |
tobyspark | 0:87aab40d5806 | 187 | } |
tobyspark | 0:87aab40d5806 | 188 | |
tobyspark | 0:87aab40d5806 | 189 | void errorOff() { |
tobyspark | 0:87aab40d5806 | 190 | *errorDO = 0; |
tobyspark | 0:87aab40d5806 | 191 | } |
tobyspark | 0:87aab40d5806 | 192 | |
tobyspark | 0:87aab40d5806 | 193 | DigitalOut *writeDO; |
tobyspark | 0:87aab40d5806 | 194 | DigitalOut *errorDO; |
tobyspark | 0:87aab40d5806 | 195 | Timeout signWriteTimeout; |
tobyspark | 0:87aab40d5806 | 196 | Timeout signErrorTimeout; |
tobyspark | 0:87aab40d5806 | 197 | }; |
tobyspark | 0:87aab40d5806 | 198 | |
tobyspark | 0:87aab40d5806 | 199 | |
tobyspark | 0:87aab40d5806 | 200 |