From edb127e6265d40e3e970ebafecee95e4061d73ab Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sun, 14 May 2023 22:10:13 +0200 Subject: [PATCH] Updated the gadget bridge parser --- src/W800_SDK_v1.00.10/app/ble/gadget_bridge.c | 126 ++++++++++++++++-- src/W800_SDK_v1.00.10/app/ble/gadget_bridge.h | 3 + 2 files changed, 118 insertions(+), 11 deletions(-) diff --git a/src/W800_SDK_v1.00.10/app/ble/gadget_bridge.c b/src/W800_SDK_v1.00.10/app/ble/gadget_bridge.c index e328141..6aff305 100644 --- a/src/W800_SDK_v1.00.10/app/ble/gadget_bridge.c +++ b/src/W800_SDK_v1.00.10/app/ble/gadget_bridge.c @@ -31,6 +31,9 @@ typedef enum gadget_bridge_parser_fsm GADGET_BRIDGE_PARSER_FSM_FOUND_TITLE, GADGET_BRIDGE_PARSER_FSM_PARSING_TITLE_CONTENT, + GADGET_BRIDGE_PARSER_FSM_FOUND_SUBJECT, + GADGET_BRIDGE_PARSER_FSM_PARSING_SUBJECT_BODY_CONTENT, + GADGET_BRIDGE_PARSER_FSM_FOUND_ID_SRC, GADGET_BRIDGE_PARSER_FSM_FOUND_SRC_BODY, GADGET_BRIDGE_PARSER_FSM_PARSING_BODY_CONTENT, @@ -244,7 +247,7 @@ static bool _parser_extract_bool(char *start, char *end, bool *data); gadget_bridge_parser_code_e gadget_bridge_parser_run(void) { if(!_gadget_bridge_internals.new_data) return GADGET_BRIDGE_PARSER_CODE_OK; - char *start = NULL, *end = NULL; + char *start = NULL, *end = NULL, *end2 = NULL; // end2 is used when more than one next tag is possible bool free_some_space = false; gadget_bridge_parser_code_e to_return = GADGET_BRIDGE_PARSER_CODE_PARSING; @@ -427,10 +430,20 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void) else to_return = GADGET_BRIDGE_PARSER_CODE_OK; break; case GADGET_BRIDGE_PARSER_FSM_FOUND_ID_SRC: - if((start = strstr(_gadget_bridge_internals.buffer, "src:")) - && (end = strstr(_gadget_bridge_internals.buffer, ",title"))) + if((start = strstr(_gadget_bridge_internals.buffer, "src:")) && + ((end = strstr(_gadget_bridge_internals.buffer, ",title")) || (end2 = strstr(_gadget_bridge_internals.buffer, ",subject")))) { - //printf("###Found TITLE\n"); + if((end && !end2) || (end != NULL && end < end2)) + { + //printf("###Found TITLE\n"); + _gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_FOUND_TITLE; + } + else if((!end && end2) || (end2 != NULL && end2 < end)) + { + //printf("###Found SUBJECT\n"); + end = end2; + _gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_FOUND_SUBJECT; + } _parser_extract_src(start + 5, end - 1); @@ -439,7 +452,6 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void) _parser_free_buffer( end -_gadget_bridge_internals.buffer ); - _gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_FOUND_TITLE; } else if((start = strstr(_gadget_bridge_internals.buffer, "GB("))) _gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE; @@ -486,7 +498,7 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void) // Then we have a very long title, in this case we juste keep the max set up else if(!end && _gadget_bridge_internals.buffer_content_size >= GADGET_BRIDGE_PARSER_MAX_TITLE_SIZE) { - printf("###NOTIFICATION (MAX TITLE SIZE)\n"); + //printf("###NOTIFICATION (MAX TITLE SIZE)\n"); _parser_extract_char_str(_gadget_bridge_internals.buffer, _gadget_bridge_internals.buffer + GADGET_BRIDGE_PARSER_MAX_TITLE_SIZE, &_gadget_bridge_internals.event_data.notification.title); @@ -511,6 +523,10 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void) _parser_free_buffer( start -_gadget_bridge_internals.buffer ); + + if(_gadget_bridge_internals.event_data.notification.notification_type == GADGET_BRIDGE_NOTIFICATION_TYPE_GADGET_BRIDGE) + _gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_PARSING_SUBJECT_BODY_CONTENT; + else _gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_PARSING_BODY_CONTENT; } else if((start = strstr(_gadget_bridge_internals.buffer, "GB("))) @@ -551,7 +567,64 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void) // Then we have a very long body, in this case we juste keep the max set up else if(!end && _gadget_bridge_internals.buffer_content_size >= GADGET_BRIDGE_PARSER_MAX_BODY_SIZE) { - //printf("###NOTIFICATION (MAX BODY SIZE) Type done\n"); + // printf("###NOTIFICATION (MAX BODY SIZE) Type done\n"); + + _parser_extract_char_str(_gadget_bridge_internals.buffer, _gadget_bridge_internals.buffer + GADGET_BRIDGE_PARSER_MAX_BODY_SIZE, &_gadget_bridge_internals.event_data.notification.body); + + // We remove the parsed part from the buffer + _parser_free_buffer( + GADGET_BRIDGE_PARSER_MAX_BODY_SIZE + 1 + ); + + // If a callback was registered, we call it and pass the data to it + if(_gadget_bridge_internals.parser_event_callback) + { + _gadget_bridge_internals.parser_event_callback(&_gadget_bridge_internals.event_data); + } + + // Free the allocated data + _free_event_data(); + + // The end of the road for this object + _gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE; + } + else to_return = GADGET_BRIDGE_PARSER_CODE_OK; + } + break; + case GADGET_BRIDGE_PARSER_FSM_PARSING_SUBJECT_BODY_CONTENT: + { + end = strstr(_gadget_bridge_internals.buffer, ",sender"); + if(end) + { + // We don't care about the sender nor the tel tag + //printf("###TEST NOTIFICATION Type done\n"); + + _parser_extract_char_str(_gadget_bridge_internals.buffer, end - 1, &_gadget_bridge_internals.event_data.notification.body); + + // We remove the parsed part from the buffer + end += 7; + _parser_free_buffer( + end -_gadget_bridge_internals.buffer + ); + + // If a callback was registered, we call it and pass the data to it + if(_gadget_bridge_internals.parser_event_callback) + { + _gadget_bridge_internals.parser_event_callback(&_gadget_bridge_internals.event_data); + } + + // Free the allocated data + _free_event_data(); + + // The end of the road for this object + _gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE; + } + else if((start = strstr(_gadget_bridge_internals.buffer, "GB("))) + _gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE; + // Then we have a very long body, in this case we juste keep the max set up + else if(!end && _gadget_bridge_internals.buffer_content_size >= GADGET_BRIDGE_PARSER_MAX_BODY_SIZE) + { + //printf("###TEST NOTIFICATION (MAX BODY SIZE) Type done\n"); _parser_extract_char_str(_gadget_bridge_internals.buffer, _gadget_bridge_internals.buffer + GADGET_BRIDGE_PARSER_MAX_BODY_SIZE, &_gadget_bridge_internals.event_data.notification.body); @@ -632,6 +705,24 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void) _gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE; break;*/ + case GADGET_BRIDGE_PARSER_FSM_FOUND_SUBJECT: + if((start = strstr(_gadget_bridge_internals.buffer, "subject:"))) + { + //printf("###Parsing SUBJECT content\n"); + + // We remove the parsed part from the buffer + start += 9; + _parser_free_buffer( + start -_gadget_bridge_internals.buffer + ); + _gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_PARSING_TITLE_CONTENT; + } + else if((start = strstr(_gadget_bridge_internals.buffer, "GB("))) + _gadget_bridge_internals.gadget_bridge_parser_fsm = GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE; + else if(_gadget_bridge_internals.buffer_content_size > GADGET_BRIDGE_PARSER_BUFFER_THRESHOLD) + free_some_space = true; + else to_return = GADGET_BRIDGE_PARSER_CODE_OK; + break; case GADGET_BRIDGE_PARSER_FSM_FOUND_CALL: if((start = strstr(_gadget_bridge_internals.buffer, "cmd:")) && (end = strstr(_gadget_bridge_internals.buffer, ",name"))) @@ -1024,10 +1115,14 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void) else to_return = GADGET_BRIDGE_PARSER_CODE_OK; break; case GADGET_BRIDGE_PARSER_FSM_FOUND_MUSICINFO: - if((start = strstr(_gadget_bridge_internals.buffer, "artist:")) - && (end = strstr(_gadget_bridge_internals.buffer, ",track"))) + if((start = strstr(_gadget_bridge_internals.buffer, "artist:")) && + (end = strstr(_gadget_bridge_internals.buffer, ",track"))) { + end2 = strstr(_gadget_bridge_internals.buffer, ",album"); //printf("###Found TRACK\n"); + if(end2 != NULL && end2 < end) + _parser_extract_char_str(start + 8, end2 - 1, &_gadget_bridge_internals.event_data.music_info.artist); + else _parser_extract_char_str(start + 8, end - 1, &_gadget_bridge_internals.event_data.music_info.artist); // We remove the parsed part from the buffer @@ -1152,6 +1247,8 @@ const char *gadget_bridge_notification_type_2_str(gadget_bridge_notification_typ { CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_SMS) CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_EMAIL) + CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_WHATSAPP) + CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_GADGET_BRIDGE) CASE_RETURN_STR(GADGET_BRIDGE_NOTIFICATION_TYPE_UNKNOWN) default: return "Unknown notification type"; @@ -1164,6 +1261,7 @@ const char *gadget_bridge_music_state_2_str(gadget_bridge_music_state_e music_st { CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_PAUSE) CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_PLAY) + CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_STOP) CASE_RETURN_STR(GADGET_BRIDGE_MUSIC_STATE_UNKNOWN) default: return "Unknown music state"; @@ -1323,10 +1421,14 @@ static void _parser_extract_tel(char *start, char *end) static void _parser_extract_src(char *start, char *end) { *end = '\0'; - if(strcmp(start, "Messages") == 0) + if(strcasecmp(start, "Messages") == 0) _gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_SMS; - else if(strcmp(start, "E-mail") == 0) + else if(strcasecmp(start, "E-mail") == 0) _gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_EMAIL; + else if(strcasecmp(start, "WhatsApp") == 0) + _gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_WHATSAPP; + else if(strcasecmp(start, "Gadgetbridge") == 0) + _gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_GADGET_BRIDGE; else _gadget_bridge_internals.event_data.notification.notification_type = GADGET_BRIDGE_NOTIFICATION_TYPE_UNKNOWN; @@ -1363,6 +1465,8 @@ static void _parser_extract_state(char *start, char *end) _gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_PLAY; else if(strcmp(start, "pause") == 0) _gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_PAUSE; + else if(strcmp(start, "stop") == 0) + _gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_STOP; else _gadget_bridge_internals.event_data.music_state.music_state = GADGET_BRIDGE_MUSIC_STATE_UNKNOWN; diff --git a/src/W800_SDK_v1.00.10/app/ble/gadget_bridge.h b/src/W800_SDK_v1.00.10/app/ble/gadget_bridge.h index cc45711..9741601 100644 --- a/src/W800_SDK_v1.00.10/app/ble/gadget_bridge.h +++ b/src/W800_SDK_v1.00.10/app/ble/gadget_bridge.h @@ -129,6 +129,8 @@ typedef enum gadget_bridge_notification_type { GADGET_BRIDGE_NOTIFICATION_TYPE_SMS = 0, GADGET_BRIDGE_NOTIFICATION_TYPE_EMAIL, + GADGET_BRIDGE_NOTIFICATION_TYPE_WHATSAPP, + GADGET_BRIDGE_NOTIFICATION_TYPE_GADGET_BRIDGE, GADGET_BRIDGE_NOTIFICATION_TYPE_UNKNOWN, } gadget_bridge_notification_type_e; @@ -136,6 +138,7 @@ typedef enum { GADGET_BRIDGE_MUSIC_STATE_PAUSE = 0, GADGET_BRIDGE_MUSIC_STATE_PLAY, + GADGET_BRIDGE_MUSIC_STATE_STOP, GADGET_BRIDGE_MUSIC_STATE_UNKNOWN, } gadget_bridge_music_state_e;