|
4 | 4 | #include "../ESPEasyCore/ESPEasy_Log.h" |
5 | 5 | #include "../Globals/RamTracker.h" |
6 | 6 | #include "../Helpers/ESPEasy_math.h" |
| 7 | +#include "../Helpers/Hardware.h" |
7 | 8 | #include "../Helpers/Numerical.h" |
8 | 9 | #include "../Helpers/StringConverter.h" |
9 | 10 |
|
@@ -71,6 +72,14 @@ bool RulesCalculate_t::is_unary_operator(char c) |
71 | 72 | */ |
72 | 73 | } |
73 | 74 |
|
| 75 | +// quinary = 5-argument functions |
| 76 | +bool RulesCalculate_t::is_quinary_operator(char c) |
| 77 | +{ |
| 78 | + const UnaryOperator op = static_cast<UnaryOperator>(c); |
| 79 | + |
| 80 | + return op == UnaryOperator::Map; |
| 81 | +} |
| 82 | + |
74 | 83 | CalculateReturnCode RulesCalculate_t::push(ESPEASY_RULES_FLOAT_TYPE value) |
75 | 84 | { |
76 | 85 | if (sp != sp_max) // Full |
@@ -261,6 +270,22 @@ ESPEASY_RULES_FLOAT_TYPE RulesCalculate_t::apply_unary_operator(char op, ESPEASY |
261 | 270 | return ret; |
262 | 271 | } |
263 | 272 |
|
| 273 | +ESPEASY_RULES_FLOAT_TYPE RulesCalculate_t::apply_quinary_operator(char op, |
| 274 | + ESPEASY_RULES_FLOAT_TYPE first, |
| 275 | + ESPEASY_RULES_FLOAT_TYPE second, |
| 276 | + ESPEASY_RULES_FLOAT_TYPE third, |
| 277 | + ESPEASY_RULES_FLOAT_TYPE fourth, |
| 278 | + ESPEASY_RULES_FLOAT_TYPE fifth) |
| 279 | +{ |
| 280 | + ESPEASY_RULES_FLOAT_TYPE ret{}; |
| 281 | + const UnaryOperator qu_op = static_cast<UnaryOperator>(op); |
| 282 | + |
| 283 | + if (UnaryOperator::Map == qu_op) { |
| 284 | + return mapADCtoFloat(first, second, third, fourth, fifth); |
| 285 | + } |
| 286 | + return ret; |
| 287 | +} |
| 288 | + |
264 | 289 | /* |
265 | 290 | char * RulesCalculate_t::next_token(char *linep) |
266 | 291 | { |
@@ -295,6 +320,16 @@ CalculateReturnCode RulesCalculate_t::RPNCalculate(char *token) |
295 | 320 |
|
296 | 321 | // FIXME TD-er: Regardless whether it is an error, all code paths return ret; |
297 | 322 | // if (isError(ret)) { return ret; } |
| 323 | + } else if (is_quinary_operator(token[0]) && (token[1] == 0)) |
| 324 | + { |
| 325 | + ESPEASY_RULES_FLOAT_TYPE fifth = pop(); |
| 326 | + ESPEASY_RULES_FLOAT_TYPE fourth = pop(); |
| 327 | + ESPEASY_RULES_FLOAT_TYPE third = pop(); |
| 328 | + ESPEASY_RULES_FLOAT_TYPE second = pop(); |
| 329 | + ESPEASY_RULES_FLOAT_TYPE first = pop(); |
| 330 | + |
| 331 | + ret = push(apply_quinary_operator(token[0], first, second, third, fourth, fifth)); |
| 332 | + |
298 | 333 | } else { |
299 | 334 | // Fetch next if there is any |
300 | 335 | ESPEASY_RULES_FLOAT_TYPE value{}; |
@@ -352,6 +387,8 @@ unsigned int RulesCalculate_t::op_arg_count(const char c) |
352 | 387 | if (is_unary_operator(c)) { return 1; } |
353 | 388 |
|
354 | 389 | if (is_operator(c)) { return 2; } |
| 390 | + |
| 391 | + if (is_quinary_operator(c)) { return 5; } |
355 | 392 | return 0; |
356 | 393 | } |
357 | 394 |
|
@@ -399,7 +436,7 @@ CalculateReturnCode RulesCalculate_t::doCalculate(const char *input, ESPEASY_RUL |
399 | 436 | } |
400 | 437 |
|
401 | 438 | // If the token is an operator, op1, then: |
402 | | - else if (is_operator(c) || is_unary_operator(c)) |
| 439 | + else if (is_operator(c) || is_unary_operator(c) || is_quinary_operator(c)) |
403 | 440 | { |
404 | 441 | *(TokenPos) = 0; // Mark end of token string |
405 | 442 | error = RPNCalculate(token); |
@@ -443,6 +480,14 @@ CalculateReturnCode RulesCalculate_t::doCalculate(const char *input, ESPEASY_RUL |
443 | 480 | ++sl; |
444 | 481 | } |
445 | 482 |
|
| 483 | + // Process the token at a colon (separator) |
| 484 | + else if (c == ':') |
| 485 | + { |
| 486 | + *(TokenPos) = 0; // Mark end of token string |
| 487 | + error = RPNCalculate(token); |
| 488 | + TokenPos = token; |
| 489 | + } |
| 490 | + |
446 | 491 | // If the token is a left parenthesis, then push it onto the stack. |
447 | 492 | else if (c == '(') |
448 | 493 | { |
@@ -609,6 +654,8 @@ const __FlashStringHelper* toString(UnaryOperator op) |
609 | 654 | return F("atan"); |
610 | 655 | case UnaryOperator::ArcTan_d: |
611 | 656 | return F("atan_d"); |
| 657 | + case UnaryOperator::Map: |
| 658 | + return F("map"); |
612 | 659 | } |
613 | 660 | return F(""); |
614 | 661 | } |
@@ -644,6 +691,7 @@ String RulesCalculate_t::preProces(const String& input) |
644 | 691 | ,UnaryOperator::Tan |
645 | 692 | ,UnaryOperator::Tan_d |
646 | 693 | #endif // if FEATURE_TRIGONOMETRIC_FUNCTIONS_RULES |
| 694 | + ,UnaryOperator::Map |
647 | 695 |
|
648 | 696 | }; |
649 | 697 |
|
|
0 commit comments