首页 > 代码库 > 可复用性程序设计(电源管理)
可复用性程序设计(电源管理)
每次慌慌张张码完一段代码,总是感觉惨不忍睹。但是进度紧,没办法只能想着调好了再来整理,但是整下项目折腾完了,人都筋疲力尽了,又懒得整理了。所以每隔一年半载看以前的代码都觉得是一堆垃圾。
下面找了个简易的电源管理的模块开刀,试着将通用的部分提取出来。
这个是未做处理的文件,我们一般也是按正常的逻辑来编码。
#include "MKL26Z4.h"#include "bat.h"#include "err.h"#include "ntc.h"#include "Events.h"#include "OLED_96X32.h"extern void (*display_array[])(void);void bat_manage_init(void){ SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK; //FGPIOB_PDDR &= ~(1<<16); // Configure as input GPIOB_PDDR &= ~(1<<16); // Configure as input PORTB_PCR16 = (PORT_PCR_MUX(1) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK); }void bat_manage_main_thread(void){ unsigned char iFun=0; static unsigned char bat_charge_cmplt=0; static unsigned char bat_charge_pass=0; static unsigned char old_disp_save_cmplt=0; static unsigned char old_disp_resume_cmplt=0; static unsigned char curr_disp_load_cmplt=0; static void (*pFunSave[FUN_MAX])(void); if(hw_adc_ave(9,16,20)< BAT_PRE_VALUE) { bat_charge_cmplt = 0; } else { bat_charge_cmplt =1; } //接上充电插座 if(!(GPIOB_PDIR&(1<<16))) { //开始充电 if(!bat_charge_cmplt) { //保存以前的显存 if(!old_disp_save_cmplt) { for(iFun = 0;iFun< FUN_MAX;iFun++) { pFunSave[iFun]=display_array[iFun]; } old_disp_save_cmplt = 1; } //加载当前的显存 if(!curr_disp_load_cmplt) { for(iFun = 0;iFun< FUN_MAX;iFun++) { display_array[iFun] = NULL; } display_array[5] = DisplayBatCharge; curr_disp_load_cmplt = 1; } } //已经充满 else { } bat_charge_pass = 1; } //没有充电 else { //已经冲过电了 if(bat_charge_pass) { //恢复以前的显存 if(!old_disp_resume_cmplt) { for(iFun = 0;iFun< FUN_MAX;iFun++) { display_array[iFun]=pFunSave[iFun]; } old_disp_resume_cmplt = 1; } bat_charge_pass = 0; bat_charge_cmplt = 0; old_disp_save_cmplt = 0; curr_disp_load_cmplt = 0; old_disp_resume_cmplt = 0; } //没冲过电 else { } }}
瞄了一眼上面代码的逻辑,发现锂电池充电都只有这四个状态:
1)正在充电:a、还未充满 b、已经充满
2)没有充电:a、已经冲过电了 b、没有冲过电
于是公共部分就是4个状态,提取如下:
bat.h
#ifndef BAT_H#define BAT_H#ifndef FUN_MAX #define FUN_MAX 5#endif#ifndef BAT_GPIO #define BAT_GPIO 0//GPIOB_PDIR&=(1<<16)#endif#ifndef NULL #define NULL 0x00u#endifclass bat{public: bat(); inline void bat_manage_init(void); void bat_monit(); void bat_manage_main_thread(void); void bat_charge_cmplt_callback(); void bat_charge_not_cmplt_callback(); void bat_charge_pass_callback(); void bat_charge_not_pass_callback();private: unsigned char bat_charge_cmplt; unsigned char bat_charge_pass;};
bat.cpp
#include "bat.h"bat::bat(){ bat_manage_init();}void bat::bat_manage_init(){}void bat::bat_monit(){ bat_charge_cmplt = 0; bat_charge_pass = 0;}void bat::bat_charge_cmplt_callback(){}void bat::bat_charge_not_cmplt_callback(){}void bat::bat_charge_pass_callback(){}void bat::bat_charge_not_pass_callback(){}void bat::bat_manage_main_thread(void){ bat_monit(); //接上充电插座 if(!BAT_GPIO) { //开始充电 if(!bat_charge_cmplt) { bat_charge_not_cmplt_callback(); } //已经充满 else { bat_charge_cmplt_callback(); } } //没有充电 else { //已经冲过电了 if(bat_charge_pass) { bat_charge_pass_callback(); } //没冲过电 else { bat_charge_not_pass_callback(); } }}
一眨眼,代码从C变成C++了,别纠结了,你可以把C++的Class改成C的Struct,Class就是一个带权限管理的Struct。
把公共部分的4个状态提取出来作为一个基类,充电过程中需要定制化处理的部分改造成4个状态的回调函数。
下次要用到锂电池充电管理就可以直接在这个基类的基础上继承一个派生类,重载这四个回调函数即可!
void bat_charge_cmplt_callback(); void bat_charge_not_cmplt_callback(); void bat_charge_pass_callback(); void bat_charge_not_pass_callback();
这个代码的实例在网盘里,感兴趣的可以下载debug耍耍,http://pan.baidu.com/s/1VCy6 ,用的QT4.8.5来调试的。程序跟平台无关,随便用什么编译环境都可以。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。