/*
What it does: 

If both parameters are set, the logig prevents that both are executed.
Second one is executed, though in gatt server example both contain the same logic.
Each test resets the own flag
*/ 

#include <stdio.h>
#include <stdint.h>

static uint8_t adv_config_done = 0;
#define adv_config_flag      (1 << 0)
#define scan_rsp_config_flag (1 << 1)

#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"
#define BYTE_TO_BINARY(byte)  \
  (byte & 0x80 ? '1' : '0'), \
  (byte & 0x40 ? '1' : '0'), \
  (byte & 0x20 ? '1' : '0'), \
  (byte & 0x10 ? '1' : '0'), \
  (byte & 0x08 ? '1' : '0'), \
  (byte & 0x04 ? '1' : '0'), \
  (byte & 0x02 ? '1' : '0'), \
  (byte & 0x01 ? '1' : '0') 

int main()
{
    
    printf(BYTE_TO_BINARY_PATTERN"\n", BYTE_TO_BINARY(~adv_config_flag));
    printf(BYTE_TO_BINARY_PATTERN"\n", BYTE_TO_BINARY(~scan_rsp_config_flag));

    // config done in gatts_profile_a_event_handler ESP_GATTS_REG_EVT
    adv_config_done |= adv_config_flag;
    adv_config_done |= scan_rsp_config_flag;

    printf(BYTE_TO_BINARY_PATTERN"\n", BYTE_TO_BINARY(adv_config_done));

    // called on ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT
    // and ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT
    adv_config_done &= (~adv_config_flag);
    printf(BYTE_TO_BINARY_PATTERN"\n", BYTE_TO_BINARY(adv_config_done));
    if (adv_config_done==0){
        printf("adv_config_flag check\n");
    }


    adv_config_done |= scan_rsp_config_flag;

    // on event: ESP_GAP_BLE_SCAN_RSP_DATA_RAW_SET_COMPLETE_EVT
    // and ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT
    adv_config_done &= (~scan_rsp_config_flag);
    printf(BYTE_TO_BINARY_PATTERN"\n", BYTE_TO_BINARY(adv_config_done));
    if (adv_config_done==0){
        printf("scan_rsp_config_flag check\n");
    }
}
