diff --git a/makefiles/posix/toolchain_native.mk b/makefiles/posix/toolchain_native.mk index fb730cd9fa..28cf32c518 100644 --- a/makefiles/posix/toolchain_native.mk +++ b/makefiles/posix/toolchain_native.mk @@ -120,7 +120,6 @@ ifeq ($(CONFIG_BOARD),) $(error Board config does not define CONFIG_BOARD) endif ARCHDEFINES += -DCONFIG_ARCH_BOARD_$(CONFIG_BOARD) \ - -D__PX4_LINUX -D__PX4_POSIX \ -Dnoreturn_function= \ -I$(PX4_BASE)/src/modules/systemlib \ -I$(PX4_BASE)/src/lib/eigen \ @@ -128,6 +127,14 @@ ARCHDEFINES += -DCONFIG_ARCH_BOARD_$(CONFIG_BOARD) \ -I$(PX4_BASE)/mavlink/include/mavlink \ -Wno-error=shadow +UNAME_S := $(shell uname -s) +ifeq ($(UNAME_S),Linux) + ARCHDEFINES += -D__PX4_POSIX -D__PX4_LINUX +endif +ifeq ($(UNAME_S),Darwin) + ARCHDEFINES += -D__PX4_POSIX -D__PX4_DARWIN +endif + # optimisation flags # ARCHOPTIMIZATION = $(MAXOPTIMIZATION) \ diff --git a/src/drivers/device/i2c_posix.cpp b/src/drivers/device/i2c_posix.cpp index aa031d9e42..159366c168 100644 --- a/src/drivers/device/i2c_posix.cpp +++ b/src/drivers/device/i2c_posix.cpp @@ -135,6 +135,9 @@ I2C::init() int I2C::transfer(const uint8_t *send, unsigned send_len, uint8_t *recv, unsigned recv_len) { + #ifndef __PX4_LINUX + return 1; + #else struct i2c_msg msgv[2]; unsigned msgs; struct i2c_rdwr_ioctl_data packets; @@ -191,11 +194,15 @@ I2C::transfer(const uint8_t *send, unsigned send_len, uint8_t *recv, unsigned re } while (retry_count++ < _retries); return ret; + #endif } int I2C::transfer(struct i2c_msg *msgv, unsigned msgs) { + #ifndef __PX4_LINUX + return 1; + #else struct i2c_rdwr_ioctl_data packets; int ret; unsigned retry_count = 0; @@ -227,16 +234,18 @@ I2C::transfer(struct i2c_msg *msgv, unsigned msgs) } while (retry_count++ < _retries); return ret; + #endif } int I2C::ioctl(device::file_t *filp, int cmd, unsigned long arg) { //struct i2c_rdwr_ioctl_data *packets = (i2c_rdwr_ioctl_data *)(void *)arg; - switch (cmd) { + #ifdef __PX4_LINUX case I2C_RDWR: warnx("Use I2C::transfer, not ioctl"); return 0; + #endif default: /* give it to the superclass */ return VDev::ioctl(filp, cmd, arg); diff --git a/src/drivers/drv_device.h b/src/drivers/drv_device.h index 3477dde9fd..e0226590bc 100644 --- a/src/drivers/drv_device.h +++ b/src/drivers/drv_device.h @@ -66,6 +66,11 @@ #define DEVIOCGDEVICEID _DEVICEIOC(2) #ifdef __PX4_POSIX + +#ifndef SIOCDEVPRIVATE + #define SIOCDEVPRIVATE 1 +#endif + #define DIOC_GETPRIV SIOCDEVPRIVATE #endif diff --git a/src/platforms/posix/px4_layer/drv_hrt.c b/src/platforms/posix/px4_layer/drv_hrt.c index 6ef217e218..d1a26fd6c6 100644 --- a/src/platforms/posix/px4_layer/drv_hrt.c +++ b/src/platforms/posix/px4_layer/drv_hrt.c @@ -77,6 +77,40 @@ static void hrt_unlock(void) sem_post(&_hrt_lock); } +#ifndef clock_gettime +#include +#define MAC_NANO (+1.0E-9) +#define MAC_GIGA UINT64_C(1000000000) +#define CLOCK_MONOTONIC 1 +#define clockid_t int + +static double px4_timebase = 0.0; +static uint64_t px4_timestart = 0; + +int clock_gettime(clockid_t clk_id, struct timespec *t) +{ +if (clk_id != CLOCK_MONOTONIC) { + return 1; +} + + // XXX multithreading locking + if (!px4_timestart) { + mach_timebase_info_data_t tb = { 0 }; + mach_timebase_info(&tb); + px4_timebase = tb.numer; + px4_timebase /= tb.denom; + px4_timestart = mach_absolute_time(); + } + + memset(t, 0, sizeof(*t)); + + double diff = (mach_absolute_time() - px4_timestart) * px4_timebase; + t->tv_sec = diff * MAC_NANO; + t->tv_nsec = diff - (t->tv_sec * MAC_GIGA); + return 0; +} +#endif + /* * Get absolute time. */ diff --git a/src/platforms/px4_log.h b/src/platforms/px4_log.h index d655fa91d6..5576025362 100644 --- a/src/platforms/px4_log.h +++ b/src/platforms/px4_log.h @@ -86,6 +86,21 @@ #define PX4_WARN(...) __px4_log_verbose("WARN", __VA_ARGS__) #define PX4_ERR(...) __px4_log_verbose("ERROR", __VA_ARGS__) +#elif defined(__PX4_DARWIN) +#include +#include + +#define __px4_log_threads(level, ...) { \ + printf("%-5s %ld ", level, pthread_self());\ + printf(__VA_ARGS__);\ + printf(" (file %s line %d)\n", __FILE__, __LINE__);\ +} + +#define PX4_DEBUG(...) __px4_log_omit("DEBUG", __VA_ARGS__) +#define PX4_INFO(...) __px4_log("INFO", __VA_ARGS__) +#define PX4_WARN(...) __px4_log_verbose("WARN", __VA_ARGS__) +#define PX4_ERR(...) __px4_log_verbose("ERROR", __VA_ARGS__) + #elif defined(__PX4_ROS) #define PX4_DBG(...) diff --git a/src/platforms/px4_tasks.h b/src/platforms/px4_tasks.h index e7eda424bf..8dde7cfdd5 100644 --- a/src/platforms/px4_tasks.h +++ b/src/platforms/px4_tasks.h @@ -68,10 +68,16 @@ typedef int px4_task_t; #define SCHED_PRIORITY_MAX sched_get_priority_max(SCHED_FIFO) #define SCHED_PRIORITY_MIN sched_get_priority_min(SCHED_FIFO) #define SCHED_PRIORITY_DEFAULT sched_get_priority_max(SCHED_FIFO) +#elif defined(__PX4_DARWIN) +#define SCHED_PRIORITY_MAX sched_get_priority_max(SCHED_FIFO) +#define SCHED_PRIORITY_MIN sched_get_priority_min(SCHED_FIFO) +#define SCHED_PRIORITY_DEFAULT sched_get_priority_max(SCHED_FIFO) #elif defined(__PX4_QURT) #define SCHED_PRIORITY_MAX 0 #define SCHED_PRIORITY_MIN 0 #define SCHED_PRIORITY_DEFAULT 0 +#else +#error "No target OS defined" #endif typedef int px4_task_t; diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index a006284df6..b4e505209d 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -55,15 +55,19 @@ add_definitions(-DERROR=-1) add_definitions(-DOK=0) add_definitions(-D_UNIT_TEST=) add_definitions(-D__PX4_POSIX) -add_definitions(-D__PX4_LINUX) -add_definitions(-D__PX4_POSIX) # check add_custom_target(unittests COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure) function(add_gtest) foreach(test_name ${ARGN}) - target_link_libraries(${test_name} gtest_main pthread rt ) + if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + target_link_libraries(${test_name} gtest_main pthread ) + add_definitions(-D__PX4_DARWIN) + else() + target_link_libraries(${test_name} gtest_main pthread rt ) + add_definitions(-D__PX4_LINUX) + endif() add_test(NAME ${test_name} COMMAND ${test_name} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) add_dependencies(unittests ${test_name}) endforeach()