
2016年1月5日 (农历11月26日)
增加了串口多通道协议收发器, 增加了串口控件动态设置串口号.
半夜 23:30... 开年第一个版本... 今天痛苦死了... 忘了丫头的生日.......

2016年1月9日 周六晚上 7:50
实现了角色旋转时的参考点图形化界面设置. 以前是固定一图片的中心为旋转中心;
但是这样做旋转的表针, 雪人等等, 需要把图片的高度扩大一倍(下边是空白)才行;
加上旋转点设置后就更方便了.

-----------------------------------

界面布局调整了, 指令栏和组件库栏都放到了左边栏, 并且自动隐藏; 标题栏调整了下布局;

2016年1月12日 0:10
模块图片尺寸鼠标滚轮放缩功能做好了

20.16.1.15
表达式字体和位置微调了下, 比以前紧凑了; 硬件模块(时间日期类)可以设置存储位置了;

//2016.1.17 这里太重要了... 执行clear之后再复位, 则很稳定!
//周末, 终于把1602. 2004液晶屏弄好了, 现在8位并口,4位并口,串口转4位并口等都调试好了,
//关于复位问题, 最重要的就是初始化之后, 清屏, 然后再次调用初始化

-----------------------------------
2016.1.18 20:00
一段聊天记录, 复制过来作为版本更新记录吧......

去掉这个 如果 否则 指令
太占地方了
然后把那个 如果（不带否则）指令 增强一下，可以动态设置是否添加 否则 分支
小燕子神飞 2016/1/18 19:37:28
另外，比如拖进来一个 如果 指令，里边填了一大堆，结果发现需要换成 如果否则指令，目前只能把原先的都删了，重新添加
小燕子神飞 2016/1/18 19:37:36
昨晚做计算器，发现的问题
用户体验很不好
而且马上就改好了，现在可以动态鼠标点击设置是否有 否则 指令，其他的都不影响
多了 否则 分支，别的都不变，这样很方便
已经改好了这个功能

-----------------------------------
初步支持C51单片机, 不带有多进程, 仅有定时器驱动; 目前图形化界面已经可以用了;

2016.1.20 0:32
实现了 C51单片机支持LED, 按键, 一位数码管等... 发现了一个小问题, 51单片机初始化未清零RAM, 导致显示异常,
有时间改一下;

---------------------

增加了一些模块, 改正了(去掉)时间日期类的"清空"属性, 有BUG. 版本: v1.3.160127

改正了一些BUG, 如 24C02 模块需要先于其他模块初始化, 拷贝 libusb0.dll 到 avrdude 中,不需要用户自己去下载.

2016.2.4 增加了显示旧版本模块的设置功能

============================================

2016.2.26
增加了无源蜂鸣器模块, 改正无法播放音乐的BUG, ST7920液晶(arduino版), 支持文字模式, 点阵模式;

2016.2.27 晚上 9:15
改正了一些小BUG, 如: 
添加指令时, 以前只能指令侧边栏隐藏, 变量栏和模块库栏不隐藏; 现在都会隐藏;
可以点击添加指令, 而不必须拖动, 也可以再次点击放置在其他指令下边;

增加了Arduino下载时的进度提示, 以前是屏幕卡住, 现在进度条也会走; 增加了下载设置框的隐藏功能;

2016.2.28 晚上 10:29
增加了电脑键盘模拟按下模块, 本来计划用 winio.dll，结果调试半天有问题，最后放弃了，用了keybd_event;
增加了7088AH 8X8LED点阵模块;

晚上 11:53
增加了一个很实用的功能, 点击软件界面空白位置时(没有拖动), 则自动添加一个新指令; 但是现在有些操作中也会出现新指令,
下一步调整下;

2016.3.4
改进了微调了界面鼠标点击添加新指令, 有参数框时则不弹出新指令

2016.3.8 0:01 这几天好忙啊... 晚上焊接了一些套件, 半夜把射频卡模块添加到了arduino库中, 测试通过;

2016.3.9 22:25 改正了电脑时钟模块不显示的BUG;

2016.3.11 23:49 给组件库列表增加了拖动时上下边界限定, 不会拖出大片空白; 加上了滚动条同步滑动显示;

2016.3.15 23:56 更正一个重要BUG, 以前软件中的arduino的两个串口端口不可以作为数字口, 连接LED等无法输出数字信号,
今天终于明白了, 是因为bootloader引导程序进入用户程序后, 没有关闭串口寄存器导致串口打开, 数字IO功能失效, 
关闭了寄存器就好了;

============================================
2016.3.18

这个版本改为了 1.4.20160318 版本号从1.3变成了1.4, 因为初步加上了新版的控制器.
实现了MEGA328的ISP下载支持;

============================================
2016.3.31

有用户反映软件报错, Consolas字体不支持Regular属性, 于是把控件字体全部改为了雅黑和宋体, 应该没有问题了.

============================================
2016.4.4
改正一个重要BUG, 就是以前的arduino AD转换其实不行! 有用户反映AD转换不对, 后来也没找到原因. 今天用新板子
测试还是不行! 但是用arduino IDE就没问题, 最后偶然发现把分频比设置为大于等于4就行了.

15:38 鼠标每次进入模块列表时, 不再复位滚动条到最顶端, 而是保持上次的位置;

============================================
2016.4.19 半夜 1:07
终于完成了一次重大升级, 软件开始支持舵机了. 目前控制板本身即可驱动8路舵机. 不过端口是默认的, 暂不可连接;
历史性的时刻... 这下可做的模型种类大大扩展了

2016.4.20 半夜 0:53
完整实现了arduino驱动多路舵机, 提取出公共引用, 图形化自动生成配置信息. 目前两个舵机独立运动测试通过;

晚上初步调试好了语音播放模块, 下一版加入 播放了一句话手工校验, 正常(!@#$%^& 今晚晕了,犯了大错>=<)

2016.4.20 半夜 23:56
把舵机定时器改为了Timer2, 不会和其他模块冲突, 以后就是舵机专用Timer2了. 现在舵机模块彻底添加完成;

============================================
2016.5.4 8:42

改正了L298驱动电机的小BUG, 端口提示框的颜色调整了下, 根据端口类型显示不同的背景填充颜色;

2016年5月6日 昨晚弄到半夜1点半 ~~~~~
现在终于完成关键性的一步, 实现了虚拟机的按字节码执行, 地址全部映射好; 下一步可以开始做硬件版的虚拟机了;

============================================
2016.5.9 终于把虚拟机格式化做好了, 现在可以编译器直接生成二进制字节码, 以前是字符串形式解析.
下一步就可以移植到单片机和安卓系统了. 
虚拟机部分整整弄了一个周末, 好累....

过程: 字符串码转为int型代码, 地址映射处理好; -> 转为byte字节码运行; -> 读写接口规范化, 
保证编译器优化可用(存储再加载数据时确保一致)

============================================
2016.5.14
周末把安卓remo调试好了, 现在有一个对应的安卓APP解释执行生成的虚拟机代码, 
目前增加了蓝牙2.0模块(HC06)和短信发送模块 (一大进步)

============================================
2016.5.15 晚上10:48
界面指令栏和模块栏改成了固定的, 不再自动隐藏, 类似于分页栏; 去掉了鼠标点击空白自动添加指令的功能,
防止用户误操作;

5.16 半夜0:28 做好了一个安卓版计算器...... 发现一个BUG, 好像读取窗体的宽度和高度不对... 有空研究下

============================================
2016.5.26 晚上23:57

实现了初步的硬件虚拟机, 目前可以上位机远程控制arduino的数字输入输出和模拟量输入了. 
发现一个小问题, 就是intel的genuino101板子, 必须要加上DTR RTS才能接收数据;

============================================
2016.5.29 半夜 0:52
终于初步支持了MEGA2560... 折腾一晚上, 移植起来很费劲, 图形化界面程序自动复位, 最后终于发现了原因,
MEGA2560的PC指针是3个字节, 执行RET/RETI指令时需要对应的SP指向的三个字节都是地址数据才行, 改了OS就好了.

============================================
2016.6.9 端午节
终于把PC从2个字节改为了3个字节,这样以后可以编写大程序了, 可超过64KB

2016.6.11 半夜 1:25
实现了虚拟机的函数调用, 加法运算等

2016.6.11 晚上 22:14
终于初步把虚拟机移植到AVR/arduino上了, 现在可以执行完整的测试程序, 并且指令保存协议测试通过,
可以存储到RAM/EEPROM. 就剩下中断部分需要处理了.

2016.6.16 晚上 9:19
加上了未调用的函数自动去除功能, 13K的机器码可以减小到11K.

2016.6.22 晚上23:53
那个飞机大战游戏不行了! 加速度计不管用, 另外加上延时器后也不稳定, 好几天都没查出原因, 晚上终于调试出来了, 
这里错了:

case C.强制转换_uint8_sint8:   InsList[ index ].CODE0 = C.N_强制转换_uint8_sint8; CodeNumber = 0; break;
case C.强制转换_uint16_sint16: InsList[ index ].CODE0 = C.N_强制转换_uint8_sint8; CodeNumber = 0; break;
case C.强制转换_uint32_sint32: InsList[ index ].CODE0 = C.N_强制转换_uint8_sint8; CodeNumber = 0; break;

太马虎了!!!

(对了, 最近开始研究英特尔的edison板子, hello world 和串口下载及通信已经调通, 剩下的就是移植虚拟机了, 加油吧!)

2016.6.23 晚上23:34
彻底解决了关于虚拟机文件打开方式的问题, 就是先删除系统过时的remo.exe注册表信息即可

============================================
2016.7.3 半夜1:43
用arduino+加速度计重新实现了打飞机游戏, 不错~ 修正了精灵边界界面的一些BUG, 如高对比度显示旋转中心点, 
初始化设置中心点为图片中心等;

============================================
2016.7.8 半夜0:54
    改进了图片编辑器的界面, 操作细节优化; 编程界面右键拖动背景等; 以后在各个控件中, 全部以右键拖动背景

============================================
2016.7.24 中午12:48
改正用户函数定义数目限制; 
改进了返回指令显示, 
根据函数返回类型标注返回指令是否可用; 
增加了模块资源冲突固定显示提示;

============================================
2016.8.7
增加了模块端口数量参数配置, 模块库都更新了端口数量配置

============================================
2016.8.12 晚上6:03
增加了模块库管理器, 可以设置哪些模块出现在软件图形界面库中, 哪些模块隐藏起来. 方便第三方定制软件;

晚上23:06
鼠标滚轮不再调节界面放缩, 而是调节模块库滚动条; 界面放缩用标题栏的两个按钮控制.

周六上午11:58 鼠标滚轮在界面滚动时上下拉动界面, 在模块库滚动时调节滚动条;

============================================
2016.8.21 晚上1:27
今晚终于把intel Edison加到了软件里, 目前已经可以下载和通过虚拟机执行RAM指令了, 加油..

2016.8.22 晚上23:59
改正了一个潜藏的BUG, 就是虚拟机文件大多数时候只能下载并运行成功一次, 之后重新下载完成指示灯不闪烁.
拖了好几天终于找到了原因, 就是BASE区没有清空! 单片机中每次上电会自动清空, 但是这里虚拟机没有复位,
只是初始化了寄存器. 现在加上了清空BASE存储区, 就好了.

晚上 0:22
又解决了一个重大问题, 以前的定时器驱动系统很卡, 需要降低十倍精度才行;刚才终于找到原因了, 
原来在loop中每执行一个指令, 就查询一次串口, 完全没有必要! 只需空闲时放到定时器中查询(0.1S), 如下解释:

定时器:
	//监听串口数据, 空闲状态, 另外在loop循环中也读取串口数据, 具体说明见loop循环
	if( Running ) {
		PortTick++;
		if( PortTick == 5 ) {
			Serial_OS_receive();
		}
	}
loop循环:
	//循环接收数据, 注意在另一个定时器中也读取串口, 仅用于空闲模式识别指令,
	//一旦识别出重新下载指令, 就会关闭Running, 之后就会切换到这里的高速接收数据
	while( true ) {
		loop();
		if( !Running ) {
			Serial_OS_receive();
		}
	}

============================================
2016.8.30
早上地铁里迷迷糊糊, 忽然想到软件的一个重大BUG, 就是模块的EventFlag变量不是线程安全的!!! 赶紧在主程序扫描中
加上了开关中断, 解决了一个重要问题, 已经隐藏了好几年的严重BUG. 后续虚拟机中也加上 CLI SEI操作.

2016.8.31 23:52
linux(Edison板)下载方式改成了SSH, 用了 SharpSSH 这个库, 实现了FTP文件拷贝和SSH远程命令重启remo

2016.9.3 19:05
调整了界面控件的坐标尺寸信息, 显示到软件的右上角

============================================
2016.9.6 00:37
实现了intel Edison板子的完整串口功能, 可以收发数据, 修改设置波特率等等;
初步实现了openCV安装和测试, 目前可以打开摄像头保存照片文件;

============================================
2016.9.14 晚上1:04
初步加上了撤销和重做功能, 有点小BUG, 第一次操作无法恢复, 图标也没置换... 再改吧

2016.9.16 下午4:45 中秋节放假
实现了软件的撤销和重做功能
增加了openCV控件, 可以拖进来使用设置读取参数

2016.9.17 晚上9:21
完善了一个编译器的小缺点, 以前虚拟类型没有检查地址类型和地址常量是否一致, 溢出等, 现在加上了完善的检测. 
调试硬件虚拟机时发现的;
升级了硬件虚拟机, 改版协议, 下一步测试一下视频识别控件和硬件的联动, 加油吧!!!

* 实现了电脑上位机连接远程板时才弹出串口号选择界面, 其他类的上位机程序不再弹出, 更好用了.

解决了一个大问题, 以前只能绑定一个扩展名, 现在要加上 项目文件的lab打开方式, 发现原先的vex文件也被干扰,
终于发现了原因:

	RegistryKey _RegKey = Registry.ClassesRoot.OpenSubKey("", true);		//打开注册表
	RegistryKey _VRPkey = _RegKey.OpenSubKey(p_FileTypeName);
	if (_VRPkey == null) return false;
	_VRPkey = _RegKey.OpenSubKey("Exec", true);
	if (_VRPkey == null) return false;
	_VRPkey = _RegKey.OpenSubKey("Exec", true);
	if (_VRPkey == null) return false;

那个 Exec 重复了, 导致都用同一个条目打开, 现在根据不同的扩展名加上linkboy前缀就好了.

2016.9.20 晚上0:24
提取出了组件配置器和组件设计器为两个独立的可执行程序, 这样显得不臃肿了.

2016.9.20 晚上 6:37
今天看到一个串口助手软件可以显示串口设备全称, 于是也加上了这个功能, 把串口类提取到一个公共文件中,
其他工程可以导入使用, 终于解决了一个长久以来困扰的问题.

2016.9.22
昨晚把界面按钮改了一下样式, 不再是放大, 而是鼠标移动时两个图片切换, 效果比以前清楚了.
事件控件样式改了下, 加上了一个顶端扩展区域和横线效果;
软件加上了启动界面, 并实现了模块库加载时的一个子进度条;

2016.9.24 晚上 23:41
实现了上位机动画的"精灵指针"功能, 可以动态指向其他精灵, 这样一下子简化了很多类型的作品开发难度.
以后修改下, 其他类型控件也都可以很容易实现动态指定功能;
做了一个拼图识别汉字的小游戏, 效果不错.

2016.9.29 昨晚解决了一个BUG, 做曹冲称象的时候, 大尺寸的角色(大象)落到小石头上没有碰撞效果,
原来是碰撞检测是双向的, 两个角色之间, 互相只要有一个角色的某个顶点在另一个角色内, 就应该触发碰撞事件.
现在还有一个bug没有解决, 就是指定情况下, 两个石子会在半空中互相卡住, 哪个都落不下来;

2016.10.7
国庆节最后一天
1:改正了碰撞处理部分, 以前总有不稳定地方, 原来是撤销安全位置后没有调用碰撞形状集合的更新函数;
2: 精灵坐标改成了高精度(0.01), 内部坐标精确度为0.01个像素, 外部表现接口部分放缩成像素单位.

2016.10.16
下午终于把足球机器人程序调试好了, 加上了反正弦, 反余弦算法, 实现了坐标到角度距离的变换,
发现了一个BUG, 小车上的开平方算法没问题, 电脑上的却不行, 最后找到了原因, 原来是uint32的移位,
从uint24复制过来, 忘了把 0xffffff 改成 0xffffffff, 改完就好了.

增加了坐标角度变换模块, 做了一个恶魔之眼示例, 不错~~~
处理反余弦时, 靠近0度角附近精度太差, 一开始打算用分段查表函数, 发现效果还是不太好, 然后忽然想到,
当角度小于45度时通过反余弦查表; 角度大于45度时通过反正弦查表, 效果不错!

2016.10.27
今天过得... 太尴尬了, 呜呜, 以后成熟点...... 创业维艰啊!!!

晚上实现了界面的鼠标缩放功能, 放大后文字不失真, 效果不错!! 终于加上了这个放缩功能

2016.10.30
去掉了反复执行语句, 因为很容易引起误解. 每个控制器类都加上了一个 系统空闲时 事件

2016.10.31
增加了软件初始提示信息, 如界面操作指南, 小贴士等等, 这样方便用户上手;
修正了界面鼠标滚轮放缩的一个小BUG, 就是放大状态下无法完全跟踪鼠标, 加上了modX modY保存小数部分解决问题;

2016.11.02
终于实现了指令列表鼠标移动时提示信息功能, 打通了指令选择界面和模块对象之间的通信, 另外加上了一个指令警告提示区,
选择了信息显示器的显示数字指令, 会显示对应的提示信息, 以后的其他模块需要提示的, 也可以方便加进来;

晚上 9:46
改正了一个很久的BUG, 就是接口连接完成后, 再修改被连接对象的名称后, 导致编译出错. 现在加上了显示接口时,
自动刷新名称为最新名称, 解决问题;

2016.11.04
完善了信息提示面板, 现在可以指向模块, 提示过时模块, 延时器只需要一个等等, 可以指向任意MyObject对象;
昨晚上思考remo坐标系, 渐渐明朗, 应该基于目前的remo运行界面去做编辑器, 调节对象大小和位置时,
全部通过接口; 摄像机应该是运行时用户可设置(如果程序也自动设置了摄像机, 那么以用户操作优先, 几秒种后平滑移动到
程序设置数值)

最近所有思考结果: 2D切割, 流程图, 组件库模块矢量格式编辑器, 硬件虚拟仿真, 模块格式如何支持仿真, ...
全部指向了矢量图编辑器系统. 这个是核心, ... 开始正式设计矢量编辑系统吧

(PS: 模块文件M本身就应该是一个标准的矢量编辑文件)

这些思考全起源于前几天加上的界面放缩功能, 发现放大后字符和形状完全不失真, 梦寐以求的技术没想到这么简单...

晚上7:44 实现了remo运行界面的右键拖动, 鼠标滚轮放缩, 滚轮+右键调节角度, 以及所有鼠标操作映射到实际世界坐标系等;
下一步是基于remo运行框, 实现初步的对象选中拖拽和属性编辑功能, 这样以后的矢量编辑器实际上就可以基于remo来做了.

2016.11.9 半夜0:33
初步实现了remo运行界面调节控件尺寸, 四周定位方框可用了. 后续需要完善一下, 包括彻底去除对应DataList的影子变量,
DataList增加浮点数数组等.

2016.11.10
大改.... remo控件改为虚拟存储区方式, 每个字段都有自己专属对象, 如颜色等, 而不再是以前的统一用DataList整型数组实现,
更灵活. 通过统一的读写接口实现对象属性的读写, 封装内部专用字段, 字段可以是颜色, 整型, 浮点型等等

2016.11.10 晚上21:22
终于把Sprite类型改好了, 现在恢复成之前的状态了, 碰撞处理可以了. 晚上老是有各种问题, 最后终于发现这里:
case v_Hited:		Hited = Data != 0; break;
那个bool类型, 底层没有处理好, 导致高位三个字节未定义!!! 只有最低字节表示bool值...
今天彻底去除了DataList, 感觉就像是在朽木地基上修了一个房子, 然后又把朽木拆掉换成结实地基...

2016.11.11
晚上6:19 重大更新!!! 用户界面坐标系终于支持了Y轴向上为正的方式, 和数学课程一致..

2016.11.13
周末, 做了好多工作, 指令框改成了自适应刷新的位图形式, 界面放缩图片不失真, 微调了指令框的鼠标响应坐标;
实现了新指令的闪烁效果, 提示用户需要设置参数;
晚上23:36 初步实现了大地图的超级玛丽和坦克巡游游戏, 镜头视野通过鼠标手动切换. 下一版加上摄像机控件, 就可以
做游戏了.

2016.11.14 23:59
刚刚初步加上了摄像机视野模块, 可以通过设置视野坐标的方式实现对角色运动的跟踪, 使其始终显示在屏幕中央.

2016.11.24 半夜0:04
终于升级了音乐编辑器, 现在可以鼠标选中编辑双声道, 并且初步实现了电脑端引擎播放, 接下来单片机端调试一下就大功告成了...

2016.11.27 半夜0:05
大体上升级完了音乐编辑器, 现在也可以在单片机上播放双声道了. 只是速度很慢, 然后想到一个好办法, 就是由用户自行调节
播放速度, 也就是导入一个现有音乐文件, 然后自行修改下速度值即可, 这样更灵活, 就这样吧...
今天去参加了工信出版社的教材编写讨论会, 接下来准备好好写一下教程, 加油

2016.11.28
周末彻底实现了新版音乐编辑控件, 告一段落, 接下来开始 1:写教程 2:继续开发新版模块编辑器, 逐步支持仿真结构.
因为音乐编辑器功能比较好, 所以这一版 版本号改成了1.7

2016.12.6 半夜 0:10
初步加上了面包板元件, 可以正确编译了, 一开始很纠结如何实现端口的内部自动连接, 表示导通, 后来想到直接把
同类端口取同一个名字就好了! 甚至软件里什么都不需要特殊处理. 不过目前限流电阻和面包板连接还有BUG, 再调试吧...

2016.12.8 半夜 0:12
实现了面包板, 可以连接限流电阻使用了, 还有点小BUG, 再处理一下就好了.
别人都在努力, 都在快速进步...... 自己加油吧!!!

2016.12.9 半夜 0:38
终于完成了面包板, 现在可以同时连接面包板和限流电阻了, 端口属性扩散最后使用了一个不强大, 但是足够简洁的思路,
就是只根据主端口更新从端口, 反向扩散主属性, 从端口连接到LINE类型端口时不对LINE端口造成任何影响;

2016.12.14
改正了一个重要BUG，以前的LED，电阻，按钮等元件有问题，现在全部改成了新版元器件，端口中有一个电源口；

2016.12.15
改正了新版本打开动画程序为null的BUG；
增加了arduino双声道播放器模块，可以同时播放两个声道的音乐；
音乐播放器增加了播放是否结束和是否暂停状态指令；

2016.12.20
OK * 音乐编辑器的操作优化一下，去掉插入音符按钮，直接点击键盘为插入当前之后；

2016.12.20 晚上22:23
修正了汇编器的一个小BUG，就是汇编指令映射表中的替换 @label 位置错了，只有参数时才替换，且替换了多次，
但是居然没出错~ 因为大部分都有参数~
继续准备支持MEGA2560的非原子端口操作~ 通过开关中断实现禁止重入。加油

12.21 终于加上了2560所有的端口, 测试通过. 再把AD转换和4个串口端口加上就最终完成了
23:22 实现了2560的串口0和16路AD转换，不错~~ 加油吧

2016.12.22 晚上23:52
今天开始设计仿真功能, 很顺利, 本来以为这是一个大工程~ 晚上修复了链接器的一个小BUG, 现在更方便仿真支持包的配置了,
硬件模块可以不需要修改内部代码, 直接通过增强版连接器重定向驱动内部元素, 包括变量, 函数等(明天实现函数).
初步仿真了一下控制板指示灯闪烁, 没问题, 下一步是UI界面集成虚拟机, 为UI仿真动画提供基础.

2016.12.27 晚上0:08
实现了4位数码管的仿真, 继续努力!

2016.12.28 晚上23:28
实现了点阵LED的仿真; 实现了蜂鸣器, 扬声器, 双声道扬声器的仿真;

2016.12.28 修改了一个BUG, 前段时间增加2560,处理端口时加了开关中断, 
结果导致以前的端口原子操作优化失效(中间指令虚拟额不匹配), 今天调试舵机才发现的, 赶紧改好了.
另外舵机角度也改成了 -90度 到 +90度








