/** * string to float. NaN input is not supported * * @return NAN in case of invalid string * todo: explicit value for error code? probably not, NaN is only returned in case of an error */ float atoff(const char *param) { uint32_t totallen = strlen(param); if (totallen > sizeof(todofixthismesswithcopy) - 1) return (float) NAN; strcpy(todofixthismesswithcopy, param); char *string = todofixthismesswithcopy; // todo: is there a standard function? // todo: create a unit test int dotIndex = indexOf(string, '.'); if (dotIndex == -1) { // just an integer int result = atoi(string); if (absI(result) == ERROR_CODE) return (float) NAN; return (float) result; } // todo: this needs to be fixed string[dotIndex] = 0; int integerPart = atoi(string); if (absI(integerPart) == ERROR_CODE) return (float) NAN; string += (dotIndex + 1); int decimalLen = strlen(string); int decimal = atoi(string); if (absI(decimal) == ERROR_CODE) return (float) NAN; float divider = 1.0; // todo: reuse 'pow10' function which we have anyway for (int i = 0; i < decimalLen; i++) { divider = divider * 10.0; } return integerPart + decimal / divider; }
static void setTriggerSimulatorMode(const char *indexStr, const char *modeCode) { int index = atoi(indexStr); if (index < 0 || index >= TRIGGER_SIMULATOR_PIN_COUNT || absI(index) == ERROR_CODE) { return; } int mode = atoi(modeCode); if (absI(mode) == ERROR_CODE) { return; } boardConfiguration->triggerSimulatorPinModes[index] = (pin_output_mode_e) mode; }
// todo: re-use primary firmware implementation? int warning(obd_code_e code, const char *fmt, ...) { int now = currentTimeMillis() / 1000; if (absI(now - timeOfPreviousWarning) < 10) return TRUE; // we just had another warning, let's not spam timeOfPreviousWarning = now; printf("Warning: %s\r\n", fmt); return FALSE; }
static void setFloat(const char *offsetStr, const char *valueStr) { int offset = atoi(offsetStr); if (absI(offset) == absI(ERROR_CODE)) { scheduleMsg(&logger, "invalid offset [%s]", offsetStr); return; } if (isOutOfBounds(offset)) return; float value = atoff(valueStr); if (cisnan(value)) { scheduleMsg(&logger, "invalid value [%s]", valueStr); return; } float *ptr = (float *) (&((char *) engine->engineConfiguration)[offset]); *ptr = value; getFloat(offset); }
static void setBit(const char *offsetStr, const char *bitStr, const char *valueStr) { int offset = atoi(offsetStr); if (absI(offset) == absI(ERROR_CODE)) { scheduleMsg(&logger, "invalid offset [%s]", offsetStr); return; } if (isOutOfBounds(offset)) { return; } int bit = atoi(bitStr); if (absI(bit) == absI(ERROR_CODE)) { scheduleMsg(&logger, "invalid bit [%s]", bitStr); return; } int value = atoi(valueStr); if (absI(value) == absI(ERROR_CODE)) { scheduleMsg(&logger, "invalid value [%s]", valueStr); return; } int *ptr = (int *) (&((char *) engineConfiguration)[offset]); *ptr ^= (-value ^ *ptr) & (1 << bit); /** * this response is part of dev console API */ scheduleMsg(&logger, "bit @%d/%d is %d", offset, bit, value); incrementGlobalConfigurationVersion(PASS_ENGINE_PARAMETER_F); }
static void setTriggerSimulatorPin(const char *indexStr, const char *pinName) { int index = atoi(indexStr); if (index < 0 || index >= TRIGGER_SIMULATOR_PIN_COUNT || absI(index) == ERROR_CODE) return; brain_pin_e pin = parseBrainPin(pinName); if (pin == GPIO_INVALID) { scheduleMsg(&logger, "invalid pin name [%s]", pinName); return; } scheduleMsg(&logger, "setting trigger simulator pin[%d] to %s please save&restart", index, hwPortname(pin)); boardConfiguration->triggerSimulatorPins[index] = pin; applyNewConfiguration(); }
static void setEgtCSPin(const char *indexStr, const char *pinName, board_configuration_s * board_configuration_s) { int index = atoi(indexStr); if (index < 0 || index >= EGT_CHANNEL_COUNT || absI(index) == ERROR_CODE) return; brain_pin_e pin = parseBrainPin(pinName); if (pin == GPIO_INVALID) { scheduleMsg(&logger, "invalid pin name [%s]", pinName); return; } scheduleMsg(&logger, "setting EGT CS pin[%d] to %s please save&restart", index, hwPortname(pin)); boardConfiguration->max31855_cs[index] = pin; applyNewConfiguration(); }
void handleActionWithParameter(TokenCallback *current, char *parameter) { if (current->parameterType == STRING_PARAMETER) { VoidCharPtr callbackS = (VoidCharPtr) current->callback; (*callbackS)(parameter); return; } if (current->parameterType == STRING_PARAMETER_P) { VoidCharPtrVoidPtr callbackS = (VoidCharPtrVoidPtr) current->callback; (*callbackS)(parameter, current->param); return; } // todo: refactor this hell! if (current->parameterType == STRING2_PARAMETER || current->parameterType == STRING2_PARAMETER_P) { int spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) { return; } parameter[spaceIndex] = 0; char * param0 = parameter; parameter += spaceIndex + 1; char * param1 = parameter; if (current->parameterType == STRING2_PARAMETER) { VoidCharPtrCharPtr callbackS = (VoidCharPtrCharPtr) current->callback; (*callbackS)(param0, param1); } else { VoidCharPtrCharPtrVoidPtr callbackS = (VoidCharPtrCharPtrVoidPtr) current->callback; (*callbackS)(param0, param1, current->param); } return; } if (current->parameterType == STRING3_PARAMETER) { int spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) { return; } parameter[spaceIndex] = 0; char * param0 = parameter; parameter += spaceIndex + 1; spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) return; parameter[spaceIndex] = 0; char * param1 = parameter; parameter += spaceIndex + 1; char * param2 = parameter; VoidCharPtrCharPtrCharPtr callbackS = (VoidCharPtrCharPtrCharPtr) current->callback; (*callbackS)(param0, param1, param2); return; } // todo: refactor this hell! if (current->parameterType == STRING5_PARAMETER) { int spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) { return; } parameter[spaceIndex] = 0; char * param0 = parameter; parameter += spaceIndex + 1; spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) return; parameter[spaceIndex] = 0; char * param1 = parameter; parameter += spaceIndex + 1; spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) return; parameter[spaceIndex] = 0; char * param2 = parameter; parameter += spaceIndex + 1; spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) return; parameter[spaceIndex] = 0; char * param3 = parameter; parameter += spaceIndex + 1; char * param4 = parameter; VoidCharPtrCharPtrCharPtrCharPtrCharPtr callbackS = (VoidCharPtrCharPtrCharPtrCharPtrCharPtr) current->callback; (*callbackS)(param0, param1, param2, param3, param4); return; } if (current->parameterType == TWO_INTS_PARAMETER) { int spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) return; parameter[spaceIndex] = 0; int value1 = atoi(parameter); if (absI(value1) == ERROR_CODE) { #if (EFI_PROD_CODE || EFI_SIMULATOR) || defined(__DOXYGEN__) scheduleMsg(logging, "not an integer [%s]", parameter); #endif return; } parameter += spaceIndex + 1; int value2 = atoi(parameter); if (absI(value2) == ERROR_CODE) { #if (EFI_PROD_CODE || EFI_SIMULATOR) || defined(__DOXYGEN__) scheduleMsg(logging, "not an integer [%s]", parameter); #endif return; } VoidIntInt callbackS = (VoidIntInt) current->callback; (*callbackS)(value1, value2); return; } if (current->parameterType == FLOAT_PARAMETER) { float value = atoff(parameter); VoidFloat callbackF = (VoidFloat) current->callback; // invoke callback function by reference (*callbackF)(value); return; } if (current->parameterType == FLOAT_FLOAT_PARAMETER || current->parameterType == FLOAT_FLOAT_PARAMETER_P) { int spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) return; parameter[spaceIndex] = 0; float value1 = atoff(parameter); parameter += spaceIndex + 1; float value2 = atoff(parameter); if (current->parameterType == FLOAT_FLOAT_PARAMETER) { VoidFloatFloat callbackS = (VoidFloatFloat) current->callback; (*callbackS)(value1, value2); } else { VoidFloatFloatVoidPtr callbackS = (VoidFloatFloatVoidPtr) current->callback; (*callbackS)(value1, value2, current->param); } return; } int value = atoi(parameter); if (absI(value) == ERROR_CODE) { print("invalid integer [%s]\r\n", parameter); return; } if (current->parameterType == ONE_PARAMETER_P) { VoidIntVoidPtr callback1 = (VoidIntVoidPtr) current->callback; // invoke callback function by reference (*callback1)(value, current->param); } else { VoidInt callback1 = (VoidInt) current->callback; // invoke callback function by reference (*callback1)(value); } }
void handleActionWithParameter(TokenCallback *current, char *parameter) { while (parameter[0] == SPACE_CHAR) { parameter[0] = 0; parameter++; } switch (current->parameterType) { case STRING_PARAMETER: { VoidCharPtr callbackS = (VoidCharPtr) current->callback; (*callbackS)(parameter); return; } case STRING_PARAMETER_P: { VoidCharPtrVoidPtr callbackS = (VoidCharPtrVoidPtr) current->callback; (*callbackS)(parameter, current->param); return; } default: // todo: handle all cases explicitly break; } // todo: refactor this hell! if (current->parameterType == STRING2_PARAMETER || current->parameterType == STRING2_PARAMETER_P) { int spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) { return; } REPLACE_SPACES_WITH_ZERO; char * param0 = parameter; parameter += spaceIndex + 1; char * param1 = parameter; if (current->parameterType == STRING2_PARAMETER) { VoidCharPtrCharPtr callbackS = (VoidCharPtrCharPtr) current->callback; (*callbackS)(param0, param1); } else { VoidCharPtrCharPtrVoidPtr callbackS = (VoidCharPtrCharPtrVoidPtr) current->callback; (*callbackS)(param0, param1, current->param); } return; } if (current->parameterType == STRING3_PARAMETER) { int spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) { return; } REPLACE_SPACES_WITH_ZERO; char * param0 = parameter; parameter += spaceIndex + 1; spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) return; REPLACE_SPACES_WITH_ZERO; char * param1 = parameter; parameter += spaceIndex + 1; char * param2 = parameter; VoidCharPtrCharPtrCharPtr callbackS = (VoidCharPtrCharPtrCharPtr) current->callback; (*callbackS)(param0, param1, param2); return; } // todo: refactor this hell! if (current->parameterType == STRING5_PARAMETER) { int spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) { return; } REPLACE_SPACES_WITH_ZERO; char * param0 = parameter; parameter += spaceIndex + 1; spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) return; REPLACE_SPACES_WITH_ZERO; char * param1 = parameter; parameter += spaceIndex + 1; spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) return; REPLACE_SPACES_WITH_ZERO; char * param2 = parameter; parameter += spaceIndex + 1; spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) return; REPLACE_SPACES_WITH_ZERO; char * param3 = parameter; parameter += spaceIndex + 1; char * param4 = parameter; VoidCharPtrCharPtrCharPtrCharPtrCharPtr callbackS = (VoidCharPtrCharPtrCharPtrCharPtrCharPtr) current->callback; (*callbackS)(param0, param1, param2, param3, param4); return; } if (current->parameterType == TWO_INTS_PARAMETER) { int spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) return; REPLACE_SPACES_WITH_ZERO; int value1 = atoi(parameter); if (absI(value1) == ERROR_CODE) { #if (EFI_PROD_CODE || EFI_SIMULATOR) || defined(__DOXYGEN__) scheduleMsg(logging, "not an integer [%s]", parameter); #endif return; } parameter += spaceIndex + 1; int value2 = atoi(parameter); if (absI(value2) == ERROR_CODE) { #if (EFI_PROD_CODE || EFI_SIMULATOR) || defined(__DOXYGEN__) scheduleMsg(logging, "not an integer [%s]", parameter); #endif return; } VoidIntInt callbackS = (VoidIntInt) current->callback; (*callbackS)(value1, value2); return; } if (current->parameterType == FLOAT_PARAMETER_NAN_ALLOWED) { float value = atoff(parameter); VoidFloat callbackF = (VoidFloat) current->callback; // invoke callback function by reference (*callbackF)(value); return; } if (current->parameterType == FLOAT_PARAMETER) { float value = atoff(parameter); if (cisnan(value)) { print("invalid float [%s]\r\n", parameter); return; } VoidFloat callbackF = (VoidFloat) current->callback; // invoke callback function by reference (*callbackF)(value); return; } if (current->parameterType == FLOAT_FLOAT_PARAMETER || current->parameterType == FLOAT_FLOAT_PARAMETER_P) { int spaceIndex = findEndOfToken(parameter); if (spaceIndex == -1) return; REPLACE_SPACES_WITH_ZERO; float value1 = atoff(parameter); if (cisnan(value1)) { print("invalid float [%s]\r\n", parameter); return; } parameter += spaceIndex + 1; float value2 = atoff(parameter); if (cisnan(value2)) { print("invalid float [%s]\r\n", parameter); return; } if (current->parameterType == FLOAT_FLOAT_PARAMETER) { VoidFloatFloat callbackS = (VoidFloatFloat) current->callback; (*callbackS)(value1, value2); } else { VoidFloatFloatVoidPtr callbackS = (VoidFloatFloatVoidPtr) current->callback; (*callbackS)(value1, value2, current->param); } return; } int value = atoi(parameter); if (absI(value) == ERROR_CODE) { print("invalid integer [%s]\r\n", parameter); return; } if (current->parameterType == ONE_PARAMETER_P) { VoidIntVoidPtr callback1 = (VoidIntVoidPtr) current->callback; // invoke callback function by reference (*callback1)(value, current->param); } else { VoidInt callback1 = (VoidInt) current->callback; // invoke callback function by reference (*callback1)(value); } }