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