程序修改升级三部曲:需求、设计、实现

近期需要对原来的一个程序进行修改、升级:

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、升级路线导致如下,自己画的总是没有高度,以后需要多关注一些其他人的论述。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值