Custom Channel Plan version of MTDOT Box firmware

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

Fork of MTDOT-BOX-EVB-Factory-Firmware by MultiTech

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     switch (_size) {
00053         case 0:
00054             // special case - no items
00055             //    (empty)
00056             //    (empty)
00057             // => (empty)
00058             //    (empty)
00059             //    (empty)
00060             break;
00061 
00062         case 1:
00063             // special case - 1 item
00064             //    (empty)
00065             //    (empty)
00066             // => item1
00067             //    (empty)
00068             //    (empty)
00069             writeField(_fItem3, _items[0]);
00070             break;
00071 
00072         case 2:
00073             // special case - 2 items
00074             //    (empty)
00075             //    (empty)
00076             // => item1
00077             //    item2
00078             //    (empty)
00079             writeField(_fItem3, _items[0]);
00080             writeField(_fItem4, _items[1]);
00081             break;
00082 
00083         case 3:
00084             // special case - 3 items
00085             //    (empty)
00086             //    item3
00087             // => item1
00088             //    item2
00089             //    (empty)
00090             writeField(_fItem2, _items[2]);
00091             writeField(_fItem3, _items[0]);
00092             writeField(_fItem4, _items[1]);
00093             break;
00094 
00095         case 4:
00096             // special case - 4 items
00097             //    item3
00098             //    item4
00099             // => item1
00100             //    item2
00101             //    (empty)
00102             writeField(_fItem1, _items[2]);
00103             writeField(_fItem2, _items[3]);
00104             writeField(_fItem3, _items[0]);
00105             writeField(_fItem4, _items[1]);
00106             break;
00107 
00108         default:
00109             // this is the generic case - should handle lists of 5+ items correctly
00110             //    item4         item6           item9
00111             //    item5         item7           item10
00112             // => item1      => item1        => item1
00113             //    item2         item2           item2
00114             //    item3         item3           item3
00115             writeField(_fItem1, _items[_size - 2]);
00116             writeField(_fItem2, _items[_size - 1]);
00117             writeField(_fItem3, _items[0]);
00118             writeField(_fItem4, _items[1]);
00119             writeField(_fItem5, _items[2]);
00120             break;
00121     }
00122 
00123     endUpdate();
00124 }
00125 
00126 void LayoutScrollSelect::scroll() {
00127     size_t index;
00128 
00129     switch (_size) {
00130         case 0:
00131         case 1:
00132             // nothing to scroll
00133             break;
00134 
00135         case 2:
00136             // special case - 2 items
00137             //    (empty)  ->     (empty)
00138             //    (empty)  ->     (empty)
00139             // => item1    ->  => item2
00140             //    item2    ->     item1
00141             //    (empty)  ->     (empty)
00142 
00143             index = _selected;
00144             // keep selected item up to date
00145             increment(_selected);
00146 
00147             startUpdate();
00148             // previously selected item moves down to field4
00149             writeField(_fItem4, _items[index]);
00150             increment(index);
00151             // other item moves up to field3
00152             writeField(_fItem3, _items[index]);
00153             endUpdate();
00154             break;
00155 
00156         case 3:
00157             // special case - 3 items
00158             //    (empty)  ->     (empty)
00159             //    item3    ->     item1  
00160             // => item1    ->  => item2
00161             //    item2    ->     item3
00162             //    (empty)  ->     (empty)
00163             
00164             index = _selected;
00165             // keep selected item up to date
00166             increment(_selected);
00167 
00168             startUpdate();
00169             // previously selected item moves up to field2
00170             writeField(_fItem2, _items[index]);
00171             increment(index);
00172             // new selected item moves up to field3
00173             writeField(_fItem3, _items[index]);
00174             increment(index);
00175             // item from field2 moves down to field4
00176             writeField(_fItem4, _items[index]);
00177             endUpdate();
00178             break;
00179 
00180         case 4:
00181             // special case - 4 items
00182             //    item3    ->     item4  
00183             //    item4    ->     item1  
00184             // => item1    ->  => item2
00185             //    item2    ->     item3
00186             //    (empty)  ->     (empty)
00187             
00188             index = _selected;
00189             // keep selected item up to date
00190             increment(_selected);
00191 
00192             startUpdate();
00193             // previously selected item moves up to field2
00194             writeField(_fItem2, _items[index]);
00195             increment(index);
00196             // new selected item moves up to field3
00197             writeField(_fItem3, _items[index]);
00198             increment(index);
00199             // item from field1 moves down to field4
00200             writeField(_fItem4, _items[index]);
00201             increment(index);
00202             // item from field2 moves up to field1
00203             writeField(_fItem1, _items[index]);
00204             endUpdate();
00205             break;
00206 
00207         default:
00208             // this is the generic case - should handle lists of 5+ items correctly
00209             //    item4    ->     item5           item6    ->     item7
00210             //    item5    ->     item1           item7    ->     item1
00211             // => item1    ->  => item2        => item1    ->  => item2
00212             //    item2    ->     item3           item2    ->     item3
00213             //    item3    ->     item4           item3    ->     item4
00214             
00215             index = _selected;
00216             // keep selected item up to date
00217             increment(_selected);
00218 
00219             startUpdate();
00220             decrement(index);
00221             // item from field2 moves up to field1
00222             writeField(_fItem1, _items[index]);
00223             increment(index);
00224             // previously selected item moves up to field2
00225             writeField(_fItem2, _items[index]);
00226             increment(index);
00227             // new selected item moves up to field3
00228             writeField(_fItem3, _items[index]);
00229             increment(index);
00230             // item from field5 moves up to field4
00231             writeField(_fItem4, _items[index]);
00232             increment(index);
00233             // next item (from field1 or off screen) moves up to field5
00234             writeField(_fItem5, _items[index]);
00235             endUpdate();
00236             break;
00237       }
00238 }
00239 
00240 std::string LayoutScrollSelect::select() {
00241     std::string selected = "";
00242     if (_size > 0)
00243         selected = _items[_selected];
00244 
00245     return selected;
00246 }
00247 
00248 void LayoutScrollSelect::increment(size_t& index) {
00249     if (_size > 1) {
00250         index++;
00251         index %= _size;
00252     }
00253 }
00254 
00255 void LayoutScrollSelect::decrement(size_t& index) {
00256     if (_size > 1) {
00257         if (index == 0)
00258             index = _size - 1;
00259         else
00260             index--;
00261     }
00262 }