- 2025-03-25
-
回复了主题帖:
邀你聊一聊:学习MCU的正确方法和你的学习之路
学个屁,进公司直接对接项目,边做边学,效率高的离谱
大厂打螺丝图一乐,小作坊全栈更锻炼人
另外MCU主要就是学外设之类的,外设的逻辑搞清楚,明白ARM的启动调试流程,其他其实没有太大区别。
-
回复了主题帖:
【STM32H7S78-DK测评】5.数字时钟
freebsder 发表于 2025-3-25 11:07
cubemx应该能生成直接支持网络的工程吧
有的,但是放进去之后的BUG没解决,UDP会卡在初始化阶段,之后会发帖子
-
回复了主题帖:
【STM32H7S78-DK测评】6.移植传感器ISM330
freebsder 发表于 2025-3-25 11:08
我和你一样,最开始什么都想自己做,结果做下来一算,还不如买现成的,还不担心质量。
目前看来最好的实践方法是先买成品,然后一点点刨析里面的内容
- 2025-03-24
-
回复了主题帖:
【STM32H7S78-DK测评】5.数字时钟
freebsder 发表于 2025-3-24 15:06
你可以找个定时器1s定时读取rtc吧
其实我的想法是扔掉RTC直接用网络来授时接入时钟的。。。可惜LWIP还没塞进去,BUG有点多
-
回复了主题帖:
【STM32H7S78-DK测评】4.调节二级页面
随文补一个展示视频:
[localvideo]dcc98569716bb26b4b3d3bad0151f2ba[/localvideo]
-
回复了主题帖:
【STM32H7S78-DK测评】6.移植传感器ISM330
freebsder 发表于 2025-3-24 15:08
看来楼主和我一样,很多时候通过充值解决问题。。。
不充钱怎么变强
-
回复了主题帖:
>>征集 | 晒电机控制痛点与难题,一起寻求最优解!
电机玩的不多,主要用一些直流和步进,也有部分用无刷电机,尤其是飞行器上的无刷电机,一般是无感的
以无感无刷电机为例,很多坛友第一时间提到“发热严重”,一般是线圈或者转轴有问题,损耗造成高摩擦或者电机绕组线圈漏电,属于较为好排查的机械故障。
更难缠的是转动不稳定问题,常见情况为电机出现异常震动,甚至堵转卡死,短时间会直接烧毁电机线圈,这种问题在无感驱动上尤为明显。
一般转动不稳定是相电流不稳定造成的,在无感无刷电机的三相绕组中,如果某一相或者某两相的电流与另外几相相差过大,就会造成电机三相电磁转矩不平衡,使电机运行不稳定,严重时可能导致电机无法转动。这种电流不平衡可能是由于电机绕组本身存在故障,如匝间短路、断路等,或者是驱动器输出电流异常引起的。
另外也可能是驱动器的问题;无感无刷电机的控制依赖于对转子位置的准确估算,以实现正确的换相控制。一单位置估算出现偏差,不准确,就会使电机的换相时机不正确,无法产生持续、稳定的转矩,甚至出现电机卡死的情况。另外如果PI控制器的比例、积分参数亦或者反馈环有问题也会发生一样的故障。
这种情况很难排查清楚,而且容易随着电机老化逐渐严重凸显。一般更先进的解决方案是检测电机震动,或者检测相电流平衡性。
-
发表了主题帖:
【STM32H7S78-DK测评】终.试用总结帖
本帖最后由 电子烂人 于 2025-3-24 13:26 编辑
【感谢】
感谢ST、EEWORLD的小伙伴和各位大佬的支持,尤其感谢@lugl4313820和@NATHAN_XI等多位大佬的鼎力相助,测评学习到了很多东西
原定测评计划:
本次的板卡主要推广ST的屏幕GUI性能,所以主要测评方向为H7S的图像性能和应用,计划使用STM32H7S制作一个实时温度监护器
第一周:测评板卡外观,熟悉手册
第二周:尝试使用TOUCHGFX驱动屏幕,移植FREERTOS系统
第三周:使用RTC定时器,并联合显示屏实现时钟功能
第四周:增加数字温度传感器,尝试在TOUCHGFX中使用图表控件的方式展示出来
第五周:使用NANOEDGE AI功能,实时监测温度数据异常
第六周:移植网络LWIP协议,并实现数据入云功能
实际成果:
【STM32H7S78-DK测评】0.测评计划前瞻 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)
【STM32H7S78-DK测评】1.收到板卡,简单测评 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)
【STM32H7S78-DK测评】2.简单TOUCHGFX点屏 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)
【STM32H7S78-DK测评】3.转轮动效菜单的实现 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)
【STM32H7S78-DK测评】4.调节二级页面 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)
【STM32H7S78-DK测评】5.数字时钟 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)
【STM32H7S78-DK测评】6.移植传感器ISM330 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)
总结:
这次评测基础任务完成较好,也学习到了很多UI控件和RTOS相关的功能。
可惜的是,最后两个功能NANOEDGE AI 和 lwip_udp 已经在单独的工程里做出来了,但是无法融入到整个做好的TOUCHGFX工程中去
之后会尝试修改并发出DEMO视频。
这个任务之后要短暂封笔了,笔者在忙自己的毕业设计和论文,不可否认的是,H7SR板子的评测为我提供了非常多的经验积累。
再次感谢EEWORLD和各位大佬的支持。
- 2025-03-23
-
回复了主题帖:
【STM32H7S78-DK测评】4.调节二级页面
Jacktang 发表于 2025-2-22 15:10
根据滑动的转轮控件,需要选择所要跳转的页面的思路是什么
就是选中哪一条,就使能哪个跳转按键
- 2025-03-15
-
回复了主题帖:
[STM32H7R/S]测评 ⑨nano edge ai studio 训练一个模型--下
重新研究了下,不太明白为什么要在BOOT下运行?是APP跑不起来吗
-
发表了主题帖:
【STM32H7S78-DK测评】6.移植传感器ISM330
本帖最后由 电子烂人 于 2025-3-23 21:51 编辑
0.前言
之前的计划是用传感器子板STEVAL-C34KAT2上的ISM330IS做传感器,但是出了一点意料之外的问题。。。
转接板早在年前就做出来了,主要问题在于那个传感器的连接器座子太不好焊了,而且间距很小很小,手贴了好几次都搞不定。
打不过我还跑不过吗,备用方案启动:直接购入一块类似传感器的扩展板卡
IKS02A1是带一个ISM330DHCX的,相比ISM330IS少了ISPU部分,但是更加精准。
感觉钱包在滴血。。。。但是为了做这个是值得的
1.板卡配置
板卡之间通过ARDUINO UNO接口对插,i2C接口链接,使能板卡上的I2C1即可
IKS02A1的底层代码在X-NUCLEO-MEMS包里有包含,仅需要使能中间件即可使用:
2.传感器代码
这边主要用到的便是ISM330其中的一轴加速度传感器,
底层代码需要移植IKS02A1的BSP包:
主要驱动部分代码参考U575的DataLogTerminal示例:
void MX_MEMS_Init(void)
{
/* USER CODE BEGIN SV */
/* USER CODE END SV */
/* USER CODE BEGIN MEMS_Init_PreTreatment */
/* USER CODE END MEMS_Init_PreTreatment */
/* Initialize the peripherals and the MEMS components */
MX_IKS02A1_DataLogTerminal_Init();
/* USER CODE BEGIN MEMS_Init_PostTreatment */
/* USER CODE END MEMS_Init_PostTreatment */
}
/*
* LM background task
*/
int32_t MX_MEMS_Process(void)
{
/* USER CODE BEGIN MEMS_Process_PreTreatment */
IKS02A1_MOTION_SENSOR_Axes_t acceleration;
int32_t i;
/* USER CODE END MEMS_Process_PreTreatment */
//MX_IKS02A1_DataLogTerminal_Process();
/* USER CODE BEGIN MEMS_Process_PostTreatment */
for(i = 0; i < IKS02A1_MOTION_INSTANCES_NBR; i++)
{
IKS02A1_MOTION_SENSOR_GetAxes(i, MOTION_ACCELERO, &acceleration);
}
return acceleration.x;
/* USER CODE END MEMS_Process_PostTreatment */
}
/**
* [url=home.php?mod=space&uid=159083]@brief[/url] Initialize the DataLogTerminal application
* @retval None
*/
void MX_IKS02A1_DataLogTerminal_Init(void)
{
//displayFloatToInt_t out_value_odr;
//int16_t i;
IKS02A1_MOTION_SENSOR_Init(IKS02A1_ISM330DHCX_0, MOTION_ACCELERO | MOTION_GYRO);
//IKS02A1_MOTION_SENSOR_Init(IKS02A1_IIS2DLPC_0, MOTION_ACCELERO);
//IKS02A1_MOTION_SENSOR_Init(IKS02A1_IIS2MDC_0, MOTION_MAGNETO);
/*
for(i = 0; i < IKS02A1_MOTION_INSTANCES_NBR; i++)
{
IKS02A1_MOTION_SENSOR_GetCapabilities(i, &MotionCapabilities[i]);
snprintf(dataOut, MAX_BUF_SIZE,
"\r\nMotion Sensor Instance %d capabilities: \r\n ACCELEROMETER: %d\r\n GYROSCOPE: %d\r\n MAGNETOMETER: %d\r\n LOW POWER: %d\r\n",
i, MotionCapabilities[i].Acc, MotionCapabilities[i].Gyro, MotionCapabilities[i].Magneto, MotionCapabilities[i].LowPower);
printf("%s", dataOut);
floatToInt(MotionCapabilities[i].AccMaxOdr, &out_value_odr, 3);
snprintf(dataOut, MAX_BUF_SIZE, " MAX ACC ODR: %d.%03d Hz, MAX ACC FS: %d\r\n", (int)out_value_odr.out_int,
(int)out_value_odr.out_dec, (int)MotionCapabilities[i].AccMaxFS);
printf("%s", dataOut);
floatToInt(MotionCapabilities[i].GyroMaxOdr, &out_value_odr, 3);
snprintf(dataOut, MAX_BUF_SIZE, " MAX GYRO ODR: %d.%03d Hz, MAX GYRO FS: %d\r\n", (int)out_value_odr.out_int,
(int)out_value_odr.out_dec, (int)MotionCapabilities[i].GyroMaxFS);
printf("%s", dataOut);
floatToInt(MotionCapabilities[i].MagMaxOdr, &out_value_odr, 3);
snprintf(dataOut, MAX_BUF_SIZE, " MAX MAG ODR: %d.%03d Hz, MAX MAG FS: %d\r\n", (int)out_value_odr.out_int,
(int)out_value_odr.out_dec, (int)MotionCapabilities[i].MagMaxFS);
printf("%s", dataOut);
}
*/
}
3.屏幕显示
传感器驱动完成后,要反馈到屏幕上,在“电机监测”界面添加一个文本框,设置为带数值的:
之后设置代码:
void MonitorView::handleTickEvent ()
{
float acc_Date;
tickCounter++;
if(tickCounter>1000)
{
tickCounter = 0;
}
if (tickCounter % 5 == 0)
{
if(0 == acc_Date)
{
acc_Date=MX_MEMS_Process();
Unicode::snprintfFloat(textArea1Buffer,20,"%.1f",acc_Date);
textArea1.invalidate();
}
}
}
4.成果展示
由于地球重力,当被立起来之后加速度计X轴的数值会变大
[localvideo]95cf6d7da7fcd0d7248a27abf985a67a[/localvideo]
- 2025-02-28
-
回复了主题帖:
手机摄像头坏了,有什么实惠点的拍摄方案
极限零 发表于 2025-2-27 13:09
话说2023年买的,为什么买2020出的手机啊,那几年手机性能更新超快的
一方面是情怀,当时看到简直是梦中神机;
另一方面因为没有喜欢的型号。。。全网除了挖孔屏就是水滴,真的丑
- 2025-02-27
-
回复了主题帖:
STM32C0移植LSM6DS3数据卡死
wangerxian 发表于 2025-2-27 16:44
现在ST的硬件IIC还会卡死?没有超时机制吗
就是超时TIMEOUT了
-
回复了主题帖:
STM32C0移植LSM6DS3数据卡死
初始化配置如图,感觉每次用GIT上的代码都有类似的情况,是代码移植有问题吗?
-
发表了主题帖:
STM32C0移植LSM6DS3数据卡死
遇到了之前做评测相似的问题,STM32C0移植LSM6DS3时候,数据不通过RST检测,感觉是一直卡在了复位上
do {
lsm6ds3tr_c_reset_get(&dev_ctx, &rst);
} while (rst);
手动设置复位寄存器之后,还是只会显示一次数据后卡死,每次显示数据一致
而且这个值完全不像是正常采集出来的值,
具体DEBUG发现是卡在了I2C的timeOUT 函数里
感觉像是压根没有正常读取数据?
贴上原代码来求教,不胜感激
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
MX_I2C1_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
lsm6ds3tr_c_read_data_polling();
}
/* USER CODE END 3 */
}
/**
* [url=home.php?mod=space&uid=159083]@brief [/url] System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
__HAL_FLASH_SET_LATENCY(FLASH_LATENCY_1);
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
Error_Handler();
}
}
/* USER CODE BEGIN 4 */
void lsm6ds3tr_c_read_data_polling(void)
{
/* Initialize mems driver interface */
stmdev_ctx_t dev_ctx;
dev_ctx.write_reg = platform_write;
dev_ctx.read_reg = platform_read;
// dev_ctx.mdelay = platform_delay;
dev_ctx.handle = &hi2c1;
/* Wait sensor boot time */
HAL_Delay(BOOT_TIME);
/* Check device ID */
lsm6ds3tr_c_device_id_get(&dev_ctx, &whoamI);
if ( whoamI != LSM6DS3TR_C_ID )
while (1); /*manage here device not found */
/* Restore default configuration*/
lsm6ds3tr_c_reset_set(&dev_ctx, PROPERTY_ENABLE);
do {
lsm6ds3tr_c_reset_get(&dev_ctx, &rst);
} while (rst);
/* Enable Block Data Update */
// lsm6ds3tr_c_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
/* Set Output Data Rate */
lsm6ds3tr_c_xl_data_rate_set(&dev_ctx, LSM6DS3TR_C_XL_ODR_12Hz5);
lsm6ds3tr_c_gy_data_rate_set(&dev_ctx, LSM6DS3TR_C_GY_ODR_12Hz5);
/* Set full scale */
lsm6ds3tr_c_xl_full_scale_set(&dev_ctx, LSM6DS3TR_C_2g);
lsm6ds3tr_c_gy_full_scale_set(&dev_ctx, LSM6DS3TR_C_2000dps);
/* Configure filtering chain(No aux interface) */
/* Accelerometer - analog filter */
//lsm6ds3tr_c_xl_filter_analog_set(&dev_ctx,LSM6DS3TR_C_XL_ANA_BW_400Hz);
/* Accelerometer - LPF1 path ( LPF2 not used )*/
//lsm6ds3tr_c_xl_lp1_bandwidth_set(&dev_ctx, LSM6DS3TR_C_XL_LP1_ODR_DIV_4);
/* Accelerometer - LPF1 + LPF2 path */
//lsm6ds3tr_c_xl_lp2_bandwidth_set(&dev_ctx,LSM6DS3TR_C_XL_LOW_NOISE_LP_ODR_DIV_100);
/* Accelerometer - High Pass / Slope path */
//lsm6ds3tr_c_xl_reference_mode_set(&dev_ctx, PROPERTY_DISABLE);
//lsm6ds3tr_c_xl_hp_bandwidth_set(&dev_ctx, LSM6DS3TR_C_XL_HP_ODR_DIV_100);
/* Gyroscope - filtering chain */
//lsm6ds3tr_c_gy_band_pass_set(&dev_ctx,LSM6DS3TR_C_HP_260mHz_LP1_STRONG);
/* Read samples in polling mode (no int) */
while (1) {
/* Read output only if new value is available */
lsm6ds3tr_c_reg_t reg;
lsm6ds3tr_c_status_reg_get(&dev_ctx, ®.status_reg);
if (reg.status_reg.xlda) {
/* Read magnetic field data */
memset(data_raw_acceleration, 0x00, 3 * sizeof(int16_t));
lsm6ds3tr_c_acceleration_raw_get(&dev_ctx,
data_raw_acceleration);
acceleration_mg[0] = lsm6ds3tr_c_from_fs2g_to_mg(
data_raw_acceleration[0]);
acceleration_mg[1] = lsm6ds3tr_c_from_fs2g_to_mg(
data_raw_acceleration[1]);
acceleration_mg[2] = lsm6ds3tr_c_from_fs2g_to_mg(
data_raw_acceleration[2]);
}
if (reg.status_reg.gda) {
/* Read magnetic field data */
memset(data_raw_angular_rate, 0x00, 3 * sizeof(int16_t));
lsm6ds3tr_c_angular_rate_raw_get(&dev_ctx,
data_raw_angular_rate);
angular_rate_mdps[0] = lsm6ds3tr_c_from_fs2000dps_to_mdps(
data_raw_angular_rate[0]);
angular_rate_mdps[1] = lsm6ds3tr_c_from_fs2000dps_to_mdps(
data_raw_angular_rate[1]);
angular_rate_mdps[2] = lsm6ds3tr_c_from_fs2000dps_to_mdps(
data_raw_angular_rate[2]);
}
if (reg.status_reg.tda) {
/* Read temperature data */
memset(&data_raw_temperature, 0x00, sizeof(int16_t));
lsm6ds3tr_c_temperature_raw_get(&dev_ctx, &data_raw_temperature);
temperature_degC = lsm6ds3tr_c_from_lsb_to_celsius(
data_raw_temperature );
}
}
}
/*
* @brief Write generic device register (platform dependent)
*
* @param handle customizable argument. In this examples is used in
* order to select the correct sensor bus handler.
* @param reg register to write
* @param bufp pointer to data to write in register reg
* @param len number of consecutive register to write
*
*/
static int32_t platform_write(void *handle, uint8_t reg, const uint8_t *bufp,
uint16_t len)
{
HAL_I2C_Mem_Write(handle, LSM6DS3TR_C_I2C_ADD_L, reg,
I2C_MEMADD_SIZE_8BIT, (uint8_t*) bufp, len, 1000);
return 0;
}
/*
* @brief Read generic device register (platform dependent)
*
* @param handle customizable argument. In this examples is used in
* order to select the correct sensor bus handler.
* @param reg register to read
* @param bufp pointer to buffer that store the data read
* @param len number of consecutive register to read
*
*/
static int32_t platform_read(void *handle, uint8_t reg, uint8_t *bufp,
uint16_t len)
{
HAL_I2C_Mem_Read(handle, LSM6DS3TR_C_I2C_ADD_L, reg,
I2C_MEMADD_SIZE_8BIT, bufp, len, 1000);
return 0;
}
/*
* @brief Write generic device register (platform dependent)
*
* @param tx_buffer buffer to transmit
* @param len number of byte to send
*
*/
/* USER CODE END 4 */
- 2025-02-26
-
回复了主题帖:
手机摄像头坏了,有什么实惠点的拍摄方案
吾妻思萌 发表于 2025-2-26 07:30
听我的 买新手机,手机目前快成生产力了
直播 外卖 滴滴,很多人自媒体小红是都手机用来赚钱了
你换新手机 ...
倒也想换,奈何现在一个新手机顶我一个月工资了
打开电商一看怎么都这么贵,还是买个二手机过度下得了
- 2025-02-25
-
发表了主题帖:
手机摄像头坏了,有什么实惠点的拍摄方案
上周骑车把手机磕了一下,主摄像头摔的不能用了,挺影响拍东西的,最近的帖子都没法贴图片
[localvideo]a6c06c6868c452351213867a0ba95a6b[/localvideo]
这台红米K30陪我征战2年了,还是2020年的机型。换手机的话,也没有看到同款类似的升降摄像头设计,其他的都不喜欢
问下万能的坛友,有什么其他拍摄桌面的方法,拍些开发板就足够了
- 2025-02-22
-
回复了主题帖:
掀桌子了,已提离职。最近求职行情咋样
说不好找的是没什么本事和技术在身的大学生,1100w的“闲杂人员”
技术过硬的话其实猎头都抢着要,就是薪资待遇好坏的问题了
- 2025-02-21
-
回复了主题帖:
【Raspberry Pi 5测评】6.WS2812点灯
freebsder 发表于 2025-2-20 19:17
点灯没有动图就完全不够炫酷了。
加班要累死了,周末统一补上
- 2025-02-20
-
发表了主题帖:
【STM32H7S78-DK测评】4.调节二级页面
本帖最后由 电子烂人 于 2025-2-20 14:15 编辑
1.前言:
之前的帖子成功实现了主菜单转轮效果(【STM32H7S78-DK测评】3.转轮动效菜单的实现 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn))不过当时只做了只有一个按键,跳转的页面也是固定的。并且由于按键的选区有部分位于转轮的控件区域,偶尔会有无法拖动的情况。
如果要实行跳转的话,官方的办法是在来的基础上加入一个过度页面,这样做更麻烦了。
这篇帖子试一下不同二级页面的设置,并优化一下转轮的“死区”。
2.设计思路:
由于转轮特效只提供基础的选择功能,并在转轮停止后返回一个当前选中的值,如果要加入按键的话,单个按键只能对应一个页面跳转功能。
初始的想法是让按键跳转页面,根据滑动的转轮控件,选择所要跳转的页面。但是
3.页面设置:
在原来的工程的基础上,加入6个二级页面
这六个页面分别对应转盘上的六个选项,再把每个页面保留一个返回键这样页面的返回跳转就做好了。
为了让主页面能精准的跳转到二级页面,在转轮右侧原先按键的位置,放着6个重叠的按键,并设置为隐藏:
分别命名好各种功能,并每一个绑定跳转不同的页面。
在代码中修改,让转轮调用到一个的时候,右侧按键使能并显示当前选中的,其他的被不使能:
void mainMenuView::scrollWheel1_ItemSelectedHandler(int16_t itemSelected)
{
presenter->menuSelected(itemSelected);
switch (itemSelected)
{
case 0://Monitor
buttonEnterMonitor.setVisible(true);
buttonEnterMonitor.invalidate();
buttonEnterTemp.setVisible(false);
buttonEnterTemp.invalidate();
buttonEnterAD.setVisible(false);
buttonEnterAD.invalidate();
buttonEnterDetails.setVisible(false);
buttonEnterDetails.invalidate();
buttonEnterMesh.setVisible(false);
buttonEnterMesh.invalidate();
buttonEnterInfo.setVisible(false);
buttonEnterInfo.invalidate();
break;
case 1://Temp
buttonEnterMonitor.setVisible(false);
buttonEnterMonitor.invalidate();
buttonEnterTemp.setVisible(true);
buttonEnterTemp.invalidate();
buttonEnterAD.setVisible(false);
buttonEnterAD.invalidate();
buttonEnterDetails.setVisible(false);
buttonEnterDetails.invalidate();
buttonEnterMesh.setVisible(false);
buttonEnterMesh.invalidate();
buttonEnterInfo.setVisible(false);
buttonEnterInfo.invalidate();
break;
case 2://AD
buttonEnterMonitor.setVisible(false);
buttonEnterMonitor.invalidate();
buttonEnterTemp.setVisible(false);
buttonEnterTemp.invalidate();
buttonEnterAD.setVisible(true);
buttonEnterAD.invalidate();
buttonEnterDetails.setVisible(false);
buttonEnterDetails.invalidate();
buttonEnterMesh.setVisible(false);
buttonEnterMesh.invalidate();
buttonEnterInfo.setVisible(false);
buttonEnterInfo.invalidate();
break;
case 3://Details
buttonEnterMonitor.setVisible(false);
buttonEnterMonitor.invalidate();
buttonEnterTemp.setVisible(false);
buttonEnterTemp.invalidate();
buttonEnterAD.setVisible(false);
buttonEnterAD.invalidate();
buttonEnterDetails.setVisible(true);
buttonEnterDetails.invalidate();
buttonEnterMesh.setVisible(false);
buttonEnterMesh.invalidate();
buttonEnterInfo.setVisible(false);
buttonEnterInfo.invalidate();
break;
case 4://Mesh
buttonEnterMonitor.setVisible(false);
buttonEnterMonitor.invalidate();
buttonEnterTemp.setVisible(false);
buttonEnterTemp.invalidate();
buttonEnterAD.setVisible(false);
buttonEnterAD.invalidate();
buttonEnterDetails.setVisible(false);
buttonEnterDetails.invalidate();
buttonEnterMesh.setVisible(true);
buttonEnterMesh.invalidate();
buttonEnterInfo.setVisible(false);
buttonEnterInfo.invalidate();
break;
case 5://Info
buttonEnterMonitor.setVisible(false);
buttonEnterMonitor.invalidate();
buttonEnterTemp.setVisible(false);
buttonEnterTemp.invalidate();
buttonEnterAD.setVisible(false);
buttonEnterAD.invalidate();
buttonEnterDetails.setVisible(false);
buttonEnterDetails.invalidate();
buttonEnterMesh.setVisible(false);
buttonEnterMesh.invalidate();
buttonEnterInfo.setVisible(true);
buttonEnterInfo.invalidate();
break;
default:
break;
}
}
即可完成二级页面的跳转切换功能。