Initial commit
This commit is contained in:
@@ -0,0 +1,218 @@
|
||||
/**
|
||||
* @file menuIntInput.cpp
|
||||
* @author Alexander Klein (alex@kleiax.de)
|
||||
* @brief
|
||||
* @version 0.1
|
||||
* @date 2022-09-12
|
||||
*
|
||||
* @copyright Copyright (c) 2022
|
||||
*
|
||||
*/
|
||||
|
||||
#include "menuIntInput.h"
|
||||
|
||||
MenuIntInput::MenuIntInput(int16_t values[], char *names, uint8_t length, MenuIntInputWrapper* wrapper) {
|
||||
this->values = values;
|
||||
this->names = names;
|
||||
this->length = length;
|
||||
this->wrapper = wrapper;
|
||||
|
||||
this->min = new int16_t[this->length];
|
||||
this->max = new int16_t[this->length];
|
||||
this->originalValues = new int16_t[this->length];
|
||||
this->stepsPerInput = new uint8_t[this->length];
|
||||
|
||||
for (uint8_t i = 0; i < this->length; i++) {
|
||||
this->min[i] = INT16_MIN;
|
||||
this->max[i] = INT16_MAX;
|
||||
this->originalValues[i] = this->values[i];
|
||||
this->stepsPerInput[i] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
MenuIntInput::MenuIntInput(uint8_t length, MenuIntInputWrapper *wrapper) {
|
||||
this->length = length;
|
||||
this->wrapper = wrapper;
|
||||
|
||||
this->values = new int16_t[this->length];
|
||||
this->names = (char*) new char[this->length][MAX_NAME_LENGTH];
|
||||
this->min = new int16_t[this->length];
|
||||
this->max = new int16_t[this->length];
|
||||
this->originalValues = new int16_t[this->length];
|
||||
this->stepsPerInput = new uint8_t[this->length];
|
||||
|
||||
for (uint8_t i = 0; i < this->length; i++) {
|
||||
this->min[i] = INT16_MIN;
|
||||
this->max[i] = INT16_MAX;
|
||||
this->values[i] = 0;
|
||||
this->originalValues[i] = 0;
|
||||
this->stepsPerInput[i] = 1;
|
||||
strcpy(this->names + MAX_NAME_LENGTH * i, "Default");
|
||||
}
|
||||
}
|
||||
|
||||
MenuIntInput::~MenuIntInput() {
|
||||
delete this->min;
|
||||
delete this->max;
|
||||
delete this->originalValues;
|
||||
delete this->stepsPerInput;
|
||||
delete this->values;
|
||||
delete this->names;
|
||||
delete this->wrapper;
|
||||
}
|
||||
|
||||
void MenuIntInput::setEntry(uint8_t valueNumber, const char* name, int16_t startValue) {
|
||||
if (this->length < valueNumber)
|
||||
return;
|
||||
|
||||
if (strlen(name) > MAX_NAME_LENGTH)
|
||||
return;
|
||||
|
||||
|
||||
strcpy(this->names + MAX_NAME_LENGTH * valueNumber, name);
|
||||
this->values[valueNumber] = startValue;
|
||||
this->originalValues[valueNumber] = startValue;
|
||||
}
|
||||
|
||||
void MenuIntInput::setMin(uint8_t valueNumber, int16_t min) {
|
||||
if (this->length < valueNumber)
|
||||
return;
|
||||
|
||||
this->min[valueNumber] = min;
|
||||
}
|
||||
|
||||
void MenuIntInput::setMax(uint8_t valueNumber, int16_t max) {
|
||||
if (this->length < valueNumber)
|
||||
return;
|
||||
|
||||
this->max[valueNumber] = max;
|
||||
}
|
||||
|
||||
void MenuIntInput::setMinMax(uint8_t valueNumber, int16_t min, int16_t max) {
|
||||
this->setMin(valueNumber, min);
|
||||
this->setMax(valueNumber, max);
|
||||
}
|
||||
|
||||
void MenuIntInput::setMin(int16_t min) {
|
||||
for (uint8_t i = 0; i < this->length; i++)
|
||||
this->min[i] = min;
|
||||
}
|
||||
|
||||
void MenuIntInput::setMax(int16_t max) {
|
||||
for (uint8_t i = 0; i < this->length; i++)
|
||||
this->max[i] = max;
|
||||
}
|
||||
|
||||
void MenuIntInput::setMinMax(int16_t min, int16_t max) {
|
||||
this->setMin(min);
|
||||
this->setMax(max);
|
||||
}
|
||||
|
||||
void MenuIntInput::setMinMaxSteps(uint8_t valueNumber, int16_t min, int16_t max, uint8_t steps) {
|
||||
this->setMin(valueNumber, min);
|
||||
this->setMax(valueNumber, max);
|
||||
this->setStepsPerInput(valueNumber, steps);
|
||||
}
|
||||
|
||||
void MenuIntInput::setMinMaxSteps(int16_t min, int16_t max, uint8_t steps) {
|
||||
this->setMin(min);
|
||||
this->setMax(max);
|
||||
this->setStepsPerInput(steps);
|
||||
}
|
||||
|
||||
void MenuIntInput::setStepsPerInput(uint8_t valueNumber, uint8_t steps) {
|
||||
if (this->length < valueNumber)
|
||||
return;
|
||||
|
||||
this->stepsPerInput[valueNumber] = steps;
|
||||
}
|
||||
|
||||
void MenuIntInput::setStepsPerInput(uint8_t steps) {
|
||||
for (uint8_t i = 0; i < this->length; i++)
|
||||
this->stepsPerInput[i] = steps;
|
||||
}
|
||||
|
||||
void MenuIntInput::down() {
|
||||
if (this->values[this->currentPosition]
|
||||
- this->stepsPerInput[this->currentPosition]
|
||||
>= this->min[currentPosition])
|
||||
{
|
||||
this->values[this->currentPosition] -= this->stepsPerInput[this->currentPosition];
|
||||
} else {
|
||||
this->values[this->currentPosition] = this->max[this->currentPosition];
|
||||
}
|
||||
|
||||
this->printMenu();
|
||||
}
|
||||
|
||||
void MenuIntInput::up() {
|
||||
if (this->values[this->currentPosition]
|
||||
+ this->stepsPerInput[this->currentPosition]
|
||||
<= this->max[this->currentPosition])
|
||||
{
|
||||
this->values[this->currentPosition] += this->stepsPerInput[this->currentPosition];
|
||||
} else {
|
||||
this->values[this->currentPosition] = this->min[this->currentPosition];
|
||||
}
|
||||
|
||||
this->printMenu();
|
||||
}
|
||||
|
||||
void MenuIntInput::right() {
|
||||
if (currentPosition < this->length - 1)
|
||||
currentPosition++;
|
||||
else
|
||||
currentPosition = 0;
|
||||
|
||||
this->printMenu();
|
||||
}
|
||||
|
||||
void MenuIntInput::left() {
|
||||
if (currentPosition > 0)
|
||||
currentPosition--;
|
||||
else
|
||||
currentPosition = this->length - 1;
|
||||
|
||||
this->printMenu();
|
||||
}
|
||||
|
||||
void MenuIntInput::no() {
|
||||
for (uint8_t i = 0; i < this->length; i++)
|
||||
this->values[i] = this->originalValues[i];
|
||||
this->currentPosition = 0;
|
||||
|
||||
if (this->parentMenu)
|
||||
this->parentMenu->printMenu();
|
||||
}
|
||||
|
||||
void MenuIntInput::yes() {
|
||||
this->wrapper->action(this->values, this->length);
|
||||
if (this->parentMenu && printParentMenu)
|
||||
this->parentMenu->printMenu();
|
||||
}
|
||||
|
||||
void MenuIntInput::printMenu() {
|
||||
char bufferName[17];
|
||||
|
||||
if (this->currentPosition == 0 && this->length == 1) {
|
||||
// No arrow
|
||||
sprintf(bufferName, " %s ", this->names + MAX_NAME_LENGTH * this->currentPosition);
|
||||
} else if (this->currentPosition > 0 && this->length - 1 == this->currentPosition) {
|
||||
// Left arrow only
|
||||
sprintf(bufferName, "< %s ", this->names + MAX_NAME_LENGTH * this->currentPosition);
|
||||
} else if (this->currentPosition == 0 && this->length > 1) {
|
||||
// Right arrow only
|
||||
sprintf(bufferName, " %s >", this->names + MAX_NAME_LENGTH * this->currentPosition);
|
||||
} else {
|
||||
// Both arrow
|
||||
sprintf(bufferName, "< %s >", this->names + MAX_NAME_LENGTH * this->currentPosition);
|
||||
}
|
||||
|
||||
char bufferValue[17];
|
||||
if (this->values[this->currentPosition])
|
||||
sprintf(bufferValue, " -> %5.d", this->values[this->currentPosition]);
|
||||
else
|
||||
sprintf(bufferValue, " -> 0");
|
||||
|
||||
this->print(bufferName, bufferValue);
|
||||
}
|
||||
Reference in New Issue
Block a user