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
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 }
Generated on Tue Jul 12 2022 13:07:49 by 1.7.2