数据页1是ANT+自行车灯广播的主要数据页之一。所有ANT+自行车灯应在数据页旋转开始时和状态改变后立即发送此页(例如,当收到新命令时)。此信息中的所有字段应按表7-3所述进行设置。
Table 7-3. 数据页1格式-灯光状态1
Table 7-4. 数据公用格式第1页
/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved.
*
* The information contained herein is property of Nordic Semiconductor ASA.
* Terms and conditions of usage are described in detail in NORDIC
* SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
*
* Licensees are granted free, non-transferable use of the information. NO
* WARRANTY of ANY KIND is provided. This heading must NOT be removed from
* the file.
*
*/
/*************Light_State_ModeNum***当前模式号************************
0 灯光关闭
1 常亮:81 - 100%亮度
2 常亮:61 - 80%亮度
3 常亮:41 - 60%亮度
4 常亮:21 - 40%亮度
5 常亮: 0 - 20%亮度
6 慢闪烁
7 快速闪烁
8 随机闪烁
9 自动
10 左转信号灯(自动取消)
11 左转信号灯(持续)
12 右转信号灯(自动取消)
13 右转信号灯(持续)
14 危险指示灯(左右指示灯连续闪烁)
15:47 保留以备将来使用。不要使用。
48 自定义模式48
X 自定义模式“X”
63 自定义模式63
**********************************/
#include "ant_BikeLight_page_1.h"
#include "ant_BikeLight_utils.h"
#include "ant_BikeLight_page_logger.h"
#include "main.h"
/**@brief BikeLight 灯光状态(0x01) 第1页数据布局结构. */
typedef struct
{
uint8_t Light_Index; //灯光索引 0-63
uint8_t : 1; //保留
uint8_t Bike_Radar_Support : 1; //自行车雷达支持 0:不支持 1:支持
uint8_t Light_Type : 3; //灯光类型 0:前灯 2:尾灯 3:信号灯 4:信号灯-左 5:信号灯-右
uint8_t Battery_Warnings : 3; //电池提示 1:新/满 2:良好 3:正常 4:低 5:极低 6:充电
uint8_t Sub_lights_Num: 3; //子灯数量 [0,4]
uint8_t : 5;
uint8_t Last_Sequence_Number; //最近收到的命令页中包含的序列号。未初始化时设置为0xFF
uint8_t Beam_Focus; //灯光聚焦 [0,100]
uint8_t Light_State_Beam : 2; //灯光类型 0--无效 1--关闭 2--近光灯(默认) 3:远光灯
uint8_t Light_State_ModeNum : 6; //当前模式号
uint8_t Light_Intensity; //灯光亮度 [0,100]
} ant_BikeLight_page1_data_layout_t;
static void page1_data_log(ant_BikeLight_page1_data_t const *p_page_data)
{
// SEGGER_RTT_printf(0, "Light_Intensity: %d\r\n", (uint8_t)p_page_data->Light_Intensity);
// SEGGER_RTT_printf(0, "Light_State_ModeNum: %d\r\n", (uint8_t)p_page_data->Light_State_ModeNum);
// SEGGER_RTT_printf(0, "Battery_Warnings: %d\r\n", (uint8_t)p_page_data->Battery_Warnings);
}
void ant_BikeLight_page_1_encode(uint8_t *p_page_buffer,
ant_BikeLight_page1_data_t const *p_page_data)
{
ant_BikeLight_page1_data_layout_t *p_outcoming_data = (ant_BikeLight_page1_data_layout_t *)p_page_buffer;
memset(p_page_buffer, 0, sizeof(ant_BikeLight_page1_data_layout_t));
p_outcoming_data->Light_Index = p_page_data->Light_Index;
p_outcoming_data->Bike_Radar_Support = p_page_data->Bike_Radar_Support;
p_outcoming_data->Light_Type = p_page_data->Light_Type;
p_outcoming_data->Battery_Warnings = p_page_data->Battery_Warnings;
p_outcoming_data->Sub_lights_Num = p_page_data->Sub_lights_Num;
p_outcoming_data->Last_Sequence_Number = p_page_data->Last_Sequence_Number;
p_outcoming_data->Beam_Focus = p_page_data->Beam_Focus;
p_outcoming_data->Light_State_Beam = p_page_data->Light_State_Beam;
p_outcoming_data->Light_State_ModeNum = p_page_data->Light_State_ModeNum;
p_outcoming_data->Light_Intensity = p_page_data->Light_Intensity;
page1_data_log(p_page_data);
}
void ant_BikeLight_page_1_decode(uint8_t const *p_page_buffer,
ant_BikeLight_page1_data_t *p_page_data,
uint8_t const Channel)
{
ant_BikeLight_page1_data_layout_t const *p_incoming_data =
(ant_BikeLight_page1_data_layout_t *)p_page_buffer;
if (Channel == 0)
{
}
else if (Channel == BikeLight_Shared_CHANNEL_NUMBER) //共享通达发送过来的,需要转发到广播通道
{
if (m_ant_BikeLight.page_1.Light_Index == 1) //作为主灯则转发到主通道
{
if (p_incoming_data->Light_Index == 2)
{
memcpy(ANT_message_payload_Wait_2, p_incoming_data, sizeof(ant_BikeLight_page1_data_t));//复制非自身内容至共享通道缓存区
ANT_Channel_sens_message_encode(ANT_message_payload_Wait_2, 1);
}
else if (p_incoming_data->Light_Index == 3)
{
memcpy(ANT_message_payload_Wait_3, p_incoming_data, sizeof(ant_BikeLight_page1_data_t));//复制非自身内容至共享通道缓存区
ANT_Channel_sens_message_encode(ANT_message_payload_Wait_3, 1);
}
else if (p_incoming_data->Light_Index == 4)
{
memcpy(ANT_message_payload_Wait_4, p_incoming_data, sizeof(ant_BikeLight_page1_data_t));//复制非自身内容至共享通道缓存区
ANT_Channel_sens_message_encode(ANT_message_payload_Wait_4, 1);
}
else if (p_incoming_data->Light_Index == 5)
{
memcpy(ANT_message_payload_Wait_5, p_incoming_data, sizeof(ant_BikeLight_page1_data_t));//复制非自身内容至共享通道缓存区
ANT_Channel_sens_message_encode(ANT_message_payload_Wait_5, 1);
}
else if (p_incoming_data->Light_Index == 6)
{
memcpy(ANT_message_payload_Wait_6, p_incoming_data, sizeof(ant_BikeLight_page1_data_t));//复制非自身内容至共享通道缓存区
ANT_Channel_sens_message_encode(ANT_message_payload_Wait_6, 1);
}
else if (p_incoming_data->Light_Index == 7)
{
memcpy(ANT_message_payload_Wait_7, p_incoming_data, sizeof(ant_BikeLight_page1_data_t));//复制非自身内容至共享通道缓存区
ANT_Channel_sens_message_encode(ANT_message_payload_Wait_7, 1);
}
else if (p_incoming_data->Light_Index == 8)
{
memcpy(ANT_message_payload_Wait_8, p_incoming_data, sizeof(ant_BikeLight_page1_data_t));//复制非自身内容至共享通道缓存区
ANT_Channel_sens_message_encode(ANT_message_payload_Wait_8, 1);
}
else if (p_incoming_data->Light_Index == 9)
{
memcpy(ANT_message_payload_Wait_9, p_incoming_data, sizeof(ant_BikeLight_page1_data_t));//复制非自身内容至共享通道缓存区
ANT_Channel_sens_message_encode(ANT_message_payload_Wait_9, 1);
}
else if (p_incoming_data->Light_Index == 10)
{
memcpy(ANT_message_payload_Wait_10, p_incoming_data, sizeof(ant_BikeLight_page1_data_t));//复制非自身内容至共享通道缓存区
ANT_Channel_sens_message_encode(ANT_message_payload_Wait_10, 1);
}
if (ANT_PAGE_NEW_Wait != 2)
{
ANT_PAGE_NEW_Wait = 1; //发送指定页
}
}
else//否则共享通道中转发
{
if (SystemInit_Type.ANT_SHARED_CHANNEL == 1 && SystemReg.ANT_SHARED_CHANNEL == 2)
{
uint32_t err_code;
memcpy(ANT_message_payload_Shared_Wait, p_incoming_data, sizeof(ant_BikeLight_page1_data_t));//复制非自身内容至共享通道缓存区
// ANT_Relay_New_Share_Page = 1; //发送指定页
ANT_Shared_Channel_sens_message_encode(ANT_message_payload_Shared_Wait, 1);//对该命令进行重组
err_code = ANT_Send_Message(BikeLight_Shared_CHANNEL_NUMBER, ANT_message_payload_Shared_Wait);
SEGGER_RTT_printf(0, "[Channel1_Forward]---TX page_%02d: %02X %02X %02X %02X %02X %02X %02X %02X --err_code:%d\n\r", \
1, Replace_Buff(ANT_message_payload_Shared_Wait), err_code); //打印发送共享命令
// ANT_Relay_New_Share_Page = 0; //复位
}
else
{
SEGGER_RTT_printf(0, "No ININ ANT_SHARED_CHANNEL!!!\r\n");
}
}
}
}
/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved.
*
* The information contained herein is property of Nordic Semiconductor ASA.
* Terms and conditions of usage are described in detail in NORDIC
* SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
*
* Licensees are granted free, non-transferable use of the information. NO
* WARRANTY of ANY KIND is provided. This heading must NOT be removed from
* the file.
*
*/
#ifndef ANT_BIKELIGHT_PAGE_1_H__
#define ANT_BIKELIGHT_PAGE_1_H__
#include <stdint.h>
typedef struct
{
uint8_t Light_Index; //灯光索引 0-63
uint8_t : 1; //保留
uint8_t Bike_Radar_Support : 1; //自行车雷达支持 0:不支持 1:支持
uint8_t Light_Type : 3; //灯光类型 0:前灯 2:尾灯
uint8_t Battery_Warnings : 3; //电池提示 1:新/满 2:良好 3:正常 4:低 5:极低 6:充电
uint8_t Sub_lights_Num: 3; //子灯数量 [0,4]
uint8_t : 5;
uint8_t Last_Sequence_Number; //最近收到的命令页中包含的序列号。未初始化时设置为0xFF
uint8_t Beam_Focus; //灯光聚焦 [0,100]
uint8_t Light_State_Beam : 2; //灯光类型 0--无效 1--关闭 2--近光灯(默认) 3:远光灯
uint8_t Light_State_ModeNum : 6; //当前模式号
uint8_t Light_Intensity; //灯光亮度 [0,100]
} ant_BikeLight_page1_data_t;
#define DEFAULT_ANT_BikeLight_PAGE1() \
(ant_BikeLight_page1_data_t) \
{ \
.Light_Index = 0, \
.Bike_Radar_Support = 0, \
.Light_Type = 0, \
.Battery_Warnings = 2, \
.Sub_lights_Num = 0, \
.Last_Sequence_Number = 0xFF, \
.Beam_Focus = 0, \
.Light_State_Beam = 2, \
.Light_State_ModeNum = 0, \
.Light_Intensity = 0, \
}
/**@brief 编码第1页的函数。
*
* @param[in] p_page_data Pointer to the page data.
* @param[out] p_page_buffer Pointer to the data buffer.
*/
void ant_BikeLight_page_1_encode(uint8_t *p_page_buffer,
ant_BikeLight_page1_data_t const *p_page_data
);
/**@brief 解码功能第1页.
*
* @param[in] p_page_buffer Pointer to the data buffer.
* @param[out] p_page_data Pointer to the page data.
*/
void ant_BikeLight_page_1_decode(uint8_t const *p_page_buffer,
ant_BikeLight_page1_data_t *p_page_data,
uint8_t const Channel);
#endif // ANT_BIKELIGHT_PAGE_1_H__
/** @} */