1 /*
2  * Copyright (C) 2019-2020 Alibaba Group Holding Limited
3  */
4 
5 #ifndef _MESH_MODEL_H__
6 #define _MESH_MODEL_H__
7 
8 #include "api/mesh.h"
9 #include "api/mesh/main.h"
10 
11 #if defined(CONFIG_BT_MESH_MODEL_GEN_ONOFF_SRV)
12 #include "sig_model/generic_onoff_srv.h"
13 #endif
14 #if defined(CONFIG_BT_MESH_MODEL_GEN_LEVEL_SRV)
15 #include "sig_model/generic_level_srv.h"
16 #endif
17 #if defined(CONFIG_BT_MESH_MODEL_LIGHT_LIGHTNESS_SRV)
18 #include "sig_model/light_lightness_srv.h"
19 #endif
20 #if defined(CONFIG_BT_MESH_MODEL_LIGHT_CTL_SRV)
21 #include "sig_model/light_ctl_srv.h"
22 #endif
23 
24 #if defined(CONFIG_BT_MESH_MODEL_GEN_ONOFF_CLI)
25 #include "sig_model/generic_onoff_cli.h"
26 #endif
27 
28 #if defined(CONFIG_BT_MESH_MODEL_GEN_LEVEL_CLI)
29 #include "sig_model/generic_level_cli.h"
30 #endif
31 
32 #if defined(CONFIG_BT_MESH_MODEL_LIGHT_LIGHTNESS_CLI)
33 #include "sig_model/light_lightness_cli.h"
34 #endif
35 #if defined(CONFIG_BT_MESH_MODEL_LIGHT_CTL_CLI)
36 #include "sig_model/light_ctl_cli.h"
37 #endif
38 
39 #if defined(CONFIG_BT_MESH_MODEL_VENDOR_SRV)
40 #include "vendor/vendor_model_srv.h"
41 #endif
42 
43 #if defined(CONFIG_BT_MESH_MODEL_VENDOR_CLI)
44 #include "vendor/vendor_model_cli.h"
45 #endif
46 
47 #include "model_bind_ops.h"
48 #include <api/mesh/access.h>
49 
50 typedef enum {
51     T_CUR = 0,
52     T_TAR,
53     TYPE_NUM,
54 } _VALUE_TYPE;
55 
56 typedef enum {
57     SUCCESS = 0,
58     SET_MIN_FAIL,
59     SET_MAX_FAIL,
60     RFU,
61 } _STATUS_CODES;
62 
63 typedef struct _RANGE {
64     _STATUS_CODES code;
65     u16_t range_min;
66     u16_t range_max;
67 } RANGE_STATUS;
68 
69 typedef struct {
70 #ifdef CONFIG_BT_MESH_MODEL_GEN_ONOFF_SRV
71     u8_t onoff[TYPE_NUM];
72 #endif
73 #ifdef CONFIG_BT_MESH_MODEL_GEN_LEVEL_SRV
74     s16_t level[TYPE_NUM];
75 #endif
76 #ifdef CONFIG_BT_MESH_MODEL_LIGHT_LIGHTNESS_SRV
77     u16_t lightness_linear[TYPE_NUM];
78     u16_t lightness_actual[TYPE_NUM];
79 #endif
80 #ifdef CONFIG_BT_MESH_MODEL_LIGHT_CTL_SRV
81     u16_t lightness[TYPE_NUM];
82     u16_t temp[TYPE_NUM];
83     u16_t UV[TYPE_NUM];
84 #endif
85 
86     u8_t delay; // unit:5ms
87     u8_t trans; // unit:100ms
88     bt_u32_t trans_start_time;
89     bt_u32_t trans_end_time;
90     s16_t trans_step;
91     struct k_timer delay_timer;
92     struct k_timer trans_timer;
93     bool timerInitFlag;
94 } S_MESH_STATE;
95 
96 typedef struct {
97 #ifdef CONFIG_BT_MESH_MODEL_LIGHT_LIGHTNESS_SRV
98     u16_t lightness_actual_default;
99     u16_t lightness_last;
100     RANGE_STATUS lightness_range;
101 #endif
102 #ifdef CONFIG_BT_MESH_MODEL_LIGHT_CTL_SRV
103     uint16_t lightness_default;
104     uint16_t temp_default;
105     uint16_t UV_default;
106     RANGE_STATUS ctl_temp_range;
107 #endif
108 } S_MESH_POWERUP;
109 
110 typedef struct {
111     S_MESH_STATE state;
112     S_MESH_POWERUP powerup;
113 } S_ELEM_STATE;
114 
115 typedef enum {
116     MESH_SUCCESS = 0,
117     MESH_TID_REPEAT,
118     MESH_ANALYZE_SIZE_ERROR,
119     MESH_ANALYZE_ARGS_ERROR,
120     MESH_SET_TRANSTION_ERROR,
121 } E_MESH_ERROR_TYPE;
122 
123 typedef enum {
124     BT_MESH_MODEL_CFG_APP_KEY_ADD = 0x00,
125     BT_MESH_MODEL_CFG_COMP_DATA_STATUS = 0x02,
126     BT_MESH_MODEL_CFG_HEARTBEAT_PUB_STATUS = 0x06,
127     BT_MESH_MODEL_CFG_APPKEY_STATUS = 0x8003,
128     BT_MESH_MODEL_CFG_BEACON_STATUS = 0x800b,
129     BT_MESH_MODEL_CFG_TTL_STATUS = 0x800e,
130     BT_MESH_MODEL_CFG_FRIEND_STATUS = 0x8011,
131     BT_MESH_MODEL_CFG_PROXY_STATUS = 0x8014,
132     BT_MESH_MODEL_CFG_NET_KRP_STATUS = 0x8017,
133     BT_MESH_MODEL_CFG_PUB_STATUS = 0x8019,
134     BT_MESH_MODEL_CFG_SUB_STATUS = 0x801f,
135     BT_MESH_MODEL_CFG_SUB_LIST = 0x802a,
136     BT_MESH_MODEL_CFG_SUB_LIST_VND = 0x802c,
137     BT_MESH_MODEL_CFG_RELAY_STATUS = 0x8028,
138     BT_MESH_MODEL_CFG_HEARTBEAT_SUB_STATUS = 0x803c,
139     BT_MESH_MODEL_CFG_APPKEY_BIND_STATUS = 0x803e,
140     BT_MESH_MODEL_CFG_RST_STATUS = 0x804a,
141     BT_MESH_MODEL_CFG_NET_KEY_STATUS = 0x8044,
142 /*[Genie begin] add by wenbing.cwb at 2021-01-21*/
143 #ifdef CONFIG_BT_MESH_CTRL_RELAY
144     BT_MESH_MODEL_CFG_CTRL_RELAY_STATUS = 0x8072,
145 #endif
146     /*[Genie end] add by wenbing.cwb at 2021-01-21*/
147     BT_MESH_MODEL_ONOFF_SET = 0x8202,
148     BT_MESH_MODEL_ONOFF_STATUS = 0x8204,
149     BT_MESH_MODEL_LEVEL_SET = 0x8206,
150     BT_MESH_MODEL_LEVEL_MOVE_SET = 0x820B,
151     BT_MESH_MODEL_LEVEL_STATUS = 0x8208,
152     BT_MESH_MODEL_LEVEL_DELTA_SET = 0x8209,
153     BT_MESH_MODEL_LIGHTNESS_SET = 0x824c,
154     BT_MESH_MODEL_LIGHTNESS_STATUS = 0x824e,
155     BT_MESH_MODEL_LIGHTNESS_LINEAR_SET = 0x8250,
156     BT_MESH_MODEL_LIGHTNESS_LINEAR_STATUS = 0x8252,
157     BT_MESH_MODEL_LIGHTNESS_LAST_STATUS = 0x8254,
158     BT_MESH_MODEL_LIGHTNESS_DEF_STATUS = 0x8256,
159     BT_MESH_MODEL_LIGHTNESS_RANGE_STATUS = 0x8258,
160     BT_MESH_MODEL_LIGHTNESS_DEF_SET = 0x8259,
161     BT_MESH_MODEL_LIGHTNESS_RANGE_SET = 0x825b,
162     BT_MESH_MODEL_LIGHT_CTL_SET = 0x825e,
163     BT_MESH_MODEL_LIGHT_CTL_STATUS = 0x8260,
164     BT_MESH_MODEL_LIGHT_CTL_TEMP_RANGE_STATUS = 0x8263,
165     BT_MESH_MODEL_LIGHT_CTL_TEMP_SET = 0x8264,
166     BT_MESH_MODEL_LIGHT_CTL_TEMP_STATUS = 0x8266,
167     BT_MESH_MODEL_LIGHT_CTL_DEF_STATUS = 0x8268,
168     BT_MESH_MODEL_LIGHT_CTL_DEF_SET = 0x8269,
169     BT_MESH_MODEL_LIGHT_CTL_RANGE_SET = 0x826b,
170     BT_MESH_MODEL_VENDOR_MESSAGES = 0xcf01a8,
171     BT_MESH_MODEL_VENDOR_MESH_AUTOCONFIG = 0xd601a8,
172     BT_MESH_MODEL_VENDOR_MESH_AUTOCONFIG_GET = 0xd701a8,
173     BT_MESH_MODEL_VENDOR_MESH_AUTOCONFIG_STATUS = 0xd801a8,
174 } mesh_model_event_en;
175 
176 typedef void (*model_event_cb)(mesh_model_event_en event, void *p_arg);
177 
178 typedef struct {
179     void *user_data;
180     uint16_t data_len;
181 } vendor_data;
182 
183 typedef struct {
184     uint16_t source_addr;
185     uint16_t dst_addr;
186     struct net_buf_simple *status_data;
187     void *user_data;
188     vendor_data ven_data;
189 } model_message;
190 
191 int ble_mesh_model_init(const struct bt_mesh_comp *comp);
192 
193 const struct bt_mesh_comp *ble_mesh_model_get_comp_data();
194 
195 int ble_mesh_model_set_cb(model_event_cb event_cb);
196 
197 struct bt_mesh_model *ble_mesh_model_find(uint16_t elem_idx, uint16_t mod_idx, uint16_t CID);
198 
199 int ble_mesh_model_status_get(uint16_t netkey_idx, uint16_t appkey_idx, uint16_t unicast_addr,
200                               struct bt_mesh_model *model, uint32_t op_code);
201 
202 void model_event(mesh_model_event_en event, void *p_arg);
203 
204 #endif // _MESH_MODEL_H_
205