近期需要对原来的一个程序进行修改、升级:
1、原来的是按一个按钮,向串口发送一组数据,读取串口接收到的数据并计算、显示。
现在的是当按下一个按钮后,先向串口发送一组数据,过一段时间后再发送一组数据,然后才读取串口接收到的数据并计算、显示。
2、原来的初始化序列现在也要丰富、改变。新序列已经初步定型,但后期可能会有调整的要求。
思考、执笔良久,依稀有了三部构想曲:
需求变化引起设计变化范围:
1、档位发送流程的改变势必需要增加参数,参数设计框架需要增加,业务流程势必修改了。
2、初始化序列属于小范围变动,不影响主业务逻辑框架,但如果能够在外部配置更好。这个以后再说吧。
设计变化引起实现变化:
主要就是业务流程的实现方面,需要新增一些变量做控制参数。当然也牵涉到新增参数存取、引用等。
考虑到时间紧迫性,目前就以实现为基准了。
实现思路:
1、首先实现了初始化序列的调整,内置。以后有调整需求时再考虑参数提取。
2、增加档位预备参数。xml
3、档位预备参数存取的实现。
4、是否存在预备档位参数配置。
5、业务流程的变化牵涉到几个方面:A、启动流程;B、显示数据;C、定时器开关;D、定时器计数;E、发送档位。
实现:
1、读代码,了解原来的实现方式,记录需要修改的地方:
A、初始化序列需要改变,由于不是主要需求,暂且采用硬编码方式。InitDevice()
B、设计预加载档位参数存储结构,采用xml格式。LevelPre.xml,LevelPreInverse.xml(以后可能还会有LevelPreNormal.xml)
C、实现档位预加载参数存取功能。CXmlLevelPre,CXmlLevelPreInverse,CLeverPre,CLevelInverse
D、新增预加载档位信号和槽。sendLevel(nLevel), sendLevelPre(nLevel)
E、记录档位状态阶段:非工作阶段WS_NONE,预加载阶段WS_PRE,正式工作阶段WS_WORK
F、预加载时串口返回的数据只显示,不参与运算。Disp()
G、改变档位切换逻辑。timeout()、Start()、SendLevelData()、SendLevelPreData()以及构造函数。
2、实现初始化序列变动:
初始化只进行一次。按步骤在原来的基础上一步一步修改、增加。
3、实现预加载档位参数存取:
参数结构设计Level_pre.xml:(1表示需要预加载,0表示不需要预加载:有的档位需要,有的档位不需要,呵呵)
<?xml version='1.0' encoding='unicode'?>
<XML>
<LEVELS_NORMAL>
<LEVEL1 INVERSE="1" />
<LEVEL2 INVERSE="1" />
<LEVEL3 INVERSE="1" />
<LEVEL4 INVERSE="1" />
<LEVEL5 INVERSE="1" />
<LEVEL6 INVERSE="1" />
<LEVEL7 INVERSE="1" />
<LEVEL8 INVERSE="1" />
<LEVEL9 INVERSE="1" />
<LEVEL10 INVERSE="1" />
<LEVEL11 INVERSE="1" />
<LEVEL12 INVERSE="1" />
<LEVEL13 INVERSE="1" />
<LEVEL14 INVERSE="1" />
<LEVEL15 INVERSE="1" />
<LEVEL16 INVERSE="1" />
<LEVEL17 INVERSE="1" />
<LEVEL18 INVERSE="1" />
<LEVEL19 INVERSE="1" />
<LEVEL20 INVERSE="1" />
</LEVELS_NORMAL>
</XML>
参数结构设计Level_pre_inverse.xml:
<?xml version='1.0' encoding='unicode'?>
<XML>
<LEVELS_NORMAL>
<LEVEL1 CURRENTVALUE="355" INTERVAL="8000" />
<LEVEL2 CURRENTVALUE="368" INTERVAL="8000" />
<LEVEL3 CURRENTVALUE="380" INTERVAL="8000" />
<LEVEL4 CURRENTVALUE="393" INTERVAL="8000" />
<LEVEL5 CURRENTVALUE="405" INTERVAL="8000" />
<LEVEL6 CURRENTVALUE="418" INTERVAL="8000" />
<LEVEL7 CURRENTVALUE="431" INTERVAL="8000" />
<LEVEL8 CURRENTVALUE="443" INTERVAL="8000" />
<LEVEL9 CURRENTVALUE="456" INTERVAL="8000" />
<LEVEL10 CURRENTVALUE="469" INTERVAL="8000" />
<LEVEL11 CURRENTVALUE="481" INTERVAL="8000" />
<LEVEL12 CURRENTVALUE="494" INTERVAL="8000" />
<LEVEL13 CURRENTVALUE="507" INTERVAL="8000" />
<LEVEL14 CURRENTVALUE="519" INTERVAL="8000" />
<LEVEL15 CURRENTVALUE="532" INTERVAL="8000" />
<LEVEL16 CURRENTVALUE="544" INTERVAL="8000" />
<LEVEL17 CURRENTVALUE="557" INTERVAL="8000" />
<LEVEL18 CURRENTVALUE="570" INTERVAL="8000" />
<LEVEL19 CURRENTVALUE="582" INTERVAL="8000" />
<LEVEL20 CURRENTVALUE="595" INTERVAL="8000" />
</LEVELS_NORMAL>
<PARAM_MEMO>
<CURRENTVALUE UNIT="mA" MEMO="" />
<INTERVAL UNIT="ms" MEMO="" />
</PARAM_MEMO>
</XML>
实现方面大致如下:
CXmlLevelPre
CXmlLevelPreInverse
CLevelPre
4、实现预加载档位参数引用:
CLevelPre levelPres[LEVEL_COUNT];
CLevel levePreInverses[LEVEL_COUNT];5、实现新增的信号和槽:
signals:
void sendLevelPre(const int nLevel);
slots:
void SendLevelPreData(const int nLevel);
6、实现档位状态记录:
enum WorkState {
WS_None,
WS_Pre,
WS_Work,
};
WorkState m_wsLevelState;
7、实现档位切换、档位状态切换:
A、开始运行后,切换到1档;
B、检查该档位是否存在预加载档;
C、如果存在则发送sendLevelPre信号,否则发送sendLevel信号;
D、如果达到档位时长,则判断是否Pre状态;
E、如果是,则切换到work状态,否则切换到下一档位,然后继续B步骤,直到完成一轮。
F、判断是否需要再测一遍;
G、如果需要则切换到A步骤,否则退出。
其中突出的一点:原来的切换档位没有作为一个单独的函数,现在需要提取出来。
8、等待联机调试:
等吧。
结论:
1、希望能够在此基础上提升技能。
2、还需要考虑文档上改怎么同步。
3、记录的比较简单、零碎,只是记录一下。
4、升级路线导致如下,自己画的总是没有高度,以后需要多关注一些其他人的论述。