Amir Chaudhary / Mbed OS MTDOT-BOX-EVB-Factory-Firmware

Dependencies:   NCP5623B GpsParser ISL29011 libmDot-mbed5 MTS-Serial MMA845x DOGS102 MPL3115A2

Committer:
jenkins@jenkinsdm1
Date:
Thu Mar 14 08:23:20 2019 -0500
Revision:
16:e76cec0eec43
Parent:
12:05435282f899
dotbox-firmware revision 3.1.2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Mike Fiore 1:71125aa00e33 1 /* Copyright (c) <2016> <MultiTech Systems>, MIT License
Mike Fiore 1:71125aa00e33 2 *
Mike Fiore 1:71125aa00e33 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
Mike Fiore 1:71125aa00e33 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
Mike Fiore 1:71125aa00e33 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
Mike Fiore 1:71125aa00e33 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
Mike Fiore 1:71125aa00e33 7 * furnished to do so, subject to the following conditions:
Mike Fiore 1:71125aa00e33 8 *
Mike Fiore 1:71125aa00e33 9 * The above copyright notice and this permission notice shall be included in all copies or
Mike Fiore 1:71125aa00e33 10 * substantial portions of the Software.
Mike Fiore 1:71125aa00e33 11 *
Mike Fiore 1:71125aa00e33 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
Mike Fiore 1:71125aa00e33 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Mike Fiore 1:71125aa00e33 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
Mike Fiore 1:71125aa00e33 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Mike Fiore 1:71125aa00e33 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Mike Fiore 1:71125aa00e33 17 */
Mike Fiore 1:71125aa00e33 18
Mike Fiore 1:71125aa00e33 19 #include "LayoutScrollSelect.h"
Mike Fiore 1:71125aa00e33 20 #include "MTSLog.h"
Mike Fiore 1:71125aa00e33 21
Mike Fiore 1:71125aa00e33 22 LayoutScrollSelect::LayoutScrollSelect(DOGS102* lcd, Items items, std::string info1, std::string info2)
Mike Fiore 1:71125aa00e33 23 : Layout(lcd),
Mike Fiore 1:71125aa00e33 24 _lSw1(0, 7, "Scroll"),
Mike Fiore 1:71125aa00e33 25 _lSw2(11, 7, "Select"),
Mike Fiore 1:71125aa00e33 26 _lInfo1(0, 0, info1),
Mike Fiore 1:71125aa00e33 27 _lInfo2(0, 1, info2),
Mike Fiore 1:71125aa00e33 28 _lCursor(0, 4, "=>"),
Mike Fiore 1:71125aa00e33 29 _fItem1(3, 2, 14),
Mike Fiore 1:71125aa00e33 30 _fItem2(3, 3, 14),
Mike Fiore 1:71125aa00e33 31 _fItem3(3, 4, 14),
Mike Fiore 1:71125aa00e33 32 _fItem4(3, 5, 14),
Mike Fiore 1:71125aa00e33 33 _fItem5(3, 6, 14),
Mike Fiore 1:71125aa00e33 34 _items(items)
Mike Fiore 1:71125aa00e33 35 {
Mike Fiore 1:71125aa00e33 36 _size = _items.size();
Mike Fiore 1:71125aa00e33 37 _selected = 0;
Mike Fiore 1:71125aa00e33 38 }
Mike Fiore 1:71125aa00e33 39
Mike Fiore 1:71125aa00e33 40 LayoutScrollSelect::~LayoutScrollSelect() {}
Mike Fiore 1:71125aa00e33 41
Mike Fiore 1:71125aa00e33 42 void LayoutScrollSelect::display() {
Mike Fiore 1:71125aa00e33 43 clear();
Mike Fiore 1:71125aa00e33 44 startUpdate();
Mike Fiore 1:71125aa00e33 45
Mike Fiore 1:71125aa00e33 46 writeLabel(_lSw1);
Mike Fiore 1:71125aa00e33 47 writeLabel(_lSw2);
Mike Fiore 1:71125aa00e33 48 writeLabel(_lInfo1);
Mike Fiore 1:71125aa00e33 49 writeLabel(_lInfo2);
Mike Fiore 1:71125aa00e33 50 writeLabel(_lCursor);
Mike Fiore 1:71125aa00e33 51
jenkins@jenkinsdm1 12:05435282f899 52 _selected = 0;
jenkins@jenkinsdm1 12:05435282f899 53
Mike Fiore 1:71125aa00e33 54 switch (_size) {
Mike Fiore 1:71125aa00e33 55 case 0:
Mike Fiore 1:71125aa00e33 56 // special case - no items
Mike Fiore 1:71125aa00e33 57 // (empty)
Mike Fiore 1:71125aa00e33 58 // (empty)
Mike Fiore 1:71125aa00e33 59 // => (empty)
Mike Fiore 1:71125aa00e33 60 // (empty)
Mike Fiore 1:71125aa00e33 61 // (empty)
Mike Fiore 1:71125aa00e33 62 break;
Mike Fiore 1:71125aa00e33 63
Mike Fiore 1:71125aa00e33 64 case 1:
Mike Fiore 1:71125aa00e33 65 // special case - 1 item
Mike Fiore 1:71125aa00e33 66 // (empty)
Mike Fiore 1:71125aa00e33 67 // (empty)
Mike Fiore 1:71125aa00e33 68 // => item1
Mike Fiore 1:71125aa00e33 69 // (empty)
Mike Fiore 1:71125aa00e33 70 // (empty)
Mike Fiore 1:71125aa00e33 71 writeField(_fItem3, _items[0]);
Mike Fiore 1:71125aa00e33 72 break;
Mike Fiore 1:71125aa00e33 73
Mike Fiore 1:71125aa00e33 74 case 2:
Mike Fiore 1:71125aa00e33 75 // special case - 2 items
Mike Fiore 1:71125aa00e33 76 // (empty)
Mike Fiore 1:71125aa00e33 77 // (empty)
Mike Fiore 1:71125aa00e33 78 // => item1
Mike Fiore 1:71125aa00e33 79 // item2
Mike Fiore 1:71125aa00e33 80 // (empty)
Mike Fiore 1:71125aa00e33 81 writeField(_fItem3, _items[0]);
Mike Fiore 1:71125aa00e33 82 writeField(_fItem4, _items[1]);
Mike Fiore 1:71125aa00e33 83 break;
Mike Fiore 1:71125aa00e33 84
Mike Fiore 1:71125aa00e33 85 case 3:
Mike Fiore 1:71125aa00e33 86 // special case - 3 items
Mike Fiore 1:71125aa00e33 87 // (empty)
Mike Fiore 1:71125aa00e33 88 // item3
Mike Fiore 1:71125aa00e33 89 // => item1
Mike Fiore 1:71125aa00e33 90 // item2
Mike Fiore 1:71125aa00e33 91 // (empty)
Mike Fiore 1:71125aa00e33 92 writeField(_fItem2, _items[2]);
Mike Fiore 1:71125aa00e33 93 writeField(_fItem3, _items[0]);
Mike Fiore 1:71125aa00e33 94 writeField(_fItem4, _items[1]);
Mike Fiore 1:71125aa00e33 95 break;
Mike Fiore 1:71125aa00e33 96
Mike Fiore 1:71125aa00e33 97 case 4:
Mike Fiore 1:71125aa00e33 98 // special case - 4 items
Mike Fiore 1:71125aa00e33 99 // item3
Mike Fiore 1:71125aa00e33 100 // item4
Mike Fiore 1:71125aa00e33 101 // => item1
Mike Fiore 1:71125aa00e33 102 // item2
Mike Fiore 1:71125aa00e33 103 // (empty)
Mike Fiore 1:71125aa00e33 104 writeField(_fItem1, _items[2]);
Mike Fiore 1:71125aa00e33 105 writeField(_fItem2, _items[3]);
Mike Fiore 1:71125aa00e33 106 writeField(_fItem3, _items[0]);
Mike Fiore 1:71125aa00e33 107 writeField(_fItem4, _items[1]);
Mike Fiore 1:71125aa00e33 108 break;
Mike Fiore 1:71125aa00e33 109
Mike Fiore 1:71125aa00e33 110 default:
Mike Fiore 1:71125aa00e33 111 // this is the generic case - should handle lists of 5+ items correctly
Mike Fiore 1:71125aa00e33 112 // item4 item6 item9
Mike Fiore 1:71125aa00e33 113 // item5 item7 item10
Mike Fiore 1:71125aa00e33 114 // => item1 => item1 => item1
Mike Fiore 1:71125aa00e33 115 // item2 item2 item2
Mike Fiore 1:71125aa00e33 116 // item3 item3 item3
Mike Fiore 1:71125aa00e33 117 writeField(_fItem1, _items[_size - 2]);
Mike Fiore 1:71125aa00e33 118 writeField(_fItem2, _items[_size - 1]);
Mike Fiore 1:71125aa00e33 119 writeField(_fItem3, _items[0]);
Mike Fiore 1:71125aa00e33 120 writeField(_fItem4, _items[1]);
Mike Fiore 1:71125aa00e33 121 writeField(_fItem5, _items[2]);
Mike Fiore 1:71125aa00e33 122 break;
Mike Fiore 1:71125aa00e33 123 }
Mike Fiore 1:71125aa00e33 124
Mike Fiore 1:71125aa00e33 125 endUpdate();
Mike Fiore 1:71125aa00e33 126 }
Mike Fiore 1:71125aa00e33 127
Mike Fiore 1:71125aa00e33 128 void LayoutScrollSelect::scroll() {
Mike Fiore 1:71125aa00e33 129 size_t index;
Mike Fiore 1:71125aa00e33 130
Mike Fiore 1:71125aa00e33 131 switch (_size) {
Mike Fiore 1:71125aa00e33 132 case 0:
Mike Fiore 1:71125aa00e33 133 case 1:
Mike Fiore 1:71125aa00e33 134 // nothing to scroll
Mike Fiore 1:71125aa00e33 135 break;
Mike Fiore 1:71125aa00e33 136
Mike Fiore 1:71125aa00e33 137 case 2:
Mike Fiore 1:71125aa00e33 138 // special case - 2 items
Mike Fiore 1:71125aa00e33 139 // (empty) -> (empty)
Mike Fiore 1:71125aa00e33 140 // (empty) -> (empty)
Mike Fiore 1:71125aa00e33 141 // => item1 -> => item2
Mike Fiore 1:71125aa00e33 142 // item2 -> item1
Mike Fiore 1:71125aa00e33 143 // (empty) -> (empty)
Mike Fiore 1:71125aa00e33 144
Mike Fiore 1:71125aa00e33 145 index = _selected;
Mike Fiore 1:71125aa00e33 146 // keep selected item up to date
Mike Fiore 1:71125aa00e33 147 increment(_selected);
Mike Fiore 1:71125aa00e33 148
Mike Fiore 1:71125aa00e33 149 startUpdate();
Mike Fiore 1:71125aa00e33 150 // previously selected item moves down to field4
Mike Fiore 1:71125aa00e33 151 writeField(_fItem4, _items[index]);
Mike Fiore 1:71125aa00e33 152 increment(index);
Mike Fiore 1:71125aa00e33 153 // other item moves up to field3
Mike Fiore 1:71125aa00e33 154 writeField(_fItem3, _items[index]);
Mike Fiore 1:71125aa00e33 155 endUpdate();
Mike Fiore 1:71125aa00e33 156 break;
Mike Fiore 1:71125aa00e33 157
Mike Fiore 1:71125aa00e33 158 case 3:
Mike Fiore 1:71125aa00e33 159 // special case - 3 items
Mike Fiore 1:71125aa00e33 160 // (empty) -> (empty)
Mike Fiore 1:71125aa00e33 161 // item3 -> item1
Mike Fiore 1:71125aa00e33 162 // => item1 -> => item2
Mike Fiore 1:71125aa00e33 163 // item2 -> item3
Mike Fiore 1:71125aa00e33 164 // (empty) -> (empty)
Mike Fiore 1:71125aa00e33 165
Mike Fiore 1:71125aa00e33 166 index = _selected;
Mike Fiore 1:71125aa00e33 167 // keep selected item up to date
Mike Fiore 1:71125aa00e33 168 increment(_selected);
Mike Fiore 1:71125aa00e33 169
Mike Fiore 1:71125aa00e33 170 startUpdate();
Mike Fiore 1:71125aa00e33 171 // previously selected item moves up to field2
Mike Fiore 1:71125aa00e33 172 writeField(_fItem2, _items[index]);
Mike Fiore 1:71125aa00e33 173 increment(index);
Mike Fiore 1:71125aa00e33 174 // new selected item moves up to field3
Mike Fiore 1:71125aa00e33 175 writeField(_fItem3, _items[index]);
Mike Fiore 1:71125aa00e33 176 increment(index);
Mike Fiore 1:71125aa00e33 177 // item from field2 moves down to field4
Mike Fiore 1:71125aa00e33 178 writeField(_fItem4, _items[index]);
Mike Fiore 1:71125aa00e33 179 endUpdate();
Mike Fiore 1:71125aa00e33 180 break;
Mike Fiore 1:71125aa00e33 181
Mike Fiore 1:71125aa00e33 182 case 4:
Mike Fiore 1:71125aa00e33 183 // special case - 4 items
Mike Fiore 1:71125aa00e33 184 // item3 -> item4
Mike Fiore 1:71125aa00e33 185 // item4 -> item1
Mike Fiore 1:71125aa00e33 186 // => item1 -> => item2
Mike Fiore 1:71125aa00e33 187 // item2 -> item3
Mike Fiore 1:71125aa00e33 188 // (empty) -> (empty)
Mike Fiore 1:71125aa00e33 189
Mike Fiore 1:71125aa00e33 190 index = _selected;
Mike Fiore 1:71125aa00e33 191 // keep selected item up to date
Mike Fiore 1:71125aa00e33 192 increment(_selected);
Mike Fiore 1:71125aa00e33 193
Mike Fiore 1:71125aa00e33 194 startUpdate();
Mike Fiore 1:71125aa00e33 195 // previously selected item moves up to field2
Mike Fiore 1:71125aa00e33 196 writeField(_fItem2, _items[index]);
Mike Fiore 1:71125aa00e33 197 increment(index);
Mike Fiore 1:71125aa00e33 198 // new selected item moves up to field3
Mike Fiore 1:71125aa00e33 199 writeField(_fItem3, _items[index]);
Mike Fiore 1:71125aa00e33 200 increment(index);
Mike Fiore 1:71125aa00e33 201 // item from field1 moves down to field4
Mike Fiore 1:71125aa00e33 202 writeField(_fItem4, _items[index]);
Mike Fiore 1:71125aa00e33 203 increment(index);
Mike Fiore 1:71125aa00e33 204 // item from field2 moves up to field1
Mike Fiore 1:71125aa00e33 205 writeField(_fItem1, _items[index]);
Mike Fiore 1:71125aa00e33 206 endUpdate();
Mike Fiore 1:71125aa00e33 207 break;
Mike Fiore 1:71125aa00e33 208
Mike Fiore 1:71125aa00e33 209 default:
Mike Fiore 1:71125aa00e33 210 // this is the generic case - should handle lists of 5+ items correctly
Mike Fiore 1:71125aa00e33 211 // item4 -> item5 item6 -> item7
Mike Fiore 1:71125aa00e33 212 // item5 -> item1 item7 -> item1
Mike Fiore 1:71125aa00e33 213 // => item1 -> => item2 => item1 -> => item2
Mike Fiore 1:71125aa00e33 214 // item2 -> item3 item2 -> item3
Mike Fiore 1:71125aa00e33 215 // item3 -> item4 item3 -> item4
Mike Fiore 1:71125aa00e33 216
Mike Fiore 1:71125aa00e33 217 index = _selected;
Mike Fiore 1:71125aa00e33 218 // keep selected item up to date
Mike Fiore 1:71125aa00e33 219 increment(_selected);
Mike Fiore 1:71125aa00e33 220
Mike Fiore 1:71125aa00e33 221 startUpdate();
Mike Fiore 1:71125aa00e33 222 decrement(index);
Mike Fiore 1:71125aa00e33 223 // item from field2 moves up to field1
Mike Fiore 1:71125aa00e33 224 writeField(_fItem1, _items[index]);
Mike Fiore 1:71125aa00e33 225 increment(index);
Mike Fiore 1:71125aa00e33 226 // previously selected item moves up to field2
Mike Fiore 1:71125aa00e33 227 writeField(_fItem2, _items[index]);
Mike Fiore 1:71125aa00e33 228 increment(index);
Mike Fiore 1:71125aa00e33 229 // new selected item moves up to field3
Mike Fiore 1:71125aa00e33 230 writeField(_fItem3, _items[index]);
Mike Fiore 1:71125aa00e33 231 increment(index);
Mike Fiore 1:71125aa00e33 232 // item from field5 moves up to field4
Mike Fiore 1:71125aa00e33 233 writeField(_fItem4, _items[index]);
Mike Fiore 1:71125aa00e33 234 increment(index);
Mike Fiore 1:71125aa00e33 235 // next item (from field1 or off screen) moves up to field5
Mike Fiore 1:71125aa00e33 236 writeField(_fItem5, _items[index]);
Mike Fiore 1:71125aa00e33 237 endUpdate();
Mike Fiore 1:71125aa00e33 238 break;
Mike Fiore 1:71125aa00e33 239 }
Mike Fiore 1:71125aa00e33 240 }
Mike Fiore 1:71125aa00e33 241
Mike Fiore 1:71125aa00e33 242 std::string LayoutScrollSelect::select() {
Mike Fiore 1:71125aa00e33 243 std::string selected = "";
Mike Fiore 1:71125aa00e33 244 if (_size > 0)
Mike Fiore 1:71125aa00e33 245 selected = _items[_selected];
Mike Fiore 1:71125aa00e33 246
Mike Fiore 1:71125aa00e33 247 return selected;
Mike Fiore 1:71125aa00e33 248 }
Mike Fiore 1:71125aa00e33 249
Mike Fiore 1:71125aa00e33 250 void LayoutScrollSelect::increment(size_t& index) {
Mike Fiore 1:71125aa00e33 251 if (_size > 1) {
Mike Fiore 1:71125aa00e33 252 index++;
Mike Fiore 1:71125aa00e33 253 index %= _size;
Mike Fiore 1:71125aa00e33 254 }
Mike Fiore 1:71125aa00e33 255 }
Mike Fiore 1:71125aa00e33 256
Mike Fiore 1:71125aa00e33 257 void LayoutScrollSelect::decrement(size_t& index) {
Mike Fiore 1:71125aa00e33 258 if (_size > 1) {
Mike Fiore 1:71125aa00e33 259 if (index == 0)
Mike Fiore 1:71125aa00e33 260 index = _size - 1;
Mike Fiore 1:71125aa00e33 261 else
Mike Fiore 1:71125aa00e33 262 index--;
Mike Fiore 1:71125aa00e33 263 }
Mike Fiore 1:71125aa00e33 264 }