#include "btstack/bluetooth.h" #include "device/vm.h" #include "bt_common.h" #include "model_api.h" #include "api/sig_mesh_api.h" #include "device/gpio.h" #include "app_config.h" #if CONFIG_BLE_MESH_ENABLE #define LOG_TAG "[Mesh-ModelApi]" #define LOG_ERROR_ENABLE #define LOG_DEBUG_ENABLE #define LOG_INFO_ENABLE /* #define LOG_DUMP_ENABLE */ #define LOG_CLI_ENABLE #include "debug.h" #define APPS_VM_START_INDEX 238 typedef enum _INFO_SETTING_INDEX { MAC_ADDR_INDEX = 60, MESH_USER_INDEX = APPS_VM_START_INDEX, // ...more to add } INFO_SETTING_INDEX; u16_t primary_addr; static u16_t primary_net_idx; extern s32 vm_open(u16 index); extern void pseudo_random_genrate(uint8_t *dest, unsigned size); extern uint32_t btctler_get_rand_from_assign_range(uint32_t rand, uint32_t min, uint32_t max); extern char *bd_addr_to_str(u8 addr[6]); extern const u8 led_use_port[2]; void prov_complete(u16_t net_idx, u16_t addr) { log_info("provisioning complete for net_idx 0x%04x addr 0x%04x\n", net_idx, addr); primary_addr = addr; primary_net_idx = net_idx; } void prov_reset(void) { bt_mesh_prov_enable(BT_MESH_PROV_ADV | BT_MESH_PROV_GATT); } static void relay_sent(u16 *delay, u16 *duration, void *cb_data) { u16 delay_ms; pseudo_random_genrate((u8 *)&delay_ms, 2); delay_ms = btctler_get_rand_from_assign_range(delay_ms, 50, 200); *delay = delay_ms; log_info("Relay_delay = %u ms", delay_ms); } const struct bt_mesh_send_cb relay_sent_cb = { .user_intercept = relay_sent, }; void gpio_pin_write(u8_t led_index, u8_t onoff) { if (led_index >= ARRAY_SIZE(led_use_port)) { log_info("led_index over realy led set"); return; } onoff ? gpio_direction_output(led_use_port[led_index], 1) : gpio_direction_output(led_use_port[led_index], 0); } static bool info_load(INFO_SETTING_INDEX index, void *buf, u16 len) { int ret; vm_hdl hdl = vm_open(index); log_info("vm hdl=0x%x", hdl); ret = vm_read(hdl, (u8 *)buf, len); log_info("ret = %d\n", ret); if (ret != len) { log_info("vm_read err\n"); log_info("ret = %d\n", ret); return 1; } return 0; } static void info_store(INFO_SETTING_INDEX index, void *buf, u16 len) { int ret; /* vm_check_all(0); */ vm_hdl hdl = vm_open(index); log_info("vm hdl=0x%x", hdl); ret = vm_write(hdl, (u8 *)buf, len); if (ret != len) { log_info("vm_read err\n"); log_info("ret = %d\n", ret); } if (ret != len) { log_info("vm_write err\n"); log_info("ret = %d\n", ret); } } static void generate_bt_address(u8 addr[6]) { u8 i; for (i = 0; i < 6;) { addr[i++] = JL_RAND->R64L; addr[i++] = JL_RAND->R64H; } } void bt_mac_addr_set(u8 *bt_addr) { int err; if (!bt_addr) { u8 mac_addr[6]; bt_addr = mac_addr; err = info_load(MAC_ADDR_INDEX, bt_addr, sizeof(bt_addr)); if (err) { log_info(RedBoldBlink "first setup bt mac addr store" Reset); generate_bt_address(bt_addr); info_store(MAC_ADDR_INDEX, bt_addr, sizeof(bt_addr)); } else { log_info(BlueBoldBlink "load exist bt mac addr" Reset); } } le_controller_set_mac(bt_addr); log_info(PurpleBold "CHIP bt MAC : %s" Reset, bd_addr_to_str(bt_addr)); } void bt_ble_mesh_adv_enable(u8 enable) { if (0 == enable) { ble_user_cmd_prepare(BLE_CMD_ADV_ENABLE, 1, enable); ble_user_cmd_prepare(BLE_CMD_SCAN_ENABLE, 1, enable); } } void bt_ble_mesh_exit(void) { bt_ble_adv_enable(0); } void ble_mesh_module_enable(u8 en) { bt_ble_adv_enable(en); } __attribute__((weak)) void ble_profile_init(void) { } #endif