trabalho

Dependencies:   X_NUCLEO_IKS01A1 mbed-rtos mbed

Fork of HelloWorld_IKS01A1 by ST

Committer:
Jacinta
Date:
Tue May 10 11:19:21 2016 +0000
Revision:
33:115aa467b4fa
Parent:
31:eb7320bd1d37
.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
stwykd 19:d442ff60498c 1 #include "mbed.h"
stwykd 19:d442ff60498c 2 #include "x_nucleo_iks01a1.h"
stwykd 28:840000670c88 3 #include "mailBox.cpp"
stwykd 19:d442ff60498c 4
stwykd 27:0bbc1d575986 5 using namespace std;
stwykd 27:0bbc1d575986 6
Jacinta 29:f96590e6058d 7
stwykd 19:d442ff60498c 8 /* Instantiate the expansion board */
stwykd 19:d442ff60498c 9 static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15);
stwykd 19:d442ff60498c 10
stwykd 19:d442ff60498c 11 static GyroSensor *gyroscope = mems_expansion_board->GetGyroscope();
stwykd 19:d442ff60498c 12 static MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer();
stwykd 19:d442ff60498c 13 static MagneticSensor *magnetometer = mems_expansion_board->magnetometer;
stwykd 19:d442ff60498c 14 static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor;
stwykd 19:d442ff60498c 15 static PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor;
stwykd 19:d442ff60498c 16 static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor;
stwykd 19:d442ff60498c 17 static TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor;
stwykd 19:d442ff60498c 18
stwykd 25:55c0dc5b32b3 19 static Ticker ticker;
stwykd 25:55c0dc5b32b3 20 void readData();
stwykd 25:55c0dc5b32b3 21
stwykd 23:61e09468bf3d 22 class ExpansionBoard {
Jacinta 29:f96590e6058d 23 public:
Jacinta 29:f96590e6058d 24 float T;
Jacinta 31:eb7320bd1d37 25 int count;
Jacinta 29:f96590e6058d 26
stwykd 25:55c0dc5b32b3 27 private:
stwykd 25:55c0dc5b32b3 28 /* Helper function for printing floats & doubles */
stwykd 25:55c0dc5b32b3 29 static char *printDouble(char* str, double v, int decimalDigits=2) {
stwykd 25:55c0dc5b32b3 30 int i = 1;
stwykd 25:55c0dc5b32b3 31 int intPart, fractPart;
stwykd 25:55c0dc5b32b3 32 int len;
stwykd 25:55c0dc5b32b3 33 char *ptr;
stwykd 25:55c0dc5b32b3 34 /* prepare decimal digits multiplicator */
stwykd 25:55c0dc5b32b3 35 for (; decimalDigits!=0; i*=10, decimalDigits--);
stwykd 25:55c0dc5b32b3 36 /* calculate integer & fractinal parts */
stwykd 25:55c0dc5b32b3 37 intPart = (int)v;
stwykd 25:55c0dc5b32b3 38 fractPart = (int)((v-(double)(int)v)*i);
stwykd 25:55c0dc5b32b3 39 /* fill in integer part */
stwykd 25:55c0dc5b32b3 40 sprintf(str, "%i.", intPart);
stwykd 25:55c0dc5b32b3 41 /* prepare fill in of fractional part */
stwykd 25:55c0dc5b32b3 42 len = strlen(str);
stwykd 25:55c0dc5b32b3 43 ptr = &str[len];
stwykd 25:55c0dc5b32b3 44 /* fill in leading fractional zeros */
stwykd 25:55c0dc5b32b3 45 for (i/=10; i>1; i/=10, ptr++) {
stwykd 25:55c0dc5b32b3 46 if(fractPart >= i) break;
stwykd 25:55c0dc5b32b3 47 *ptr = '0'; }
stwykd 25:55c0dc5b32b3 48 /* fill in (rest of) fractional part */
stwykd 25:55c0dc5b32b3 49 sprintf(ptr, "%i", fractPart);
stwykd 25:55c0dc5b32b3 50 return str;
stwykd 25:55c0dc5b32b3 51 }
stwykd 25:55c0dc5b32b3 52
stwykd 28:840000670c88 53 //This is the producer
stwykd 25:55c0dc5b32b3 54 void readData() {
stwykd 25:55c0dc5b32b3 55 float value1, value2;
stwykd 25:55c0dc5b32b3 56 char buffer1[32], buffer2[32];
stwykd 25:55c0dc5b32b3 57 int32_t axes[3];
stwykd 28:840000670c88 58
Jacinta 33:115aa467b4fa 59 log_data *log_d = (log_data*)mail_box.alloc();
stwykd 28:840000670c88 60 //TODO Too small!?
stwykd 28:840000670c88 61 log_d->id = rand() % 255;
stwykd 28:840000670c88 62
stwykd 28:840000670c88 63 //TODO Out of memory, specs say to delete oldest sample
stwykd 28:840000670c88 64 if (log_d == NULL) return;
stwykd 28:840000670c88 65
stwykd 25:55c0dc5b32b3 66 temp_sensor1->GetTemperature(&value1);
stwykd 25:55c0dc5b32b3 67 humidity_sensor->GetHumidity(&value2);
stwykd 25:55c0dc5b32b3 68 printf("HTS221: [temp] %7s°C, [hum] %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
stwykd 28:840000670c88 69 log_d->tempCelsius = value1;
stwykd 28:840000670c88 70 log_d->humidity = value2;
stwykd 27:0bbc1d575986 71
stwykd 25:55c0dc5b32b3 72 temp_sensor2->GetFahrenheit(&value1);
stwykd 25:55c0dc5b32b3 73 pressure_sensor->GetPressure(&value2);
stwykd 25:55c0dc5b32b3 74 printf("LPS25H: [temp] %7s°F, [press] %smbar\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
stwykd 28:840000670c88 75 log_d->tempFarenheit = value1;
stwykd 28:840000670c88 76 log_d->pressure = value2;
stwykd 25:55c0dc5b32b3 77 printf("---\r\n");
stwykd 25:55c0dc5b32b3 78
stwykd 25:55c0dc5b32b3 79 magnetometer->Get_M_Axes(axes);
stwykd 25:55c0dc5b32b3 80 printf("LIS3MDL [mag/mgauss]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
stwykd 28:840000670c88 81 memcpy(&log_d->magnetometer, &axes, sizeof(axes));
stwykd 27:0bbc1d575986 82
stwykd 25:55c0dc5b32b3 83 accelerometer->Get_X_Axes(axes);
stwykd 25:55c0dc5b32b3 84 printf("LSM6DS0 [acc/mg]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
stwykd 28:840000670c88 85 memcpy(&log_d->accelerometer, &axes, sizeof(axes));
stwykd 27:0bbc1d575986 86
stwykd 25:55c0dc5b32b3 87 gyroscope->Get_G_Axes(axes);
stwykd 25:55c0dc5b32b3 88 printf("LSM6DS0 [gyro/mdps]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
stwykd 28:840000670c88 89 memcpy (&log_d->accelerometer, &axes, sizeof(axes));
stwykd 27:0bbc1d575986 90
stwykd 27:0bbc1d575986 91 //TODO Not sure about this one, maybe use time()
stwykd 28:840000670c88 92 //log_d->date = asctime(localtime());
stwykd 28:840000670c88 93
stwykd 28:840000670c88 94 //Send pointer to the queue
Jacinta 33:115aa467b4fa 95 osStatus *stat = (osStatus*)mail_box.put(log_d);
Jacinta 31:eb7320bd1d37 96 count++;
stwykd 28:840000670c88 97
stwykd 28:840000670c88 98 // Check for resource error
Jacinta 33:115aa467b4fa 99 if (stat == osErrorResource.osStatus) {
stwykd 28:840000670c88 100 printf("mail_box->put() Error %4Xh", stat);
stwykd 28:840000670c88 101 //Error, free up memory block
stwykd 28:840000670c88 102 mail_box.free(log_d);
Jacinta 31:eb7320bd1d37 103 count--;
stwykd 28:840000670c88 104 return;
stwykd 28:840000670c88 105 }
stwykd 25:55c0dc5b32b3 106 }
stwykd 25:55c0dc5b32b3 107
stwykd 25:55c0dc5b32b3 108 public:
Jacinta 31:eb7320bd1d37 109 ExpansionBoard() : count(0) {
stwykd 25:55c0dc5b32b3 110 /* Retrieve the composing elements of the expansion board */
stwykd 19:d442ff60498c 111 uint8_t id;
stwykd 19:d442ff60498c 112 humidity_sensor->ReadID(&id);
stwykd 19:d442ff60498c 113 printf("HTS221 humidity & temperature = 0x%X\r\n", id);
stwykd 19:d442ff60498c 114 pressure_sensor->ReadID(&id);
stwykd 19:d442ff60498c 115 printf("LPS25H pressure & temperature = 0x%X\r\n", id);
stwykd 19:d442ff60498c 116 magnetometer->ReadID(&id);
stwykd 19:d442ff60498c 117 printf("LIS3MDL magnetometer = 0x%X\r\n", id);
stwykd 19:d442ff60498c 118 gyroscope->ReadID(&id);
stwykd 19:d442ff60498c 119 printf("LSM6DS0 accelerometer & gyroscope = 0x%X\r\n", id);
stwykd 19:d442ff60498c 120 }
stwykd 25:55c0dc5b32b3 121 void startSampling() {
stwykd 25:55c0dc5b32b3 122 //TODO For now it just spits out the data
stwykd 25:55c0dc5b32b3 123 //but data must be passed to the FIFO
Jacinta 30:673e342f1932 124 ticker.attach(this, &ExpansionBoard::readData, T);
stwykd 19:d442ff60498c 125 }
stwykd 25:55c0dc5b32b3 126 void stopSampling() { ticker.detach(); }
stwykd 19:d442ff60498c 127 };