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:
Fri Oct 26 16:51:28 2012 +0000
Revision:
23:909928cafb95
Parent:
21:f9d63cb7cedb
Child:
24:49c6624119ae
SPKMenu redux

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 23:909928cafb95 68 enum itemType { changesToMenu, sendsCommand, usesMenuControls };
tobyspark 23:909928cafb95 69 itemType type;
tobyspark 23:909928cafb95 70 string text;
tobyspark 23:909928cafb95 71 union {
tobyspark 23:909928cafb95 72 SPKMenu* menu;
tobyspark 23:909928cafb95 73 int32_t command[2];
tobyspark 23:909928cafb95 74 bool handlingControls;
tobyspark 23:909928cafb95 75 } payload;
tobyspark 23:909928cafb95 76
tobyspark 23:909928cafb95 77 SPKMenuItem(string title, SPKMenu* menu)
tobyspark 23:909928cafb95 78 {
tobyspark 23:909928cafb95 79 text = title;
tobyspark 23:909928cafb95 80 type = changesToMenu;
tobyspark 23:909928cafb95 81 payload.menu = menu;
tobyspark 23:909928cafb95 82 }
tobyspark 23:909928cafb95 83
tobyspark 23:909928cafb95 84 SPKMenuItem(string title, int32_t command)
tobyspark 23:909928cafb95 85 {
tobyspark 23:909928cafb95 86 text = title;
tobyspark 23:909928cafb95 87 type = sendsCommand;
tobyspark 23:909928cafb95 88 payload.command[0] = command;
tobyspark 23:909928cafb95 89 payload.command[1] = 0;
tobyspark 23:909928cafb95 90 }
tobyspark 23:909928cafb95 91
tobyspark 23:909928cafb95 92 SPKMenuItem(string title, int32_t command1, int32_t command2)
tobyspark 23:909928cafb95 93 {
tobyspark 23:909928cafb95 94 text = title;
tobyspark 23:909928cafb95 95 type = sendsCommand;
tobyspark 23:909928cafb95 96 payload.command[0] = command1;
tobyspark 23:909928cafb95 97 payload.command[1] = command2;
tobyspark 23:909928cafb95 98 }
tobyspark 23:909928cafb95 99
tobyspark 23:909928cafb95 100 SPKMenuItem(string title)
tobyspark 23:909928cafb95 101 {
tobyspark 23:909928cafb95 102 text = title;
tobyspark 23:909928cafb95 103 type = usesMenuControls;
tobyspark 23:909928cafb95 104 payload.handlingControls = true;
tobyspark 23:909928cafb95 105 }
tobyspark 23:909928cafb95 106 };
tobyspark 23:909928cafb95 107
tobyspark 23:909928cafb95 108
tobyspark 0:87aab40d5806 109 class SPKMenu {
tobyspark 0:87aab40d5806 110 public:
tobyspark 0:87aab40d5806 111 SPKMenu() {
tobyspark 0:87aab40d5806 112 selected.set(0, 0, 0, true);
tobyspark 0:87aab40d5806 113 }
tobyspark 0:87aab40d5806 114
tobyspark 0:87aab40d5806 115 std::string title;
tobyspark 0:87aab40d5806 116
tobyspark 5:f8b285ca41ba 117 SPKMenu& operator = (const int &newIndex) {
tobyspark 0:87aab40d5806 118 selected = newIndex;
tobyspark 5:f8b285ca41ba 119 return *this;
tobyspark 0:87aab40d5806 120 }
tobyspark 0:87aab40d5806 121
tobyspark 0:87aab40d5806 122 void operator ++ () {
tobyspark 0:87aab40d5806 123 selected++;
tobyspark 0:87aab40d5806 124 }
tobyspark 0:87aab40d5806 125
tobyspark 0:87aab40d5806 126 void operator -- () {
tobyspark 0:87aab40d5806 127 selected--;
tobyspark 0:87aab40d5806 128 }
tobyspark 0:87aab40d5806 129
tobyspark 23:909928cafb95 130 void addMenuItem (SPKMenuItem menuItem) {
tobyspark 23:909928cafb95 131 items.push_back(menuItem);
tobyspark 23:909928cafb95 132 selected.setMax(items.size()-1);
tobyspark 23:909928cafb95 133 }
tobyspark 23:909928cafb95 134
tobyspark 23:909928cafb95 135 void clearMenuItems() {
tobyspark 23:909928cafb95 136 items.clear();
tobyspark 23:909928cafb95 137 selected.setMax(0);
tobyspark 0:87aab40d5806 138 }
tobyspark 0:87aab40d5806 139
tobyspark 0:87aab40d5806 140 int selectedIndex() {
tobyspark 0:87aab40d5806 141 return selected.index();
tobyspark 0:87aab40d5806 142 }
tobyspark 0:87aab40d5806 143
tobyspark 23:909928cafb95 144 std::string selectedString() {
tobyspark 23:909928cafb95 145 return items[selected.index()].text;
tobyspark 23:909928cafb95 146 }
tobyspark 23:909928cafb95 147
tobyspark 23:909928cafb95 148 SPKMenuItem selectedItem() {
tobyspark 23:909928cafb95 149 return items[selected.index()];
tobyspark 0:87aab40d5806 150 }
tobyspark 0:87aab40d5806 151
tobyspark 0:87aab40d5806 152 protected:
tobyspark 0:87aab40d5806 153 SPKIndexInRange selected;
tobyspark 23:909928cafb95 154 std::vector<SPKMenuItem> items;
tobyspark 0:87aab40d5806 155 };
tobyspark 0:87aab40d5806 156
tobyspark 0:87aab40d5806 157
tobyspark 0:87aab40d5806 158 class SPKSign {
tobyspark 0:87aab40d5806 159 public:
tobyspark 0:87aab40d5806 160 SPKSign(PinName signWrite, PinName signError) {
tobyspark 0:87aab40d5806 161 writeDO = new DigitalOut(signWrite);
tobyspark 0:87aab40d5806 162 errorDO = new DigitalOut(signError);
tobyspark 0:87aab40d5806 163 }
tobyspark 0:87aab40d5806 164
tobyspark 0:87aab40d5806 165 ~SPKSign() {
tobyspark 0:87aab40d5806 166 delete writeDO;
tobyspark 0:87aab40d5806 167 delete errorDO;
tobyspark 0:87aab40d5806 168 }
tobyspark 0:87aab40d5806 169
tobyspark 0:87aab40d5806 170 void serialWrite() {
tobyspark 0:87aab40d5806 171 signWriteTimeout.detach();
tobyspark 0:87aab40d5806 172 signWriteTimeout.attach(this, &SPKSign::writeOff, 0.25);
tobyspark 0:87aab40d5806 173 *writeDO = 1;
tobyspark 0:87aab40d5806 174 }
tobyspark 0:87aab40d5806 175
tobyspark 0:87aab40d5806 176 void serialError() {
tobyspark 0:87aab40d5806 177 signErrorTimeout.detach();
tobyspark 0:87aab40d5806 178 signErrorTimeout.attach(this, &SPKSign::errorOff, 0.25);
tobyspark 0:87aab40d5806 179 *errorDO = 1;
tobyspark 0:87aab40d5806 180 }
tobyspark 0:87aab40d5806 181
tobyspark 0:87aab40d5806 182 private:
tobyspark 0:87aab40d5806 183 void writeOff() {
tobyspark 0:87aab40d5806 184 *writeDO = 0;
tobyspark 0:87aab40d5806 185 }
tobyspark 0:87aab40d5806 186
tobyspark 0:87aab40d5806 187 void errorOff() {
tobyspark 0:87aab40d5806 188 *errorDO = 0;
tobyspark 0:87aab40d5806 189 }
tobyspark 0:87aab40d5806 190
tobyspark 0:87aab40d5806 191 DigitalOut *writeDO;
tobyspark 0:87aab40d5806 192 DigitalOut *errorDO;
tobyspark 0:87aab40d5806 193 Timeout signWriteTimeout;
tobyspark 0:87aab40d5806 194 Timeout signErrorTimeout;
tobyspark 0:87aab40d5806 195 };
tobyspark 0:87aab40d5806 196
tobyspark 0:87aab40d5806 197
tobyspark 0:87aab40d5806 198