118 lines
3 KiB
C
118 lines
3 KiB
C
/* Simple example for I2C / BMP180 / Timer & Event Handling
|
|
*
|
|
* This sample code is in the public domain.
|
|
*/
|
|
#include "espressif/esp_common.h"
|
|
|
|
#include "FreeRTOS.h"
|
|
#include "task.h"
|
|
#include "timers.h"
|
|
#include "queue.h"
|
|
|
|
// BMP180 driver
|
|
#include "bmp180/bmp180.h"
|
|
|
|
#define MY_EVT_TIMER 0x01
|
|
#define MY_EVT_BMP180 0x02
|
|
|
|
#define SCL_PIN GPIO_ID_PIN((0))
|
|
#define SDA_PIN GPIO_ID_PIN((2))
|
|
|
|
typedef struct
|
|
{
|
|
uint8_t event_type;
|
|
bmp180_result_t bmp180_data;
|
|
} my_event_t;
|
|
|
|
// Communication Queue
|
|
static xQueueHandle mainqueue;
|
|
static xTimerHandle timerHandle;
|
|
|
|
// Own BMP180 User Inform Implementation
|
|
bool bmp180_i2c_informUser(const xQueueHandle* resultQueue, uint8_t cmd, bmp180_temp_t temperature, bmp180_press_t pressure)
|
|
{
|
|
my_event_t ev;
|
|
|
|
ev.event_type = MY_EVT_BMP180;
|
|
ev.bmp180_data.cmd = cmd;
|
|
ev.bmp180_data.temperature = temperature;
|
|
ev.bmp180_data.pressure = pressure;
|
|
|
|
return (xQueueSend(*resultQueue, &ev, 0) == pdTRUE);
|
|
}
|
|
|
|
// Timer call back
|
|
static void bmp180_i2c_timer_cb(xTimerHandle xTimer)
|
|
{
|
|
my_event_t ev;
|
|
ev.event_type = MY_EVT_TIMER;
|
|
|
|
xQueueSend(mainqueue, &ev, 0);
|
|
}
|
|
|
|
// Check for communiction events
|
|
void bmp180_task(void *pvParameters)
|
|
{
|
|
// Received pvParameters is communication queue
|
|
xQueueHandle *com_queue = (xQueueHandle *)pvParameters;
|
|
|
|
printf("%s: Started user interface task\n", __FUNCTION__);
|
|
|
|
while(1)
|
|
{
|
|
my_event_t ev;
|
|
|
|
xQueueReceive(*com_queue, &ev, portMAX_DELAY);
|
|
|
|
switch(ev.event_type)
|
|
{
|
|
case MY_EVT_TIMER:
|
|
printf("%s: Received Timer Event\n", __FUNCTION__);
|
|
|
|
bmp180_trigger_measurement(com_queue);
|
|
break;
|
|
case MY_EVT_BMP180:
|
|
printf("%s: Received BMP180 Event temp:=%d.%d°C press=%d.%02dhPa\n", __FUNCTION__, \
|
|
(int32_t)ev.bmp180_data.temperature, abs((int32_t)(ev.bmp180_data.temperature*10)%10), \
|
|
ev.bmp180_data.pressure/100, ev.bmp180_data.pressure%100 );
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void user_init(void)
|
|
{
|
|
// Just some informations
|
|
printf("\n");
|
|
printf("SDK version : %s\n", sdk_system_get_sdk_version());
|
|
printf("GIT version : %s\n", GITSHORTREV);
|
|
|
|
// Use our user inform implementation
|
|
bmp180_informUser = bmp180_i2c_informUser;
|
|
|
|
// Init BMP180 Interface
|
|
bmp180_init(SCL_PIN, SDA_PIN);
|
|
|
|
// Create Main Communication Queue
|
|
mainqueue = xQueueCreate(10, sizeof(my_event_t));
|
|
|
|
// Create user interface task
|
|
xTaskCreate(bmp180_task, (signed char *)"bmp180_task", 256, &mainqueue, 2, NULL);
|
|
|
|
// Create Timer (Trigger a measurement every second)
|
|
timerHandle = xTimerCreate((signed char *)"BMP180 Trigger", 1000/portTICK_RATE_MS, pdTRUE, NULL, bmp180_i2c_timer_cb);
|
|
|
|
if (timerHandle != NULL)
|
|
{
|
|
if (xTimerStart(timerHandle, 0) != pdPASS)
|
|
{
|
|
printf("%s: Unable to start Timer ...\n", __FUNCTION__);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
printf("%s: Unable to create Timer ...\n", __FUNCTION__);
|
|
}
|
|
}
|