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

Committer:
tobyspark
Date:
Mon Dec 17 18:22:07 2012 +0000
Revision:
51:98cc27390484
Parent:
49:16309f39cead
Child:
57:14d37904c889
More UX, Correct blend algorithm (Maths!), Fixes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tobyspark 8:d46cc49f0f37 1 // *SPARK D-FUSER
tobyspark 8:d46cc49f0f37 2 // A project by Toby Harris
tobyspark 8:d46cc49f0f37 3 // Copyright *spark audio-visual 2012
tobyspark 8:d46cc49f0f37 4 //
tobyspark 8:d46cc49f0f37 5 // SPK_UTILS provides utility classes for the main SPK-DVIMXR codebase, most significantly the menu system.
tobyspark 8:d46cc49f0f37 6
tobyspark 0:87aab40d5806 7 #include <string>
tobyspark 0:87aab40d5806 8 #include <vector>
tobyspark 0:87aab40d5806 9
tobyspark 0:87aab40d5806 10 class SPKIndexInRange {
tobyspark 0:87aab40d5806 11 public:
tobyspark 0:87aab40d5806 12 void operator = (int newIndex) {
tobyspark 0:87aab40d5806 13 set(newIndex);
tobyspark 0:87aab40d5806 14 }
tobyspark 0:87aab40d5806 15
tobyspark 0:87aab40d5806 16 void operator ++ (int) {
tobyspark 0:87aab40d5806 17 if (idx == max) idx = wrap ? min : max;
tobyspark 0:87aab40d5806 18 else idx++;
tobyspark 0:87aab40d5806 19 }
tobyspark 0:87aab40d5806 20
tobyspark 0:87aab40d5806 21 void operator -- (int) {
tobyspark 0:87aab40d5806 22 if (idx == min) idx = wrap ? max : min;
tobyspark 0:87aab40d5806 23 else idx--;
tobyspark 0:87aab40d5806 24 }
tobyspark 0:87aab40d5806 25
tobyspark 0:87aab40d5806 26 void set (int newIndex) {
tobyspark 0:87aab40d5806 27 if (newIndex > max) idx = max;
tobyspark 0:87aab40d5806 28 else if (newIndex < min) idx = min;
tobyspark 0:87aab40d5806 29 else idx = newIndex;
tobyspark 0:87aab40d5806 30 }
tobyspark 0:87aab40d5806 31
tobyspark 0:87aab40d5806 32 void set (int newMin, int newMax, int newIndex = 0, bool newWrap = false) {
tobyspark 0:87aab40d5806 33 min = newMin;
tobyspark 0:87aab40d5806 34 max = newMax;
tobyspark 0:87aab40d5806 35 wrap = newWrap;
tobyspark 0:87aab40d5806 36 set(newIndex);
tobyspark 0:87aab40d5806 37 }
tobyspark 0:87aab40d5806 38
tobyspark 0:87aab40d5806 39 void setMax(int newMax) {
tobyspark 0:87aab40d5806 40 max = newMax;
tobyspark 0:87aab40d5806 41 }
tobyspark 0:87aab40d5806 42
tobyspark 0:87aab40d5806 43 SPKIndexInRange () {
tobyspark 0:87aab40d5806 44 min = 0;
tobyspark 0:87aab40d5806 45 max = 1;
tobyspark 0:87aab40d5806 46 wrap = true;
tobyspark 0:87aab40d5806 47 idx = 0;
tobyspark 0:87aab40d5806 48 }
tobyspark 0:87aab40d5806 49
tobyspark 0:87aab40d5806 50 SPKIndexInRange (int newMin, int newMax, int newIndex = 0, bool newWrap = false) {
tobyspark 0:87aab40d5806 51 set(newMin, newMax, newIndex, newWrap);
tobyspark 0:87aab40d5806 52 }
tobyspark 0:87aab40d5806 53
tobyspark 0:87aab40d5806 54 int index() {
tobyspark 0:87aab40d5806 55 return idx;
tobyspark 0:87aab40d5806 56 }
tobyspark 0:87aab40d5806 57
tobyspark 0:87aab40d5806 58 private:
tobyspark 0:87aab40d5806 59 int idx;
tobyspark 0:87aab40d5806 60 int min, max;
tobyspark 0:87aab40d5806 61 bool wrap;
tobyspark 0:87aab40d5806 62 };
tobyspark 0:87aab40d5806 63
tobyspark 23:909928cafb95 64 class SPKMenu;
tobyspark 23:909928cafb95 65
tobyspark 23:909928cafb95 66 class SPKMenuItem {
tobyspark 23:909928cafb95 67 public:
tobyspark 49:16309f39cead 68 enum itemType { changesToMenu, sendsCommand, hasHandler };
tobyspark 23:909928cafb95 69 itemType type;
tobyspark 23:909928cafb95 70 string text;
tobyspark 49:16309f39cead 71 void (*handler)(int, bool);
tobyspark 23:909928cafb95 72 union {
tobyspark 23:909928cafb95 73 SPKMenu* menu;
tobyspark 23:909928cafb95 74 int32_t command[2];
tobyspark 49:16309f39cead 75 void (*handler)(int, bool);
tobyspark 23:909928cafb95 76 } payload;
tobyspark 23:909928cafb95 77
tobyspark 49:16309f39cead 78 SPKMenuItem(string title, SPKMenu* menu)
tobyspark 23:909928cafb95 79 {
tobyspark 23:909928cafb95 80 text = title;
tobyspark 23:909928cafb95 81 type = changesToMenu;
tobyspark 23:909928cafb95 82 payload.menu = menu;
tobyspark 23:909928cafb95 83 }
tobyspark 23:909928cafb95 84
tobyspark 49:16309f39cead 85 SPKMenuItem(void (*menuItemHandler)(int, bool))
tobyspark 49:16309f39cead 86 {
tobyspark 49:16309f39cead 87 text = "[has handler]";
tobyspark 49:16309f39cead 88 type = hasHandler;
tobyspark 49:16309f39cead 89 payload.handler = menuItemHandler;
tobyspark 49:16309f39cead 90 }
tobyspark 49:16309f39cead 91
tobyspark 23:909928cafb95 92 SPKMenuItem(string title, int32_t command)
tobyspark 23:909928cafb95 93 {
tobyspark 23:909928cafb95 94 text = title;
tobyspark 23:909928cafb95 95 type = sendsCommand;
tobyspark 23:909928cafb95 96 payload.command[0] = command;
tobyspark 23:909928cafb95 97 payload.command[1] = 0;
tobyspark 23:909928cafb95 98 }
tobyspark 23:909928cafb95 99
tobyspark 23:909928cafb95 100 SPKMenuItem(string title, int32_t command1, int32_t command2)
tobyspark 23:909928cafb95 101 {
tobyspark 23:909928cafb95 102 text = title;
tobyspark 23:909928cafb95 103 type = sendsCommand;
tobyspark 23:909928cafb95 104 payload.command[0] = command1;
tobyspark 23:909928cafb95 105 payload.command[1] = command2;
tobyspark 23:909928cafb95 106 }
tobyspark 23:909928cafb95 107 };
tobyspark 23:909928cafb95 108
tobyspark 23:909928cafb95 109
tobyspark 0:87aab40d5806 110 class SPKMenu {
tobyspark 0:87aab40d5806 111 public:
tobyspark 0:87aab40d5806 112 SPKMenu() {
tobyspark 0:87aab40d5806 113 selected.set(0, 0, 0, true);
tobyspark 0:87aab40d5806 114 }
tobyspark 0:87aab40d5806 115
tobyspark 0:87aab40d5806 116 std::string title;
tobyspark 0:87aab40d5806 117
tobyspark 5:f8b285ca41ba 118 SPKMenu& operator = (const int &newIndex) {
tobyspark 0:87aab40d5806 119 selected = newIndex;
tobyspark 5:f8b285ca41ba 120 return *this;
tobyspark 0:87aab40d5806 121 }
tobyspark 0:87aab40d5806 122
tobyspark 0:87aab40d5806 123 void operator ++ () {
tobyspark 0:87aab40d5806 124 selected++;
tobyspark 0:87aab40d5806 125 }
tobyspark 0:87aab40d5806 126
tobyspark 0:87aab40d5806 127 void operator -- () {
tobyspark 0:87aab40d5806 128 selected--;
tobyspark 0:87aab40d5806 129 }
tobyspark 0:87aab40d5806 130
tobyspark 23:909928cafb95 131 void addMenuItem (SPKMenuItem menuItem) {
tobyspark 23:909928cafb95 132 items.push_back(menuItem);
tobyspark 23:909928cafb95 133 selected.setMax(items.size()-1);
tobyspark 23:909928cafb95 134 }
tobyspark 23:909928cafb95 135
tobyspark 23:909928cafb95 136 void clearMenuItems() {
tobyspark 23:909928cafb95 137 items.clear();
tobyspark 23:909928cafb95 138 selected.setMax(0);
tobyspark 0:87aab40d5806 139 }
tobyspark 0:87aab40d5806 140
tobyspark 0:87aab40d5806 141 int selectedIndex() {
tobyspark 0:87aab40d5806 142 return selected.index();
tobyspark 0:87aab40d5806 143 }
tobyspark 0:87aab40d5806 144
tobyspark 24:49c6624119ae 145 std::string selectedString() {
tobyspark 24:49c6624119ae 146 if (items.size() == 0) printf("SPKMenu no items");
tobyspark 23:909928cafb95 147 return items[selected.index()].text;
tobyspark 23:909928cafb95 148 }
tobyspark 23:909928cafb95 149
tobyspark 23:909928cafb95 150 SPKMenuItem selectedItem() {
tobyspark 24:49c6624119ae 151 if (items.size() == 0) printf("SPKMenu no items");
tobyspark 23:909928cafb95 152 return items[selected.index()];
tobyspark 0:87aab40d5806 153 }
tobyspark 0:87aab40d5806 154
tobyspark 0:87aab40d5806 155 protected:
tobyspark 0:87aab40d5806 156 SPKIndexInRange selected;
tobyspark 23:909928cafb95 157 std::vector<SPKMenuItem> items;
tobyspark 0:87aab40d5806 158 };
tobyspark 0:87aab40d5806 159
tobyspark 0:87aab40d5806 160
tobyspark 0:87aab40d5806 161 class SPKSign {
tobyspark 0:87aab40d5806 162 public:
tobyspark 0:87aab40d5806 163 SPKSign(PinName signWrite, PinName signError) {
tobyspark 0:87aab40d5806 164 writeDO = new DigitalOut(signWrite);
tobyspark 0:87aab40d5806 165 errorDO = new DigitalOut(signError);
tobyspark 0:87aab40d5806 166 }
tobyspark 0:87aab40d5806 167
tobyspark 0:87aab40d5806 168 ~SPKSign() {
tobyspark 0:87aab40d5806 169 delete writeDO;
tobyspark 0:87aab40d5806 170 delete errorDO;
tobyspark 0:87aab40d5806 171 }
tobyspark 0:87aab40d5806 172
tobyspark 0:87aab40d5806 173 void serialWrite() {
tobyspark 0:87aab40d5806 174 signWriteTimeout.detach();
tobyspark 0:87aab40d5806 175 signWriteTimeout.attach(this, &SPKSign::writeOff, 0.25);
tobyspark 0:87aab40d5806 176 *writeDO = 1;
tobyspark 0:87aab40d5806 177 }
tobyspark 0:87aab40d5806 178
tobyspark 0:87aab40d5806 179 void serialError() {
tobyspark 0:87aab40d5806 180 signErrorTimeout.detach();
tobyspark 0:87aab40d5806 181 signErrorTimeout.attach(this, &SPKSign::errorOff, 0.25);
tobyspark 0:87aab40d5806 182 *errorDO = 1;
tobyspark 0:87aab40d5806 183 }
tobyspark 0:87aab40d5806 184
tobyspark 0:87aab40d5806 185 private:
tobyspark 0:87aab40d5806 186 void writeOff() {
tobyspark 0:87aab40d5806 187 *writeDO = 0;
tobyspark 0:87aab40d5806 188 }
tobyspark 0:87aab40d5806 189
tobyspark 0:87aab40d5806 190 void errorOff() {
tobyspark 0:87aab40d5806 191 *errorDO = 0;
tobyspark 0:87aab40d5806 192 }
tobyspark 0:87aab40d5806 193
tobyspark 0:87aab40d5806 194 DigitalOut *writeDO;
tobyspark 0:87aab40d5806 195 DigitalOut *errorDO;
tobyspark 0:87aab40d5806 196 Timeout signWriteTimeout;
tobyspark 0:87aab40d5806 197 Timeout signErrorTimeout;
tobyspark 0:87aab40d5806 198 };
tobyspark 0:87aab40d5806 199
tobyspark 48:c0fedfa8c525 200 class SPKMessageHold {
tobyspark 48:c0fedfa8c525 201 public:
tobyspark 0:87aab40d5806 202
tobyspark 48:c0fedfa8c525 203 SPKMessageHold() {
tobyspark 48:c0fedfa8c525 204 holding = false;
tobyspark 48:c0fedfa8c525 205 currentMessage = "";
tobyspark 48:c0fedfa8c525 206 waitingMessage = "";
tobyspark 48:c0fedfa8c525 207 }
tobyspark 48:c0fedfa8c525 208
tobyspark 48:c0fedfa8c525 209 void addMessage(string message, float minimumSeconds) {
tobyspark 48:c0fedfa8c525 210 if (minimumSeconds > 0.0f)
tobyspark 48:c0fedfa8c525 211 {
tobyspark 48:c0fedfa8c525 212 timeout.detach();
tobyspark 48:c0fedfa8c525 213 timeout.attach(this, &SPKMessageHold::handleTimeout, minimumSeconds);
tobyspark 48:c0fedfa8c525 214 holding = true;
tobyspark 51:98cc27390484 215 waitingMessage = currentMessage;
tobyspark 48:c0fedfa8c525 216 currentMessage = message;
tobyspark 48:c0fedfa8c525 217 }
tobyspark 48:c0fedfa8c525 218 else
tobyspark 48:c0fedfa8c525 219 {
tobyspark 48:c0fedfa8c525 220 if (holding) waitingMessage = message;
tobyspark 48:c0fedfa8c525 221 else currentMessage = message;
tobyspark 48:c0fedfa8c525 222 }
tobyspark 48:c0fedfa8c525 223 }
tobyspark 48:c0fedfa8c525 224
tobyspark 48:c0fedfa8c525 225 string message() { return currentMessage; }
tobyspark 0:87aab40d5806 226
tobyspark 48:c0fedfa8c525 227 private:
tobyspark 48:c0fedfa8c525 228 void handleTimeout() {
tobyspark 48:c0fedfa8c525 229 currentMessage = waitingMessage;
tobyspark 48:c0fedfa8c525 230 waitingMessage = "";
tobyspark 48:c0fedfa8c525 231 holding = false;
tobyspark 48:c0fedfa8c525 232 }
tobyspark 48:c0fedfa8c525 233
tobyspark 48:c0fedfa8c525 234 bool holding;
tobyspark 48:c0fedfa8c525 235 string currentMessage;
tobyspark 48:c0fedfa8c525 236 string waitingMessage;
tobyspark 48:c0fedfa8c525 237 Timeout timeout;
tobyspark 48:c0fedfa8c525 238 };