From e9f249bc21d5f5711464a53d0183f97a2e601180 Mon Sep 17 00:00:00 2001 From: Rocco Marco Guglielmi Date: Tue, 27 Feb 2018 20:41:45 +0000 Subject: Improved LSM303DLHC driver. Modified base demo git-svn-id: https://svn.code.sf.net/p/chibios/svn2/trunk@11589 110e8d01-0319-4d1e-a829-52ad28d1bb01 --- testex/STM32/STM32F3xx/I2C-LSM303DLHC/main.c | 277 ++++----------------------- 1 file changed, 35 insertions(+), 242 deletions(-) (limited to 'testex/STM32/STM32F3xx/I2C-LSM303DLHC/main.c') diff --git a/testex/STM32/STM32F3xx/I2C-LSM303DLHC/main.c b/testex/STM32/STM32F3xx/I2C-LSM303DLHC/main.c index 19aa840b1..b60e5b6a4 100644 --- a/testex/STM32/STM32F3xx/I2C-LSM303DLHC/main.c +++ b/testex/STM32/STM32F3xx/I2C-LSM303DLHC/main.c @@ -17,13 +17,11 @@ #include "ch.h" #include "hal.h" -#include "usbcfg.h" -#include "string.h" -#include "shell.h" #include "chprintf.h" #include "lsm303dlhc.h" +#define cls(chp) chprintf(chp, "\033[2J\033[1;1H") /*===========================================================================*/ /* LSM303DLHC related. */ @@ -32,10 +30,11 @@ /* LSM303DLHC Driver: This object represent an LSM303DLHC instance */ static LSM303DLHCDriver LSM303DLHCD1; -static int32_t rawdata[LSM303DLHC_ACC_NUMBER_OF_AXES + - LSM303DLHC_COMP_NUMBER_OF_AXES]; -static float cookeddata[LSM303DLHC_ACC_NUMBER_OF_AXES + - LSM303DLHC_COMP_NUMBER_OF_AXES]; +static int32_t accraw[LSM303DLHC_ACC_NUMBER_OF_AXES]; +static int32_t compraw[LSM303DLHC_COMP_NUMBER_OF_AXES]; + +static float acccooked[LSM303DLHC_ACC_NUMBER_OF_AXES]; +static float compcooked[LSM303DLHC_COMP_NUMBER_OF_AXES]; static char axisID[LSM303DLHC_ACC_NUMBER_OF_AXES] = {'X', 'Y', 'Z'}; static uint32_t i; @@ -78,214 +77,11 @@ static const LSM303DLHCConfig lsm303dlhccfg = { &lsm303dlhccompcfg }; -/*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -/* - * DP resistor control is not possible on the STM32F3-Discovery, using stubs - * for the connection macros. - */ -#define usb_lld_connect_bus(usbp) -#define usb_lld_disconnect_bus(usbp) - -/* Enable use of special ANSI escape sequences */ -#define CHPRINTF_USE_ANSI_CODE TRUE -#define SHELL_WA_SIZE THD_WORKING_AREA_SIZE(2048) - -static void cmd_read(BaseSequentialStream *chp, int argc, char *argv[]) { - (void)argv; - if (argc != 2) { - chprintf(chp, "Usage: read [acc|comp|both] [raw|cooked]\r\n"); - return; - } - - while (chnGetTimeout((BaseChannel *)chp, 150) == Q_TIMEOUT) { - if (!strcmp (argv[0], "acc")) { - if (!strcmp (argv[1], "raw")) { -#if CHPRINTF_USE_ANSI_CODE - chprintf(chp, "\033[2J\033[1;1H"); -#endif - accelerometerReadRaw(&LSM303DLHCD1, rawdata); - chprintf(chp, "LSM303DLHC Accelerometer raw data...\r\n"); - for(i = 0; i < LSM303DLHC_ACC_NUMBER_OF_AXES; i++) { - chprintf(chp, "%c-axis: %d\r\n", axisID[i], rawdata[i]); - } - } - else if (!strcmp (argv[1], "cooked")) { -#if CHPRINTF_USE_ANSI_CODE - chprintf(chp, "\033[2J\033[1;1H"); -#endif - accelerometerReadCooked(&LSM303DLHCD1, cookeddata); - chprintf(chp, "LSM303DLHC Accelerometer cooked data...\r\n"); - for(i = 0; i < LSM303DLHC_ACC_NUMBER_OF_AXES; i++) { - chprintf(chp, "%c-axis: %.4f mG\r\n", axisID[i], cookeddata[i]); - } - } - else { - chprintf(chp, "Usage: read [acc|comp|both] [raw|cooked]\r\n"); - return; - } - } - else if (!strcmp (argv[0], "comp")) { - if (!strcmp (argv[1], "raw")) { -#if CHPRINTF_USE_ANSI_CODE - chprintf(chp, "\033[2J\033[1;1H"); -#endif - compassReadRaw(&LSM303DLHCD1, rawdata); - chprintf(chp, "LSM303DLHC Compass raw data...\r\n"); - for(i = 0; i < LSM303DLHC_COMP_NUMBER_OF_AXES; i++) { - chprintf(chp, "%c-axis: %d\r\n", axisID[i], rawdata[i]); - } - } - else if (!strcmp (argv[1], "cooked")) { -#if CHPRINTF_USE_ANSI_CODE - chprintf(chp, "\033[2J\033[1;1H"); -#endif - compassReadCooked(&LSM303DLHCD1, cookeddata); - chprintf(chp, "LSM303DLHC Compass cooked data...\r\n"); - for(i = 0; i < LSM303DLHC_COMP_NUMBER_OF_AXES; i++) { - chprintf(chp, "%c-axis: %.4f Gauss\r\n", axisID[i], cookeddata[i]); - } - } - else { - chprintf(chp, "Usage: read [acc|comp|both] [raw|cooked]\r\n"); - return; - } - } - else if (!strcmp (argv[0], "both")) { - if (!strcmp (argv[1], "raw")) { -#if CHPRINTF_USE_ANSI_CODE - chprintf(chp, "\033[2J\033[1;1H"); -#endif - sensorReadRaw(&LSM303DLHCD1, rawdata); - chprintf(chp, "LSM303DLHC Accelerometer raw data...\r\n"); - for(i = 0; i < LSM303DLHC_ACC_NUMBER_OF_AXES; i++) { - chprintf(chp, "%c-axis: %d\r\n", axisID[i], rawdata[i]); - } - chprintf(chp, "LSM303DLHC Compass raw data...\r\n"); - for(i = 0; i < LSM303DLHC_COMP_NUMBER_OF_AXES; i++) { - chprintf(chp, "%c-axis: %d\r\n", axisID[i], - rawdata[i + LSM303DLHC_ACC_NUMBER_OF_AXES]); - } - } - else if (!strcmp (argv[1], "cooked")) { -#if CHPRINTF_USE_ANSI_CODE - chprintf(chp, "\033[2J\033[1;1H"); -#endif - sensorReadCooked(&LSM303DLHCD1, cookeddata); - chprintf(chp, "LSM303DLHC Accelerometer cooked data...\r\n"); - for(i = 0; i < LSM303DLHC_ACC_NUMBER_OF_AXES; i++) { - chprintf(chp, "%c-axis: %.4f mG\r\n", axisID[i], cookeddata[i]); - } - chprintf(chp, "LSM303DLHC Compass cooked data...\r\n"); - for(i = 0; i < LSM303DLHC_COMP_NUMBER_OF_AXES; i++) { - chprintf(chp, "%c-axis: %.4f Gauss\r\n", axisID[i], - cookeddata[i + LSM303DLHC_ACC_NUMBER_OF_AXES]); - } - } - else { - chprintf(chp, "Usage: read [acc|comp|both] [raw|cooked]\r\n"); - return; - } - } - else { - chprintf(chp, "Usage: read [acc|comp|both] [raw|cooked]\r\n"); - return; - } - } - chprintf(chp, "Stopped\r\n"); -} - -static void cmd_fullscale(BaseSequentialStream *chp, int argc, char *argv[]) { - (void)argv; - if (argc < 1) { - chprintf(chp, "Usage: fullscale [acc|comp] [value]\r\n"); - return; - } - if (!strcmp (argv[0], "acc")) { -#if CHPRINTF_USE_ANSI_CODE - chprintf(chp, "\033[2J\033[1;1H"); -#endif - if(!strcmp (argv[1], "2G")) { - accelerometerSetFullScale(&LSM303DLHCD1, LSM303DLHC_ACC_FS_2G); - chprintf(chp, "LSM303DLHC Accelerometer full scale set to 2G...\r\n"); - } - else if(!strcmp (argv[1], "4G")) { - accelerometerSetFullScale(&LSM303DLHCD1, LSM303DLHC_ACC_FS_4G); - chprintf(chp, "LSM303DLHC Accelerometer full scale set to 4G...\r\n"); - } - else if(!strcmp (argv[1], "8G")) { - accelerometerSetFullScale(&LSM303DLHCD1, LSM303DLHC_ACC_FS_8G); - chprintf(chp, "LSM303DLHC Accelerometer full scale set to 8G...\r\n"); - } - else if(!strcmp (argv[1], "16G")) { - accelerometerSetFullScale(&LSM303DLHCD1, LSM303DLHC_ACC_FS_16G); - chprintf(chp, "LSM303DLHC Accelerometer full scale set to 16G...\r\n"); - } - else { - chprintf(chp, "Usage: fullscale acc [2G|4G|8G|16G]\r\n"); - return; - } - } - else if (!strcmp (argv[0], "comp")) { -#if CHPRINTF_USE_ANSI_CODE - chprintf(chp, "\033[2J\033[1;1H"); -#endif - if(!strcmp (argv[1], "1.3")) { - compassSetFullScale(&LSM303DLHCD1, LSM303DLHC_COMP_FS_1P3GA); - chprintf(chp, "LSM303DLHC Compass full scale set to 1.3 Gauss...\r\n"); - } - else if(!strcmp (argv[1], "1.9")) { - compassSetFullScale(&LSM303DLHCD1, LSM303DLHC_COMP_FS_1P9GA); - chprintf(chp, "LSM303DLHC Compass full scale set to 1.9 Gauss...\r\n"); - } - else if(!strcmp (argv[1], "2.5")) { - compassSetFullScale(&LSM303DLHCD1, LSM303DLHC_COMP_FS_2P5GA); - chprintf(chp, "LSM303DLHC Compass full scale set to 2.5 Gauss...\r\n"); - } - else if(!strcmp (argv[1], "4.0")) { - compassSetFullScale(&LSM303DLHCD1, LSM303DLHC_COMP_FS_4P0GA); - chprintf(chp, "LSM303DLHC Compass full scale set to 4.0 Gauss...\r\n"); - } - else if(!strcmp (argv[1], "4.7")) { - compassSetFullScale(&LSM303DLHCD1, LSM303DLHC_COMP_FS_4P7GA); - chprintf(chp, "LSM303DLHC Compass full scale set to 4.7 Gauss...\r\n"); - } - else if(!strcmp (argv[1], "5.6")) { - compassSetFullScale(&LSM303DLHCD1, LSM303DLHC_COMP_FS_5P6GA); - chprintf(chp, "LSM303DLHC Compass full scale set to 5.6 Gauss...\r\n"); - } - else if(!strcmp (argv[1], "8.1")) { - compassSetFullScale(&LSM303DLHCD1, LSM303DLHC_COMP_FS_8P1GA); - chprintf(chp, "LSM303DLHC Compass full scale set to 8.1 Gauss...\r\n"); - } - else { - chprintf(chp, "Usage: fullscale comp [1.3|1.9|2.5|4.0|4.7|5.6|8.1]\r\n"); - return; - } - } - else { - chprintf(chp, "Usage: fullscale [acc|comp] [value]\r\n"); - return; - } -} - -static const ShellCommand commands[] = { - {"read", cmd_read}, - {"fullscale", cmd_fullscale}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SDU1, - commands -}; - /*===========================================================================*/ /* Generic code. */ /*===========================================================================*/ +static BaseSequentialStream* chp = (BaseSequentialStream*)&SD1; /* * Red LED blinker thread, times are in milliseconds. */ @@ -295,13 +91,8 @@ static THD_FUNCTION(Thread1, arg) { (void)arg; chRegSetThreadName("blinker"); while (true) { - systime_t time; - - time = serusbcfg.usbp->state == USB_ACTIVE ? 250 : 500; - palClearLine(LINE_LED3_RED); - chThdSleepMilliseconds(time); - palSetLine(LINE_LED3_RED); - chThdSleepMilliseconds(time); + palToggleLine(LINE_LED3_RED); + chThdSleepMilliseconds(250); } } @@ -321,25 +112,9 @@ int main(void) { chSysInit(); /* - * Initializes a serial-over-USB CDC driver. - */ - sduObjectInit(&SDU1); - sduStart(&SDU1, &serusbcfg); - - /* - * Activates the USB driver and then the USB bus pull-up on D+. - * Note, a delay is inserted in order to not have to disconnect the cable - * after a reset. - */ - usbDisconnectBus(serusbcfg.usbp); - chThdSleepMilliseconds(1500); - usbStart(serusbcfg.usbp, &usbcfg); - usbConnectBus(serusbcfg.usbp); - - /* - * Shell manager initialization. + * Activates the serial driver 1 using the driver default configuration. */ - shellInit(); + sdStart(&SD1, NULL); /* * Creates the blinker thread. @@ -360,13 +135,31 @@ int main(void) { * Normal main() thread activity, spawning shells. */ while (true) { - if (SDU1.config->usbp->state == USB_ACTIVE) { - thread_t *shelltp = chThdCreateFromHeap(NULL, SHELL_WA_SIZE, - "shell", NORMALPRIO + 1, - shellThread, (void *)&shell_cfg1); - chThdWait(shelltp); /* Waiting termination. */ + accelerometerReadRaw(&(LSM303DLHCD1.accelerometer_if), accraw); + chprintf(chp, "LSM303DLHC Accelerometer raw data...\r\n"); + for(i = 0; i < LSM303DLHC_ACC_NUMBER_OF_AXES; i++) { + chprintf(chp, "%c-axis: %d\r\n", axisID[i], accraw[i]); + } + + compassReadRaw(&(LSM303DLHCD1.compass_if), compraw); + chprintf(chp, "LSM303DLHC Compass raw data...\r\n"); + for(i = 0; i < LSM303DLHC_COMP_NUMBER_OF_AXES; i++) { + chprintf(chp, "%c-axis: %d\r\n", axisID[i], compraw[i]); + } + + accelerometerReadCooked(&(LSM303DLHCD1.accelerometer_if), acccooked); + chprintf(chp, "LSM303DLHC Accelerometer cooked data...\r\n"); + for(i = 0; i < LSM303DLHC_ACC_NUMBER_OF_AXES; i++) { + chprintf(chp, "%c-axis: %.3f\r\n", axisID[i], acccooked[i]); + } + + compassReadCooked(&(LSM303DLHCD1.compass_if), compcooked); + chprintf(chp, "LSM303DLHC Compass cooked data...\r\n"); + for(i = 0; i < LSM303DLHC_COMP_NUMBER_OF_AXES; i++) { + chprintf(chp, "%c-axis: %.3f\r\n", axisID[i], compcooked[i]); } - chThdSleepMilliseconds(1000); + chThdSleepMilliseconds(100); + cls(chp); } lsm303dlhcStop(&LSM303DLHCD1); } -- cgit v1.2.3