tcMenu
Toggle main menu visibility
Loading...
Searching...
No Matches
src
EditableLargeNumberMenuItem.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2018 https://www.thecoderscorner.com (Dave Cherry).
3
* This product is licensed under an Apache license, see the LICENSE file in the top-level directory.
4
*/
5
6
#ifndef _EDITABLE_LARGE_NUMBER_MENU_ITEM_H_
7
#define _EDITABLE_LARGE_NUMBER_MENU_ITEM_H_
8
9
#include "
RuntimeMenuItem.h
"
10
#include <IoLogging.h>
11
17
18
#define LARGE_NUM_MAX_DIGITS 12
19
#define LARGE_NUM_ALLOC_SIZE (LARGE_NUM_MAX_DIGITS / 2)
20
27
class
LargeFixedNumber
{
28
private
:
29
uint8_t bcdRepresentation[LARGE_NUM_ALLOC_SIZE] = {};
30
bool
negative =
false
;
31
uint8_t totalSize = 12;
32
uint8_t fractionDp = 0;
33
public
:
37
LargeFixedNumber
() =
default
;
38
47
LargeFixedNumber
(
int
totalDigits,
int
decimalPointIndex
, uint32_t whole, uint32_t fraction,
bool
negative);
48
49
LargeFixedNumber
(
const
LargeFixedNumber
& other) =
default
;
50
LargeFixedNumber
& operator=(
const
LargeFixedNumber
& other) =
default
;
51
55
void
clear
();
56
60
int
decimalPointIndex
()
const
{
return
fractionDp; }
61
65
int
getTotalDigits
()
const
{
return
totalSize; }
66
74
void
setPrecision
(uint8_t dp, uint8_t maxDigits = 12) {
75
fractionDp = dp;
76
totalSize = maxDigits;
77
clear
();
78
}
79
86
void
setValue
(uint32_t whole, uint32_t fraction,
bool
negative);
87
93
void
setFromFloat
(
float
value);
94
101
uint32_t
fromBcdPacked
(
int
start,
int
end);
102
109
void
convertToBcdPacked
(uint32_t value,
int
start,
int
end);
110
116
int
getDigit
(
int
digit);
117
123
void
setDigit
(
int
digit,
int
val);
124
132
float
getAsFloat
();
133
137
bool
isNegative
()
const
{
return
negative; }
138
143
void
setNegative
(
bool
neg) {
144
negative = neg;
145
}
146
150
uint32_t
getWhole
() {
151
return
fromBcdPacked
(fractionDp, totalSize);
152
}
153
157
uint32_t
getFraction
() {
158
return
fromBcdPacked
(0, fractionDp);
159
}
160
165
uint8_t*
getNumberBuffer
() {
166
return
bcdRepresentation;
167
}
168
};
169
173
int
largeNumItemRenderFn
(
RuntimeMenuItem
* item, uint8_t row,
RenderFnMode
mode,
char
* buffer,
int
bufferSize);
174
182
class
EditableLargeNumberMenuItem :
public
EditableMultiPartMenuItem {
183
private
:
184
LargeFixedNumber
data;
185
bool
negativeAllowed;
186
public
:
187
EditableLargeNumberMenuItem(
RuntimeRenderingFn
renderFn,
const
LargeFixedNumber
& initial, uint16_t
id
,
bool
allowNeg,
MenuItem
* next =
nullptr
)
188
: EditableMultiPartMenuItem(
MENUTYPE_LARGENUM_VALUE
,
id
, initial.
getTotalDigits
() + (allowNeg ? 1 : 0), renderFn, next) {
189
data = initial;
190
negativeAllowed = allowNeg;
191
}
192
193
EditableLargeNumberMenuItem(
RuntimeRenderingFn
renderFn, uint16_t
id
,
int
maxDigits,
int
dps,
bool
allowNeg,
MenuItem
* next =
nullptr
)
194
: EditableMultiPartMenuItem(
MENUTYPE_LARGENUM_VALUE
,
id
, maxDigits + (allowNeg ? 1 : 0), renderFn, next) {
195
data.setPrecision(dps, maxDigits);
196
negativeAllowed = allowNeg;
197
}
198
199
EditableLargeNumberMenuItem(
RuntimeRenderingFn
renderFn, uint16_t
id
,
int
maxDigits,
int
dps,
MenuItem
* next =
nullptr
)
200
: EditableMultiPartMenuItem(
MENUTYPE_LARGENUM_VALUE
,
id
, maxDigits + 1, renderFn, next) {
201
data.setPrecision(dps, maxDigits);
202
negativeAllowed =
true
;
203
}
204
205
EditableLargeNumberMenuItem(
const
AnyMenuInfo
*
info
,
const
LargeFixedNumber
& initial,
bool
allowNeg,
MenuItem
* next =
nullptr
,
bool
isPgm = INFO_LOCATION_PGM)
206
: EditableMultiPartMenuItem(
info
, isPgm,
MENUTYPE_LARGENUM_VALUE
, initial.
getTotalDigits
() + (allowNeg ? 1 : 0),
largeNumItemRenderFn
, next) {
207
data = initial;
208
negativeAllowed = allowNeg;
209
}
210
211
EditableLargeNumberMenuItem(
const
AnyMenuInfo
*
info
,
RuntimeRenderingFn
renderFn,
const
LargeFixedNumber
& initial,
bool
allowNeg,
MenuItem
* next =
nullptr
,
bool
isPgm = INFO_LOCATION_PGM)
212
: EditableMultiPartMenuItem(
info
, isPgm,
MENUTYPE_LARGENUM_VALUE
, initial.
getTotalDigits
() + (allowNeg ? 1 : 0), renderFn, next) {
213
data = initial;
214
negativeAllowed = allowNeg;
215
}
216
218
LargeFixedNumber
*
getLargeNumber
() {
return
&data; }
219
221
void
setLargeNumberFromString
(
const
char
* largeNum);
222
223
bool
isNegativeAllowed()
const
{
return
negativeAllowed; }
224
};
225
226
#endif
//_EDITABLE_LARGE_NUMBER_MENU_ITEM_H_
largeNumItemRenderFn
int largeNumItemRenderFn(RuntimeMenuItem *item, uint8_t row, RenderFnMode mode, char *buffer, int bufferSize)
Definition
EditableLargeNumberMenuItem.cpp:119
RenderFnMode
RenderFnMode
Definition
MenuItems.h:292
RuntimeRenderingFn
int(* RuntimeRenderingFn)(RuntimeMenuItem *item, uint8_t row, RenderFnMode mode, char *buffer, int bufferSize)
Definition
MenuItems.h:327
MENUTYPE_LARGENUM_VALUE
@ MENUTYPE_LARGENUM_VALUE
Definition
MenuItems.h:284
AnyMenuInfo
Definition
MenuItems.h:51
RuntimeMenuItem.h
Contains definitions of menu items that can be fully defined at runtime with no need for prog mem str...
EditableLargeNumberMenuItem::setLargeNumberFromString
void setLargeNumberFromString(const char *largeNum)
Definition
EditableLargeNumberMenuItem.cpp:98
EditableLargeNumberMenuItem::getLargeNumber
LargeFixedNumber * getLargeNumber()
Definition
EditableLargeNumberMenuItem.h:218
LargeFixedNumber
Definition
EditableLargeNumberMenuItem.h:27
LargeFixedNumber::decimalPointIndex
int decimalPointIndex() const
Definition
EditableLargeNumberMenuItem.h:60
LargeFixedNumber::fromBcdPacked
uint32_t fromBcdPacked(int start, int end)
Definition
EditableLargeNumberMenuItem.cpp:22
LargeFixedNumber::setFromFloat
void setFromFloat(float value)
Definition
EditableLargeNumberMenuItem.cpp:76
LargeFixedNumber::getFraction
uint32_t getFraction()
Definition
EditableLargeNumberMenuItem.h:157
LargeFixedNumber::setValue
void setValue(uint32_t whole, uint32_t fraction, bool negative)
Definition
EditableLargeNumberMenuItem.cpp:15
LargeFixedNumber::setDigit
void setDigit(int digit, int val)
Definition
EditableLargeNumberMenuItem.cpp:52
LargeFixedNumber::getAsFloat
float getAsFloat()
Definition
EditableLargeNumberMenuItem.cpp:66
LargeFixedNumber::setNegative
void setNegative(bool neg)
Definition
EditableLargeNumberMenuItem.h:143
LargeFixedNumber::clear
void clear()
Definition
EditableLargeNumberMenuItem.cpp:10
LargeFixedNumber::getTotalDigits
int getTotalDigits() const
Definition
EditableLargeNumberMenuItem.h:65
LargeFixedNumber::getDigit
int getDigit(int digit)
Definition
EditableLargeNumberMenuItem.cpp:41
LargeFixedNumber::getWhole
uint32_t getWhole()
Definition
EditableLargeNumberMenuItem.h:150
LargeFixedNumber::isNegative
bool isNegative() const
Definition
EditableLargeNumberMenuItem.h:137
LargeFixedNumber::LargeFixedNumber
LargeFixedNumber()=default
LargeFixedNumber::convertToBcdPacked
void convertToBcdPacked(uint32_t value, int start, int end)
Definition
EditableLargeNumberMenuItem.cpp:32
LargeFixedNumber::setPrecision
void setPrecision(uint8_t dp, uint8_t maxDigits=12)
Definition
EditableLargeNumberMenuItem.h:74
LargeFixedNumber::getNumberBuffer
uint8_t * getNumberBuffer()
Definition
EditableLargeNumberMenuItem.h:165
MenuItem::MenuItem
MenuItem(MenuType menuType, const AnyMenuInfo *menuInfo, MenuItem *next, bool infoProgMem)
Definition
MenuItems.cpp:12
MenuItem::info
const AnyMenuInfo * info
Definition
MenuItems.h:343
RuntimeMenuItem
Definition
RuntimeMenuItem.h:75