20140603
- 将通信程序包装成 Windows Service。
- 与曾磊一起调试通信程序和数据库相关问题。
- 校正项目计划书。
- 用 PSService 实现远程操作 Windows service。
20140604
- 用 InstallShield 生成服务端安装程序,包含
- .Net Framework 4.0
- Visual Studio 12 CRT x86
- Windows Installer 4.0
- InstallSheild 收费版提供卸载前的
actions
,免费版只有卸载完成后的action
可定义,最后用sc
命令代替 WinSW 的 uninstall 来删除服务。
- 远程启动、停止、重启通信程序功能测试成功。
20140605
- 修复数据库自增ID计数器在系统重启后被重置的问题。
- InnoDB 的计数器在内存里,并不写到磁盘;
- 改用 MyISAM 解决。
- 根据李应启的反馈,修改数据库操作行为:设置组与清除组时,不更新数据库;仅在查询组之后,将查到的值更新至数据库。
- 开始实现软件模拟的控制器,用于压力测试。
20140606
- 模拟控制器回复
0080
和1080
类型的查询指令。 - 解决 MySQL/MariaDB Server 安装在 Windows 上,表名全部被转换为小写的问题。
20140607
性能优化
- 用更快的
split()
函数替代boost::split()
来分割任务参数 - 日志中不再记录函数信息和在代码中的位置
- 大量重复输出的日志记录级别降到
trace
,减少输出量 - 在内存中缓存数据库查询结果,减少数据库查询数量
- 自动设备状态查询尽在空闲时(TaskTodo为空时)才进行
- 用
sprintf()
替代一些stringstream
的操作
20140609
- 性能优化
- 从6号每秒查询20个终端状态,到现在每秒查询约50个
- 由于libmysql的查询不支持多线程并发操作,实现多线程通信需要做较大改动,暂不考虑
- 数据库查询加上TaskDone插入语句的生成占了近一半的执行时间,这部分时间很难再缩减了
20140610
- 启用数据库多条语句一次发送执行的功能。
- 忽略卸载时删除服务的返回值,避免服务已被人工删除导致卸载程序报错。
- 处理任务考虑优先级:用户插入的任务,优先级高于定时查询。
- 实验在数据库中用 trigger 实现状态变更历史记录。
- 讨论决定记录如下状态量的历史:
- 电流
- 电压
- 亮度
- 功率
20140611
- 将控制器返回的设备状态转换成浮点数再存入数据库。
- 电流、电压、功率都有2位宽度的单位和14位宽度的数值;
- 存到数据库的值统一使用A、V、W为单位。
- 新增
DeviceStatusHistory
表,记录电流、电压、亮度、功率的变化。 - 通过 SQL 语句汇总每小时、每天、每月的状态量平均值。
- 应唐德要求,升级设备固件增加对单灯地址的支持
- 任务参数修改为“控制器地址,终端地址,FirmwareMD5”
20140612
- 提出两种历史状态查询的数据采集方法,做了比较
- 与唐德讨论历史状态查询的需求细节,确定数据采集方式
- 读MySQL文档,熟悉一些日期、数值相关的工具函数
- 调试控制器掉电后,通信程序crash的问题。
- 问题出在超时后断开连接重连的过程,
socket.cancel()
函数在 Windows XP & Windows Server 2003 上会失败。 - Windows 7 下没有问题。
- 使用
socket.close()
同时完成异步操作的取消以及关闭连接,是具有可移植性的方式。
- 问题出在超时后断开连接重连的过程,
- 修正控制器掉电后,重连前待执行的任务一直遗留在
TaskTodo
表中的问题。
20140613
- 解决一个前台程序与数据库信息不一致后,引起通信程序crash的问题。
- 前台程序实例1启动后,数据库中的控制器信息被修改,此时如果查询一个数据库中不存在的控制器,会无法建立连接。
- 此前合并重复代码时,未充分考虑错误处理,导致这里的错误处理代码被绕过了。
- 配置 MySQL Event Scheduler 实现定时采样状态量
- 将过去一天的状态量采样按小时归纳成平均值
- 将过去一周的状态量采样按天归纳成平均值
20140614
- 求历史记录均值后,清除过期历史
- 写StarRiver测试计划(通信程序部分)
20140616
- 检查过去三天历史记录 event 行为是否符合预期
- 历史记录增加对峰谷值的记录
- 调试单灯固件升级
- 修正通信运行状态显示不正确的问题
- 写脚本每日自动备份202.11.4.63上的数据库
20140617
- 历史记录统计间隔改为
- 每小时统计上一个小时的均值、峰谷值
- 每日统计上一日的均值、峰谷值
- 如果一个控制器连接不上,通信程序卡在建立连接和重试的阶段,查询另一个控制器的任务要等到这个任务超时才开始执行,很容易超时。将建立连接改为异步操作解决。
- 从数据库读取配置参数,使得GUI程序可以通过写数据库并通知通信程序重启来修改通信程序的行为。
- 避免
\Wall
检查到的 signed/unsigned 类型间的隐式转换。 - 更新数据库设计,新增
DeviceStatus_edit
表,用于存放 StarRiverEdit 中录入的设备初始记录。
20140618
- 记录通信状态历史,用于绘图时标志可能无效的采样值。
- 设计数据结构存储亮度设置表格,用于定时刷新亮度设置。
- 区分用户任务和自动任务,后者不经过数据库的
TaskTodo
和TaskDone
表。
20140619
- 新建数据库用户
'sansi'@'%'
,数据库连接统一使用该用户登录。 - TCP通信超时后立即断开连接,保证下一次通信重连后进行。不等待N次超时才判定连接已丢失。
- 在笔记本上安装配置数据库、通信程序、前台程序。
- 浏览 POCO C++ Libraries 文档
- 其中的 net, log, encoding, hash 等模块都可以用在通信程序和前台程序上。
- 现在用 boost.asio 和 boost.logging 以及我自己的一些工具函数库实现的代码,维护起来难度不小,主要是 boost 的一些写法初看比较难理解。
- 如果 POCO 的API更加简单直观,考虑在下次大幅增加功能的时候,替换掉现有代码。
20140620
- 调试数据库查询返回空结果的问题
- StarRiver 项目进度讨论
- 尝试用 Rickshaw 画历史变化曲线
20140621
- 周报
- POCO文档
- POCO 的 socket 类没有对串口的支持,目前查下来,跨平台的 C++ 串口通信库只有 Boost.Asio 了。另一个 RS-232 for Linux and Windows 只支持 Cygwin,不支持 Visual Studio 编译。
20140623
- 读 More Effective C++
ControllerConnection
类增加成员记录需要刷新的亮度设置- StarRiver 测试程序设计讨论
20140624
- 设置亮度时,根据设备ID更新亮度表。
- 广播:清空表。
- 非广播:如有广播设置,删除,改为所有单灯设置。
- 组:清除组内全部单灯设置。
- 单灯:如有单灯所属组设置,删除,改为单灯设置。
- 插入当前亮度设置。
- 修改数据库设计,记录控制器、设备的状态变化。
20140625
- 协助薛工调试 SkyEye 无线监控程序。
- 根据控制器 workmode 开启/关闭亮度表定时刷新。
20140626
- 配置文件增加刷新亮度设置间隔
- 实现定时刷新亮度设置
20140627
- 调试 StarRiver 通信程序
- (校正项目)寻找将搜索到的像素点先按行再按列排序的算法
20140630
- 读 Effective STL,改写 StarRiver 通信程序代码,提升效率。
- StarRiver 项目时间表