import win.ui;
/*DSG{{*/
mainForm = win.form(text="CAN_Bootloader";right=599;bottom=465;border="dialog frame";max=false)
mainForm.add(
btnConnect={cls="button";text="连接";left=204;top=64;right=289;bottom=90;z=4};
btnDiag={cls="button";text="诊断";left=149;top=350;right=248;bottom=375;z=25};
btnFlash={cls="button";text="开始刷写";left=37;top=315;right=136;bottom=343;z=9};
btnFresh={cls="button";text="刷新";left=204;top=28;right=288;bottom=54;z=2};
btnOpen={cls="button";text="打开文件";left=37;top=282;right=136;bottom=310;z=8};
btnOpenFlashdrv={cls="button";text="打开FlashDriver";left=149;top=282;right=248;bottom=310;z=24};
btnReadF186={cls="button";text="读取当前会话";left=37;top=349;right=136;bottom=377;z=13};
btnReadF191={cls="button";text="读取F191";left=37;top=415;right=136;bottom=443;z=19};
btnReadF199={cls="button";text="读取F199";left=149;top=415;right=248;bottom=443;z=20};
btnReadHw={cls="button";text="读取硬件版本号";left=149;top=381;right=248;bottom=409;z=12};
btnReadSw={cls="button";text="读取软件版本号";left=37;top=382;right=136;bottom=410;z=10};
btnTest={cls="button";text="停止";left=149;top=316;right=248;bottom=344;z=11};
button={cls="button";text="Button";left=248;top=445;right=278;bottom=459;z=26};
cbbChannel={cls="combobox";left=58;top=64;right=191;bottom=90;edge=1;items={};mode="dropdown";z=3};
cbbDev={cls="combobox";left=58;top=27;right=191;bottom=53;edge=1;items={};mode="dropdown";z=1};
checkbox={cls="checkbox";text="CANFD设备";left=151;top=101;right=248;bottom=120;checked=1;z=21};
edFile={cls="richedit";left=8;top=131;right=288;bottom=187;border=1;disabled=1;edge=1;multiline=1;wrap=1;z=14};
edFile2={cls="richedit";left=8;top=213;right=288;bottom=269;border=1;disabled=1;edge=1;multiline=1;wrap=1;z=22};
edit={cls="edit";left=294;top=19;right=596;bottom=401;autovscroll=false;edge=1;multiline=1;vscroll=1;z=5};
progress={cls="progress";left=296;top=436;right=596;bottom=464;edge=1;max=100;min=0;z=15};
static={cls="static";text="设备";left=1;top=28;right=61;bottom=52;align="center";center=1;transparent=1;z=6};
static2={cls="static";text="通道";left=1;top=66;right=61;bottom=90;align="center";center=1;transparent=1;z=7};
static3={cls="static";text="刷写进度";left=296;top=409;right=349;bottom=429;transparent=1;z=16};
static4={cls="static";text="烧录APP";left=13;top=108;right=85;bottom=132;center=1;transparent=1;z=17};
static5={cls="static";text="V0.1_20220518";left=451;top=1;right=595;bottom=17;align="right";center=1;transparent=1;z=18};
static6={cls="static";text="FlashDriver";left=13;top=195;right=101;bottom=218;transparent=1;z=23}
)
/*}}*/

import win;
import usb2canfd;
import win.timer;

var boot_count = 0;//boot时间计数器
var bootstate = false;//boot状态标志
var starttime = time.now();
timer_bootcount = win.timer(mainForm,100);
timer_bootcount.onTimer = function(){//boot时间定时器，100ms间隔
	boot_count++;
}

Display = function(str){//显示日志
	var nowtime = time();
	nowtime.format="%H:%M:%S";
	mainForm.edit.print(tostring(nowtime) + " " + str);
}
//遍历目录
import console;

/*
import fsys.fileInfo;
info = fsys.fileInfo("C:\Users\fcb19\Desktop\dll\libusb-1.0.dll");
console.log(info.writeTime);
execute("pause")
raw.loadDll("C:\Users\fcb19\Desktop\dll\libusb-1.0.dll");
*/
CANHw = usb2canfd.USB2CANHW();//尝试加载CAN dll
var ret = CANHw.LoadDll();
if(ret == 0){
	Display("DLL加载成功");
}
else {
	//Display("DLL加载失败");
	return ; 
}


//初始化界面
mainForm.cbbChannel.add("通道1");
mainForm.cbbChannel.add("通道2");
mainForm.cbbChannel.selIndex = 1


//刷新按键
mainForm.btnFresh.oncommand = function(id,event){
	mainForm.cbbDev.clear();//清空下拉框，防止反复刷新叠加
	var hwnum = CANHw.FlashHw();//获取硬件数量
	if(hwnum == 0){
		mainForm.cbbDev.text = "未找到硬件"
	}
	else {
		var allhw = CANHw.GetAvailableHW();
		for(i=1;#allhw;1){
			mainForm.cbbDev.add(allhw[i].name);
		}	 
	}
	mainForm.cbbDev.selIndex = 1
	::PostThreadMessage(thrdId,100,0,0)//自定义消息
}

mainForm.btnConnect.oncommand = function(id,event){
	var canfd_check = mainForm.checkbox.checked?0x80:0x00;
	::PostThreadMessage(thrdId,101,mainForm.cbbDev.selIndex,(mainForm.cbbChannel.selIndex - 1)|canfd_check)//自定义消息
	/*
	var ret = CANHw.OpenDevice(mainForm.cbbDev.selIndex,mainForm.cbbChannel.selIndex - 1);//通道为0和1
	if(ret == 0){
		Display("连接成功");
	}
	else {
		Display("连接失败");
	}
	*/
}

//CAN通讯线程
import thread.command;
var listener = thread.command();
var flag_connected=0;
listener.$Display = function(str){
	Display(str);
}
listener.$ShowPath = function(str){
	mainForm.edFile.text = str;
}
listener.$ShowFlashDrvPath = function(str){
	mainForm.edFile2.text = str;
}
listener.$SetProgress = function(pos){
	if(pos >= 0 && pos <= 100){
		mainForm.progress.pos = pos;
	}
}

listener.$Connected = function(){
	mainForm.btnConnect.disabled = true;
	mainForm.btnFresh.disabled = true;
	mainForm.cbbDev.disabled = true;
	mainForm.cbbChannel.disabled = true;
	flag_connected = 1;
}
listener.$SendEnd = function(isSuccess){
	//timer_bootcount.disable();
	var usetime = time.now().diffsecond(starttime);
	bootstate = false;
	if(isSuccess == true){
		Display("刷写成功，用时 " + usetime + " S")
	}
}

//线程函数
var CanThread = function(){

	//线程函数内部要添加自已的import语句
    import win; 
    import console;
    //console.log("线程开始运行")
	loadcodex("\user\CanThread.aardio");//加载线程程序
    //在子线程启动消息循环
    win.loopMessage(FuncLoopMsg)
}
DiagReadDID = function(did){
	::PostThreadMessage(thrdId,110,did,0)//自定义消息
}
var Diag10Req = function(num){
	::PostThreadMessage(thrdId,111,num,0)//自定义消息
}
var DiagBootReq = function(){
	::PostThreadMessage(thrdId,102,0,0)//自定义消息
}
var DiagStopReq = function(){
	::PostThreadMessage(thrdId,103,0,0)//自定义消息
}

mainForm.btnReadSw.oncommand = function(id,event){
	DiagReadDID(0xF195);
}


mainForm.btnReadHw.oncommand = function(id,event){
	DiagReadDID(0xF193);
}

mainForm.btnReadF186.oncommand = function(id,event){
	DiagReadDID(0xF186);
}

mainForm.btnTest.oncommand = function(id,event){
	DiagStopReq();
}

mainForm.btnFlash.oncommand = function(id,event){
	if(io.exist(mainForm.edFile.text) == null){
		Display("请打开烧写文件");
		return; 
	}
	if(io.exist(mainForm.edFile2.text) == null){
		Display("请打开flashdriver文件");
		return; 
	}
	if(flag_connected == 0){
		Display("请连接设备");
		return; 
	}
	if(bootstate == true){
		return ;
	}
	bootstate = true;
	mainForm.edit.text = "";
	Display("开始刷写流程");
	starttime = time.now();
	//timer_bootcount.enable();
	boot_count = 0;
	DiagBootReq();

	
}

mainForm.btnOpen.oncommand = function(id,event){
	::PostThreadMessage(thrdId,104,2,0)//自定义消息-打开文件
}

//程序关闭
mainForm.onClose = function(hwnd,message,wParam,lParam){
	if(thrdId != null){
		::PostThreadMessage(thrdId,105,0,0)//自定义消息
		thread.waitClose(thrdHandle);
	}
	
	
    //PLinHw.isConnected()///待完善
    //console.print("线程已关闭")
    //console.pause()
}

mainForm.btnReadF191.oncommand = function(id,event){
	DiagReadDID(0xF191);
}

mainForm.btnReadF199.oncommand = function(id,event){
	DiagReadDID(0x1702);
}

mainForm.btnOpenFlashdrv.oncommand = function(id,event){
	::PostThreadMessage(thrdId,104,1,0)//自定义消息-打开flashdriver
}

var frmChild = win.loadForm("\dlg\诊断子窗口.aardio");
frmChild.show(false);
mainForm.btnDiag.oncommand = function(id,event){
		
	frmChild.show();
	
}

thrdHandle,thrdId = thread.create( CanThread ) 


mainForm.onClose = function(hwnd,message,wParam,lParam){
	::PostThreadMessage(thrdId,120,1,0)
    raw.closehandle(thrdHandle);
    thread.waitClose(thrdHandle);
    
}

mainForm.button.oncommand = function(id,event){
	DiagReadDID(0xF191);
}

mainForm.show();
return win.loopMessage();