Skip to content

Commit

Permalink
Added persistent storage
Browse files Browse the repository at this point in the history
  • Loading branch information
atc1441 authored Oct 25, 2021
1 parent 7e38fca commit d31032e
Show file tree
Hide file tree
Showing 8 changed files with 154 additions and 81 deletions.
32 changes: 11 additions & 21 deletions ATC_Thermometer/app.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,7 @@ RAM uint16_t battery_mv;
RAM bool show_batt_or_humi;

//Settings
RAM bool temp_C_or_F;
RAM bool blinking_smiley = false;
RAM bool comfort_smiley = true;
RAM bool show_batt_enabled = true;
RAM bool advertising_type = false;//Custom or Mi Advertising (true)
RAM uint8_t advertising_interval = 6;//advise new values - multiply by 10 for value
RAM uint8_t measure_interval = 10;//time = loop interval * factor (def: about 7 * X)
RAM int8_t temp_offset;
RAM int8_t humi_offset;
RAM uint8_t temp_alarm_point = 5;//divide by ten for value
RAM uint8_t humi_alarm_point = 5;
extern settings_struct settings;

RAM int16_t comfort_x[] = {2000, 2560, 2700, 2500, 2050, 1700, 1600, 1750};
RAM uint16_t comfort_y[] = {2000, 1980, 3200, 6000, 8200, 8600, 7700, 3800};
Expand Down Expand Up @@ -83,29 +73,29 @@ void main_loop(){
last_battery_delay = clock_time();
}

if(meas_count >= measure_interval){
if(meas_count >= settings.measure_interval){
read_sensor(&temp,&humi);
temp += temp_offset;
humi += humi_offset;
temp += settings.temp_offset;
humi += settings.humi_offset;
meas_count=0;

if((temp-last_temp > temp_alarm_point)||(last_temp-temp > temp_alarm_point)||(humi-last_humi > humi_alarm_point)||(last_humi-humi > humi_alarm_point)){// instant advertise on to much sensor difference
if((temp-last_temp > settings.temp_alarm_point)||(last_temp-temp > settings.temp_alarm_point)||(humi-last_humi > settings.humi_alarm_point)||(last_humi-humi > settings.humi_alarm_point)){// instant advertise on to much sensor difference
set_adv_data(temp, humi, battery_level, battery_mv);
}
last_temp = temp;
last_humi = humi;
}
meas_count++;

if(temp_C_or_F){
if(settings.temp_C_or_F){
show_temp_symbol(2);
show_big_number(((((last_temp*10)/5)*9)+3200)/10,1);//convert C to F
}else{
show_temp_symbol(1);
show_big_number(last_temp,1);
}

if(!show_batt_enabled) show_batt_or_humi = true;
if(!settings.show_batt_enabled) show_batt_or_humi = true;

if(show_batt_or_humi){//Change between Humidity displaying and battery level if show_batt_enabled=true
show_small_number(last_humi,1);
Expand All @@ -123,24 +113,24 @@ void main_loop(){
ble_send_battery(battery_level);
}

if((clock_time() - last_adv_delay) > (advertising_type?5000:10000)*CLOCK_SYS_CLOCK_1MS){//Advetise data delay
if(adv_count >= advertising_interval){
if((clock_time() - last_adv_delay) > (settings.advertising_type?5000:10000)*CLOCK_SYS_CLOCK_1MS){//Advetise data delay
if(adv_count >= settings.advertising_interval){
set_adv_data(last_temp, last_humi, battery_level, battery_mv);
last_adv_delay = clock_time();
adv_count=0;
}
adv_count++;
}

if(comfort_smiley) {
if(settings.comfort_smiley) {
if(is_comfort(last_temp * 10, last_humi * 100)){
show_smiley(1);
} else {
show_smiley(2);
}
}

if(blinking_smiley){//If Smiley should blink do it
if(settings.blinking_smiley){//If Smiley should blink do it
last_smiley=!last_smiley;
show_smiley(last_smiley);
}
Expand Down
5 changes: 3 additions & 2 deletions ATC_Thermometer/ble.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "ble.h"
#include "cmd_parser.h"
#include "lcd.h"
#include "flash.h"

RAM uint8_t ble_connected = 0;

Expand Down Expand Up @@ -174,9 +175,9 @@ bool ble_get_connected(){
return ble_connected;
}

extern bool advertising_type;//Custom or Mi Advertising
extern settings_struct settings;//Custom or Mi Advertising
void set_adv_data(int16_t temp, uint16_t humi, uint8_t battery_level, uint16_t battery_mv){
if(advertising_type){//Mi Like Advertising
if(settings.advertising_type){//Mi Like Advertising
humi = humi * 10;

advertising_data_Mi[8]++;
Expand Down
69 changes: 34 additions & 35 deletions ATC_Thermometer/cmd_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,65 +4,64 @@
#include "vendor/common/blt_common.h"

#include "lcd.h"
#include "flash.h"

extern settings_struct settings;

extern bool advertising_type;
extern bool temp_C_or_F;
extern bool blinking_smiley;
extern bool comfort_smiley;
extern bool show_batt_enabled;
extern uint8_t advertising_interval;
extern int8_t temp_offset;
extern int8_t humi_offset;
extern uint8_t temp_alarm_point;
extern uint8_t humi_alarm_point;
void cmd_parser(void * p){
rf_packet_att_data_t *req = (rf_packet_att_data_t*)p;
uint8_t inData = req->dat[0];
if(inData == 0xFF){
temp_C_or_F = true;//Temp in F
settings.temp_C_or_F = true;//Temp in F
}else if(inData == 0xCC){
temp_C_or_F = false;//Temp in C
settings.temp_C_or_F = false;//Temp in C
}else if(inData == 0xB1){
show_batt_enabled = true;//Enable battery on LCD
settings.show_batt_enabled = true;//Enable battery on LCD
}else if(inData == 0xB0){
show_batt_enabled = false;//Disable battery on LCD
settings.show_batt_enabled = false;//Disable battery on LCD
}else if(inData == 0xA0){
blinking_smiley = false;
comfort_smiley = false;
settings.blinking_smiley = false;
settings.comfort_smiley = false;
show_smiley(0);//Smiley off
}else if(inData == 0xA1){
blinking_smiley = false;
comfort_smiley = false;
settings.blinking_smiley = false;
settings.comfort_smiley = false;
show_smiley(1);//Smiley happy
}else if(inData == 0xA2){
blinking_smiley = false;
comfort_smiley = false;
settings.blinking_smiley = false;
settings.comfort_smiley = false;
show_smiley(2);//Smiley sad
}else if(inData == 0xA3){
blinking_smiley = false;
comfort_smiley = true; // Comfort Indicator
settings.blinking_smiley = false;
settings.comfort_smiley = true; // Comfort Indicator
}else if(inData == 0xAB){
blinking_smiley = true;//Smiley blinking
settings.blinking_smiley = true;//Smiley blinking
}else if(inData == 0xAE){
advertising_type = false;//Advertising type Custom
settings.advertising_type = false;//Advertising type Custom
}else if(inData == 0xAF){
advertising_type = true;//Advertising type Mi Like
settings.advertising_type = true;//Advertising type Mi Like
}else if(inData == 0xFE){
advertising_interval = req->dat[1];//Set advertising interval with second byte, value*10second / 0=main_delay
settings.advertising_interval = req->dat[1];//Set advertising interval with second byte, value*10second / 0=main_delay
}else if(inData == 0xFA){
temp_offset = req->dat[1];//Set temp offset, -12,5 - +12,5 °C
settings.temp_offset = req->dat[1];//Set temp offset, -12,5 - +12,5 °C
}else if(inData == 0xFB){
humi_offset = req->dat[1];//Set humi offset, -50 - +50 %
if(humi_offset<-50)humi_offset=-50;
if(humi_offset>50)humi_offset=50;
settings.humi_offset = req->dat[1];//Set humi offset, -50 - +50 %
if(settings.humi_offset<-50)settings.humi_offset=-50;
if(settings.humi_offset>50)settings.humi_offset=50;
}else if(inData == 0xFC){
temp_alarm_point = req->dat[1];//Set temp alarm point value divided by 10 for temp in °C
if(temp_alarm_point==0)temp_alarm_point = 1;
settings.temp_alarm_point = req->dat[1];//Set temp alarm point value divided by 10 for temp in °C
if(settings.temp_alarm_point==0)settings.temp_alarm_point = 1;
}else if(inData == 0xFD){
humi_alarm_point = req->dat[1];//Set humi alarm point
if(humi_alarm_point==0)humi_alarm_point = 1;
if(humi_alarm_point>50)humi_alarm_point = 50;
settings.humi_alarm_point = req->dat[1];//Set humi alarm point
if(settings.humi_alarm_point==0)settings.humi_alarm_point = 1;
if(settings.humi_alarm_point>50)settings.humi_alarm_point = 50;
}else if(inData == 0xDD){// Set display segments directly
send_to_lcd(req->dat[1],req->dat[2],req->dat[3],req->dat[4],req->dat[5],req->dat[6]);
}else if(inData == 0xDE){// Save settings in flash to default
reset_settings_to_default();
save_settings_to_flash();
}else if(inData == 0xDF){// Save current settings in flash
save_settings_to_flash();
show_sto();
}
}
61 changes: 56 additions & 5 deletions ATC_Thermometer/flash.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,63 @@

#include "flash.h"

#define MAGIC_WORD 0xABCFF123

RAM settings_struct settings;

void erase_mi_data(){
uint8_t read=0x00;//ERASE THE MI ID to prevent blocking :D
flash_write_page(0x78000, 1, read);
if(read != 0xff)
flash_erase_sector(0x78000);
uint8_t read[0x100];//ERASE THE MI ID to prevent blocking :D
memset(read,0x00,0x100);
flash_read_page(0x78000, 0x100, read);
if((read[0] != 0xff) && (read[1] != 0xff) && (read[2] != 0xff) && (read[3] != 0xff) && (read[4] != 0xff))
flash_erase_sector(0x78000);
}
void init_flash(){

void init_flash(){
erase_mi_data();

flash_read_page(0x78100,sizeof(settings),(uint8_t*)&settings);

if((settings.magic != MAGIC_WORD) | (settings.crc != get_crc()) | (settings.len != sizeof(settings)))
{
reset_settings_to_default();
save_settings_to_flash();
}

}

void reset_settings_to_default()
{
settings.magic = MAGIC_WORD;
settings.len = sizeof(settings_struct);

settings.temp_C_or_F = false;
settings.blinking_smiley = false;
settings.comfort_smiley = true;
settings.show_batt_enabled = true;
settings.advertising_type = false;
settings.advertising_interval = 6;
settings.measure_interval = 10;
settings.temp_offset = 0;
settings.humi_offset = 0;
settings.temp_alarm_point = 5;
settings.humi_alarm_point = 5;
}

void save_settings_to_flash()
{
settings.crc = get_crc();
flash_erase_sector(0x78100);
flash_write_page(0x78100,sizeof(settings_struct),(uint8_t*)&settings);
}

uint8_t get_crc()
{
uint8_t temp_crc = 0x00;

for(int i=0; i<sizeof(settings_struct)-1;i++)//Iterate over everything expect the last value as it is CRC itself
{
temp_crc = temp_crc ^ ((uint8_t *)&settings)[i];
}
return temp_crc;
}
23 changes: 23 additions & 0 deletions ATC_Thermometer/flash.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,26 @@
#pragma once

struct Settings_struct
{
uint32_t magic;
uint32_t len;
uint8_t temp_C_or_F;
uint8_t blinking_smiley;
uint8_t comfort_smiley;
uint8_t show_batt_enabled;
uint8_t advertising_type;//Custom or Mi Advertising (true)
uint8_t advertising_interval;//advise new values - multiply by 10 for value
uint8_t measure_interval;//time = loop interval * factor (def: about 7 * X)
int8_t temp_offset;
int8_t humi_offset;
uint8_t temp_alarm_point;//divide by ten for value
uint8_t humi_alarm_point;
uint8_t crc;// Needs to be at the last position otherwise the settings can not be validated on next boot!!!!
};

typedef struct Settings_struct settings_struct;

void init_flash();
void reset_settings_to_default();
void save_settings_to_flash();
uint8_t get_crc();
32 changes: 19 additions & 13 deletions ATC_Thermometer/lcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
#include "i2c.h"
#include "lcd.h"

#define pm_wait_ms(t) cpu_stall_wakeup_by_timer0(t*CLOCK_SYS_CLOCK_1MS);

const uint8_t lcd_init_cmd[] = {0x80,0x3B,0x80,0x02,0x80,0x0F,0x80,0x95,0x80,0x88,0x80,0x88,0x80,0x88,0x80,0x88,0x80,0x19,0x80,0x28,0x80,0xE3,0x80,0x11};
RAM uint8_t display_buff[6];
const uint8_t display_numbers[16] = {0xF5,0x05,0xD3,0x97,0x27,0xb6,0xf6,0x15,0xf7,0xb7,0x77,0xe6,0xf0,0xc7,0xf2,0x72};
Expand Down Expand Up @@ -41,19 +43,19 @@ void init_lcd(){
init_lcd_deepsleep();

}else if(lcd_version == 2){// B1.9 Hardware
send_i2c(i2c_address_lcd,0xEA, 1);
send_i2c(i2c_address_lcd,(uint8_t *)0xEA, 1);
sleep_us(240);
send_i2c(i2c_address_lcd, 0xA4, 1);
send_i2c(i2c_address_lcd, 0x9c, 1);
send_i2c(i2c_address_lcd, 0xac, 1);
send_i2c(i2c_address_lcd, 0xbc, 1);
send_i2c(i2c_address_lcd, 0xf0, 1);
send_i2c(i2c_address_lcd, 0xfc, 1);
send_i2c(i2c_address_lcd, (uint8_t *)0xA4, 1);
send_i2c(i2c_address_lcd, (uint8_t *)0x9c, 1);
send_i2c(i2c_address_lcd, (uint8_t *)0xac, 1);
send_i2c(i2c_address_lcd, (uint8_t *)0xbc, 1);
send_i2c(i2c_address_lcd, (uint8_t *)0xf0, 1);
send_i2c(i2c_address_lcd, (uint8_t *)0xfc, 1);

uint8_t lcd_3E_init_segments[] = {0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
send_i2c(i2c_address_lcd,lcd_3E_init_segments, sizeof(lcd_3E_init_segments));

send_i2c(i2c_address_lcd, 0xc8, 1);
send_i2c(i2c_address_lcd, (uint8_t *)0xc8, 1);
return;
}
send_to_lcd_long(0x00,0x00,0x00,0x00,0x00,0x00);
Expand Down Expand Up @@ -154,18 +156,22 @@ void show_atc(){
send_to_lcd(0x00,0x00,0x05,0xc2,0xe2,0x77);
}

void show_sto(){
send_to_lcd(0x00,0x00,0x00,0xc6,0xe2,0xb6);
}

void show_atc_mac(){
extern u8 mac_public[6];
send_to_lcd(display_numbers[mac_public[2] &0x0f],display_numbers[mac_public[2]>>4],0x05,0xc2,0xe2,0x77);
sleep_ms(1800);
pm_wait_ms(1800);
send_to_lcd(0x00,0x00,0x05,0xc2,0xe2,0x77);
sleep_ms(200);
pm_wait_ms(200);
send_to_lcd(display_numbers[mac_public[1] &0x0f],display_numbers[mac_public[1]>>4],0x05,0xc2,0xe2,0x77);
sleep_ms(1800);
pm_wait_ms(1800);
send_to_lcd(0x00,0x00,0x05,0xc2,0xe2,0x77);
sleep_ms(200);
pm_wait_ms(200);
send_to_lcd(display_numbers[mac_public[0] &0x0f],display_numbers[mac_public[0]>>4],0x05,0xc2,0xe2,0x77);
sleep_ms(1800);
pm_wait_ms(1800);
}

void show_big_number(int16_t number, bool point){
Expand Down
3 changes: 3 additions & 0 deletions ATC_Thermometer/lcd.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,15 @@

void init_lcd();
void init_lcd_deepsleep();
void send_to_lcd(uint8_t byte1, uint8_t byte2, uint8_t byte3, uint8_t byte4, uint8_t byte5, uint8_t byte6);
void update_lcd();
void show_temp_symbol(uint8_t symbol);
void show_battery_symbol(bool state);
void show_big_number(int16_t number, bool point);
void show_small_number(uint16_t number, bool percent);
void show_smiley(uint8_t state);
void show_atc();
void show_sto();
void show_atc_mac();
void show_ble_symbol(bool state);
void send_to_lcd_long(uint8_t byte1, uint8_t byte2, uint8_t byte3, uint8_t byte4, uint8_t byte5, uint8_t byte6);
Expand Down
Loading

0 comments on commit d31032e

Please sign in to comment.