diff --git a/.travis.yml b/.travis.yml index 31f85ade3d..dd4e5b4401 100644 --- a/.travis.yml +++ b/.travis.yml @@ -87,17 +87,17 @@ env: - PX4_AWS_BUCKET=px4-travis script: - #- make check_format + - make check_format - arm-none-eabi-gcc --version - echo 'Building POSIX Firmware..' && echo -en 'travis_fold:start:script.1\\r' - - make posix_sitl_simple -j4 + - make posix_sitl_simple - echo -en 'travis_fold:end:script.1\\r' - echo 'Running Tests..' && echo -en 'travis_fold:start:script.2\\r' - make posix_sitl_simple test - cat build_posix_sitl_simple/src/modules/systemlib/mixer/mixer_multirotor.generated.h - echo -en 'travis_fold:end:script.2\\r' - echo 'Building NuttX Firmware..' && echo -en 'travis_fold:start:script.3\\r' - - make px4fmu-v2_default -j4 + - make px4fmu-v2_default - echo -en 'travis_fold:end:script.3\\r' - echo 'Running Tests..' && echo -en 'travis_fold:start:script.4\\r' - make px4fmu-v2_default test diff --git a/Makefile b/Makefile index 1d2cd152ff..1e4546a3f7 100644 --- a/Makefile +++ b/Makefile @@ -59,12 +59,24 @@ all: px4fmu-v2_default ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) j ?= 4 +# disable ninja by default for now because it hides upload progress +#NINJA_BUILD := $(shell ninja --version 2>/dev/null) +ifdef NINJA_BUILD + PX4_CMAKE_GENERATOR ?= "Ninja" + PX4_MAKE = ninja + PX4_MAKE_ARGS = +else + PX4_CMAKE_GENERATOR ?= "Unix Makefiles" + PX4_MAKE = make + PX4_MAKE_ARGS = -j$(j) --no-print-directory +endif + # Functions # -------------------------------------------------------------------- # describe how to build a cmake config define cmake-build -+mkdir -p $(PWD)/build_$@ && cd $(PWD)/build_$@ && cmake .. -G"Unix Makefiles" -DCONFIG=$(1) -+make -j$(j) -C $(PWD)/build_$@ --no-print-directory $(ARGS) ++@if [ ! -e $(PWD)/build_$@/CMakeCache.txt ]; then mkdir -p $(PWD)/build_$@ && cd $(PWD)/build_$@ && cmake .. -G$(PX4_CMAKE_GENERATOR) -DCONFIG=$(1); fi ++$(PX4_MAKE) -C $(PWD)/build_$@ $(PX4_MAKE_ARGS) $(ARGS) endef # create empty targets to avoid msgs for targets passed to cmake @@ -141,6 +153,9 @@ sitl_ros: # Other targets # -------------------------------------------------------------------- +check_format: + @./Tools/check_code_style.sh + clean: @rm -rf build_*/ diff --git a/cmake/common/px4_base.cmake b/cmake/common/px4_base.cmake index 797cb14fc1..22cc19c0fe 100644 --- a/cmake/common/px4_base.cmake +++ b/cmake/common/px4_base.cmake @@ -482,14 +482,15 @@ function(px4_add_common_flags) set(warnings -Wall + -Werror -Wno-sign-compare -Wextra #-Wshadow # very verbose due to eigen -Wfloat-equal -Wpointer-arith -Wmissing-declarations - -Wpacked -Wno-unused-parameter + -Wno-varargs -Werror=format-security -Werror=array-bounds -Wfatal-errors @@ -505,7 +506,7 @@ function(px4_add_common_flags) # but generates too many false positives ) - if (NOT ${OS} STREQUAL "qurt") + if (${OS} STREQUAL "nuttx") list(APPEND warnings -Wframe-larger-than=1024) endif() diff --git a/cmake/nuttx/px4_impl_nuttx.cmake b/cmake/nuttx/px4_impl_nuttx.cmake index 89ec3d44c2..13d120af26 100644 --- a/cmake/nuttx/px4_impl_nuttx.cmake +++ b/cmake/nuttx/px4_impl_nuttx.cmake @@ -213,8 +213,7 @@ function(px4_nuttx_add_export) # copy add_custom_command(OUTPUT nuttx_copy_${CONFIG}.stamp COMMAND ${MKDIR} -p ${CMAKE_BINARY_DIR}/${CONFIG} - COMMAND ${CP} -r ${CMAKE_SOURCE_DIR}/NuttX ${nuttx_src} - COMMAND ${RM} -rf ${nuttx_src}/.git + COMMAND rsync -a --exclude=.git ${CMAKE_SOURCE_DIR}/NuttX/ ${nuttx_src}/ COMMAND ${TOUCH} nuttx_copy_${CONFIG}.stamp DEPENDS ${DEPENDS}) add_custom_target(__nuttx_copy_${CONFIG} @@ -222,27 +221,22 @@ function(px4_nuttx_add_export) # export file(GLOB_RECURSE config_files ${CMAKE_SOURCE_DIR}/nuttx-configs/${CONFIG}/*) - add_custom_command(OUTPUT ${CONFIG}.export + add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/${CONFIG}.export COMMAND ${ECHO} Configuring NuttX for ${CONFIG} - COMMAND ${MAKE} -C${nuttx_src}/nuttx -j${THREADS} - -r --quiet distclean - COMMAND ${CP} -r ${CMAKE_SOURCE_DIR}/nuttx-configs/${CONFIG} - ${nuttx_src}/nuttx/configs - COMMAND cd ${nuttx_src}/nuttx/tools && - ./configure.sh ${CONFIG}/nsh + COMMAND ${MAKE} --no-print-directory -C${nuttx_src}/nuttx -r --quiet distclean + COMMAND ${CP} -r ${CMAKE_SOURCE_DIR}/nuttx-configs/${CONFIG} ${nuttx_src}/nuttx/configs + COMMAND cd ${nuttx_src}/nuttx/tools && ./configure.sh ${CONFIG}/nsh COMMAND ${ECHO} Exporting NuttX for ${CONFIG} - COMMAND ${MAKE} -C ${nuttx_src}/nuttx -j${THREADS} - -r CONFIG_ARCH_BOARD=${CONFIG} export - COMMAND ${CP} -r ${nuttx_src}/nuttx/nuttx-export.zip - ${CONFIG}.export + COMMAND ${MAKE} --no-print-directory --quiet -C ${nuttx_src}/nuttx -j${THREADS} -r CONFIG_ARCH_BOARD=${CONFIG} export + COMMAND ${CP} -r ${nuttx_src}/nuttx/nuttx-export.zip ${CMAKE_BINARY_DIR}/${CONFIG}.export DEPENDS ${config_files} ${DEPENDS} __nuttx_copy_${CONFIG}) # extract add_custom_command(OUTPUT nuttx_export_${CONFIG}.stamp COMMAND ${RM} -rf ${nuttx_src}/nuttx-export - COMMAND ${UNZIP} ${CONFIG}.export -d ${nuttx_src} + COMMAND ${UNZIP} -q ${CMAKE_BINARY_DIR}/${CONFIG}.export -d ${nuttx_src} COMMAND ${TOUCH} nuttx_export_${CONFIG}.stamp - DEPENDS ${DEPENDS} ${CONFIG}.export) + DEPENDS ${DEPENDS} ${CMAKE_BINARY_DIR}/${CONFIG}.export) add_custom_target(${OUT} DEPENDS nuttx_export_${CONFIG}.stamp) diff --git a/cmake/toolchains/Toolchain-posix-clang-native.cmake b/cmake/toolchains/Toolchain-posix-clang-native.cmake index 544f61f826..0945b2b1f5 100644 --- a/cmake/toolchains/Toolchain-posix-clang-native.cmake +++ b/cmake/toolchains/Toolchain-posix-clang-native.cmake @@ -1,6 +1,7 @@ set(WARNINGS -Wall + -Werror -Wextra -Wdouble-promotion -Wshadow @@ -25,6 +26,7 @@ set(WARNINGS -Werror=unused-private-field -Wno-packed -Wno-frame-larger-than= + -Wno-varargs #-Wcast-qual - generates spurious noreturn attribute warnings, # try again later #-Wconversion - would be nice, but too many "risky-but-safe" @@ -58,6 +60,7 @@ set(C_FLAGS # set(CXX_WARNINGS -Wno-missing-field-initializers + -Wno-varargs ) set(CXX_FLAGS -fno-exceptions diff --git a/src/drivers/px4flow/i2c_frame.h b/src/drivers/px4flow/i2c_frame.h index a682c5f3de..43e10e417c 100644 --- a/src/drivers/px4flow/i2c_frame.h +++ b/src/drivers/px4flow/i2c_frame.h @@ -41,7 +41,7 @@ #ifndef I2C_FRAME_H_ #define I2C_FRAME_H_ -#define __STDC_FORMAT_MACROS 1 +#define __STDC_FORMAT_MACROS #include typedef struct i2c_frame diff --git a/src/drivers/px4fmu/CMakeLists.txt b/src/drivers/px4fmu/CMakeLists.txt index 335da06c1e..492aad5939 100644 --- a/src/drivers/px4fmu/CMakeLists.txt +++ b/src/drivers/px4fmu/CMakeLists.txt @@ -35,7 +35,6 @@ px4_add_module( MAIN fmu STACK 1200 COMPILE_FLAGS - -Weffc++ -Os SRCS fmu.cpp diff --git a/src/drivers/px4io/CMakeLists.txt b/src/drivers/px4io/CMakeLists.txt index 818d2c33d6..5c180c6f82 100644 --- a/src/drivers/px4io/CMakeLists.txt +++ b/src/drivers/px4io/CMakeLists.txt @@ -35,7 +35,6 @@ px4_add_module( MAIN px4io STACK 1200 COMPILE_FLAGS - -Weffc++ -Os SRCS px4io.cpp diff --git a/src/lib/launchdetection/CatapultLaunchMethod.cpp b/src/lib/launchdetection/CatapultLaunchMethod.cpp index f13c7c4bfe..b5692cc7e7 100644 --- a/src/lib/launchdetection/CatapultLaunchMethod.cpp +++ b/src/lib/launchdetection/CatapultLaunchMethod.cpp @@ -79,7 +79,7 @@ void CatapultLaunchMethod::update(float accel_x) if (motorDelay.get() > 0.0f) { state = LAUNCHDETECTION_RES_DETECTED_ENABLECONTROL; warnx("Launch detected: enablecontrol, waiting %8.4fs until full throttle", - double(motorDelay.get())); + double(motorDelay.get())); } else { /* No motor delay set: go directly to enablemotors state */ diff --git a/src/modules/attitude_estimator_ekf/CMakeLists.txt b/src/modules/attitude_estimator_ekf/CMakeLists.txt index 2c037d46bb..8c68904661 100644 --- a/src/modules/attitude_estimator_ekf/CMakeLists.txt +++ b/src/modules/attitude_estimator_ekf/CMakeLists.txt @@ -35,9 +35,7 @@ px4_add_module( MAIN attitude_estimator_ekf STACK 1200 COMPILE_FLAGS - -Wframe-larger-than=2400 -Wno-float-equal - SRCS attitude_estimator_ekf_main.cpp codegen/AttitudeEKF.c diff --git a/src/modules/attitude_estimator_q/CMakeLists.txt b/src/modules/attitude_estimator_q/CMakeLists.txt index b4726b5c89..c74993ad67 100644 --- a/src/modules/attitude_estimator_q/CMakeLists.txt +++ b/src/modules/attitude_estimator_q/CMakeLists.txt @@ -31,15 +31,13 @@ # ############################################################################# set(MODULE_CFLAGS) -if (NOT ${OS} STREQUAL "qurt") - list(APPEND MODULE_CFLAGS - -Wframe-larger-than=1400) +if (${OS} STREQUAL "nuttx") + list(APPEND MODULE_CFLAGS -Wframe-larger-than=1400) endif() px4_add_module( MODULE modules__attitude_estimator_q MAIN attitude_estimator_q - COMPILE_FLAGS - ${MODULE_CFLAGS} + COMPILE_FLAGS ${MODULE_CFLAGS} STACK 1200 SRCS attitude_estimator_q_main.cpp diff --git a/src/modules/commander/CMakeLists.txt b/src/modules/commander/CMakeLists.txt index 7cd5b045ef..d5c4aa0f12 100644 --- a/src/modules/commander/CMakeLists.txt +++ b/src/modules/commander/CMakeLists.txt @@ -31,10 +31,8 @@ # ############################################################################ set(MODULE_CFLAGS -Os) - -if(NOT ${OS} STREQUAL "qurt") - list(APPEND MODULE_CFLAGS - -Wframe-larger-than=2200) +if(${OS} STREQUAL "nuttx") + list(APPEND MODULE_CFLAGS -Wframe-larger-than=2300) endif() px4_add_module( MODULE modules__commander diff --git a/src/modules/ekf_att_pos_estimator/CMakeLists.txt b/src/modules/ekf_att_pos_estimator/CMakeLists.txt index 5a70282103..907bb31ff3 100644 --- a/src/modules/ekf_att_pos_estimator/CMakeLists.txt +++ b/src/modules/ekf_att_pos_estimator/CMakeLists.txt @@ -31,7 +31,7 @@ # ############################################################################ -set(MODULE_CFLAGS -Weffc++) +set(MODULE_CFLAGS ) if(NOT ${OS} STREQUAL "qurt") list(APPEND MODULE_CFLAGS -Wframe-larger-than=3400) endif() diff --git a/src/modules/land_detector/CMakeLists.txt b/src/modules/land_detector/CMakeLists.txt index 37030f1795..f18b3ed187 100644 --- a/src/modules/land_detector/CMakeLists.txt +++ b/src/modules/land_detector/CMakeLists.txt @@ -35,9 +35,7 @@ px4_add_module( MAIN land_detector STACK 1200 COMPILE_FLAGS - -Weffc++ -Os - SRCS land_detector_main.cpp land_detector_params.c diff --git a/src/modules/mavlink/CMakeLists.txt b/src/modules/mavlink/CMakeLists.txt index f9897dd194..c8a0e7d870 100644 --- a/src/modules/mavlink/CMakeLists.txt +++ b/src/modules/mavlink/CMakeLists.txt @@ -30,16 +30,20 @@ # POSSIBILITY OF SUCH DAMAGE. # ############################################################################ +if (${OS} STREQUAL "nuttx") + list(APPEND MODULE_CFLAGS -Wframe-larger-than=1500) +endif() px4_add_module( MODULE modules__mavlink MAIN mavlink STACK 1200 COMPILE_FLAGS - -Weffc++ + ${MODULE_CFLAGS} -Wno-attributes -Wno-packed -DMAVLINK_COMM_NUM_BUFFERS=3 -Wno-packed + -Wno-tautological-constant-out-of-range-compare -Os SRCS mavlink.c diff --git a/src/modules/mc_att_control/CMakeLists.txt b/src/modules/mc_att_control/CMakeLists.txt index 3f4aeed93f..3c08772766 100644 --- a/src/modules/mc_att_control/CMakeLists.txt +++ b/src/modules/mc_att_control/CMakeLists.txt @@ -30,10 +30,14 @@ # POSSIBILITY OF SUCH DAMAGE. # ############################################################################ +if (${OS} STREQUAL "nuttx") + list(APPEND MODULE_CFLAGS -Wframe-larger-than=3500) +endif() px4_add_module( MODULE modules__mc_att_control MAIN mc_att_control STACK 1200 + COMPILE_FLAGS ${MODULE_CFLAGS} SRCS mc_att_control_main.cpp mc_att_control_params.c diff --git a/src/modules/mc_att_control_multiplatform/mc_att_control.cpp b/src/modules/mc_att_control_multiplatform/mc_att_control.cpp index 63515f497d..98435a08f0 100644 --- a/src/modules/mc_att_control_multiplatform/mc_att_control.cpp +++ b/src/modules/mc_att_control_multiplatform/mc_att_control.cpp @@ -64,11 +64,9 @@ static const int ERROR = -1; MulticopterAttitudeControlMultiplatform::MulticopterAttitudeControlMultiplatform() : MulticopterAttitudeControlBase(), - _task_should_exit(false), _actuators_0_circuit_breaker_enabled(false), /* publications */ - _att_sp_pub(nullptr), _v_rates_sp_pub(nullptr), _actuators_0_pub(nullptr), _n(_appState), diff --git a/src/modules/mc_att_control_multiplatform/mc_att_control.h b/src/modules/mc_att_control_multiplatform/mc_att_control.h index de059fc9f3..12d4beadfc 100644 --- a/src/modules/mc_att_control_multiplatform/mc_att_control.h +++ b/src/modules/mc_att_control_multiplatform/mc_att_control.h @@ -85,10 +85,8 @@ public: void spin() { _n.spin(); } private: - bool _task_should_exit; /**< if true, sensor task should exit */ bool _actuators_0_circuit_breaker_enabled; /**< circuit breaker to suppress output */ - px4::Publisher *_att_sp_pub; /**< attitude setpoint publication */ px4::Publisher *_v_rates_sp_pub; /**< rate setpoint publication */ px4::Publisher *_actuators_0_pub; /**< attitude actuator controls publication */ diff --git a/src/modules/mc_pos_control_multiplatform/CMakeLists.txt b/src/modules/mc_pos_control_multiplatform/CMakeLists.txt index 28c2d0948a..f36acf4e33 100644 --- a/src/modules/mc_pos_control_multiplatform/CMakeLists.txt +++ b/src/modules/mc_pos_control_multiplatform/CMakeLists.txt @@ -33,9 +33,6 @@ px4_add_module( MODULE modules__mc_pos_control_multiplatform MAIN mc_pos_control_m - COMPILE_FLAGS - -Wframe-larger-than=1200 - SRCS mc_pos_control_main.cpp mc_pos_control_start_nuttx.cpp diff --git a/src/modules/position_estimator_inav/CMakeLists.txt b/src/modules/position_estimator_inav/CMakeLists.txt index 0e801603a8..90ab4ad74c 100644 --- a/src/modules/position_estimator_inav/CMakeLists.txt +++ b/src/modules/position_estimator_inav/CMakeLists.txt @@ -30,8 +30,7 @@ # POSSIBILITY OF SUCH DAMAGE. # ############################################################################ -set(MODULE_CFLAGS) -if(NOT ${OS} STREQUAL "qurt") +if(${OS} STREQUAL "nuttx") list(APPEND MODULE_CFLAGS -Wframe-larger-than=3800) endif() px4_add_module( @@ -39,7 +38,6 @@ px4_add_module( MAIN position_estimator_inav STACK 1200 COMPILE_FLAGS ${MODULE_CFLAGS} - SRCS position_estimator_inav_main.c position_estimator_inav_params.c diff --git a/src/modules/sdlog2/CMakeLists.txt b/src/modules/sdlog2/CMakeLists.txt index ddc1b30174..b438f30fd5 100644 --- a/src/modules/sdlog2/CMakeLists.txt +++ b/src/modules/sdlog2/CMakeLists.txt @@ -30,13 +30,16 @@ # POSSIBILITY OF SUCH DAMAGE. # ############################################################################ +if (${OS} STREQUAL "nuttx") + list(APPEND MODULE_CFLAGS -Wframe-larger-than=1500) +endif() px4_add_module( MODULE modules__sdlog2 MAIN sdlog2 PRIORITY "SCHED_PRIORITY_MAX-30" STACK 1200 COMPILE_FLAGS - -Wframe-larger-than=1500 + ${MODULE_CFLAGS} -Os SRCS sdlog2.c diff --git a/src/modules/simulator/CMakeLists.txt b/src/modules/simulator/CMakeLists.txt index 1e81695b97..de452c5de4 100644 --- a/src/modules/simulator/CMakeLists.txt +++ b/src/modules/simulator/CMakeLists.txt @@ -40,11 +40,9 @@ px4_add_module( MODULE modules__simulator MAIN simulator COMPILE_FLAGS - -Weffc++ -Wno-attributes -Wno-packed -Wno-packed - SRCS ${SIMULATOR_SRCS} DEPENDS diff --git a/src/modules/systemlib/param/param.c b/src/modules/systemlib/param/param.c index 4ba9d32004..097e61e350 100644 --- a/src/modules/systemlib/param/param.c +++ b/src/modules/systemlib/param/param.c @@ -88,7 +88,7 @@ extern struct param_info_s *param_info_base; extern struct param_info_s *param_info_limit; #else // FIXME - start and end are reversed -static const struct param_info_s *param_info_base = (const struct param_info_s *)&px4_parameters; +static const struct param_info_s *param_info_base = (const struct param_info_s *) &px4_parameters; #endif #define param_info_count px4_parameters.param_count diff --git a/src/modules/uavcan/CMakeLists.txt b/src/modules/uavcan/CMakeLists.txt index f3d255d1e0..38bf0bc111 100644 --- a/src/modules/uavcan/CMakeLists.txt +++ b/src/modules/uavcan/CMakeLists.txt @@ -35,7 +35,7 @@ set(uavcan_c_flags ${c_flags}) list(REMOVE_ITEM uavcan_c_flags -std=gnu++0x -D__CUSTOM_FILE_IO__) set(uavcan_cxx_flags ${cxx_flags}) -list(REMOVE_ITEM uavcan_cxx_flags -std=gnu++0x -std=c++11 -D__CUSTOM_FILE_IO__) +list(REMOVE_ITEM uavcan_cxx_flags -std=gnu++0x -std=c++11 -Wundef -Werror -D__CUSTOM_FILE_IO__) set(uavcan_deps git_uavcan) set(uavcan_platform generic) @@ -76,8 +76,10 @@ externalproject_add(libuavcan DEPENDS ${uavcan_deps} DOWNLOAD_COMMAND "" UPDATE_COMMAND git submodule update --init + LOG_INSTALL 1 SOURCE_DIR ${CMAKE_SOURCE_DIR}/src/lib/uavcan CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + -DUAVCAN_USE_CPP03=ON -DUAVCAN_PLATFORM=${uavcan_platform} -DUAVCAN_OS=${OS} -DCMAKE_CXX_FLAGS=${uavcan_cxx_flags} @@ -94,6 +96,8 @@ px4_add_module( MAIN uavcan STACK 3200 COMPILE_FLAGS + -Wframe-larger-than=1500 + -Wno-deprecated-declarations -O3 SRCS diff --git a/src/platforms/posix/drivers/gyrosim/CMakeLists.txt b/src/platforms/posix/drivers/gyrosim/CMakeLists.txt index 184df706d3..335bee65d6 100644 --- a/src/platforms/posix/drivers/gyrosim/CMakeLists.txt +++ b/src/platforms/posix/drivers/gyrosim/CMakeLists.txt @@ -35,7 +35,6 @@ px4_add_module( MAIN gyrosim STACK 1200 COMPILE_FLAGS - -Weffc++ -Os SRCS gyrosim.cpp diff --git a/src/systemcmds/mixer/CMakeLists.txt b/src/systemcmds/mixer/CMakeLists.txt index dd051b2772..703d8210fb 100644 --- a/src/systemcmds/mixer/CMakeLists.txt +++ b/src/systemcmds/mixer/CMakeLists.txt @@ -34,7 +34,7 @@ set(MIXER_CFLAGS -Os) if(${OS} STREQUAL "qurt") list(APPEND MIXER_CFLAGS -Wframe-larger-than=2176) else() - list(APPEND MIXER_CFLAGS -Wframe-larger-than=2048) + list(APPEND MIXER_CFLAGS -Wframe-larger-than=2100) endif() px4_add_module( diff --git a/src/systemcmds/param/param.c b/src/systemcmds/param/param.c index d38a13c676..88f5197d27 100644 --- a/src/systemcmds/param/param.c +++ b/src/systemcmds/param/param.c @@ -445,8 +445,8 @@ do_set(const char *name, const char *val, bool fail_on_not_found) if (i != newval) { printf("%c %s: ", - param_value_unsaved(param) ? '*' : (param_value_is_default(param) ? ' ' : '+'), - param_name(param)); + param_value_unsaved(param) ? '*' : (param_value_is_default(param) ? ' ' : '+'), + param_name(param)); printf("curr: %ld", (long)i); param_set(param, &newval); printf(" -> new: %ld\n", (long)newval); @@ -467,8 +467,8 @@ do_set(const char *name, const char *val, bool fail_on_not_found) if (f != newval) { #pragma GCC diagnostic pop printf("%c %s: ", - param_value_unsaved(param) ? '*' : (param_value_is_default(param) ? ' ' : '+'), - param_name(param)); + param_value_unsaved(param) ? '*' : (param_value_is_default(param) ? ' ' : '+'), + param_name(param)); printf("curr: %4.4f", (double)f); param_set(param, &newval); printf(" -> new: %4.4f\n", (double)newval);