MTK6768 Android13 亮度条均匀调节实现
文章目录
- 需求:
- 问题现象:
- 需求实现疑难问题点:
- 相关资源
- 修改的文件
- 调试技巧
- 具体需求实现
- 去除亮度弹框
- 设置去掉跳转逻辑
- SystemUI亮度条长按跳转屏蔽
- 实现亮度均匀调节
- PhoneWindowManager.java
- BrightnessUtils convertLinearToGammaFloat
- BrightnessSynchronizer brightnessIntToFloat brightnessFloatToIntRange
- ToggleSlider
- BrightnessController onChanged
- setBrightness(valFloat);
- 延伸内容
- DisplayManager setBrightness
- DisplayManagerGlobal setBrightness
- DisplayManagerService setBrightness
- 总结
需求:
- 物理按键亮度调节做均匀调节处理
- 屏蔽物理按键调亮度条界面
问题现象:
- 当前亮度调节到最低:点击亮度+ 物理按键,SystemUI的下拉框的亮度条和亮度显示值 或者 在设置界面的亮度条
亮度显示值和亮度进度条一下子变成了50%; 反之也是一样。 - 基于问题1的现象,在亮度调节到50% 以上的时候,点击加或者减按钮时候,实际调节值不一样,非线性调节。
需求实现疑难问题点:
-
亮度条弹框是有两个地方: 都需要屏蔽
下拉框亮度条长按进入亮度条控制镜像
设置界面,设置->显示->亮度 点击会弹出亮度控制界面,和上面的亮度控制镜像是两个内容 -
亮度设置分为两个部分:UI上面的亮度条是一个SeekBar,调节设置;物理按键控制设置;
-
MTK6768产品,或者其它产品,因为恒压电路板电量功率原因、屏幕原因、显示底层原因 等多种原因
本身是一个复杂的体系,方方面面会造成亮度不均匀调节。 -
分析到最后发现,亮度本身就是线性调节的,那如何规避或者解决,达到实际用户体验上感觉亮度是线性的。
-
调试中,亮度调节到最低后,始终调节不下去了。比如 调节亮度到13%、5% ,亮度值或者亮度条再也调节不下去了。
-
调节亮度调节到最后,调节到亮度值为0 的时候,亮度却变成了最亮。
相关资源
实现本需求,结合自己以前写过的相关内容的笔记,结合起来了解相关最基本的基础内容:
实现本需求,结合自己以前写过的相关内容的笔记,结合起来了解相关最基本的基础内容:
Android12_SystemUI下拉框新增音量控制条-熟悉brightness
包下面的几个关键类:
熟悉几个关键类 并 熟悉 每个类的具体作用,方便对亮度条操控和新增功能BrightnessController.java :对外的控制器 BrightnessController implements ToggleSlider.Listener BrightnessSlider.java : 本质上也是一个View,带了ViewController控制器,extends ViewController<BrightnessSliderView> implements ToggleSliderToggleSlider.java : 定义进度条控制器的接口,如:进度条变化回调 onChanged、setMax、getMax、getValue、setValueBrightnessDialog.java :显示亮度的Activity,里面加载的是Dialog,源码暂未使用 BrightnessSliderView.java :SeekBar的根布局文件,包裹ToggleSeekBar 的View,本质是一个FrameLayout 布局ToggleSeekBar.java :SeekBar
Android13_SystemUI下拉新增音量控制条
查看跟亮度模块相关的部分
android 修改最低亮度值,不要太暗
Android亮度范围定制
DisplayManagerService 亮度调节
PowerManagerService
Android framework配置默认屏幕亮度值源码分析
Android10 安卓修改屏幕背光默认亮度
模拟Power长按事件实现应用调用 熟悉按键分发机制
基础的基本内容的核心要求就是熟悉亮度模块的基本类和工具类:通过下拉框进度条和范围作为入口来关联相关的类 来进一步熟悉。
修改的文件
frameworks/base/core/java/com/android/internal/display/BrightnessSynchronizer.java
frameworks/base/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
vendor/mediatek/proprietary/packages/apps/SystemUI/AndroidManifest.xml
vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java
vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java
vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderView.java
vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/brightness/ToggleSlider.java
vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/volume/VolumeSliderController.java
/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/display/BrightnessLevelPreferenceController.java
调试技巧
在没有亮度物理按键的情况下,模拟调节亮度物理按键
降低屏幕亮度: input keyevent 220
提高屏幕亮度: input keyevent 221
具体需求实现
去除亮度弹框
设置去掉跳转逻辑
系统设置找到对应的Activity,在跳转的地方屏蔽掉 跳转逻辑。AndroidManifest 可改可不改
@Overridepublic boolean handlePreferenceTreeClick(Preference preference) {if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {return false;}final Intent intent = new Intent(ACTION_SHOW_BRIGHTNESS_DIALOG);intent.putExtra(SettingsBaseActivity.EXTRA_PAGE_TRANSITION_TYPE,SettingsTransitionHelper.TransitionType.TRANSITION_NONE);// Start activity in the same task and pass fade animations//wangfangchen add /*final ActivityOptions options = ActivityOptions.makeCustomAnimation(mContext,android.R.anim.fade_in, android.R.anim.fade_out);mContext.startActivityForResult(preference.getKey(), intent, 0, options.toBundle());*///wangfangchen end return true;}
SystemUI亮度条长按跳转屏蔽
BrightnessSliderController.java@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {mTracking = true;if (mListener != null) {mListener.onChanged(mTracking, getValue(), false);}/*if (mMirrorController != null) {mMirrorController.showMirror();mMirrorController.setLocationAndSize(mView);}*/}
实现亮度均匀调节
PhoneWindowManager.java
为什么要看这个,或者说一定要看,从根本的角度来看物理按键触发后到底做了什么
case KeyEvent.KEYCODE_BRIGHTNESS_UP:case KeyEvent.KEYCODE_BRIGHTNESS_DOWN:if (down) {int direction = keyCode == KeyEvent.KEYCODE_BRIGHTNESS_UP ? 1 : -1;// Disable autobrightness if it's onint auto = Settings.System.getIntForUser(mContext.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS_MODE,Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL,UserHandle.USER_CURRENT_OR_SELF);if (auto != 0) {Settings.System.putIntForUser(mContext.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS_MODE,Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL,UserHandle.USER_CURRENT_OR_SELF);}float min = mPowerManager.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM);float max = mPowerManager.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM);float step = (max - min) / BRIGHTNESS_STEPS * direction;int screenDisplayId = displayId < 0 ? DEFAULT_DISPLAY : displayId;float brightness = mDisplayManager.getBrightness(screenDisplayId);//wangfangchen add Log.d(TAG, "brightness brightness:=" + brightness+" step:"+step+"========"); //wangfangchen end brightness += step;// Make sure we don't go beyond the limits.brightness = Math.min(max, brightness);brightness = Math.max(min, brightness);//wangfangchen add Log.d(TAG, "brightness brightness:=" + brightness+" max:"+max+" min:"+min); if(brightness>1||brightness<0.1){brightness=0.02f;Log.d(TAG, "brightness to large,let brightness ==0.02");}//wangfangchen end mDisplayManager.setBrightness(screenDisplayId, brightness);startActivityAsUser(new Intent(Intent.ACTION_SHOW_BRIGHTNESS_DIALOG),UserHandle.CURRENT_OR_SELF);}
可以看出,最终亮度加减按钮调节亮度 通过调用方法:
mDisplayManager.setBrightness(screenDisplayId, brightness);
所以遇到异常的时候,如上面疑难点中的 亮度调节到0变成最亮、亮度调到小的时候不可调节 在这里check 问题原因。
BrightnessUtils convertLinearToGammaFloat
关注方法:
/*** Version of {@link #convertLinearToGamma} that takes float values.* TODO: brightnessfloat merge with above method(?)* @param val The brightness setting value.* @param min The minimum acceptable value for the setting.* @param max The maximum acceptable value for the setting.* @return The corresponding slider value*///wangfangchen add //public static final int convertLinearToGammaFloat(float val, float min, float max) {public static final int convertLinearToGammaFloat(float originalFloat, float min, float max) {BigDecimal bd = BigDecimal.valueOf(originalFloat);bd = bd.setScale(1, RoundingMode.HALF_UP); // 保留一位小数,四舍五入float val = bd.floatValue();// For some reason, HLG normalizes to the range [0, 12] rather than [0, 1]final float normalizedVal = MathUtils.norm(min, max, val) * 12;final float ret;Log.d(TAG,"convertLinearToGammaFloat originalFloat:"+originalFloat +" min:"+min+" max:"+max+" val:"+val+" normalizedVal:"+normalizedVal+" normalizedVal:"+normalizedVal);if (normalizedVal <= 1f) {ret = MathUtils.sqrt(normalizedVal) * R;} else {ret = A * MathUtils.log(normalizedVal - B) + C;}Log.d(TAG," ret:"+ret+" return value:"+Math.round(MathUtils.lerp(GAMMA_SPACE_MIN, GAMMA_SPACE_MAX, ret)));//return Math.round(MathUtils.lerp(GAMMA_SPACE_MIN, GAMMA_SPACE_MAX, ret));float ratio = (float)(val - min)/ (max - min);Log.d(TAG," shiji val:"+val+" min:"+min+" max:"+max+" return value:"+(int)(ratio * GAMMA_SPACE_MAX));Log.d(TAG," GAMMA_SPACE_MAX*val:"+(int)GAMMA_SPACE_MAX*val);int valueData= (int) (GAMMA_SPACE_MAX*val);Log.d(TAG," valueData:"+valueData);return valueData;}
这个方法,就是用convertLinearToGammaFloat 将线性值转换为伽马校正后的浮点值的过程,这个地方就是造成非线性的根本原因。
如果我们改成线性 ,显示上面就是线性显示了,实际的亮度值 可能就不是线性显示了。 为了 解决实际亮度值线性显示,那么就需要控制档位了,只显示60%-100%.
如 上述的笔记参考:Android亮度范围定制
BrightnessSynchronizer brightnessIntToFloat brightnessFloatToIntRange
/*** Converts between the int brightness system and the float brightness system.*/public static float brightnessIntToFloat(int brightnessInt) {if (brightnessInt == PowerManager.BRIGHTNESS_OFF) {return PowerManager.BRIGHTNESS_OFF_FLOAT;} else if (brightnessInt == PowerManager.BRIGHTNESS_INVALID) {return PowerManager.BRIGHTNESS_INVALID_FLOAT;} else {final float minFloat = PowerManager.BRIGHTNESS_MIN;final float maxFloat = PowerManager.BRIGHTNESS_MAX;//wangfangchen add //final float minInt = PowerManager.BRIGHTNESS_OFF + 1;Log.d(TAG," brightnessIntToFloat: minInt:"+PowerManager.BRIGHTNESS_OFF + 1);float minInt =0f;final float maxInt = PowerManager.BRIGHTNESS_ON;Log.d(TAG," brightnessIntToFloat: maxInt:"+PowerManager.BRIGHTNESS_ON);Log.d(TAG," brightnessIntToFloat: brightnessInt:"+brightnessInt);//wangfangchen endreturn MathUtils.constrainedMap(minFloat, maxFloat, minInt, maxInt, brightnessInt);}}/*** Translates specified value from the float brightness system to the int brightness system,* given the min/max of each range. Accounts for special values such as OFF and invalid values.* Value returned as a float primitive (to preserve precision), but is a value within the* int-system range.*/public static float brightnessFloatToIntRange(float brightnessFloat) {if (floatEquals(brightnessFloat, PowerManager.BRIGHTNESS_OFF_FLOAT)) {return PowerManager.BRIGHTNESS_OFF;} else if (Float.isNaN(brightnessFloat)) {return PowerManager.BRIGHTNESS_INVALID;} else {final float minFloat = PowerManager.BRIGHTNESS_MIN;final float maxFloat = PowerManager.BRIGHTNESS_MAX;//wangfangchen add //final float minInt = PowerManager.BRIGHTNESS_OFF + 1;float minInt =0f;//wangfangchen end final float maxInt = PowerManager.BRIGHTNESS_ON;return MathUtils.constrainedMap(minInt, maxInt, minFloat, maxFloat, brightnessFloat);}}在转换亮度范围的地方法,设置亮度范围值,这里可能涉及到亮度范围定制需求,如上笔记分析。 float minInt =0f; 表示最低亮度设置为0
ToggleSlider
顶层接口,添加接口方法:
public interface ToggleSlider {interface Listener {void onChanged(boolean tracking, int value, boolean stopTracking);}void setEnforcedAdmin(RestrictedLockUtils.EnforcedAdmin admin);void setMirrorControllerAndMirror(BrightnessMirrorController c);boolean mirrorTouchEvent(MotionEvent ev);void setOnChangedListener(Listener l);void setMax(int max);int getMax();//wangfangchen add void setMin(int max);int getMin();//wangfangchen end void setValue(int value);int getValue();void showView();void hideView();boolean isVisible();
}
为什么添加这两个方法?
- void setMin(int max);
- int getMin();
给View 用,因为下拉框的亮度条,是需要新增最新亮度值的,默认是有最大亮度值的65535。 因为可能涉及到定制亮度在60%-100 之间调节,所以需要有最小亮度的控制。
BrightnessController onChanged
在下拉框,控制亮度条的时候,亮度为什么会变化? SeekBar 控制后肯定设置了亮度的呀,我们找到对应的方法,看看源码。
@Overridepublic void onChanged(boolean tracking, int value, boolean stopTracking) {if (mExternalChange) return;if (mSliderAnimator != null) {mSliderAnimator.cancel();}final float minBacklight;final float maxBacklight;final int metric;if (mIsVrModeEnabled) {metric = MetricsEvent.ACTION_BRIGHTNESS_FOR_VR;minBacklight = mMinimumBacklightForVr;maxBacklight = mMaximumBacklightForVr;} else {metric = mAutomatic? MetricsEvent.ACTION_BRIGHTNESS_AUTO: MetricsEvent.ACTION_BRIGHTNESS;minBacklight = mBrightnessMin;maxBacklight = mBrightnessMax;}final float valFloat = MathUtils.min(convertGammaToLinearFloat(value, minBacklight, maxBacklight),maxBacklight);if (stopTracking) {// TODO(brightnessfloat): change to use float value instead.MetricsLogger.action(mContext, metric,BrightnessSynchronizer.brightnessFloatToInt(valFloat));}Log.d(TAG," onChanged setBrightness valFloat:"+valFloat);//wangfangchen add // setBrightness(valFloat);// if (!tracking) {//wangfangchen end AsyncTask.execute(new Runnable() {public void run() {//wangfangchen add Log.d(TAG,"onChanged valFloat:"+valFloat);//0.0017if(valFloat>1||valFloat<0.002){// brightness=0.002f;float brightness=0.002f;Log.d(TAG, "onChanged brightness to large,let brightness ==0.002f");mDisplayManager.setBrightness(mDisplayId, brightness);}else{Log.d(TAG, "brightness setBrightness:"+valFloat);mDisplayManager.setBrightness(mDisplayId, valFloat);}//wangfangchen end }});//wangfangchen add //}//wangfangchen end }
这里我们找到了我们熟悉的方法:在PhoneWindowManager 里面我们看到过 setBrightness
mDisplayManager.setBrightness(mDisplayId, valFloat);
和在PhoneWindowManager 里面的 setBrightness 一样,调试具体哪里问题,适配来解决可能出现的:亮度无法调节、最小亮度可能实际变成最亮。
setBrightness(valFloat);
我们看看这个方法做什么的
private void setBrightness(float brightness) {//wangfangchen add Log.d(TAG," setBrightness brightness:"+brightness);Log.d(TAG,"setTemporaryBrightness brightness :"+brightness);//wangfangchen end mDisplayManager.setTemporaryBrightness(mDisplayId, brightness);}setTemporaryBrightness 其实也是设置一次亮度。 暂不关心,我们直接屏蔽掉。
其它修改类,我们暂不分析,通过上面源码分析,核心本质内容:
- 亮度适配:按键和下拉框进度条
- 新增接口方法,实现后续可能定制的亮度范围区间控制
延伸内容
结合上面控制亮度的方法作为入口:
mDisplayManager.setBrightness
DisplayManager setBrightness
/*** Sets the brightness of the specified display.* <p>* Requires the {@link android.Manifest.permission#CONTROL_DISPLAY_BRIGHTNESS}* permission.* </p>** @param displayId the logical display id* @param brightness The brightness value from 0.0f to 1.0f.** @hide*/@RequiresPermission(Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS)public void setBrightness(int displayId, @FloatRange(from = 0f, to = 1f) float brightness) {mGlobal.setBrightness(displayId, brightness);}
DisplayManagerGlobal setBrightness
/*** Sets the brightness of the display.** @param brightness The brightness value from 0.0f to 1.0f.** @hide*/public void setBrightness(int displayId, float brightness) {try {mDm.setBrightness(displayId, brightness);} catch (RemoteException ex) {throw ex.rethrowFromSystemServer();}}
DisplayManagerService setBrightness
@Override // Binder callpublic void setBrightness(int displayId, float brightness) {mContext.enforceCallingOrSelfPermission(Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS,"Permission required to set the display's brightness");Log.d(TAG,"setBrightness brightness:"+brightness);if (!isValidBrightness(brightness)) {Slog.w(TAG, "Attempted to set invalid brightness" + brightness);return;}final long token = Binder.clearCallingIdentity();try {synchronized (mSyncRoot) {DisplayPowerController dpc = mDisplayPowerControllers.get(displayId);if (dpc != null) {dpc.setBrightness(brightness);}mPersistentDataStore.saveIfNeeded();}} finally {Binder.restoreCallingIdentity(token);}}private static boolean isValidBrightness(float brightness) {return !Float.isNaN(brightness)&& (brightness >= PowerManager.BRIGHTNESS_MIN)&& (brightness <= PowerManager.BRIGHTNESS_MAX);}
总结
- 亮度条均匀调节实现 只是一个需求而已,通过此需求 需要掌握的基本知识技能如下:
- 熟悉物理按键触发流程,进一步了解 PhoneWindowManager
- 熟悉亮度控制逻辑和业务
- 熟悉亮度brightness模块
- 熟悉亮度范围定制
相关文章:
MTK6768 Android13 亮度条均匀调节实现
文章目录 需求:问题现象:需求实现疑难问题点:相关资源修改的文件调试技巧具体需求实现去除亮度弹框设置去掉跳转逻辑SystemUI亮度条长按跳转屏蔽 实现亮度均匀调节PhoneWindowManager.javaBrightnessUtils convertLinearToGammaFloatBrightne…...
力扣560和为K的数组
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1], k 2 输出:2示例 2: 输入:nums [1,2,3], …...
【MVCC过程中会加锁吗?】
MVCC过程中会加锁吗? 一、MVCC的工作原理二、MVCC的并发控制三、MVCC中的加锁情况在MVCC(Multi-Version Concurrency Control,多版本并发控制)过程中, 通常不需要加锁来控制并发访问。 MVCC是一种数据并发控制技术,它允许在不同的事务中对同一数据进行并发访问,而不需要…...
LeetCode100之搜索二维矩阵(46)--Java
1.问题描述 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回…...
Android BottomNavigationView不加icon使text垂直居中,完美解决。
这个问题网上千篇一律的设置iconsize为0,labale固定什么的,都没有效果。我的这个基本上所有人用都会有效果。 问题解决之前的效果:垂直方向,文本不居中,看着很难受 问题解决之后:舒服多了 其实很简单&…...
cmake + vscode + mingw 开发环境配置
1.软件准备 准备如下软件: mingw64(安装完成之后检测是否有环境变量,如果没有需要配置) cmake(安装完成之后检测是否有环境变量,如果没有需要配置) vscode(安装CMake插件࿰…...
【GPON实战】ONT和OLT的vlan处理机制(一)
引言 ONT和OLT支持多种vlan配置,包括单层tag vlan,默认vlan(PVID),vlan转换,vlan翻译,双层vlan等等。那ONT和OLT是如何处理的呢?本文将介绍ONT和OLT对vlan的处理机制,第一篇介绍单层vlan场景ONT和OLT如何打vlan和剥离vlan,第二篇将介绍OLT是如何通过omci消息将vlan的…...
Qt模块概览(核心模块、GUI模块等)
Qt 模块概览 Qt 是一个跨平台的应用程序开发框架,广泛用于开发图形用户界面(GUI)程序,在前面的章节中,我们已经介绍了许多控件、布局的用法,这些都属于QT的GUI模块,当然QT也支持非 GUI 程序的开发,也就是核心模块。 Qt 框架由多个模块组成,每个模块提供特定的功能。…...
七大排序算法
文章目录 排序的概念及引用1.插入排序2.希尔排序(缩小增量排序)3.选择排序4.堆排序5.冒泡排序6.快速排序7.归并排序8.代码排序部分的测试9.代码加效果大致测试时间(仅供参考) 排序的概念及引用 排序:将数据按照特定的规律排成递增或递减的操作 稳定性:…...
代理模式实现
一、概念:代理模式属于结构型设计模式。客户端不能直接访问一个对象,可以通过代理的第三者来间接访问该对象,代理对象控制着对于原对象的访问,并允许在客户端访问对象的前后进行一些扩展和处理;这种设置模式称为代理模…...
国产linux系统(银河麒麟,统信uos)使用 PageOffice 实现后台批量生成PDF文档
PageOffice 国产版 :支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)、龙芯(LoogArch)芯片架构。 PageOffice 版本&…...
基于若依的脚手架,扩展了flowable、mybatisPlus、lombok、前端美化
前言 若依框架可以说是非常优秀的框架,奈何前端一直有点丑,而且集成的东西比较少,我就基于若依,做了一个轻美化版本,主要集成了工作流、mybatisPlus、lombok等工具。 因为我也在用这个框架为公司做系统,所…...
LeetCode 热题 100 | 矩阵
矩阵基础 使用哈希数组来标记当前行或者列是否出现0按层模拟 73. 矩阵置零 题目讲解:LeetCode 重点: 使用标记数组:用两个标记数组分别记录每一行和每一列是否有零出现。使用两个标记变量:用矩阵的第一行和第一列代替两个标记数组…...
(经过验证)在 Ubuntu 系统中为 VSCode、PyCharm 终端及 Jupyter Notebook 配置代理的完整方案
文章目录 1. 通过系统环境变量配置代理步骤一:打开终端步骤二:编辑 ~/.bashrc 文件步骤三:添加代理环境变量步骤四:保存并关闭文件步骤五:使配置生效步骤六:重启相关应用步骤七:使用代理函数 2.…...
【Linux】sed编辑器二
一、处理多行命令 sed编辑器有3种可用于处理多行文本的特殊命令。 N:加入数据流中的下一行,创建一个多行组进行处理;D:删除多行组中的一行;P:打印多行组中的一行。 1、next命令:N 单行next命…...
STM32 FreeRTOS移植
目录 FreeRTOS源码结构介绍 获取源码 1、 官网下载 2、 Github下载 源码结构介绍 源码整体结构 FreeRTOS文件夹结构 Source文件夹结构如下 portable文件夹结构 RVDS文件夹 MemMang文件夹 FreeRTOS在基于寄存器项目中移植步骤 目录添加源码文件 工程添加源码文件 …...
python 寻找数据拐点
import numpy as np import cv2 from scipy.signal import find_peaks# 示例数据 y_data [365.63258786, 318.34824281, 258.28434505, 228.8913738, 190.87220447, 158.28434505, 129.53035144, 111.95846645, 111.95846645, 120.26517572, 140.71246006, 161.79872204, 180.…...
Windows 蓝牙驱动开发-蓝牙设备栈
蓝牙设备栈 蓝牙驱动程序堆栈包含 Microsoft 为蓝牙协议提供支持的核心部分。 有了这个堆栈,已启用蓝牙的设备可以彼此定位并建立连接。 在此类连接中,设备可以通过各种应用程序交换数据并彼此交互。 下图显示了蓝牙驱动程序堆栈中的模块,以…...
css hover样式调试
调试 hover后才出现的元素如何调试 打开开发者工具,鼠标放在hover时才出现的元素上,然后点击右键不要选中任何选项,将鼠标移动到开发者工具的调试面板中按下N键,此时悬浮的元素不会消失,定位成功 调试元素悬浮样式 …...
【Unity】unity3D 调用LoadSceneAsync 场景切换后比较暗 部门材质丢失
解决方法:两个场景使用同样灯光 现象 直接进入第二个场景是可以正常显示 调用LoadSceneAsync来切换后,第二个场景出现比较暗的情况 解决方法:两个场景使用同样灯光,在loading 的场景中加入灯光。 Light—Directional Light 如果…...
代码随想录二刷|字符串总结
代码随想录二刷|字符串 反转数字 题干 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。 思路 class Soluti…...
Linux浅谈——管道、网络配置和客户端软件的使用
目录 一、管道 1、管道符 2、过滤功能 3、特殊功能 4、扩展处理 5、xargs命令扩展 二、网络配置 1、ifconfig查看网络信息 2、配置文件详解 网卡配置文件位置 3、systemctl查看网卡状态 4、systemctl启动/重启/停止网卡 三、客户端软件 1、什么是SSH 2、常用SSH终…...
HBASE学习(一)
1.HBASE基础架构, 1.1 参考: HBase集群架构与读写优化:理解核心机制与性能提升-CSDN博客 1.2问题: 1.FLUSH对hbase的影响 2. HLog和memstore的区别 hlog中存储的是操作记录,比如写、删除。而memstor中存储的是写入…...
深入解析 Linux 内核中的 IPoIB 驱动:ipoib.h 文件分析
引言 InfiniBand 是一种高性能、低延迟的网络互联技术,广泛应用于高性能计算(HPC)和数据中心。为了在 InfiniBand 网络上运行传统的 IP 协议栈,Linux 内核提供了 IP over InfiniBand (IPoIB) 驱动。ipoib.h 是 IPoIB 驱动的核心头文件,定义了驱动所需的数据结构、常量、宏…...
2025-01-16 思考-人生下半场的归途-那温和的良夜
摘要: 转眼已经不再年轻,生命赠与的礼物,也可以说开始陷入归途。不再被外界推着走之后,发现可以有更多的精力和时间可以用来内视,不被外界种种束缚。 在人生的下半场,其实更多的是接受失去,正如人生上半场…...
【C++篇】红黑树的实现
目录 前言: 一,红黑树的概念 1.1,红黑树的规则 1.2,红黑树的最长路径 1.3,红黑树的效率分析 二,红黑树的实现 2.1,红黑树的结构 2.2,红黑树的插入 2.2.1,大致过程…...
Linux的常用命令(一)
目录 一、文件处理命令 1.文件处理命令ls 2.文件处理命令cd 3.文件处理命令pwd 4.文件处理命令touch 5.文件处理命令mkdir 6.文件处理命令cp 7.文件处理命令mv 8.文件处理命令rm 9.文件处理命令cat 10.文件处理命令more 11.文件处理命令head 12.文件处理命令tail …...
小米vela系统(基于开源nuttx内核)——如何使用信号量进行PV操作
如何使用信号量进行PV操作 前言信号量1. 信号量简介2. NuttX中信号量的创建与使用2.1 Nuttx信号量的初始化和销毁2.2 信号量的等待和发布 3. 信号量的实际应用:下载任务示例3.1 实际代码3.2 代码说明3.3 执行说明 4. 信号量的优势与应用场景5. 常见应用场景…...
(01)STM32—GPIO
1. GPIO简介 GPIO(General Purpose Input Output)通用输入输出端口。可配置为8种输入输出模式。引脚电平:0V~3.3V,部分引脚可容忍5V。输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时…...
浏览器输入http形式网址后自动跳转https解决方法
一、问题描述 使用浏览器 网上冲浪 时会遇到一个情况: 在浏览器中输入“http域名”后会自动变成“https 域名”的形式,此时“https 域名”的网站可能已停止对外提供服务了,这时会出现如下不友好的网页提示: 二、处理方法&#x…...
mybatis的多对一、一对多的用法
目录 1、使用VO聚合对象(可以解决这两种情况) 多对一: 一对多: 2、非聚合的多对一做法: 3、非聚合的一对多做法: 1、使用VO聚合对象(可以解决这两种情况) 当我需要多对一、一对…...
生产管理看板助力节能科技公司实现数据自动化管理
在节能科技公司的生产过程中,数据管理的自动化是提高生产效率和产品质量的关键。然而,许多公司在数据记录、展示、对比和存档方面仍面临诸多痛点,如产品检测数据无法自动记录、缺乏直观的产线状态展示、检测数据对比繁琐耗时,以及…...
网络科技有限公司网络设计
网络科技有限公司网络设计 摘要:伴随着信息科技发展,上网变得一件必不可少的事情,当然网络安全对我们也是越来越重要。像我们的传统网结构是无法为我们的上网提供一个安全的网络环境。锐雯网络科技有限公司就是以网络安全为基本的对网络惊醒…...
C++没有Y Combinator?使用 C++ 实现 Y Combinator(中英双语)
C 中并没有直接内置的 Y Combinator,但通过现代 C 特性(如 lambda 表达式 和 std::function),我们可以实现一个类似 Y Combinator 的功能。 下面我们来详细讲解如何在 C 中实现 Y Combinator。 使用 C 实现 Y Combinator 目标 …...
YOLOv10-1.1部分代码阅读笔记-loaders.py
loaders.py ultralytics\data\loaders.py 目录 loaders.py 1.所需的库和模块 2.class SourceTypes: 3.class LoadStreams: 4.class LoadScreenshots: 5.class LoadImagesAndVideos: 6.class LoadPilAndNumpy: 7.class LoadTensor: 8.def autocast_list(source…...
《戴森球计划》异地远程联机攻略
文章目录 前言1. 下载MOD2.配置cpolar内网穿透3. 主机开启联机3.1 玩家加入游戏 4. 配置固定的TCP端口5. 游玩体验 前言 《戴森球计划》不仅是一款融合了科幻冒险与经营管理元素的游戏,更是一个让玩家在浩瀚宇宙中尽情探索和创造的平台。在这个游戏中,你…...
【Linux跬步积累】—— 线程
🌏博客主页:PH_modest的博客主页 🚩当前专栏:Linux跬步积累 💌其他专栏: 🔴 每日一题 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮࿰…...
计算机网络 (46)简单网络管理协议SNMP
前言 简单网络管理协议(SNMP,Simple Network Management Protocol)是一种用于在计算机网络中管理网络节点的标准协议。 一、概述 SNMP是基于TCP/IP五层协议中的应用层协议,它使网络管理员能够管理网络效能,发现并解决网…...
模型 前景理论
系列文章 分享模型,了解更多👉 模型_思维模型目录。面对得失,人们更怕失,参考点定输赢。 1 前景理论的应用 1.1 前景理论在投资决策中的应用案例 假设一位投资者面临两个投资方案的选择: 方案A:投资一只…...
Android ScrollView嵌套X5WebView大片空白问题
scrollview嵌套后webview的高度不可控。留有大片空白。 注:官方不建议scrollview嵌套webview 最好让webview自身滚动 解决方案: act_news_detail_wv.setWebViewClient(new WebViewClient() {Overridepublic void onPageFinished(WebView webView, Str…...
频域增强通道注意力机制EFCAM模型详解及代码复现
背景与动机 在深度学习领域,如何有效处理时间序列数据一直是一个重要的研究方向。近年来, 频域分析技术 在时间序列处理中展现出了巨大潜力,特别是离散余弦变换(DCT)因其能够高效捕捉低频信息并避免高频噪声干扰而受到广泛关注。 FECAM模型的开发正是基于这一背景,旨在…...
[计算机网络]一. 计算机网络概论第一部分
作者申明:作者所有文章借助了各个渠道的图片视频以及资料,在此致谢。作者所有文章不用于盈利,只是用于个人学习。 1.0推荐动画 【网络】半小时看懂<计算机网络>_哔哩哔哩_bilibili 1.1计算机网络在信息时代的作用 在当今信息时代&…...
第十三章:数据库技术
文章目录: 一:基础 1.概念 2.特点 3.常见数据库品牌 4.数据库应⽤系统 4.1 C/S 4.2 B/S 5.数据模型的分类 6.名词解析 7.关系运算 二:Access 1.基础 2.操作 2.1 建立表 2.2 维护表 2.3 创建查询 2.4 创建窗体 2.5 创建报表…...
中等难度——python实现电子宠物和截图工具
import io # 文件处理 import nt # windows nt 库直接获取对应的磁盘空间 import time # 时间 import zlib # 加解密 import ctypes # 调用 import struct # 处理字节二进制 import base64 # 编解码 import threading # 线程 import tkinter as tk # tk from datetime…...
构建优雅、高效的 Nodejs 命令行工具 - Archons
目录 项目简介安装基本用法样例创建一个简单的命令行工具使用archons上下文创建进度条 最后 项目地址: https://github.com/noctisynth/archons Bug反馈或功能请求:https://github.com/noctisynth/archons/issues 项目简介 Archons意思是“执政官”,我使…...
源码编译安装httpd 2.4,提供系统服务管理脚本并测试
1.安装httpd wget https://downloads.apache.org/httpd/httpd-2.4.62.tar.gzbmcv tar -zxvf httpd-2.4.62.tar.gz cd httpd-2.4.62 2.安装依赖包 sudo yum install -y gcc make apr-devel apr-util-devel pcre-devel sudo yum groupinstall "Development Tools"…...
【爬虫】某某查cookie逆向
代码仅供技术人员进行学习和研究使用,请勿将其用于非法用途或以任何方式窃取第三方数据。使用该代码产生的所有风险均由用户自行承担,作者不对用户因使用该代码而造成的任何损失或损害承担任何责任。 加密参数 加密参数主要是cookie,其中只有…...
【华为路由/交换机的ssh远程设置】
华为路由/交换机的ssh远程设置 R1(client):10.1.1.1 R2(server):10.1.1.2 R2服务端配置: 生成本机密钥 查看生成的密钥 设置AAA授权验证方式,并设置支持SSH协议 创建本地用户&…...
Linux:System V - 共享内存
1.System V共享内存的原理 通过为用户提供系统调用接口,让用户可以申请一块空间,进程A/B也可以通过系统调用接口将创建好的内存通过页表映射进进程的地址空间。完成让不同的两个进程看见同一份资源的目的。如果未来不想继续通信,取消进程和内…...
闪豆多平台视频批量下载器
1. 视频链接获取与解析 首先,在哔哩哔哩网页中随意点击一个视频,比如你最近迷上了一个UP主的美食制作视频,想要下载下来慢慢学。点击视频后,复制视频页面的链接。复制完成后,不要急着关闭浏览器,因为接下来…...