1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 // This file contains frequently used constants and helper macros. 18 19 #include <stdint.h> 20 21 #ifndef LOCATION_LBS_CONTEXTHUB_NANOAPPS_COMMON_MATH_MACROS_H_ 22 #define LOCATION_LBS_CONTEXTHUB_NANOAPPS_COMMON_MATH_MACROS_H_ 23 24 // Constants. 25 #define NANO_PI (3.14159265359f) 26 #define INVALID_TEMPERATURE_CELSIUS (-274.0f) 27 28 // Common math operations. 29 #define NANO_ABS(x) ((x) > 0 ? (x) : -(x)) 30 #define NANO_MAX(a, b) ((a) > (b)) ? (a) : (b) 31 #define NANO_MIN(a, b) ((a) < (b)) ? (a) : (b) 32 #define SIGMOID(x) (1 / (1 + expf(-x))) 33 34 // Timestamp conversion macros. 35 #ifdef __cplusplus 36 #define MSEC_TO_NANOS(x) (static_cast<uint64_t>(x * UINT64_C(1000000))) 37 #else 38 #define MSEC_TO_NANOS(x) ((uint64_t)(x * UINT64_C(1000000))) // NOLINT 39 #endif 40 41 #define SEC_TO_NANOS(x) MSEC_TO_NANOS(x * UINT64_C(1000)) 42 #define MIN_TO_NANOS(x) SEC_TO_NANOS (x * UINT64_C(60)) 43 #define HRS_TO_NANOS(x) MIN_TO_NANOS (x * UINT64_C(60)) 44 #define DAYS_TO_NANOS(x) HRS_TO_NANOS (x * UINT64_C(24)) 45 46 // Sample rate to period conversion. 47 #ifdef __cplusplus 48 #define HZ_TO_PERIOD_NANOS(hz) \ 49 (SEC_TO_NANOS(1024) / (static_cast<uint64_t>(hz * 1024))) 50 #else 51 #define HZ_TO_PERIOD_NANOS(hz) \ 52 (SEC_TO_NANOS(1024) / ((uint64_t)(hz * 1024))) // NOLINT 53 #endif 54 55 // Unit conversion: nanoseconds to seconds. 56 #define NANOS_TO_SEC (1.0e-9f) 57 58 // Unit conversion: milli-degrees to radians. 59 #define MDEG_TO_RAD (NANO_PI / 180.0e3f) 60 61 // Unit conversion: radians to milli-degrees. 62 #define RAD_TO_MDEG (180.0e3f / NANO_PI) 63 64 // Time check helper macro that returns true if: 65 // i. 't1' is equal to or exceeds 't2' plus 't_delta'. 66 // ii. Or, a negative timestamp delta occurred since, 67 // 't1' should always >= 't2'. This prevents potential lockout conditions 68 // if the timer count 't1' rolls over or an erroneously large 69 // timestamp is passed through. 70 #define NANO_TIMER_CHECK_T1_GEQUAL_T2_PLUS_DELTA(t1, t2, t_delta) \ 71 (((t1) >= (t2) + (t_delta)) || ((t1) < (t2))) 72 73 #ifdef __cplusplus 74 extern "C" { 75 #endif 76 77 // This conversion function may be necessary for embedded hardware that can't 78 // cast a uint64_t to a float directly. This conversion function was taken from: 79 // [android]//device/google/contexthub/firmware/os/core/floatRt.c 80 static inline float floatFromUint64(uint64_t v) { 81 uint32_t hi = v >> 32; 82 uint32_t lo = (uint32_t) v; 83 84 if (!hi) { // This is very fast for cases where 'v' fits into a uint32_t. 85 return (float)lo; 86 } else { 87 return ((float)hi) * 4294967296.0f + (float)lo; 88 } 89 } 90 91 #ifdef __cplusplus 92 } 93 #endif 94 95 #endif // LOCATION_LBS_CONTEXTHUB_NANOAPPS_COMMON_MATH_MACROS_H_ 96