定义结构体指针,访问成员时就用->
定义结构体变量,访问成员时就用.
例如:
struct A {
int a;
char b;
};
struct A q; 访问成员就用:q.a;
struct A *p; 访问成员就用:p->a;
eg:
首先定义结构体指针:
CTRL_CHANNEL 和 HW_TABLE
typedef struct
{
IO_CONFIG relay; // 继电器
LED_HANDLE relay_handle; // 继电器句柄
IO_CONFIG button; // 控制按键
IO_CONFIG led; // 状态指示灯
LED_HANDLE led_handle; // 状态指示灯句柄
int dpid; // 该通道绑定的dpid
int cd_dpid; // 该通道绑定的倒计时dpid 小于0表示不存在
int cd_sec; // 通道倒计时 -1 停止
BOOL stat; // 通道状态 TRUE - 有效; FALSE - 无效
}CTRL_CHANNEL;
// HW_TABLE结构体类型
// 抽象描述硬件配置
typedef struct
{
IO_CONFIG wifi_stat_led; // wifi状态指示灯
LED_HANDLE wifi_stat_led_handle;
// 电源总开关 存在通道有效时按下关闭 否则按下全部开启
IO_CONFIG power_button;
int channel_num;
CTRL_CHANNEL *channels; // 通道列表 *!* 不要重新指向其他位置
}HW_TABLE;
接着定义结构体变量
channels[] g_hw_table
static CTRL_CHANNEL channels[] =
{
// channel 0
{
// 继电器
.relay = {.type = IO_DRIVE_LEVEL_HIGH, .pin = GPIO_ID_PIN(13)},
// 按钮
.button = {.type = IO_DRIVE_LEVEL_LOW, .pin = GPIO_ID_PIN(16)},
// 通道状态指示灯
.led = {.type = IO_DRIVE_LEVEL_NOT_EXIST},
// 绑定dpid
.dpid = 1,
// 绑定倒计时dpid DPID_NOT_EXIST表示不存在倒计时
.cd_dpid = 101
},
// channel 1
{
// 继电器
.relay = {.type = IO_DRIVE_LEVEL_HIGH, .pin = GPIO_ID_PIN(5)},
// 按钮
.button = {.type = IO_DRIVE_LEVEL_LOW, .pin = GPIO_ID_PIN(14)},
// 通道状态指示灯
.led = {.type = IO_DRIVE_LEVEL_NOT_EXIST},
// 绑定dpid
.dpid = 2,
// 绑定倒计时dpid DPID_NOT_EXIST表示不存在倒计时
.cd_dpid = 103
},
// channel 2
{
// 继电器
.relay = {.type = IO_DRIVE_LEVEL_HIGH, .pin = GPIO_ID_PIN(15)},
// 按钮
.button = {.type = IO_DRIVE_LEVEL_LOW, .pin = GPIO_ID_PIN(12)},
// 通道状态指示灯
.led = {.type = IO_DRIVE_LEVEL_NOT_EXIST},
// 绑定dpid
.dpid = 3,
// 绑定倒计时dpid DPID_NOT_EXIST表示不存在倒计时
.cd_dpid = 104
},
// channel 2
{
// 继电器
.relay = {.type = IO_DRIVE_LEVEL_HIGH, .pin = GPIO_ID_PIN(4)},
// 按钮
.button = {.type = IO_DRIVE_LEVEL_NOT_EXIST},
// 通道状态指示灯
.led = {.type = IO_DRIVE_LEVEL_NOT_EXIST},
// 绑定dpid
.dpid = 4,
// 绑定倒计时dpid DPID_NOT_EXIST表示不存在倒计时
.cd_dpid = 102
}
};
// 硬件配置表全局变量
HW_TABLE g_hw_table =
{
// wifi状态指示灯 有效对应wifi连接 无效对应wifi未连接 配置完后显示电源状态
.wifi_stat_led = {.type = IO_DRIVE_LEVEL_LOW, .pin = GPIO_ID_PIN(0)},
// 电源总开关 存在通道有效时按下关闭 否则按下全部开启
.power_button = {.type = IO_DRIVE_LEVEL_NOT_EXIST},
.channels = channels
};
使用示例
访问结构体指针的成员用->
set_led_light_type(hw_table->channels[channel_no].relay_handle, OL_HIGH, 0);
访问结构体变量的成员用”.”
if(g_hw_table.channels[i].button.pin == gpio_no)
{
// 事件类型
if(LONG_KEY == type)
{
// 长按 更改wifi配网状态
single_dev_reset_factory();
}
else if(NORMAL_KEY == type)
{
if(Boot_key== BOOT_KEY_OK){
Boot_key=BOOT_KEY_NO;
}
else{
// 普通按键 触发该通道状态切换
// hw_trig_channel(&g_hw_table, i);
//hw_set_channel(&g_hw_table, i, true);
//hw_set_channel(&g_hw_table, i, false);
// 切换后上报当前状态
char buff[30];
if(g_hw_table.channels[i].stat)
{
sprintf(buff, "{\"%d\":true}", g_hw_table.channels[i].dpid);
}
else
{
sprintf(buff, "{\"%d\":false}", g_hw_table.channels[i].dpid);
}
// 推送数据到云
dp_upload_proc(buff);
//倒计时
// 倒计时
if(is_count_down)
{
g_hw_table.channels[i].cd_sec = -1;
sprintf(buff, "{\"%d\":0}", g_hw_table.channels[i].cd_dpid);// 回复倒计时0
// 推送倒计时数据
dp_trans_upload_proc(buff);
}
// 启动断电记忆存储定时器
if(is_save_stat)
{
sys_start_timer(save_stat_timer, 5000, TIMER_ONCE);
}
}
}
}