Skip to content

Commit

Permalink
Merge pull request #2 from ojousima/ruuviblog
Browse files Browse the repository at this point in the history
Ruuviblog
  • Loading branch information
ojousima committed Aug 31, 2018
2 parents d199207 + c84c21e commit 33aaeae
Show file tree
Hide file tree
Showing 14 changed files with 200 additions and 22 deletions.
23 changes: 23 additions & 0 deletions application_config/application_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,27 @@
// Allow BME280 support compilation
#define RUUVI_INTERFACE_ENVIRONMENTAL_BME280_ENABLED 1

// Allow using MCU as environmental (temperature) sensor
#define APPLICATION_ENVIRONMENTAL_MCU_ENABLED 1

// 1, 10, 25, 50, 100, 200 or RUUVI_DRIVER_SENSOR_CFG_MAX (400) for LIS2DH12
#define APPLICATION_ACCELEROMETER_SAMPLERATE 1

// 8, 10, 12 for LIS2DH12
#define APPLICATION_ACCELEROMETER_RESOLUTION 10

// 2, 4, 8, 16 for LIS2DH12
#define APPLICATION_ACCELEROMETER_SCALE RUUVI_DRIVER_SENSOR_CFG_MIN

// LAST or HIGH_PASS
#define APPLICATION_ACCELEROMETER_DSPFUNC RUUVI_DRIVER_SENSOR_DSP_LAST
#define APPLICATION_ACCELEROMETER_DSPPARAM 1

// SLEEP or CONTINUOUS
#define APPLICATION_ACCELEROMETER_MODE RUUVI_DRIVER_SENSOR_CFG_CONTINUOUS

// Allow LIS2DH12 support compilation
#define RUUVI_INTERFACE_ACCELERATION_LIS2DH12_ENABLED 1


#endif
13 changes: 7 additions & 6 deletions application_config/ruuvi_platform_nrf5_sdk15_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,13 @@
#define RUUVI_PLATFORM_NRF5_SDK15_CONFIG_H

#if NRF5_SDK15_PLATFORM_ENABLED
#define NRF5_SDK15_GPIO_ENABLED APPLICATION_GPIO_ENABLED
#define NRF5_SDK15_GPIO_INTERRUPT_ENABLED APPLICATION_GPIO_INTERRUPT_ENABLED
#define NRF5_SDK15_NRF52832_ENVIRONMENTAL_ENABLED APPLICATION_ENVIRONMENTAL_MCU_ENABLED
#define NRF5_SDK15_LOG_ENABLED APPLICATION_LOG_ENABLED
#define NRF5_SDK15_SPI_ENABLED APPLICATION_SPI_ENABLED
#define NRF5_SDK15_YIELD_ENABLED APPLICATION_YIELD_ENABLED
#define NRF5_SDK15_GPIO_ENABLED APPLICATION_GPIO_ENABLED
#define NRF5_SDK15_GPIO_INTERRUPT_ENABLED APPLICATION_GPIO_INTERRUPT_ENABLED
#define NRF5_SDK15_NRF52832_ENVIRONMENTAL_ENABLED APPLICATION_ENVIRONMENTAL_MCU_ENABLED
#define NRF5_SDK15_LOG_ENABLED APPLICATION_LOG_ENABLED
#define NRF5_SDK15_SPI_ENABLED APPLICATION_SPI_ENABLED
#define NRF5_SDK15_YIELD_ENABLED APPLICATION_YIELD_ENABLED
#define NRF5_SDK15_NRF52832_ENVIRONMENTAL_ENABLED APPLICATION_ENVIRONMENTAL_MCU_ENABLED

#endif

Expand Down
21 changes: 14 additions & 7 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "ruuvi_interface_log.h"
#include "ruuvi_interface_yield.h"
#include "ruuvi_boards.h"
#include "task_acceleration.h"
#include "task_button.h"
#include "task_environmental.h"
#include "task_led.h"
Expand All @@ -36,20 +37,23 @@ int main(void)
status |= task_led_init();
status |= task_led_write(RUUVI_BOARD_LED_RED, TASK_LED_ON);

// Initialize button with led_cycle task
status |= task_button_init(RUUVI_INTERFACE_GPIO_SLOPE_HITOLO, task_environmental_on_button);
RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_SUCCESS);

// Initialize SPI
status |= task_spi_init();
RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_SUCCESS);

// Initialize environmental- nRF52 will return ERROR NOT SUPPORTED if
// DSP was configured, log warning
status |= task_environmental_init();
status = task_environmental_init();
RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_ERROR_NOT_SUPPORTED);

status |= task_led_write(RUUVI_BOARD_LED_RED, TASK_LED_OFF);
status |= task_acceleration_init();
RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_ERROR_NOT_FOUND);

// Initialize button with on_button task
status = task_button_init(RUUVI_INTERFACE_GPIO_SLOPE_HITOLO, task_button_on_press);
RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_SUCCESS);

status = task_led_write(RUUVI_BOARD_LED_RED, TASK_LED_OFF);

// Turn GREEN LED on if BME280 was found
if(RUUVI_DRIVER_SUCCESS == status)
Expand All @@ -59,8 +63,11 @@ int main(void)
ruuvi_platform_delay_ms(1000);
status |= task_led_write(RUUVI_BOARD_LED_GREEN, TASK_LED_OFF);

// Reset status flag
status = RUUVI_DRIVER_SUCCESS;

while (1)
{
ruuvi_platform_yield();
status |= ruuvi_platform_yield();
}
}
2 changes: 1 addition & 1 deletion ruuvi.boards.c
10 changes: 9 additions & 1 deletion targets/ruuvitag_b/armgcc/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ SDK_ROOT := ../../../../nRF5_SDK_15.0.0_a53641a
PROJ_DIR := ../../..

$(OUTPUT_DIRECTORY)/nrf52832_xxaa.out: \
LINKER_SCRIPT := ruuvi_gcc_nrf52.ld
LINKER_SCRIPT := ruuvi.firmware.c.ld

# Source files common to all targets
SRC_FILES += \
Expand Down Expand Up @@ -109,16 +109,21 @@ SRC_FILES += \
$(PROJ_DIR)/ruuvi.drivers.c/ruuvi_driver_sensor.c \
$(PROJ_DIR)/ruuvi.drivers.c/BME280_driver/bme280.c \
$(PROJ_DIR)/ruuvi.drivers.c/BME280_driver/selftest/bme280_selftest.c \
$(PROJ_DIR)/ruuvi.drivers.c/interfaces/acceleration/ruuvi_interface_lis2dh12.c \
$(PROJ_DIR)/ruuvi.drivers.c/interfaces/environmental/ruuvi_interface_bme280.c \
$(PROJ_DIR)/ruuvi.drivers.c/interfaces/log/ruuvi_interface_log.c \
$(PROJ_DIR)/ruuvi.drivers.c/interfaces/spi/ruuvi_interface_spi_bme280.c \
$(PROJ_DIR)/ruuvi.drivers.c/interfaces/spi/ruuvi_interface_spi_lis2dh12.c \
$(PROJ_DIR)/ruuvi.drivers.c/nrf5_sdk15_platform/environmental/ruuvi_platform_environmental_mcu.c \
$(PROJ_DIR)/ruuvi.drivers.c/nrf5_sdk15_platform/gpio/ruuvi_platform_gpio.c \
$(PROJ_DIR)/ruuvi.drivers.c/nrf5_sdk15_platform/gpio/ruuvi_platform_gpio_interrupt.c \
$(PROJ_DIR)/ruuvi.drivers.c/nrf5_sdk15_platform/log/ruuvi_platform_log.c \
$(PROJ_DIR)/ruuvi.drivers.c/nrf5_sdk15_platform/spi/ruuvi_platform_spi.c \
$(PROJ_DIR)/ruuvi.drivers.c/nrf5_sdk15_platform/yield/ruuvi_platform_yield.c \
$(PROJ_DIR)/ruuvi.drivers.c/nrf5_sdk15_platform/ruuvi_platform_error.c \
$(PROJ_DIR)/ruuvi.drivers.c/nrf5_sdk15_platform/ruuvi_platform_error.c \
$(PROJ_DIR)/ruuvi.drivers.c/STMems_Standard_C_drivers/lis2dh12_STdC/driver/lis2dh12_reg.c \
$(PROJ_DIR)/tasks/task_acceleration.c \
$(PROJ_DIR)/tasks/task_button.c \
$(PROJ_DIR)/tasks/task_environmental.c \
$(PROJ_DIR)/tasks/task_led.c \
Expand Down Expand Up @@ -206,12 +211,14 @@ INC_FOLDERS += \
$(PROJ_DIR)/ruuvi.drivers.c/ \
$(PROJ_DIR)/ruuvi.drivers.c/BME280_driver \
$(PROJ_DIR)/ruuvi.drivers.c/BME280_driver/selftest \
$(PROJ_DIR)/ruuvi.drivers.c/interfaces/acceleration \
$(PROJ_DIR)/ruuvi.drivers.c/interfaces/environmental \
$(PROJ_DIR)/ruuvi.drivers.c/interfaces/gpio \
$(PROJ_DIR)/ruuvi.drivers.c/interfaces/log \
$(PROJ_DIR)/ruuvi.drivers.c/interfaces/spi \
$(PROJ_DIR)/ruuvi.drivers.c/interfaces/yield \
$(PROJ_DIR)/ruuvi.drivers.c/nrf5_sdk15_platform \
$(PROJ_DIR)/ruuvi.drivers.c/STMems_Standard_C_drivers/lis2dh12_STdC/driver/ \
$(PROJ_DIR)/tasks/


Expand Down Expand Up @@ -297,6 +304,7 @@ LDFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
LDFLAGS += -Wl,--gc-sections
# use newlib in nano version
LDFLAGS += --specs=nano.specs
LDFLAGS += -u _printf_float

nrf52832_xxaa: CFLAGS += -D__HEAP_SIZE=8192
nrf52832_xxaa: CFLAGS += -D__STACK_SIZE=8192
Expand Down
3 changes: 2 additions & 1 deletion targets/ruuvitag_b/ses/flash_placement.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<ProgramSection alignment="0x100" load="Yes" name=".vectors" start="$(FLASH_START)" />
<ProgramSection alignment="4" load="Yes" name=".init" />
<ProgramSection alignment="4" load="Yes" name=".init_rodata" />
<ProgramSection alignment="4" load="Yes" name=".fini" />
<ProgramSection alignment="4" load="Yes" name=".text" />
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".sdh_soc_observers" inputsections="*(SORT(.sdh_soc_observers*))" address_symbol="__start_sdh_soc_observers" end_symbol="__stop_sdh_soc_observers" />
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".sdh_ble_observers" inputsections="*(SORT(.sdh_ble_observers*))" address_symbol="__start_sdh_ble_observers" end_symbol="__stop_sdh_ble_observers" />
Expand Down Expand Up @@ -50,4 +51,4 @@
<MemorySegment name="uicr_bootloader_start_address" start="0x10001014" size="0x4">
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".uicr_bootloader_start_address" address_symbol="__start_uicr_bootloader_start_address" end_symbol="__stop_uicr_bootloader_start_address" start = "0x10001014" size="0x4" />
</MemorySegment>
</Root>
</Root>
4 changes: 4 additions & 0 deletions targets/ruuvitag_b/ses/ruuvi.firmware.c.emProject
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,10 @@
path="../../../ruuvi.drivers.c/BME280_driver"
recurse="Yes" />
<file file_name="../../../ruuvi.drivers.c/ruuvi_driver_error.h" />
<folder Name="STM_drivers">
<file file_name="../../../ruuvi.drivers.c/STMems_Standard_C_drivers/lis2dh12_STdC/driver/lis2dh12_reg.c" />
<file file_name="../../../ruuvi.drivers.c/STMems_Standard_C_drivers/lis2dh12_STdC/driver/lis2dh12_reg.h" />
</folder>
</folder>
<folder
Name="ruuvi.boards.c"
Expand Down
79 changes: 79 additions & 0 deletions tasks/task_acceleration.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
#include "application_config.h"
#include "ruuvi_boards.h"
#include "ruuvi_driver_error.h"
#include "ruuvi_driver_sensor.h"
#include "ruuvi_interface_acceleration.h"
#include "ruuvi_interface_lis2dh12.h"
#include "ruuvi_interface_log.h"
#include "task_acceleration.h"
#include "task_led.h"

#include <stddef.h>
#include <stdio.h>
#include <inttypes.h>

static ruuvi_driver_sensor_t acceleration_sensor = {0};

static ruuvi_driver_status_t task_acceleration_configure(void)
{
ruuvi_driver_sensor_configuration_t config;
config.samplerate = APPLICATION_ACCELEROMETER_SAMPLERATE;
config.resolution = APPLICATION_ACCELEROMETER_RESOLUTION;
config.scale = APPLICATION_ACCELEROMETER_SCALE;
config.dsp_function = APPLICATION_ACCELEROMETER_DSPFUNC;
config.dsp_parameter = APPLICATION_ACCELEROMETER_DSPPARAM;
config.mode = APPLICATION_ACCELEROMETER_MODE;
if(NULL == acceleration_sensor.data_get) { return RUUVI_DRIVER_ERROR_INVALID_STATE; }
return acceleration_sensor.configuration_set(&acceleration_sensor, &config);
}

ruuvi_driver_status_t task_acceleration_init(void)
{
ruuvi_driver_status_t err_code = RUUVI_DRIVER_SUCCESS;
ruuvi_driver_bus_t bus = RUUVI_DRIVER_BUS_NONE;
uint8_t handle = 0;

#if RUUVI_BOARD_ACCELEROMETER_LIS2DH12_PRESENT
err_code = RUUVI_DRIVER_SUCCESS;
// Only SPI supported for now
bus = RUUVI_DRIVER_BUS_SPI;
handle = RUUVI_BOARD_SPI_SS_ACCELEROMETER_PIN;
err_code |= ruuvi_interface_lis2dh12_init(&acceleration_sensor, bus, handle);
RUUVI_DRIVER_ERROR_CHECK(err_code, RUUVI_DRIVER_ERROR_NOT_FOUND);

if(RUUVI_DRIVER_SUCCESS == err_code)
{
err_code |= task_acceleration_configure();
return err_code;
}
#endif

// Return error if usable environmental sensor was not found.
return RUUVI_DRIVER_ERROR_NOT_FOUND;
}

ruuvi_driver_status_t task_acceleration_data_log(const ruuvi_interface_log_severity_t level)
{
ruuvi_driver_status_t err_code = RUUVI_DRIVER_SUCCESS;
ruuvi_interface_acceleration_data_t data;
if(NULL == acceleration_sensor.data_get) { return RUUVI_DRIVER_ERROR_INVALID_STATE; }

err_code |= acceleration_sensor.data_get(&data);
char message[128] = {0};
snprintf(message, sizeof(message), "Time: %"PRIu64"\r\n", data.timestamp_ms);
ruuvi_platform_log(level, message);
snprintf(message, sizeof(message), "X: %.3f\r\n", data.x_g);
ruuvi_platform_log(level, message);
snprintf(message, sizeof(message), "Y: %.3f\r\n" ,data.y_g);
ruuvi_platform_log(level, message);
snprintf(message, sizeof(message), "Z: %.3f\r\n", data.z_g);
ruuvi_platform_log(level, message);
return err_code;
}

ruuvi_driver_status_t task_acceleration_on_button(void)
{
ruuvi_driver_status_t err_code = RUUVI_DRIVER_SUCCESS;
err_code |= task_acceleration_data_log(RUUVI_INTERFACE_LOG_INFO);
return err_code;
}
36 changes: 36 additions & 0 deletions tasks/task_acceleration.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/**
* Ruuvi Firmware 3.x Acceleration tasks.
*
* License: BSD-3
* Author: Otso Jousimaa <otso@ojousima.net>
**/

#ifndef TASK_ACCELERATION_H
#define TASK_ACCELERATION_H

#include "ruuvi_boards.h"
#include "ruuvi_driver_error.h"
#include "ruuvi_driver_sensor.h"
#include "ruuvi_interface_bme280.h"
#include "ruuvi_interface_environmental.h"
#include "ruuvi_interface_environmental_mcu.h"
#include "ruuvi_interface_log.h"

/**
* Auto-detects and initializes environmental sensor in low-power state
* Reads supported sensors from board.h and tries to initialize them.
* Configures the sensor according to defaults in application_config.h
*/
ruuvi_driver_status_t task_acceleration_init(void);

/**
* Prints environmental data to log at given severity
*/
ruuvi_driver_status_t task_acceleration_data_log(const ruuvi_interface_log_severity_t level);

/**
* Get acceleration data and print it on console.
*/
ruuvi_driver_status_t task_acceleration_on_button(void);

#endif
13 changes: 13 additions & 0 deletions tasks/task_button.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@
#include "ruuvi_boards.h"
#include "ruuvi_interface_gpio.h"
#include "ruuvi_interface_yield.h"
#include "task_acceleration.h"
#include "task_button.h"
#include "task_environmental.h"
#include "task_led.h"
#include <stddef.h>

static task_button_fp_t button_callback = NULL;
Expand All @@ -21,4 +24,14 @@ ruuvi_driver_status_t task_button_init(ruuvi_interface_gpio_slope_t slope, task_
err_code |= ruuvi_platform_gpio_interrupt_init(interrupt_table, sizeof(interrupt_table));
err_code |= ruuvi_platform_gpio_interrupt_enable(RUUVI_BOARD_BUTTON_1, slope, RUUVI_INTERFACE_GPIO_MODE_INPUT_PULLUP, on_button);
return err_code;
}

ruuvi_driver_status_t task_button_on_press(void)
{
ruuvi_driver_status_t err_code = RUUVI_DRIVER_SUCCESS;
err_code |= task_led_write(RUUVI_BOARD_LED_RED, TASK_LED_ON);
err_code |= task_acceleration_on_button();
err_code |= task_environmental_on_button();
err_code |= task_led_write(RUUVI_BOARD_LED_RED, TASK_LED_OFF);
return err_code;
}
11 changes: 9 additions & 2 deletions tasks/task_button.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Ruuvi Firmware 3.x Button tasks.
* Ruuvi Firmware 3.x Button tasks.
*
* License: BSD-3
* Author: Otso Jousimaa <otso@ojousima.net>
Expand All @@ -20,8 +20,15 @@ typedef ruuvi_driver_status_t(*task_button_fp_t)(void);
* parameter slope: slopes to interrupt on. (RUUVI_INTERFACE_GPIO_SLOPE_)HITOLO, LOTOHI or TOGGLE
* parameter action: Function to be called when button interrupt occurs
*
* return: Status code from the stack. RUUVI_DRIVER_SUCCESS if no errors occured.
* return: Status code from the stack. RUUVI_DRIVER_SUCCESS if no errors occured.
**/
ruuvi_driver_status_t task_button_init(ruuvi_interface_gpio_slope_t slope, task_button_fp_t action);

/**
* Calls other Button tasks.
*
* return: Status code from the stack. RUUVI_DRIVER_SUCCESS if no errors occured.
*/
ruuvi_driver_status_t task_button_on_press(void);

#endif
5 changes: 2 additions & 3 deletions tasks/task_environmental.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "task_environmental.h"
#include "task_led.h"

#include <inttypes.h>
#include <stddef.h>
#include <stdio.h>

Expand Down Expand Up @@ -82,7 +83,7 @@ ruuvi_driver_status_t task_environmental_data_log(const ruuvi_interface_log_seve

err_code |= environmental_sensor.data_get(&data);
char message[128] = {0};
snprintf(message, sizeof(message), "Time: %llu\r\n", data.timestamp_ms);
snprintf(message, sizeof(message), "Time: %"PRIu64"\r\n", data.timestamp_ms);
ruuvi_platform_log(level, message);
snprintf(message, sizeof(message), "Temperature: %.2f\r\n", data.temperature_c);
ruuvi_platform_log(level, message);
Expand All @@ -96,8 +97,6 @@ ruuvi_driver_status_t task_environmental_data_log(const ruuvi_interface_log_seve
ruuvi_driver_status_t task_environmental_on_button(void)
{
ruuvi_driver_status_t err_code = RUUVI_DRIVER_SUCCESS;
err_code |= task_led_write(RUUVI_BOARD_LED_RED, TASK_LED_ON);
err_code |= task_environmental_data_log(RUUVI_INTERFACE_LOG_INFO);
err_code |= task_led_write(RUUVI_BOARD_LED_RED, TASK_LED_OFF);
return err_code;
}

0 comments on commit 33aaeae

Please sign in to comment.