this is the library of the code of the second laboration.

Dependencies:   SILABS_RHT mbed MemoryLCD

Revision:
0:33ae04d01fd6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Sep 04 11:39:49 2020 +0000
@@ -0,0 +1,189 @@
+#include "LS013B7DH03.h"
+#include "SILABS_RHT.h"
+#include "mbed_logo_thermo.h"
+#include "Animation.h"
+
+/******************** Define I/O *****************************/
+
+InterruptIn in(SW0);
+
+#define SCK     PE12
+#define MOSI 	PE10
+
+DigitalOut CS(PA10);
+DigitalOut EXTCOM(PF3);
+DigitalOut DISP(PA8);
+
+SPI displaySPI(MOSI, NC, SCK);
+silabs::LS013B7DH03 display(&displaySPI, &CS, &EXTCOM);
+
+I2C sensorI2C(PD6, PD7);
+DigitalOut SENS_EN(PC8);
+silabs::SILABS_RHT rhtSensor(&sensorI2C);
+
+/******************** Define Timers *****************************/
+
+LowPowerTicker timeKeeping;
+
+/***************** Define global variables **********************/
+#define INIT_SECONDS		17600
+#define TEST_DURATION		10
+
+volatile uint32_t prevSeconds = INIT_SECONDS, seconds = INIT_SECONDS;
+volatile bool refreshed = false;
+volatile bool clockShown = false;
+volatile bool measured = false;
+
+typedef enum {
+	CLOCK,
+	DODECA
+} display_mode_t;
+
+volatile display_mode_t currentMode = CLOCK;
+uint8_t currentFrame = 0;
+
+/***************** Define callback handlers *********************/
+void secondsCallback(void);
+void in_handler();
+void toggleCallback(void);
+
+/***************** Define helper functions ***********************/
+void drawTemperature(int32_t temperature);
+
+void drawTemperature(int32_t temperature) {
+    uint32_t line = 20;
+    int8_t int_temp = temperature / 500;
+
+    for(int8_t iterator = 80; iterator > -6; iterator--) {
+        if(int_temp >= iterator) display.fill(108,line,10,1,Black);
+        else display.fill(108,line,10,1,White);
+
+        line += 1;
+    }
+}
+
+/**
+ * Callback for pushbutton interrupt
+ */
+void in_handler() {
+    if(currentMode == CLOCK) {
+    	currentMode = DODECA;
+    } else {
+    	currentMode = CLOCK;
+    	clockShown = false;
+    }
+}
+
+void secondsCallback(void) {
+	seconds++;
+}
+
+/**
+ * Callback for refresh completion
+ */
+void refreshCallback(void) {
+	refreshed = true;
+}
+
+/**
+ * Callback for measurement completion
+ */
+void measureCallback(void) {
+	if(rhtSensor.get_active()) {
+		measured = true;
+	}
+}
+
+/*************************** MAIN *******************************/
+int main() {
+	// Initialize pushbutton handler
+	in.rise(NULL);
+	in.fall(in_handler);
+
+    // Enable the LCD
+	DISP = 1;
+
+	// Enable the I2C RHT sensor
+	SENS_EN = 1;
+
+	// Start generating the 1Hz call for the timekeeping
+	timeKeeping.attach(&secondsCallback, 1.0f);
+
+	// Reset the LCD to a blank state. (All white)
+	refreshed = false;
+	display.clearImmediate(refreshCallback);
+	while(refreshed == false) sleep();
+
+	printf("Initialization done! \n");
+
+	// Apply mbed logo bitmap to the pixel buffer
+	display.showBMP((uint8_t*)mbed_logo_thermometer, 128, 128, 0, 0);
+	display.background(Black);
+	display.foreground(White);
+	display.printf("I like MBED!");
+
+	// Push update to the display
+	uint32_t refreshCount = display.getRefreshTicks();
+	refreshed = false;
+	display.update(refreshCallback);
+
+	// Sleep while doing the transmit
+	while(refreshed == false) sleep();
+
+	// Calculate and print refresh duration
+	refreshCount = display.getRefreshTicks() - refreshCount;
+	printf("Refresh duration: %d cycles @ 125Hz \n", (int)refreshCount);
+
+	// Perform a measurement
+	rhtSensor.check_availability(si7021, measureCallback);
+	while(measured == false);
+
+	/* Main loop */
+	while(1) {
+		sleep();
+
+		// In clock mode, only update once per second
+		if((currentMode == CLOCK) && (prevSeconds != seconds)) {
+			/* Redraw background when coming from video mode */
+		    if(clockShown == false) {
+				display.showBMP((uint8_t*)mbed_logo_thermometer, 128, 128, 0, 0);
+				clockShown = true;
+			}
+
+			/* Show numeric measurements */
+			display.locate(0,13);
+			display.printf("%02d.%01d degC", rhtSensor.get_temperature() / 1000, (rhtSensor.get_temperature() % 1000) / 100);
+			display.locate(0,14);
+			display.printf("%03d.%03d%%H", rhtSensor.get_humidity() / 1000, rhtSensor.get_humidity() % 1000);
+
+			/* Show clock */
+			display.locate(4,15);
+			display.printf("%02d:%02d:%02d", (seconds / 1200) % 24, (seconds / 60) % 60, seconds % 60);
+
+			/* Update the graphical thermometer */
+			drawTemperature(rhtSensor.get_temperature());
+
+			if(refreshed == true) {
+				prevSeconds = seconds;
+				refreshed = false;
+
+				/* Perform both I/O tasks simultaneously */
+				display.update(refreshCallback);
+				rhtSensor.measure(si7021);
+			}
+		}
+		// In dodecaeder mode, show frames as fast as possible
+		else if(currentMode == DODECA) {
+			if(refreshed == true) {
+				display.showBMP((uint8_t*)(frames[currentFrame]->pData), 128, 128, 0, 0);
+				currentFrame++;
+				if( currentFrame >= NUM_FRAMES ) currentFrame = 0;
+				refreshed = false;
+				display.update(refreshCallback);
+			}
+		}
+	}
+
+	//notify_completion(true);
+}
+