Skip to content

Commit

Permalink
modified: README.md
Browse files Browse the repository at this point in the history
	modified:   c_mX.bin
	modified:   inc/WidgetConfig.h
	modified:   inc/erika_task_conf.h
	modified:   inc/spotify.h
	modified:   src/app.c
	modified:   src/json_parser.c
	modified:   src/spotify.c
	modified:   src/ui.c
	modified:   user.mk
  • Loading branch information
chris committed Jun 4, 2024
1 parent 702d3da commit 89dfc5c
Show file tree
Hide file tree
Showing 10 changed files with 184 additions and 40 deletions.
70 changes: 69 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,16 @@ In the main board, the app was built based on ErikaRTOSv2, which is divided in 6

- __Network__, triggered each 80ms, runs the web client or the web servers upon request of the previous tasks.

The Fig 1. shows the overall FSM of the network
The ESP8266 (ESP8) works on request of AT commands, a host sends a command such as:

```
Host: AT+CWMODE=3\r\n
ESP8: AT+CWMODE=3\r\n
ESP8: \r\n
ESP8: OK\r\n
```



```mermaid
---
Expand All @@ -64,6 +73,65 @@ note left of SuperState : = INITIAL_SETUP, NETSTATUS, CLIENT, SERVER, AP
```

```mermaid
---
title: Fig. 2 - Initial Setup Super State
---
stateDiagram-v2
direction TB
state LUT_OK <<choice>>
[*] --> INITIAL_SETUP
state INITIAL_SETUP {
direction LR
[*] --> RESTART : LUT(prev_state)
RESTART --> [*]
[*] --> CHECK_DEV
[*] --> CHECK_DEV : (ready & RESTART) | err & (STATION_MODE | MULTI_CONN)
CHECK_DEV --> [*]
[*] --> STATION_MODE : ok & CHECK_DEV
STATION_MODE --> [*]
[*] --> MULTI_CONN : ok & STATION_MODE
MULTI_CONN --> [*]
}
LUT_OK --> NETSTATUS : ok & MULTI_CONN
LUT_OK --> INITIAL_SETUP
ON_HOLD --> LUT_OK
INITIAL_SETUP --> ON_HOLD
ON_HOLD --> ERROR : err
ERROR --> INITIAL_SETUP
```

```mermaid
---
title: Fig. 2 - Initial Setup Super State
---
stateDiagram-v2
direction LR
state LUT_OK <<choice>>
state NETSTATE {
direction LR
[*] --> IFCONFIG
IFCONFIG --> [*]
[*] --> NETSTAT
NETSTAT --> [*]
[*] --> NETKILL : ok
NETKILL --> [*]
}
LUT_OK --> NETSTAT : ok | ready
LUT_OK --> NESTATUS : ok & MULTI_CONN
ON_HOLD --> LUT_OK
INITIAL_SETUP --> ON_HOLD
ON_HOLD --> ERROR : error
ERROR --> INITIAL_SETUP : LUT(prev_state)
```



## Future Improvements

1. Not close the SSL connection with Spotify, it takes 5 seconds.
Expand Down
Binary file modified c_mX.bin
Binary file not shown.
1 change: 1 addition & 0 deletions inc/WidgetConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ void UI_setWeatherIcon(unsigned short *iconID);
void UI_writeWeatherCurrTemp(char *curr_temp);
void UI_setTime(char *timezone, char *time);
void UI_set_track(char *track);
void UI_set_track_progress(char *progress, char* duration);

void UI_SettingsOn(void);
void UI_SettingsOff(void);
Expand Down
2 changes: 1 addition & 1 deletion inc/erika_task_conf.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
#define NETWORK_PERIOD 80
#define NETWORK_OFFSET 15

#define SPOTIFY_UPDATE_PERIOD 20000
#define SPOTIFY_UPDATE_PERIOD 2000
#define SPOTIFY_UPDATE_OFFSET SPOTIFY_UPDATE_PERIOD

#define EXEC(task) \
Expand Down
22 changes: 18 additions & 4 deletions inc/spotify.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,15 +86,29 @@ char spotify_get_token(char *http, char **vals, uint16_t *sizes);
"Authorization: Bearer %s\r\n\r\n"

enum {
iSPOTIFY_SONG,
iSPOTIFY_ALBUM,
iSPOTIFY_X0,
iSPOTIFY_ARTIST,
iSPOTIFY_SONG,
iSPOTIFY_PROGRESS,
iSPOTIFY_DURATION,
iSPOTIFY_TIME,
SPOTIFY_TRACK_COUNT
};

char spotify_get_track(char *json, char **vals, uint16_t *sizes);
#define SPOTIFY_PROGRESS_OFFSET 2
#define SPOTIFY_PROGRESS_DELIM ','

#define SPOTIFY_ARTIST_OFFSET 3
#define SPOTIFY_ARTIST_DELIM '"'

#define SPOTIFY_SONG_OFFSET 3
#define SPOTIFY_SONG_DELIM '"'

#define SPOTIFY_DURATION_OFFSET 2
#define SPOTIFY_DURATION_DELIM ','

#define SPOTIFY_TIME_OFFSET 2
#define SPOTIFY_TIME_DELIM ','

char spotify_get_track(char *json, char **vals, uint16_t *sizes);

#endif
20 changes: 18 additions & 2 deletions src/app.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ struct Http http_conf;
static char spotify_auth_content[SPOTIFY_AUTH_CONTENT_SIZE];
static int16_t spotify_code;
static uint8_t internal_events = 0;
static char timezone[7];

static void app_spotify_conf(uint8_t *success, char *http, void *arg) {

Expand Down Expand Up @@ -255,7 +256,8 @@ static void OWAPI_process_result(uint8_t *success, char *tmp, void *arg) {
/* Request Time */
*(weather[iOWAPI_TIMEZONE] + sizes[iOWAPI_TIMEZONE]) = 0;
*(weather[iOWAPI_TIME] + sizes[iOWAPI_TIME]) = 0;
UI_setTime(weather[iOWAPI_TIMEZONE], weather[iOWAPI_TIME]);
memcpy(timezone, weather[iOWAPI_TIMEZONE], sizes[iOWAPI_TIMEZONE]);
UI_setTime(timezone, weather[iOWAPI_TIME]);

*success = 0;
}
Expand Down Expand Up @@ -303,6 +305,11 @@ static void spotify_track_processor(uint8_t *success, char *http, void *arg) {

*(track_ptr[iSPOTIFY_SONG] + sizes[iSPOTIFY_SONG]) = 0;
*(track_ptr[iSPOTIFY_ARTIST] + sizes[iSPOTIFY_ARTIST]) = 0;
*(track_ptr[iSPOTIFY_PROGRESS] + sizes[iSPOTIFY_PROGRESS]) = 0;
*(track_ptr[iSPOTIFY_DURATION] + sizes[iSPOTIFY_DURATION]) = 0;
*(track_ptr[iSPOTIFY_TIME] + 10) = 0;

UI_set_track_progress(track_ptr[iSPOTIFY_PROGRESS], track_ptr[iSPOTIFY_DURATION]);

sizes[iSPOTIFY_SONG] = snprintf(track_info, TRACK_INFO_SIZE, "%s:%s",\
track_ptr[iSPOTIFY_ARTIST], track_ptr[iSPOTIFY_SONG]);
Expand All @@ -311,6 +318,7 @@ static void spotify_track_processor(uint8_t *success, char *http, void *arg) {
track_info[TRACK_INFO_SIZE - 1] = 0;

UI_set_track(track_info);
UI_setTime(timezone, track_ptr[iSPOTIFY_TIME]);

*success = 0;
}
Expand Down Expand Up @@ -600,6 +608,11 @@ void client_function(struct StateS *state, uint8_t *_client_id) {
client_id = SPOTIFY_AUTH;
*state->nx_state = MKSTATE(ESP8SS_CLIENT, ESP8S_CONNECT_SSL);
}
else if (esp8_status.http == HTTP_200) {
if(SUBSTATE(*state->nx_state) == ESP8S_CLOSE) {
*state->nx_state = MKSTATE(ESP8SS_READY, 0);
}
}
}
// break;
}
Expand Down Expand Up @@ -637,8 +650,11 @@ void NetEventHandler(struct StateS *s,\
*client_id = LOCATION;
}
else if(internal_events & SPOTIFY_UPDATE_EVENT) {
if(*spotify_auth_content == 0)
return;

internal_events &= ~SPOTIFY_UPDATE_EVENT;
*s->nx_state = MKSTATE(ESP8SS_CLIENT, ESP8S_CONNECT_SSL);
*s->nx_state = MKSTATE(ESP8SS_CLIENT, ESP8S_RMALLOC);
*client_id = SPOTIFY;

}
Expand Down
2 changes: 1 addition & 1 deletion src/json_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ char *json_get_value_ptr(char *json, char *key, unsigned short key_len) {
if (memcmp(json, key, key_len) == 0)
return json + key_len + 2;

json += key_len + 1;
json += key_len - 1;
}
json++;
}
Expand Down
78 changes: 51 additions & 27 deletions src/spotify.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,46 +67,70 @@ char spotify_get_token(char *json, char **vals, uint16_t *vals_sizes) {

}

#define JSON_get_panic(dest, src, key, key_len) \
dest = json_get_value_ptr(src, key, key_len); \

#define JSON_get_panic(dest, src, key, key_len) \
dest = json_get_value_ptr(src, key, key_len);\
if (dest == NULL)\
return 1

char spotify_get_track(char *json, char **vals, uint16_t *vals_sizes) {
char *keys[SPOTIFY_TRACK_COUNT] = {"name", "name", "name", "name"};
uint16_t keys_sizes[SPOTIFY_TRACK_COUNT] = {4, 4, 4, 4};
#define json_get_value(dest, destsz, src, key_id) \
src += key_id##_OFFSET;\
*(dest + i##key_id) = src;\
while(*(src) != key_id##_DELIM)\
src++;\
destsz[i##key_id] = src - dest[i##key_id]

char spotify_get_track(char *json, char **vals, uint16_t *vals_sz) {
char *dest;

vals[iSPOTIFY_ARTIST] = "Null";
vals[iSPOTIFY_SONG] = "Null";
vals_sizes[iSPOTIFY_ARTIST] = 4;
vals_sizes[iSPOTIFY_SONG] = 4;
vals_sz[iSPOTIFY_ARTIST] = 4;
vals_sz[iSPOTIFY_SONG] = 4;

/* */
dest = json_get_value_ptr(json, "timestamp", 9);
if (dest == NULL) {
dest = json;
vals_sz[iSPOTIFY_TIME] = 0;
} else {
json_get_value(vals, vals_sz, dest, SPOTIFY_TIME);
}

/* progress ms */
dest = json_get_value_ptr(json, "progress_ms", 11);
if (dest == NULL)
dest = json;
else {
json_get_value(vals, vals_sz, dest, SPOTIFY_PROGRESS);
}

/* Artist */
JSON_get_panic(dest, json, "artists", 7);
JSON_get_panic(dest, dest, "artists", 7);
JSON_get_panic(dest, dest, "name", 4);

dest += 3;
vals[iSPOTIFY_ARTIST] = dest;
while(*dest != '"')
dest++;

vals_sizes[iSPOTIFY_ARTIST] = dest - vals[iSPOTIFY_ARTIST];
json_get_value(vals, vals_sz, dest, SPOTIFY_ARTIST);

/* Track */
do {
JSON_get_panic(vals[iSPOTIFY_SONG], dest, "name", 4);
JSON_get_panic(dest, vals[iSPOTIFY_SONG], "type", 4);
} while(memcmp(dest, ": \"track\",", 10));
/* duration_ms */
dest = json_get_value_ptr(dest, "duration_ms", 11);
if (dest == NULL) {
dest = json;

/* Track */
do {
JSON_get_panic(vals[iSPOTIFY_SONG], dest, "name", 4);
JSON_get_panic(dest, vals[iSPOTIFY_SONG], "type", 4);
} while(memcmp(dest, ": \"track\",", 10));

dest = vals[iSPOTIFY_SONG];
json_get_value(vals, vals_sz, dest, SPOTIFY_SONG);
return 0;
}

dest = vals[iSPOTIFY_SONG];
dest += 3;
vals[iSPOTIFY_SONG] = dest;
while(*dest != '"')
dest++;

vals_sizes[iSPOTIFY_SONG] = dest - vals[iSPOTIFY_SONG];
json_get_value(vals, vals_sz, dest, SPOTIFY_DURATION);

/* Track */
JSON_get_panic(dest, dest, "name", 4);
json_get_value(vals, vals_sz, dest, SPOTIFY_SONG);

return 0;
}
27 changes: 24 additions & 3 deletions src/ui.c
Original file line number Diff line number Diff line change
Expand Up @@ -396,11 +396,11 @@ void UI_writeWeatherCurrTemp(char *curr_temp) {
void UI_setTime(char *timezone, char *time) {
time_t epochs;
struct tm *time_info;
char buff[10];
char buff[8];

epochs = atoi(time) + atoi(timezone);
time_info = localtime(&epochs);
strftime(buff, 10, "%I:%M%p", time_info);
strftime(buff, 8, "%I:%M%p", time_info);

WPrintLog(&weather_ui[REQ_TIME], buff);
}
Expand All @@ -409,6 +409,26 @@ void UI_set_track(char *msg) {
LCD_DrawFullRect(SPOTIFY_INFO_X, SPOTIFY_INFO_Y, 300, 8);
WPrintLog(&weather_ui[SPOTIFY_STATUS], msg);
}

void UI_set_track_progress(char *progress_str, char *duration_str) {
uint32_t progress, duration;
progress = atoi(progress_str);
duration = atoi(duration_str);

LCD_SetColors(UI_CLEAN_PROGRESS_BAR_COLOR, UI_CLEAN_PROGRESS_BAR_COLOR);
LCD_DrawFullRect(SPOTIFY_INFO_X, SPOTIFY_INFO_Y + 10, 286, 1);

if (duration < progress) {
LCD_SetColors(APP_BACKGROUND_COLOR, APP_BACKGROUND_COLOR);
return;
}

progress = (progress * 286) / duration;

LCD_SetColors(UI_PROGRESS_BAR_COLOR, UI_PROGRESS_BAR_COLOR);
LCD_DrawFullRect(SPOTIFY_INFO_X, SPOTIFY_INFO_Y + 10, progress, 1);
LCD_SetColors(APP_BACKGROUND_COLOR, APP_BACKGROUND_COLOR);
}
/*******************************************************/


Expand All @@ -422,7 +442,8 @@ void UI_SettingsOff(void) {
}
/*******************************************************/

void UI_WriteState(char *str){
void UI_WriteState(char *str) {
LCD_SetColors(APP_BACKGROUND_COLOR, APP_BACKGROUND_COLOR);
LCD_DrawFullRect(5, 228, 300, 8);
WPrintLog(&weather_ui[STATE_DEV_STR], str);
}
Expand Down
2 changes: 1 addition & 1 deletion user.mk
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ INC_DIR:=inc ui/inc img/inc
SRC:=$(foreach dir, $(SRC_DIR), $(wildcard $(dir)/*.c))
INC:=$(foreach dir, $(INC_DIR), -I$(dir))

CFLAGS += $(INC)
CFLAGS += $(INC) -g3
APP_SRCS += $(SRC)

0 comments on commit 89dfc5c

Please sign in to comment.