1 /*
2  * Copyright (C) 2018-2020 Alibaba Group Holding Limited
3  */
4 
5 #define BT_DBG_ENABLED IS_ENABLED(CONFIG_BT_MESH_DEBUG_MODEL)
6 //#include <port/mesh_hal_ble.h>
7 #include "common/log.h"
8 #include "mesh/access.h"
9 #include "mesh/main.h"
10 #include "prov.h"
11 
12 #include "genie_service.h"
13 
14 static struct k_timer repeat_reset_timer;
15 static struct k_timer delay_reset_timer;
16 //1:need reset 0:no reset
17 static uint8_t hw_reset_flag = 0;
18 
genie_reset_get_hw_reset_flag(void)19 uint8_t genie_reset_get_hw_reset_flag(void)
20 {
21     return hw_reset_flag;
22 }
23 
_genie_reset_write_count(uint8_t count)24 static genie_storage_status_e _genie_reset_write_count(uint8_t count)
25 {
26     uint8_t data = count;
27 
28     return genie_storage_write_userdata(GFI_MESH_RESET_CNT, &data, 1);
29 }
30 
repeat_reset_timer_cb(void * p_timer,void * args)31 static void repeat_reset_timer_cb(void *p_timer, void *args)
32 {
33     uint8_t number = 0;
34 
35     _genie_reset_write_count(number);
36 }
37 
genie_reset_by_repeat_init(void)38 void genie_reset_by_repeat_init(void)
39 {
40     uint8_t count = 0;
41     genie_storage_status_e flash_err = GENIE_STORAGE_SUCCESS;
42 
43     flash_err = genie_storage_read_userdata(GFI_MESH_RESET_CNT, &count, 1);
44     if (flash_err != GENIE_STORAGE_SUCCESS)
45     {
46         count = 0;
47     }
48 
49     /* update number and check if exceeded */
50     if (count > GENIE_RESET_BY_REPEAT_COUNTER)
51     {
52         count = 0;
53     }
54 
55     if (count < GENIE_RESET_BY_REPEAT_COUNTER)
56     {
57         count++;
58         _genie_reset_write_count(count);
59     }
60     else
61     {
62         hw_reset_flag = 1;
63     }
64 
65     k_timer_init(&repeat_reset_timer, repeat_reset_timer_cb, NULL);
66     k_timer_start(&repeat_reset_timer, GENIE_RESET_BY_REPEAT_TIMEOUT);
67 }
68 
genie_reset_provision(void)69 int genie_reset_provision(void)
70 {
71     bt_mesh_reset();
72     if (bt_prov_active())
73     {
74         extern void reset_link(void);
75         reset_link();
76     }
77 
78     bt_mesh_adv_stop();
79 #ifndef CONFIG_BT_SETTINGS
80     return genie_storage_reset_system();
81 #else
82     return 0;
83 #endif
84 }
85 
delay_reset_timer_cb(void * p_timer,void * args)86 static void delay_reset_timer_cb(void *p_timer, void *args)
87 {
88     genie_provision_set_state(GENIE_PROVISION_UNPROV);
89     genie_reset_provision();
90 
91 #ifdef CONFIG_GENIE_SW_RESET_PROV
92     bt_mesh_prov_enable(BT_MESH_PROV_GATT | BT_MESH_PROV_ADV);
93     genie_event(GENIE_EVT_SDK_MESH_PBADV_START, NULL);
94     return;
95 #else
96     aos_reboot();
97 #endif
98 }
99 
genie_reset_do_sw_reset(void)100 genie_event_e genie_reset_do_sw_reset(void)
101 {
102     k_timer_start(&delay_reset_timer, GENIE_RESET_WAIT_TIMEOUT); //wait report reset event done
103     return GENIE_EVT_NONE;
104 }
105 
reset_report_result_cb(transport_result_e result_e)106 static int reset_report_result_cb(transport_result_e result_e)
107 {
108     if (result_e == SEND_RESULT_SUCCESS)
109     {
110         hw_reset_flag = 0;
111         GENIE_LOG_INFO("report reset ok");
112     }
113     else
114     {
115         GENIE_LOG_INFO("report reset fail");
116     }
117 
118     return 0;
119 }
120 
genie_reset_report_device_reset(void)121 static int genie_reset_report_device_reset(void)
122 {
123     uint8_t payload[3];
124     genie_transport_payload_param_t transport_payload_param;
125 
126     payload[0] = ATTR_TYPE_DEVICE_EVENT & 0xFF;
127     payload[1] = (ATTR_TYPE_DEVICE_EVENT >> 8) & 0xFF;
128     payload[2] = EL_HW_RESET_T;
129 
130     memset(&transport_payload_param, 0, sizeof(genie_transport_payload_param_t));
131     transport_payload_param.opid = VENDOR_OP_ATTR_INDICATE;
132     transport_payload_param.p_payload = payload;
133     transport_payload_param.payload_len = sizeof(payload);
134     transport_payload_param.retry_cnt = GENIE_TRANSPORT_DEFAULT_RETRY_COUNT;
135     transport_payload_param.result_cb = reset_report_result_cb;
136 
137     return genie_transport_send_payload(&transport_payload_param);
138 }
139 
genie_reset_do_hw_reset(bool is_only_report)140 genie_event_e genie_reset_do_hw_reset(bool is_only_report)
141 {      extern uint8_t is_proxy_connected();
142     if (IS_ENABLED(CONFIG_BT_MESH_GATT_PROXY) && !is_proxy_connected()) {
143        extern int bt_mesh_proxy_gatt_disable();
144        bt_mesh_proxy_gatt_disable();
145     }
146     genie_reset_report_device_reset();
147 
148     if (is_only_report)
149     {
150         return GENIE_EVT_NONE;
151     }
152     else
153     {
154         return GENIE_EVT_SW_RESET;
155     }
156 }
157 
genie_reset_init(void)158 int genie_reset_init(void)
159 {
160 #ifdef CONFIG_GENIE_RESET_BY_REPEAT
161     genie_reset_by_repeat_init();
162 #endif
163     k_timer_init(&delay_reset_timer, delay_reset_timer_cb, NULL);
164     return 0;
165 }
166