Factory firmware for the MultiTech Dotbox (MTDOT-BOX) and EVB (MTDOT-EVB) products.

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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers LayoutScrollSelect.cpp Source File

LayoutScrollSelect.cpp

00001 /* Copyright (c) <2016> <MultiTech Systems>, MIT License
00002  *
00003  * Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
00004  * and associated documentation files (the "Software"), to deal in the Software without restriction, 
00005  * including without limitation the rights to use, copy, modify, merge, publish, distribute, 
00006  * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 
00007  * furnished to do so, subject to the following conditions:
00008  *
00009  * The above copyright notice and this permission notice shall be included in all copies or 
00010  * substantial portions of the Software.
00011  *
00012  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 
00013  * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
00014  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
00015  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
00016  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00017  */
00018 
00019 #include "LayoutScrollSelect.h"
00020 #include "MTSLog.h"
00021 
00022 LayoutScrollSelect::LayoutScrollSelect(DOGS102* lcd, Items items, std::string info1, std::string info2)
00023   : Layout(lcd),
00024     _lSw1(0, 7, "Scroll"),
00025     _lSw2(11, 7, "Select"),
00026     _lInfo1(0, 0, info1),
00027     _lInfo2(0, 1, info2),
00028     _lCursor(0, 4, "=>"),
00029     _fItem1(3, 2, 14),
00030     _fItem2(3, 3, 14),
00031     _fItem3(3, 4, 14),
00032     _fItem4(3, 5, 14),
00033     _fItem5(3, 6, 14),
00034     _items(items)
00035 {
00036     _size = _items.size();
00037     _selected = 0;
00038 }
00039 
00040 LayoutScrollSelect::~LayoutScrollSelect() {}
00041 
00042 void LayoutScrollSelect::display() {
00043     clear();
00044     startUpdate();
00045 
00046     writeLabel(_lSw1);
00047     writeLabel(_lSw2);
00048     writeLabel(_lInfo1);
00049     writeLabel(_lInfo2);
00050     writeLabel(_lCursor);
00051 
00052     _selected = 0;
00053 
00054     switch (_size) {
00055         case 0:
00056             // special case - no items
00057             //    (empty)
00058             //    (empty)
00059             // => (empty)
00060             //    (empty)
00061             //    (empty)
00062             break;
00063 
00064         case 1:
00065             // special case - 1 item
00066             //    (empty)
00067             //    (empty)
00068             // => item1
00069             //    (empty)
00070             //    (empty)
00071             writeField(_fItem3, _items[0]);
00072             break;
00073 
00074         case 2:
00075             // special case - 2 items
00076             //    (empty)
00077             //    (empty)
00078             // => item1
00079             //    item2
00080             //    (empty)
00081             writeField(_fItem3, _items[0]);
00082             writeField(_fItem4, _items[1]);
00083             break;
00084 
00085         case 3:
00086             // special case - 3 items
00087             //    (empty)
00088             //    item3
00089             // => item1
00090             //    item2
00091             //    (empty)
00092             writeField(_fItem2, _items[2]);
00093             writeField(_fItem3, _items[0]);
00094             writeField(_fItem4, _items[1]);
00095             break;
00096 
00097         case 4:
00098             // special case - 4 items
00099             //    item3
00100             //    item4
00101             // => item1
00102             //    item2
00103             //    (empty)
00104             writeField(_fItem1, _items[2]);
00105             writeField(_fItem2, _items[3]);
00106             writeField(_fItem3, _items[0]);
00107             writeField(_fItem4, _items[1]);
00108             break;
00109 
00110         default:
00111             // this is the generic case - should handle lists of 5+ items correctly
00112             //    item4         item6           item9
00113             //    item5         item7           item10
00114             // => item1      => item1        => item1
00115             //    item2         item2           item2
00116             //    item3         item3           item3
00117             writeField(_fItem1, _items[_size - 2]);
00118             writeField(_fItem2, _items[_size - 1]);
00119             writeField(_fItem3, _items[0]);
00120             writeField(_fItem4, _items[1]);
00121             writeField(_fItem5, _items[2]);
00122             break;
00123     }
00124 
00125     endUpdate();
00126 }
00127 
00128 void LayoutScrollSelect::scroll() {
00129     size_t index;
00130 
00131     switch (_size) {
00132         case 0:
00133         case 1:
00134             // nothing to scroll
00135             break;
00136 
00137         case 2:
00138             // special case - 2 items
00139             //    (empty)  ->     (empty)
00140             //    (empty)  ->     (empty)
00141             // => item1    ->  => item2
00142             //    item2    ->     item1
00143             //    (empty)  ->     (empty)
00144 
00145             index = _selected;
00146             // keep selected item up to date
00147             increment(_selected);
00148 
00149             startUpdate();
00150             // previously selected item moves down to field4
00151             writeField(_fItem4, _items[index]);
00152             increment(index);
00153             // other item moves up to field3
00154             writeField(_fItem3, _items[index]);
00155             endUpdate();
00156             break;
00157 
00158         case 3:
00159             // special case - 3 items
00160             //    (empty)  ->     (empty)
00161             //    item3    ->     item1  
00162             // => item1    ->  => item2
00163             //    item2    ->     item3
00164             //    (empty)  ->     (empty)
00165             
00166             index = _selected;
00167             // keep selected item up to date
00168             increment(_selected);
00169 
00170             startUpdate();
00171             // previously selected item moves up to field2
00172             writeField(_fItem2, _items[index]);
00173             increment(index);
00174             // new selected item moves up to field3
00175             writeField(_fItem3, _items[index]);
00176             increment(index);
00177             // item from field2 moves down to field4
00178             writeField(_fItem4, _items[index]);
00179             endUpdate();
00180             break;
00181 
00182         case 4:
00183             // special case - 4 items
00184             //    item3    ->     item4  
00185             //    item4    ->     item1  
00186             // => item1    ->  => item2
00187             //    item2    ->     item3
00188             //    (empty)  ->     (empty)
00189             
00190             index = _selected;
00191             // keep selected item up to date
00192             increment(_selected);
00193 
00194             startUpdate();
00195             // previously selected item moves up to field2
00196             writeField(_fItem2, _items[index]);
00197             increment(index);
00198             // new selected item moves up to field3
00199             writeField(_fItem3, _items[index]);
00200             increment(index);
00201             // item from field1 moves down to field4
00202             writeField(_fItem4, _items[index]);
00203             increment(index);
00204             // item from field2 moves up to field1
00205             writeField(_fItem1, _items[index]);
00206             endUpdate();
00207             break;
00208 
00209         default:
00210             // this is the generic case - should handle lists of 5+ items correctly
00211             //    item4    ->     item5           item6    ->     item7
00212             //    item5    ->     item1           item7    ->     item1
00213             // => item1    ->  => item2        => item1    ->  => item2
00214             //    item2    ->     item3           item2    ->     item3
00215             //    item3    ->     item4           item3    ->     item4
00216             
00217             index = _selected;
00218             // keep selected item up to date
00219             increment(_selected);
00220 
00221             startUpdate();
00222             decrement(index);
00223             // item from field2 moves up to field1
00224             writeField(_fItem1, _items[index]);
00225             increment(index);
00226             // previously selected item moves up to field2
00227             writeField(_fItem2, _items[index]);
00228             increment(index);
00229             // new selected item moves up to field3
00230             writeField(_fItem3, _items[index]);
00231             increment(index);
00232             // item from field5 moves up to field4
00233             writeField(_fItem4, _items[index]);
00234             increment(index);
00235             // next item (from field1 or off screen) moves up to field5
00236             writeField(_fItem5, _items[index]);
00237             endUpdate();
00238             break;
00239       }
00240 }
00241 
00242 std::string LayoutScrollSelect::select() {
00243     std::string selected = "";
00244     if (_size > 0)
00245         selected = _items[_selected];
00246 
00247     return selected;
00248 }
00249 
00250 void LayoutScrollSelect::increment(size_t& index) {
00251     if (_size > 1) {
00252         index++;
00253         index %= _size;
00254     }
00255 }
00256 
00257 void LayoutScrollSelect::decrement(size_t& index) {
00258     if (_size > 1) {
00259         if (index == 0)
00260             index = _size - 1;
00261         else
00262             index--;
00263     }
00264 }