
2015年1月25日 晚上11:18
    放弃移植到安卓上去了，先用win8平板作为运行目标吧……
今晚增加了一个功能，当拖动逻辑类模块时，下边的所有连接模块都会同时被拖动，不过暂时还没处理
碰撞检测等；

2015年1月31日 下午5:45
    实现了接口的图形化端口连接, 不需要进入菜单面板点击按钮, 更加直观;

晚上23:59 - 把面板移到了模块右边, 又移到了左边... 应该分成两个面板, 左边的是事件列表, 右边的是其他属性;

2015年2月23日 正月初五 晚上10:35
    完善了表达式编辑功能, 全部集合到一个窗口中, 根据传入类型显示对应的按钮;

-------------------------------------------------
2015年2月24日 上午 11:44
    把组件库改成了初始化自动加载组件对象, 鼠标移动到对应的条目上就会直接显示对象列表, 
不需要加载对象的配置文件, 这样弹出各个条目的详细模块图片的速度加快了, 不像以前那样一卡一卡的. 效果很好;

-------------------------------------------------
2015年2月27日 下午4:31
    今天是过年回来上班的第一天, 计划给所里的工作项目-智慧天下公司的模块编写驱动程序, 结果发现
那些模块用的是MEGA48单片机, 于是抽出时间把自己的编译器增加了对MEGA48芯片的支持;

-------------------------------------------------
2015年3月2日 晚上9:31
    增加了事件资源计数器, 这样可以识别一个事件是否正在执行, 防止事件重入导致代码前后冲突; 图形界面
中每个事件自动生成一个计数器, 创建一个进程时就会被进程中的计数器指针锁住, 直到进程退出为止.
用旋钮调节音调程序测试通过, 效果非常好.

-------------------------------------------------
//2015.3.5 上午调试I2C MEGA48
//上午调试I2C通信, 还是接收不到数据! 好头疼啊... 正在一筹莫展之际, 忽然发现TWI的
//中断地址不对, 还是随便写的55! 于是赶紧改地址, 进入编译器汇编封包那里改一下, 改着改着
//觉得不对, 既然已经实现了rjump, 那还有必要做中断地址变换吗??? 于是试着把MEGA48处理成
//和MEGA32一样, 果然没有问题! 然后把MEGA8也改了, 去掉了中断地址变换, 直接跳到目标地址;

-------------------------------------------------
//2015.3.16
1 改正了文字显示引擎中的BUG, 数组应为11位
2 完成了8位数码管和随机数发生器;

-------------------------------------------------
2015年3月21日 下午 3:11 周六
    上午终于把软件的打开文件异常保护做好了, 出现异常之后不会导致界面卡住, 而是显示一个信息框,
之后软件自动退出;

-------------------------------------------------
2015年3月22日 中午 11:57 周日
    终于改正了一个BUG, 就是组件库打开或者新建(尤其是新建)一个文件的时候, 组件库老是闪, 抖动,
以前还偶尔会出现移到组件条目上却不弹出详情, 或者弹出详情但是条目却变成非 MouseOn 状态,
刚才加了一个 ModuleLib.Reset函数, 因为这个是静态的, 每次打开新文件都会调用这个函数, 现在非常稳定;

-------------------------------------------------
2015年3月22日 晚上 10:18
    整整折腾了一天~~~~ 本以为中午那个组件库抖动改好了， 结果发现越来越严重了，打开文件越多越乱。
最后花了一下午， 中午慢慢找出原因了， 是打开多个文件，包含多个GPanel，每个里边有一个FlashTimer，
这些Timer0.5秒触发一次Refresh，每个里边都设置了组件库的 SX，SY，导致SX，SY随机变化。调试了
半天，最后把SX，SY显示出来才发现的…… 于是加上了 GPanel的Close函数，把所有定时器关掉，就好了。

    另外晚上实现了清空控制器的自动检测功能，插上下载线，并且文件打开新的时就会触发弹出一个清空界面。

-------------------------------------------------
2015年3月24日 晚上 11:20
    一个晚上终于整理完了AVR芯片的编译参数设置, 全部提取到CPUType类中, 外界不需要知道各种芯片类型了;
这样要想支持新的AVR系列芯片, 理论上只需要在CPUType中加上几行代码就行了. 目前ISPForm尚未处理芯片类型,
明天再说吧, ... 目前的计划是把linkboy控制板芯片从MEGA32改为MEGA644, 这样可以轻松支持128*64液晶屏
等设备, 图形化组件等.

下一步计划:  提取出板子类型和语言类型, 合并为一个通用的路径包含替换语法, 或者直接处理成 #define

2015.3.25 晚上11:22 做了好多.... 结果如下:

目标是在文本模式下也很容易理解程序的结构, 正好趁着这次移植到MEGA644上, 把不兼容的程序
格式改为兼容C语言, 如常量定义等
移植计划:

====* 去掉#cpu=?这样, 用 #resetcompiler代替, 不在程序开始出现, 而是两个程序中间分隔
====* 初步实现了#define定义, 目前只支持字符串替换;
====* 常量定义放到前边, 如 const int32 data = 34;
====* #include 去掉后边的分号, 同时采用 "" 和 <> 的写法;
====* 试着能否把扫描芯片类型不独立出来, 直接一次性include扫描;
====* start函数不设置的话, 默认指向 main
====* 去掉 I 这一层元件, 直接给用户 #.??? 的空间;
====* 系统类放到 # 根目录下, 和用户程序在同一个空间;
====  分别命名为 base 和 code;
====* 结构体也做成C语言兼容的形式
====* 独立出 MCU OS linker等, 作为图形界面的普通文件包含进来

-------------------------------------------------
2015年3月27日 早上
    昨晚上终于把调度器移植到MEGA644上, T0 CTC中断可以触发事件了, 用单按键模块测试通过, 
完成了第一阶段; 昨晚上想到, 以前的第一版控制板模块其实还可以再用啊, 封装成 arduino 的形式,
配合即将开始设计的 arduino 文字编程框架;

    早上上班坐地铁想到两点: 

    一是对于 linkboy for PLC 系列, 提供给用户各种规格的控制器,
如按照输入路数, 输出路数区分, 带有继电器, 光耦隔离等; 编程依然用图形界面的指令调用方式;
另外加上大量的 "软件端口" (其实很早以前实现过), 如 PWM, AD, 以及端口电平监控器等;
这时候的就基本只需要控制板, 不再需要外围提供给用户模块, 因为可以兼容 arduino 的各种模块;

    二是要支持以前的控制板(插针式), 应该规范化组件设计器, 把 PORT 和 WIRE 合并成一种端口,
可以用户自定义端口绘制出来的形状, 大小等, 并且之前的 PORT 也用 unit 包实现, 不再用 bit 类型
来链接; 

    这样处理之后, 就很适合做成一个平台了, 可以兼容目前的所有 arduino/C语言系列模块;

-------------------------------------------------
2015年3月31日 周二 早上
    昨晚上把最后剩下的模块程序(小喇叭, 超声波, 红外遥控器) 全部移植到MEGA644上, 
终于完成一个阶段了, 下一步就是继续设计各种新模块... 

    昨天, 以及上周末, 连续三天心情很差... 不知道为什么, 衣服买的也不舒心, 唉...

-------------------------------------------------
2015年4月2日 晚上
*    调试好了MEGA644芯片的串口功能, 看门狗等, 现在基本上移植完成, 告一段落;
*    重新加上了成员快捷列表, 输入英文句号 '.' 可以显示出当前的成员项, 很方便; 点击词语也可以转到定义;
*    初步测试了一下软件一键下载功能, 可以连接到服务器上下载最新版的软件, 下一步可以做成自动
      检查更新并提示用户下载到指定的文件夹里;

-------------------------------------------------
2015年4月4日 中午 12:46
清明节放假第一天
修改名称时需要鼠标向左滑动, 容易经过说明框触发信息显示
测试程序全部移植到了MEGA644芯片上, 测试没问题;
改正了图形控件的尺寸拖动, 左右无法拖动. 加上了一个XPadding就好了;

-------------------------------------------------
2015年4月6日 半夜 0:25
清明节放假第二天
今天上午做了几套1602的液晶模块, 下午修正了组件库的条目和详情不同步BUG, 就是鼠标移入一点点时
不显示详情... 改好了, 现在完全同步了. 晚上整理了一下图形显示引擎, 发现有等间隔空白, 最后终于找到
原因, 是读取液晶屏直接返回0(串行模式), 然后加了1KB缓冲后就好了; 晚上接着合并了音乐和图片的
表达式选择窗口, 输入一个参数就会出现对应的元素供用户选择, 下一步是增加 memory 这个类型, 等同
处理成 music和bitmap, 这样就是先不采用连线(变量和存储区模块), 而是在变量的面板中增加一个按钮,
点击后弹出刚才整理好的那个表达式选择窗口, 输入的需求类型即是 memory.

...... 好累呀, 浑身没劲儿 ...... 赶紧睡觉了

-------------------------------------------------
2015年4月6日 中午 1:21
清明节放假第三天
上午终于把变量的存储位置设置功能做好了, 内置EEPROM的存储器接口类型也处理完成, 
下一步是写一个密码锁程序测试一下EEPROM.

晚上 11:10 晚上初步实现了指针的 * 和 & 两个运算, 可以指向简单类型变量了, 初步测试通过; 想到一点(可能很关键):
存储类型不再内置于类型中, 而是每个类型只有唯一一个存储位置, 全局的. 即一个完整类型包括纯类型和存储位置,...
code [4]uint8  (而不是 [4] code uint8)
code struct {uint8; uint8; } (而不是struct {code uint8; code uint8; }
......
这样解析类型就很简单了, 得好好思考一下... 目标是实现智能指针, 可以指向任意存储区

-------------------------------------------------
2015年4月7日 晚上7:02
发现了一个非常好的东西 - sharpdevelop 中自带的一个着色控件, 很好用, 偶然下载了SharpDevelop5, 
然后打开自带的一个例子, 很容易就做出一个程序代码高亮软件. 于是集成到了linkboy中, 将来有可能替代原先的linkboIDE. 
另外打算放弃SharpDevelop2, 以后就用 SharpDevelop5 吧.

-------------------------------------------------
2015年4月9日 晚上9:44
终于初步完成了 linkboy for Arduino 的IDE界面, 可以打开文件并进行编译下载, 有一个ListBox用来提示错误;
带有一个开源文本着色器. 目前基本能用了. 有些小问题, 都是由于WPF不熟悉导致的, 目前还没有解决. 如ListBox
的编译实时刷新, 点击程序区自动隐藏ListBox等. 另外点击错误列表跳转到出错行的功能还没有加上, 不过总算是
完成一个原形了.

-------------------------------------------------
2015年4月12日 周日 中午12:11
    上午完成了闹钟模块，可以连接到电子表模块并设置一个定时日期时间，到了就会触发时间到事件。发现一个问题，
就是偶尔时间事件无法触发~ 最后想了半天恍然大悟，感觉是用户态事件扫描程序读取了时间数据（SPI接口时序），
而定时器中断 OS_run 中也扫描秒标志占用SPI，导致时序混乱。然后试了下加大扫描频率，屏幕果然乱码，然后增加
一个 isSafe 标志位就好了，很稳定。

    但是那个定时事件还是偶尔不能触发，最后总算找到真正的原因：文本改变检测定时器间隔是0.1秒，设置参数后立刻
点击下载按钮的话， 就可能会赶不上，系统认为文本未改变。调整下，放到MouseMove事件中触发就好了。

    主要还是第一点那个进程冲突，访问资源要加保护。其他模块也要注意下，OS_run 中不要不加保护的访问用户资源；

-------------------------------------------------
2015.4.15
刚才在看浮点数资料时，想到给自己的语言加上浮点数，然后考虑怎么获取浮点数的小数部分，
于是习惯性的搜了一下，看到了结果，是通过取整和原数的差值可得。

然后忽然就想到，有了网络，似乎自己思考的机会越来越少了…… 遇到问题，几乎是不假思索的上网搜，
渐渐地感觉自己已经失去了思考的能力…… 很可怕，仔细想想

-------------------------------------------------
//液晶屏元件,处理器无关代码
//2015.4.15 23:40  唉.... 真是天才~~ 
//深更半夜解决一个重大问题: 2004液晶屏经常初始化不通过, 屏幕显示乱码,
//而一旦复位通过的话, 就会一直正常, 不再出错.
//反复查看数据手册也不知道哪里问题, ...... 怀疑是布线, 电容, 74595, ...
//加延时... 办法都用尽了, 最后偶然试着把复位序列调用多次, 看它行不行,
//结果一试非常稳定, 每次复位都能正确完成, 之后屏幕正常显示...

-------------------------------------------------
2015.4.20 晚上 8:58
1. 给 linkboy for Arduino 软件加上了输入句号"."显示组件成员列表项
2. 自动补全大括号, 一开始试验捕获回车按键, 结果试了半天发现不行! 最后折腾一晚上, 通过判断大括号键实现了...
3. 实现了输入 //加 +-*/= 时自动补全70个字符, 形成文本分割样式;

目前一个小问题: 输入回车后无法自动添加一个 制表符, 还是延续上一行的制表符数目, 有空再研究下吧.
现在这样已经可以赶上以前那个IDE了;

-------------------------------------------------
2015.4.29
改正了一个BUG, 现在可以对常量进行 (uint) 和 (int) 转换, 用 uint 时认为常量为 int 型, 用 int 时认为常量为 uint 型
并且返回最终的类型变量;

-------------------------------------------------
2015.4.30 下午6:38 明天五一劳动节放假
开始一个关键功能升级: 合并 base 和 code 类型(可能的话同时合并其他的 vtype)

下午6:39
类型地址从uint16改为了uint32, 高两位字节准备存放类型索引信息, 下载一个液晶屏显示程序发现无法运行, 经过分析
发现是base写入变量接口函数, 第二个参数应从 y+4开始, 而不是 y+2, 因为地址信息占据4个字节, 改好之后运行正常;

晚上8:02
初步做好了base和code的合并, 现在可以用一个指向单片机变量区的引用指向code区, 可以正常读出数据; 目前采用的
方法比较临时, 直接给code地址的第三个字节设置为1. 下一步是第三个字节设置为vtype索引, 就可以支持任意虚拟类型了;

5月1日 下午3:15
今天本想着移植图形引擎, 改为base和code合并版本, 但是发现base结构体指针指向code数组还是不行, 
于是用一个最基本的闪灯程序测试, 结果发现连闪灯程序都不行了, 折腾半天, 用一个能用的控制板程序删减半天, 
终于发现了, 多定义一个变量就好了~~~ 然后查找原因, 文本比较, 最后发现是程序的初始化清零静态变量的汇编代码存在BUG, 
当静态变量数目为0时将会清空整个64K内存... 呜呜, 太马虎了

这是改之前的, 有BUG:
	//初始化C环境, 清零内存区, 0x0060 - 0x0860 全部清零
	result.Append( "ldi r31," + StartAddress / 256 + "\n" );
	result.Append( "ldi r30," + StartAddress % 256 + "\n" );
	result.Append( "ldi r26,0\n" );
	result.Append( "finit:\n" );
	result.Append( "st z+,r26\n" );
	result.Append( "cpi r31," + SoftSP_high + "\n" );
	result.Append( "brne finit\n" );
	result.Append( "cpi r30," + SoftSP_low + "\n" );
	result.Append( "brne finit\n" );

这是改之后的, 虽然比较繁琐, 但是没有问题了:
	//初始化C环境, 清零内存区, 0x0060 - 0x0860 全部清零(实际只清零静态变量区)
	result.Append( "ldi r31," + StartAddress / 256 + "\n" );
	result.Append( "ldi r30," + StartAddress % 256 + "\n" );
	result.Append( "ldi r26,0\n" );
	result.Append( "finit0:\n" );
	result.Append( "cpi r31," + SoftSP_high + "\n" );
	result.Append( "brne finit1\n" );
	result.Append( "cpi r30," + SoftSP_low + "\n" );
	result.Append( "brne finit1\n" );
	result.Append( "jmp finitok\n" );
	result.Append( "finit1:\n" );
	result.Append( "st z+,r26\n" );
	result.Append( "jmp finit0\n" );
	result.Append( "finitok:\n" );

5月1日 下午5:03
数组名常量和结构体常量用 -> 重定向时给出了错误提示: 临时变量的值不能改变

5月1日 晚上11:25
初步做好了合并base和code的图形引擎, 但是图片尺寸默认为16还没有改.

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

5月2日 半夜0:03
终于把组件库root文件格式更新了, 可以多个模块并列竖直排列... 好累

5月3日 中午12:57
图形变量改成直接显示图片, 更加直观了. 但是还有一些小细节问题, 包括尺寸显示更新等;


//备注日期: 2015年5月8日
//今天又遇到了一个大问题, 播放不了音乐了, 一播放就死机,单片机复位... 找不到原因, 哎
//怀疑是 合并了 base code 之后, 汇编有问题, 但是仔细检查没问题啊.
//弄了一天, 忽然感觉这个情况好熟悉啊! 想起来了, 可能是堆栈溢出了!!! 于是赶紧把 OS 中的堆栈空间
//从 200 改为 300, 结果一试还是不行! 然后冷静下来想想, 明白了, 是中断堆栈, 每个中断函数的
//堆栈尺寸太小了... 于是找到那个关键的数字, 100改成了200, 一切OK!

5月8日 晚上 8:13
    完成了一个重要的功能, 不再需要一个临时函数返回音乐数据包, 而是在数组常量中可以直接引用
另一个数组名, 编译器会解析成对应的地址. 这样可以通过纯code常量包的方式封装多通道音乐数据,
下一步就可以整理用户编辑音乐的功能了, 不错!
//[i] var_music melody;
[#.code uint16*?] melody =
[
	//1, #addr main
	1, 0, #addr main, 1
];

-------------------------------------------------
5月17日 周日 上午10:46
周五晚上调试串口转NRF2401模块时, 发现MEGA8空间不够用了, 没办法, 只好开始处理下编译器优化.
昨天弄了一天, 把汇编库的读写接口提取出来, 然后自作主张改了几个细节. 昨晚上初步排除了
一些错误, 今天开始用运算集合程序进行测试, 发现第一个就不行, 基本的比较运算. 然后检查下
汇编库, 最后终于发现了, clr r20 这个指令影响标志位... 唉, 真不该改
不过发现以前的版本, 也是有的指令, 先比较寄存器, 然后设置 clr r30

# >_bool_sint16_sint16 $a0 $b0 $c0 $va $vb $vc//sint16-大于

$b1 = $b0 + 1//
$c1 = $c0 + 1//

ldd_$vb r20,$b0
ldd_$vb r21,$b1
ldd_$vc r24,$c0
ldd_$vc r25,$c1

sub r24,r20
sbc r25,r21
ser r30		//这里应该一开始就设置(减法之前)
brlt @label1
clr r30
@label1:

std_$va $a0,r30

估计是以前的版本本来就有错误, 只是侥幸没发现而已, ...
刚才测试又没问题, 因为 ser r30 不影响标志位, 又是碰巧了

写入 uint8 IO 类型分量处理下, 不应该带有 LOAD 和 STORE
目前临时用了一个解决方案

2015.5.17 上午11:32
改好了错误级别4之后, 居然就没错了, 有点接受不了, 还等着改错呢

2015.5.17 下午 5:29
//清除上一次的标志, 不能把这个标志遗留到以后的代码, 防止该加载的变量忽略
//刚才别的程序优化都没问题, 就是音乐播放有问题, 播放太慢了, 研究一下午, 终于发现了问题, 下边的程序优化逻辑
//有些问题, 没有把 LastOperVarIndex 清零, 导致下一个指令忽略了加载数据(碰巧相等时)

2015.5.17 下午 7:31
提取出读写接口后, 优化就非常好做了
刚实现了 IO 类型的常量位赋值优化,
端口设置只要一个汇编指令就可以完成;
总算是解决了这个大问题

目前静态和局部变量的常量位分量写入没有做优化

目前的一个问题: AVR rjmp指令还是不能跳转到整个范围, 好像是 0 - 4096, 有空研究下
临时的解决方案: 中断函数尽量靠前

总结:
2015.5.17 晚上 11:14
本来周五晚上打算调试好串口转NRF2401, 结果发现加上了串口之后, 跳转偏移量超了! 以为是代码超出8K,
没办法, 只好开始处理编译器优化部分. 周末折腾了两天, 优化终于做好了, 提取了
接口读写, 目前优化率为原先的85%左右; 然后再处理那个串口转无线, 还是超了, 最后优化
不行了, 还是精简吧, 去掉int32运算, 还打算去掉内置16,32位函数库呢, 结果发现
正确之后, 代码只有4K多... 然后发现了超的那个 rjmp 仅仅是中断跳转... 无语啊...
然后把串口代码放到NRF2401之前, 一切OK... 刚才写了一个串口转无线双向通信, 没有问题;

-------------------------------------------------
2015年5月20日 晚上9:03
初步把linka做成了被动连接方式握手, 控制板主动给上位机发送数据进行连接; 测试通过, 不过
只有基本的功能, 无法实现运行时控制板复位重建, 另外控制板没有连续发送握手数据; 下一步
改为连续发送, 这样运行linka就会连上了, 不需要在手工按下复位键;

2015年5月21日 晚上8:39
做好了无线方式的linka远程通信, 非常稳定, 效果很好~ 下一步需要把USB转接器的协议处理下,
目前的是收到一个串口字符就无线发送出去, 速度比较慢.

2015年5月25日 晚上8:39
今天调试无线linka, 发现控制板连接后不复位, 重启linka时, 点击退出按钮无法结束, 进程中还有
linka.exe 最后终于找到了原因, 就是 不要再用:
while( ) {
	DoEvent();...
}
这样的结构了, 哎...
可是发现还是不稳定, 就是PL2303时常没反应, 只能重新插拔, ... 很是郁闷, 弄了一天也没有弄好...

//---------------------------------------------------
//2015.5.27 都快气死了... 
//想起前段时间, 图形化程序控制板端不能用了, wifi收数据没反应. 不知道为什么...
//今天把蓝牙安卓程序整理好了, 可以添加自己的图形界面进行蓝牙通信, 但是发现一个问题, 发送
//单个的字符控制小灯闪烁没问题, 但是发送协议却不行! AA N *** 0 这样. 还以为是java没法发送
//大于127的字符呢, 最后发现把协议的 AA 改成 0A 就行了, 真是奇怪了. 然后忽然想到, 是自己的
//协议解析程序有问题!!!

//int8 data = #.SerialPort.GetData( index );
//index + 1;		
//判断是否为合法的数据头部
//if( index == 1 ) {			
//	//普通数据包
//	if( data == 0xAA ) {
//		return;
//	}
//那个data永远不可能等于0xAA! 哎.. 然后赶快看以前的程序, 发现以前的协议是 0x55, 难怪以前没问题!

//然后改了编译器的类型解析这里, 常量(有符号数)和另一个有符号数运算时, 如果不能隐式转换, 那么就返回一个
// overflow, 表示溢出错误. 这样改了之后, 觉得自己的编译器写代码, 可靠性又变高了, 放心. 很好... 

//---------------------------------------------------
//2015.5.28
    实现了串口协议解析器, 可以设置协议, 设置数目, 并可忽略空的数据字节; 下一步是增加一些提示功能,
数据格式(各种进制都支持)等等;

//---------------------------------------------------
//2015.7.12
表达式图形化编辑器里边的加减乘除余加上了等于号（返回void类型时），可能以后也要把代码层面完全兼容C语言；




//=======================================================================
//2015.7.24
今天开始正式推广linkboy, 版本号为 1.0.0.0

//2015.7.24

v1.0.150724
修正了点阵取模插件的文字转图片BUG(输入空格导致异常)

v1.0.150726
初步改正了图片变量编辑文字点阵的时候出现的空白, 方法是把字符串拆成单个的字符逐个显示, 效果非常好!
下一步可以支持用户设置字符显示起始XY, 字符宽度, 字符高度, 整体平移等功能, 另外图片宽度和高度即使在
文字模式下也应允许用户修改(修改之后保持原有的数据不变)
这样一来, 图片点阵模块就很强大了, 比得上以前用的专业取模软件了. 可以实现各个字体微调到8*8, 16*16等尺寸中;

2015.7.27
增加了修改点阵宽度和高度时保留以前点阵信息的功能, 现在可以方便的裁剪文字边缘了;
实现了文字间距和高度间距的修改功能, 下一步是提供整体移位功能, 后期可实现鼠标选定区域移位功能;

晚上 7:51
实现了整幅图片的平移, 目前基本完善了;

以上修改之后的版本定为 v1.0.150727

//=======================================================================

2015.8.1 周六
最近开始做linka了, 改名为 remo并且移植到安卓系统上; 今天实现了NumbeBox和TraceBar, 并且都是跨平台的控件;
原来的linka程序可能就作为旧版, 不再升级; 以后同步维护新版PC端remo和安卓端remo
此版本定为 v1.0.150801

2015年8月2日 周日
周末, 终于把remo弄得差不多了, 共用一套控件; 布局器也导入了跨平台控件(而不是以前那样临时绘图),
真正的所见即所得, 布局界面和最终的运行界面完全一样. 另外组件库图片也完善好了.

刚才调试稳定性, 发现偶尔异常(RGB,滑动条被控偶然为零), 后来问题很严重, 越来越卡...
终于调试好了.

2015.8.3
实现了控件在安卓手机上运行时自动适应屏幕尺寸的功能;
目前remo基本完善了.

2015.8.5
昨晚本想改成UI线程处理数据接收的, 不行, 又改回成
直接在线程中接收消息执行 Decode.
然后试验remo在XP系统上界面刷新好慢! 找了半夜也没找到问题,
今天再试试.
(本想添加MIDI音乐控件的, 也耽误了)

当前版本为发布的第二个公开版本, 版本号为 v1.1.150805

//=======================================================================

2015年8月14日 在家
增加了 CheckBox 控件, 回去了验证下是否可用;

2015年8月18日 在家
在windows下验证了CheckBox控件, 修改了一些小问题后测试通过;

//=======================================================================

2015年9月14日 晚上10:45

今天刚从家回来, 在家一个多月... 老爸的病终于好了
晚上调试项目--循迹小车, 不稳定. 自己搭建了一个模型, 然后解决了两个BUG:

1是马达调速, 发现有时候居然反转, 然后加了一个标志位变量Changed就好了;

	public void OS_run100us()
	{
		Changed = false;
	}

2是偶尔不响应遮挡检测模块的事件, 找了半天原因, 最后终于发现了! 这里:

	//---------------------------------------------------
	//[i] function_void OS_run;
	public void OS_run()
	{
		//一定要先读取到一个临时变量中!!!!
		//2015.9.14 22:41
		bit KEY0 = KEY0_IN;
		
		bit key0_down = ~KEY0 & last_key0_press;
		bit key0_up = KEY0 & ~last_key0_press;
		if( key0_down == 1 ) OS_EventFlag.0(bit) = 1;
		if( key0_up == 1 ) OS_EventFlag.1(bit) = 1;
		last_key0_press = KEY0;
	}

唉, 太马虎了... 以后一定要记住了, 端口变量先读取到临时变量中!!!!

当前版本号为 v1.2.150922

//=======================================================================
2015年10月14日 晚上7:24

初步实现了移植到MCS51单片机, 闪烁和流水灯测试通过

//=======================================================================
2015年10月28日
给巨人学校的定制版初步做好了, 不容易啊...

//=======================================================================
2015年10月30日
周五晚上 8点17
终于把编译器重新支持了51系列单片机!!!! 用74595测试通过, 主要找回来以前的Malloc文件.

2015年11月4日 半夜
初步隐藏了以前的指令连接方式, 改成了类似于Scratch拖拽形式, 目前实现了指令的吸附连接,
整体拖动等. 下一步实现条件指令

2015.11.5 晚上9:19
两天时间, 就实现了Scratch模式编程, 不错啊...
真是应该早点换成这种的... 以前的箭头方式, 不行啊...

2015年11月6日 半夜 0:53
把指令的删除做好了, 拖到一个垃圾桶图标上就会删除. 另外把定时器的时间改为秒为单位,
编译器遇到 0.1 这样的常量, 临时解释成 100, 以后应该增加专门的浮点型变量;

//=======================================================================
2015年11月15日

昨天周六忙了一天, 到半夜三点钟, 实现了:
1) 编译器移植到MEGA328 (调度OS测试通过), 为支持 Arduino 做好了准备; 
2) 添加了 Arduino UNO / NANO 图形模块并调试通过;
3) 实现了调用 AVRdude 下载程序到 Arduino 控制板 (UNO和NANO 都一一实现);
4) 加入了下载时设置串口号和波特率的窗体;

下一步计划是尽快增加 LED, 数码管, 蜂鸣器, 电阻, 三极管 等常用电子元件的图形化模型,
好好设计一下交互逻辑接口, 尽可能接近实际和拟真;

//=======================================================================
2015年11月20日

参加了硬件创新大赛, 并添加了led,数码管等基本模块.

初步调试成功虚拟机运行方式, 为下一步实现scratch做好准备;

2015年11月22日
周末, 下大雪
昨天完成了虚拟机运行显示一个运动的线条; 晚上增加了595移位和ULN2803模块的图形界面, 可以运行;
今天下午加上了用户自定义函数的形参和返回值, 基本操作上就差不多了, 比较完善了.
下午思考那个虚拟机的时候, 意识到, 最终的虚拟机和remo肯定要合并起来的, 因为所有的控件都有
这两种调用方式. 虚拟机调用控件, 也合并到remo的数据通道方式中, 通过数据通道和界面交互;

2015年11月23日 晚上把ds18b20测试通过, 当前版本号: v1.2.1511
这个版本也是放到网站上, 带有版本记录的第一版

晚上在思考remo和vex,如何合并... 那个vex是独立虚拟机, 只是一个临时测试用. 刚才合并好了,
现在可以用remo运行vex程序了, 不错啊... 然后思考如何统一通用控件(自动刷新)和用户自定义绘图,
因为用户自定义绘图是不能刷新的.. 然后忽然想到, 应该添加一种新控件--绘图控件, 里边有一个
bitmap保存用户的绘图结果, 而显示时作为一个普通控件去显示, 就这样! 最终的方案.

2015年11月27日
周五晚上... 做了好多, 实现了remo的虚拟机运行, 实现了和SG控件通信, 实现了调度器移植到虚拟机...
进度好快呀.
也做好了虚拟机文件打开方式指定, 系统进行判断并设置.

半夜 0:02 把控件的字符串设置函数全部改为了GBK编码,不再使用unicode编码

2015年11月28日
周六, 加了定时器和延时器模块, 加了定时中断驱动, 发现定时器可以运行, 但是延时器不行, 目前还没改;
因为电脑中断频率不能太快, 所以把定时器, 延时器加上一个分频项, 可以通用于单片机和虚拟机;

----------------------------------------------------
2015年11月30日 23:42
OK 1 实现定时器, 延时器等
2 实现背景GUI绘图模块
3 增加各种场景,动画,造型
4 鼠标和键盘事件触发中断
OK 5 事件改为函数形式, 可以带有参数

折腾了好几天, 终于弄好了 Delayer, 一开始调用延时后, 就卡住了, 程序很奇怪, 各种问题. 
周六晚上弄了很晚放弃了; 今晚接着弄, 加了一个 AddNumberMes 函数作为调试, 很好用, 逐步发现了问题,
最后发现在 OS_run 函数开始加上一个任意汇编指令就行了, 然后顺藤摸瓜, 终于找到了原因: 那个读取
函数地址到PC的指令, 没有设置 PCnext 为false, 导致PC又多加了1.... 太马虎了

2012.12.2 半夜 0:28
终于支持了键盘事件监听, 并且可以监听多个独立按键, 互不影响;
这样就可以做游戏了, 下一步是监听按键的设置界面, 应该用一个键盘布局, 方便用户设置;

----------------------------------------------------
2015年12月6日 23:32
今天从家里回来了, 去医院老爸的复查终于结束了, 还是有点偏高...
这几天完成了:
1 按键设置监听按键, 通过一个键盘面板设置, 目前只能设置一个键;
2 分离了MIDI播放器的各个参数;
3 MIDI播放器的设置音色用一个专用的音色面板去设置;
4 arduino连接remo的连接器做好了, 可以通过remo和arduino板子交互;

----------------------------------------------------
2015年12月8日
把虚拟机中断的定时器改成了一个多媒体定时器,以前的精度只能达到0.1秒,现在可以达到0.001秒了, 好厉害~
去掉了定时器和延时器里边的那个 PerTimer, 不需要了. 不过当方块运动过快时导致系统死机, 需要找找原因.

2015.12.9
解决了一个BUG, 调试动画运动, 发现到了左边不反弹... 折腾半天终于发现问题了, 
就是在 读系统量_sint32 中没有处理负数.. 直接是空的函数. 
应该根据符号位, 对数据进行规格化, 因为后续不一定把这个数据存起来, 可能立刻要参与下一个运算 
(优化时自动去掉了保存和加载) 加上下边的代码就好了:

static void 读系统量_sint32( string[] Cut )
{
	if( ( A & 0x80000000 ) != 0 ) {
		A = -( ( A ^ 0xffffffff ) + 1 );
	}
}

晚上 23:19 终于做好了第一个动画作品, 不错!!!
并且解决了动画卡住不响应, 不运动的问题----通过一个线程锁lock锁住中断事件添加代码就行了, 确保顺序添加;

2015.12.10 晚上 9:18
增加了角色的宽度/高度比例 和 透明度属性;

晚上忽然做不下去了, 不知道该做啥了.... 半夜开始转换方向, 增加波形显示控件, 目前初步添加好了控件;

在做坦克大战游戏时, 增加了按键的属性, 目前有: 默认/忽略新键/强制结束其他键/暂停其他键, 控制坦克的时候很爽!!!!
非常流畅和顺手.

2015.12.12 半夜 2:13
实现了角色背景图片序号功能, 可以切换图片, 做爆炸效果等; 实现了动作控制器;
下一步需要支持时间秒数的小数设置功能;

2015.12.12 周六, 昨晚睡得太晚了.... 上午实现了延时器和动作控制器的秒数支持小数功能, 根据 float 标志
自动隐藏显示常量输入面板的小数点按钮, 这样不错;

====================================================
2015.12.12 周日中午出去转, 想到如下方案:
1 角色坐标用浮点数, 这样可以向指定角度前进几个像素, 累加不失真;
2 增加复合角色, 可用于俄罗斯方块碰撞检测, 坦克大战背景地图, 各种游戏背景碰撞地图等等
  (备注: 复合角色内部元素按照行列整齐排列, 可以用脚本生成一个复杂的地图); 甚至地图可以在运行时再次执行那个
  脚本去更新, 用于设计游戏关卡等) 等等... 也可以添加各种事件, 例如角色走到一个背景里边的某个元素上(武器等),
  系统会触发自定义事件
3 子弹飞行的过程中可以飞的很快依然能进行碰撞检测, 每次坐标被修改后, 会自动在走过的路径上内部重走一次, 
  判断是否碰撞; 碰撞检测交给系统来做, 角色可设置参考形状用于碰撞范围计算, 如圆形, 长方形, 正方形, 椭圆, 亦可以
  用户在图片上根据图片内容圈出一个圆形, 长方形等, 或者可以多个简单形状组合起来进行判断)
  做像素级别的碰撞检测, 其实没有意义...
4 通过接口元件实现角色的物理属性添加, 如速度, 弹性, 惯性, 重量, 浮力等
5 接口是否应该换一个形式, 思路是类似于给模块添加技能(而不是取代他), 各种引擎等软件模块需要考虑下... 目前的,
  添加引擎后就不能再访问基础模块, 确实不太好; 引擎名字也是一个不好的地方... 觉得应该改;

晚上0:27
花了整整一晚上, 终于把虚拟机的优化字节码做好了, 以前是直接执行字符串指令, 现在是先转换字符串到字节码, 然后
再执行字节码, 看上去执行速度好像是快了一些..
PS: 发现虚拟机其实还是有问题, 就是加减乘除等没考虑不同位数需要规格化的问题, 如 u8 + u8, 并没有清除高8位数据;

实现了碰撞检测放到系统中自动处理, 发生碰撞后就会给对应的角色一个触发事件, 这样就好用了;
同时检测碰撞的范围会根据角色角度进行变换(目前仅处理好角度, 尺寸缩放等尚未考虑进来);

刚才去掉了BackPanel, 用用户的ControlPad代替, 这样可以少画一个背景图片, 提高速度.

0:25 2015.12.16 Panel可以设置图像了(但是jpg格式的好像不对, 很大), 解决了一些碰撞的小BUG....

---------------------
去掉了虚拟机模块, 集成到了窗口中, 这样更方便了.

2015.12.17 晚上9:51
初步做好了一个图片去除背景的小工具, 实现了橡皮擦, 魔棒去背景等功能;

2015.12.20 2:06 ...
//BufferPanel:
//这个效率不高, 还是不要用了......  都用了好几年, 今晚才发现, 效率不高.. 可以直接重载 OnPaint 显示的..

去掉了 BufferPanel 的图片, 这样又少画了一层, 软件界面明显变快了. 不过目前乐谱和点阵尚未修改过来;

周六, 上午实现了 编辑图片放缩功能, 晚上查资料实现了图片放大后查看清晰点阵的属性, 这样基本完善了;

2015.12.20 晚上 7:34 今天在家增加了音乐文件播放控件, 折腾一天发现无法播放, 最后发现应该放到主线程才行,
那个 MCIsendstring 函数; 然后又折腾一晚上发现声音播放后无法停止... 最后发现原来停止播放的函数也没放到主线程...
呜呜  快把我搞崩溃了...

2015年12月22日 晚上23:49
实现了角色碰撞后自动停止(退回到安全位置), 作为一个图形界面可设置的属性; 按键类增加了启动和禁用功能, 用于
超级玛丽跳起后再次按下跳跃键忽略;

----
实现了角色说话功能
实现了图片打开后解除锁定, 保存时可以覆盖原图片;
背景拖动换成了鼠标右键;

2015.12.26 0:04 增加了速度属性, 下一步是增加重力属性, 并引出碰撞允许开关量给用户使用, 可动态切换角色是否允许碰撞;

2015.12.28 0:34 周日把串口整理一下, 去掉了原来的协议, 改成新版的(基本串口只带有一个数据缓冲区, 更通用), 
协议设计器界面调整了一下, 准备增加"多个值"属性, 协议解析时会进行匹配;

---------------------
2015年12月28日 23:48
增加了电脑串口组件并测试通过, 发现一个问题, 在线程中不能创建 Form定时器, 不会工作的, 后来用 MmTimer 搞定;
目前可以设置波特率, 串口号需要手工设定, 下一步增加一个配置界面(既可以编程时设定属性, 也可以运行时设定);
最终运行时, 是一个可见的串口图标, 点击后就会弹出属性设置框, 而不是以前设想的, 提供一个组合下拉列表框,文本框等.

---------------------
2015年12月29日 23:45
初步增加了育松电子的马达驱动, 单路继电器和双路继电器, 还挺简单...



