;--------+---------+---------+---------+---------+---------+---------+---------+
;  RS485-IDWriter Version 2.0c Programmed by Futaba Corporation
;	Current Platform - windowsXP
;	Programmed in HSP ver3.0a  by onion software
;		& ɏݖ߃W[ Version1.0 by v} (ExeWrightMod)
;		& ӂ邨ԂLite by eƂ (colorfulobject)
;		& header/macro and module Library  - rs485header, exobject, rs485comm
;--------+---------+---------+---------+---------+---------+---------+---------+
;/
;	2006/05/17 : 1.0		TŁ@
;	2006/06/09 : 1.1a		UŁ@eXg͈̔͂ݒ@\ǉ	
;	2006/07/31 : 1.2a		VŁ@ʃTCYgo[W
;	2006/09/27 : 2.0a		WŁ@J
;		COMportiR{{bNXIj		FCOM1`10
;		BaudRateiR{{bNXIj		F9.6k-1.3M
;		Present servo IDiĺj		FT[{ID0`127 0all(255)
;		New     servo IDiĺj		FVT[{IDݒ 1`127
;		Automatic testi`FbN{bNXj	FmF
;		ID updatei{^j					FT[{IDID
;		Servo testi{^j				FeXg
;		eXgʒu{iR{{bNXIj	F0`+150x(10x)
;		eXgʒu|iR{{bNXIj	F0`-150x(10x)
;		Closei{^j						FI
;	2007/02/20 : 2.0b		XŁ@sC
;		WriteFlashRom̌L(:WrihtFlashRom)
;	2009/03/24 : 2.0c
;		ݑ҂ԂRS405CBǉiRĝ݁j

#define	SoftName	"RS485-IDWriter for RS30xxx"		;soft name
#define VerNum	 	"2.0c"								;version
#define	Copyright	"Copyright (C) 2006 Futaba Corporation"

#define ScrnX	400										;Screen Width
#define ScrnY	200 									;screen height

;/st@C쐬IvVw
; type=0(EXEt@C), orgpath=0(fBNgړ)
#packopt name "RS485-IDWriter"							;st@C
#packopt runtime "hsp3c.hrt"							;^C
#packopt hide 1											;EBhE\

;/ʂ̔\
;--------+---------+---------+---------+---------+---------+---------+---------+
; NɈu\̂𖳂B
; EXE쐬 uNCEBhE\vɂC[ExeWrightMod]
;--------+---------+---------+---------+---------+---------+---------+---------+
	gsel 0,-1											;ŏɉʔ\

#include "rs485header.as"								;RS485 header and module
#include "exobject.as"									;extension object module
#include "rs485comm.as"									;RS485 communication module
#include "colorfulobject.as"							;Colorful object Module
#include "ExeWrightMod.hsp"								;Execution file Wright Module

;/[̏
;--------+---------+---------+---------+---------+---------+---------+---------+
; [̗̈ݒAp[^̃[h
;--------+---------+---------+---------+---------+---------+---------+---------+
;/ɏݖ߃W[̐ݒ:ExeWrightModW[ by v}
;--------+---------+---------+---------+---------+---------+---------+---------+
; INIt@C⃌WXgg킸Ag1KB̕ۑł܂B
;	f[^͐l^ϐp̔zƕ^ϐmoji̔z񂪒`ĂāA
;	킹1024bytẽgpłB
;		l^ϐp: p(0)->p(255)
;		^ϐmoji: moji(0)->moji(1023)
;--------+---------+---------+---------+---------+---------+---------+---------+
; p(100)̗̈gpAp(100)-(103)͉ʂ̂wxʒuEwxTCYɎgp
; p(104),p(105)͗\
#define pstart	100								;ŏ̔zԍ
#const	pScrnPosX			pstart				;ʂ̂wʒu
#const	pScrnPosY			pScrnPosX+1			;ʂ̂xʒu
#const	pScrnWidX			pScrnPosY+1			;ʂ̂wTCY
#const	pScrnWidY			pScrnWidX+1			;ʂ̂xTCY
#const	pPreServoID			pScrnWidY+3			;T[{hc
#const	pNewServoID			pPreServoID+1		;VT[{hc
#const	pRS485ComPort		pNewServoID+1		;RS485|[gԍ
#const	pRS485BaudRate		pRS485ComPort+1		;RS485{[[g
#const	pAutoTest			pRS485BaudRate+1	;eXg
#const	pTestPosP			pAutoTest+1			;eXgʒu{
#const	pTestPosN			pTestPosP+1			;eXgʒu|

;/p[^̃[h
	onexit goto *exit_routine				;IĂяo
	DataLoad p,moji							;f[^zɃ[h
	; p[^̃N[ϐ
	dup ScrnPosX,p(pScrnPosX)
	dup ScrnPosY,p(pScrnPosY)
	dup ScrnWidX,p(pScrnWidX)
	dup ScrnWidY,p(pScrnWidY)
	dup PreServoID,p(pPreServoID)
	dup NewServoID,p(pNewServoID)
	dup RS485ComPort,p(pRS485ComPort)
	dup RS485BaudRate,p(pRS485BaudRate)
	dup AutoTest,p(pAutoTest)
	dup TestPosP,p(pTestPosP)
	dup TestPosN,p(pTestPosN)
	; eݒp[^̃ftHgl
	if ScrnWidX=0 { 							;1ԍŏ 0Ȃ̂ŁB
		ScrnPosX=0
		ScrnPosY=0
		ScrnWidX=ScrnX
		ScrnWidY=ScrnY
		PreServoID=1
		NewServoID=1
		RS485ComPort=0
		RS485BaudRate=7
		AutoTest=0
		TestPosP=15
		TestPosN=15
	}

;/[̗̈ݒ

;/ʂ̏
;--------+---------+---------+---------+---------+---------+---------+---------+
; ʃTCYA^CgAtHgAwiACAbZ[W
;--------+---------+---------+---------+---------+---------+---------+---------+
;/XN[̏
	screen 2,ScrnWidX,ScrnWidY,screen_hide|screen_fixedsize,ScrnPosX,ScrnPosY	;ʏ,\,TCYŒ
	title2 SoftName + "  Ver" + VerNum					;^Cg\
	font "Arial",14 : objmode 2							;tHg"Arial"

	syscolor COLOR_3DFACE								;{^\ʃJ[
	mref bmscr,67 : BackColor=bmscr(40)
	boxf 0,0,ScrnWidX,ScrnWidY							;wiF(D)

;/3DC̕`
#const	Frame_x1	4
#const	Frame_y1	4
#const	Frame_x2	ScrnX-6
#const	Frame_y2	Scrny-9
#const	Erase_x1	100
#const	Erase_x2	Erase_x1+272

#const	POS_x1	Frame_x1+10
#const	POS_x2	POS_x1+170
#const	POS_x3	POS_x1+200
#const	POS_x4	POS_x1+200

#const	POS_y1	Frame_y1+12
#const	POS_y2	POS_y1+38
#const	POS_y3	POS_y2+30
#const	POS_y4	POS_y3+25
#const	POS_y5	POS_y4+52

#const	line_y1	POS_y1+28
#const	line_y2	POS_y4+44


	frame3d Frame_x1,Frame_y1,Frame_x2,Frame_y2,Erase_x1,Erase_x2
	hline3d Frame_x1+4,line_y1,Frame_x2-12,line_y1
	hline3d Frame_x1+4,line_y2,Frame_x2-12,line_y2

;/bZ[W̕`

	pos POS_x1,POS_y4 : mes "Please do not turn off the power supply and do not remove the cable, when you are writing servo ID."
	color 0x7F,0x7F,0x7F								;ү(D)
	pos Erase_x1+12,Frame_y2-8 : mes Copyright

;/JtIuWFNgW[̐ݒ:ӂ邨ԂLite by eƂ
;--------+---------+---------+---------+---------+---------+---------+---------+
; ̃EBhEŃIuWFNg̐F悤ɂB
;--------+---------+---------+---------+---------+---------+---------+---------+
	objcolorscreen

;/IuWFNg̔zu
;--------+---------+---------+---------+---------+---------+---------+---------+
; exobject.as ̃}NƃJtIuWFNgW[gp
;--------+---------+---------+---------+---------+---------+---------+---------+
; ʐM|[gX^eBbNRg[
	stcctl POS_x1,POS_y1+3,65,14,"COMport",SS_RIGHT,ComPortStcID
	objcolor ComPortStcID,BackColor,RGB(0,0,0)
; ʐM|[gR{{bNX
	cmbobj POS_x1+70,POS_y1-1,90,24,RS485ComPort,80,"     COM1\n     COM2\n     COM3\n     COM4\n     COM5\n     COM6\n     COM7\n     COM8\n     COM9\n    COM10",ComPortcmbID
	objcolor ComPortcmbID,RGB(255,255,191),RGB(255,0,0)
; ʐMxX^eBbNRg[
	stcctl POS_x2,POS_y1+3,65,14,"BaudRate",SS_RIGHT,BaudRateStcID
	objcolor BaudRateStcID,BackColor,RGB(0,0,0)
; ʐMxR{{bNX
	cmbobj POS_x2+70,POS_y1-1,90,24,RS485BaudRate,80,"    9,600\n   14,400\n   19,200\n   28,800\n   38,400\n   57,600\n   76,800\n  115,200\n  153,600\n  230,400\n  460,800\n  691,200\n1,382,400",BaudRatecmbID
	objcolor BaudRatecmbID,RGB(255,255,191),RGB(255,0,0)

; T[{IDX^eBbNRg[
	stcctl POS_x1,POS_y2+3,125,14,"Present Servo ID",SS_RIGHT,PreServoStcID
	objcolor PreServoStcID,BackColor,RGB(0,0,0)
; T[{IDGfBbg{bNX
	edtctl POS_x1+130,POS_y2,40,20,PreServoIDs,ES_RIGHT|ES_NUMBER,,PreSrvEdtID
	if PreServoID : settext PreSrvEdtID,str(PreServoID) : else : settext PreSrvEdtID,"all"
	objcolor PreSrvEdtID,RGB(191,255,255),RGB(0,0,0)
; T[{IDAbv_ERg[
	updnctl POS_x1+170,POS_y2-1,15,20,0x100,PreServoUpdownID
	updownrng PreServoUpdownID,0,127
	updownpos PreServoUpdownID,COMCTL_SET,PreServoID

; VT[{IDX^eBbNRg[
	stcctl POS_x1,POS_y3+3,125,14,"New servo ID",SS_RIGHT,NewServoStcID
	objcolor NewServoStcID,BackColor,RGB(0,0,0)
; VT[{IDGfBbg{bNX
	edtctl POS_x1+130,POS_y3,40,20,NewServoIDs,ES_RIGHT|ES_NUMBER,,NewSrvEdtID
	settext NewSrvEdtID,str(NewServoID)
	objcolor NewSrvEdtID,RGB(191,255,255),RGB(0,0,0)
; VT[{IDAbv_ERg[
	updnctl POS_x1+170,POS_y3-1,15,20,0x100,NewServoUpdownID
	updownrng NewServoUpdownID,1,127
	updownpos NewServoUpdownID,COMCTL_SET,NewServoID

; eXg`FbN{bNX
	chkobj POS_x3,POS_y2+3,130,14,"Automatic test",AutoTest,AutoTestChkID
	objcolor AutoTestChkID,BackColor,RGB(0,0,0)
; ID݃{^
	btnobj POS_x3,POS_y3,100,20,"Write NewID",*btn_IDupdate,IDupdateBtnID
; eXg{^
	btnobj POS_x1,POS_y5,100,20,"Servo Test",*btn_Test,TestBtnID
; I{^
	pos POS_x1+310,POS_y5 : objsize 60,20 : button goto "Close",*btn_Close : CloseBtnID=stat

; NoteX^eBbNRg[
	stcctl POS_x1,POS_y4,370,36,"Note: Please do not turn off the power supply and do not remove the cable, when you are writing servo ID.",SS_SUNKEN,NoteStcID
	objcolor NoteStcID,BackColor,RGB(255,0,0)

; eXgʒu{R{{bNX
	cmbobj POS_x1+110,POS_y5-2,80,24,TestPosP,80,"   0deg\n+ 10deg\n+ 20deg\n+ 30deg\n+ 40deg\n+ 50deg\n+ 60deg\n+ 70deg\n+ 80deg\n+ 90deg\n+100deg\n+110deg\n+120deg\n+130deg\n+140deg\n+150deg",TestPosPcmbID
	objcolor TestPosPcmbID,RGB(191,255,255),RGB(0,0,0)
; eXgʒu|R{{bNX
	cmbobj POS_x1+220,POS_y5-2,80,24,TestPosN,80,"   0deg\n- 10deg\n- 20deg\n- 30deg\n- 40deg\n- 50deg\n- 60deg\n- 70deg\n- 80deg\n- 90deg\n-100deg\n-110deg\n-120deg\n-130deg\n-140deg\n-150deg",TestPosNcmbID
	objcolor TestPosNcmbID,RGB(191,255,255),RGB(0,0,0)
; eXgʒuX^eBbNRg[
	stcctl POS_x1+190,POS_y5,30,20,"<=>",SS_CENTER,TestStcID
	objcolor TestStcID,BackColor,RGB(0,0,0)

;--------+---------+---------+---------+---------+---------+---------+---------+
;/VA|[g̐ݒ
;--------+---------+---------+---------+---------+---------+---------+---------+
;/RS485<->USBRo[^(BTE061),PCI<->RS485 CONTEC COM-2PD(PCI)H̃hCo[`FbN
; hCo[COM3-9COM1ɖ߂
	Directory=dir_cur								;ÑJgfBNg
	do
		if RS485ComNum<=1 : _break
		chdir dir_sys+"\\drivers"			;\system32\driversɈړ
		dirlist reg,"ftser2k.sys"			;ftser2k.sys̃`FbN
		if reg="ftser2k.sys\n" : _break
		dirlist reg,"ComDrv2k.sys"			;ComDrv2k.sys̃`FbN
		if reg="ComDrv2k.sys\n" : _break
		p(pRS485ComNum)=0 : RS485ComNum=p(pRS485ComNum) : objprm ComNumcmbID,RS485ComNum 
	until
	chdir Directory									;Nɖ߂

;/VA|[g̃I[v
	rs485open RS485ComPort, RS485BaudRate

;--------+---------+---------+---------+---------+---------+---------+---------+
;/ݏ̏ݒ
;--------+---------+---------+---------+---------+---------+---------+---------+
;/IuWFNg̊
#define  WM_HSCROLL	0x114
#define  WM_VSCROLL	0x115
#define  WM_COMMAND	0x0111
;	oncmd gosub *hscroll,WM_HSCROLL
	oncmd gosub *vscroll,WM_VSCROLL
	oncmd gosub *command,WM_COMMAND

;--------+---------+---------+---------+---------+---------+---------+---------+
;/C[`̏
;--------+---------+---------+---------+---------+---------+---------+---------+
	gsel 2,1										;CʑI
	PosP=TestPosP*100
	PosN=TestPosN*-100

;/C[`
;--------+---------+---------+---------+---------+---------+---------+---------+
;/C[`(Ȃ)
;--------+---------+---------+---------+---------+---------+---------+---------+
	stop

;--------+---------+---------+---------+---------+---------+---------+---------+
; {^̏
;--------+---------+---------+---------+---------+---------+---------+---------+
;/{^[ID update]
*btn_IDupdate ;writing
	objenable IDupdateBtnID,0
	objenable TestBtnID,0
	objenable AutoTestChkID,0
	objenable TestPosPcmbID,0
	objenable TestPosNcmbID,0	

	if PreServoID : reg=PreServoID : else : reg=255
	await : title2 SoftName + "  --- writing ---"
	SetServoID reg,NewServoID
	WriteFlashRom NewServoID,1	;2.0b WriteFlashRom̌L
	wait 100					;ݑ҂ԁFRS30x/405=100,RS401/402/601=1000 [ver.2.0c RS405CBǉ]  

	if AutoTest {
		title2 SoftName + "  --- testing ---"
		SetTorqueON NewServoID
		SetPositionTime NewServoID,PosP,150
		wait 100 : title2 SoftName
		wait 100 : title2 SoftName + "  --- testing ---"
		SetPositionTime NewServoID,0,150
		wait 100 : title2 SoftName
		wait 100 : title2 SoftName + "  --- testing ---"
		SetPositionTime NewServoID,PosN,150
		wait 100 : title2 SoftName
		wait 100 : title2 SoftName + "  --- testing ---"
		SetPositionTime NewServoID,0,150
		wait 100 : title2 SoftName + "  Ver" + VerNum
		wait 100
	}
	else {
		title2 SoftName + "  Ver" + VerNum
	}
	objenable IDupdateBtnID,1
	objenable TestBtnID,1
	objenable AutoTestChkID,1
	objenable TestPosPcmbID,1
	objenable TestPosNcmbID,1	
	
	return

;/{^[Test]
*btn_Test ;testing
	objenable IDupdateBtnID,0
	objenable TestBtnID,0
	objenable AutoTestChkID,0
	objenable TestPosPcmbID,0
	objenable TestPosNcmbID,0

	if PreServoID : reg=PreServoID : else : reg=255
	await : title2 SoftName + "  --- testing ---"
	SetTorqueON reg
	SetPositionTime reg,PosP,150
	wait 100 : title2 SoftName
	wait 100 : title2 SoftName + "  --- testing ---"
	SetPositionTime reg,0,150
	wait 100 : title2 SoftName
	wait 100 : title2 SoftName + "  --- testing ---"
	SetPositionTime reg,PosN,150
	wait 100 : title2 SoftName
	wait 100 : title2 SoftName + "  --- testing ---"
	SetPositionTime reg,0,150
	wait 100 : title2 SoftName + "  Ver" + VerNum
	wait 100

	objenable IDupdateBtnID,1
	objenable TestBtnID,1
	objenable AutoTestChkID,1
	objenable TestPosPcmbID,1
	objenable TestPosNcmbID,1

	return

;--------+---------+---------+---------+---------+---------+---------+---------+
; Abv_ERg[̓eςƂ̏
;--------+---------+---------+---------+---------+---------+---------+---------+
#define	SB_LINEUP			0	;
#define	SB_LINEDOWN			1	;
#define	SB_PAGEUP			2	;y[WAbv
#define	SB_PAGEDOWN			3	;y[WAbv
#define	SB_THUMBPOSITION	4	;lParam̉ʃ[hɃT̈ʒu
#define	SB_THUMTRACK		5	;Tړ
#define	SB_TOP				6	;[HOME]L[ꂽ
#define	SB_BOTTMOM			7	;EɃXN[
;#define	SB_ENDSCROLL		8	;[END]L[ꂽ

*vscroll
	switch wparam&0x0F
	case SB_TOP
	case SB_BOTTMOM
	case SB_THUMBPOSITION
	case SB_THUMTRACK
		switch lparam
		case objinfo_hwnd(PreServoUpdownID)		;T[{hcAbv_ERg[
			updownpos PreServoUpdownID,COMCTL_GET,NULL : PreServoID=stat
			if PreServoID : settext PreSrvEdtID,str(PreServoID) : else : settext PreSrvEdtID,"all"
			swbreak
		case objinfo_hwnd(NewServoUpdownID)		;VT[{hcAbv_ERg[
			updownpos NewServoUpdownID,COMCTL_GET,NULL : NewServoID=stat
			settext NewSrvEdtID,str(NewServoID)
			swbreak
		swend
		swbreak
	swend
	return

;--------+---------+---------+---------+---------+---------+---------+---------+
; GfBbg{bNX/R{{bNX/`FbN{bNX̓eςƂ̏
;--------+---------+---------+---------+---------+---------+---------+---------+
#define	EN_UPDATE		0x400	;eς
#define	CBN_SELCHANGE 	1		;IڂύXꂽƂ 
#define	BN_CLICKED		0		;{^(`FbN{bNXjNbNꂽƂ

*command
	switch wparam>>16&0xFFFF
	case CBN_SELCHANGE
		switch lparam
		case objinfo_hwnd(ComPortcmbID)		;ʐM|[gR{{bNX
		case objinfo_hwnd(BaudRatecmbID)	;ʐMxR{{bNX
			rs485close : rs485open RS485ComPort, RS485BaudRate
			swbreak
		case objinfo_hwnd(TestPosPcmbID)	;eXgʒu{R{{bNX
			PosP=TestPosP*100
			swbreak
		case objinfo_hwnd(TestPosNcmbID)	;eXgʒu|R{{bNX
			PosN=TestPosN*-100
			swbreak
		swend
		swbreak
	case EN_UPDATE
		switch lparam
		case objinfo_hwnd(PreSrvEdtID)		;T[{hcGfBbg{bNX
			gettext PreSrvEdtID,PreServoIDs,5 : PreServoID=limit(int(PreServoIDs),0,127)
			updownpos PreServoUpdownID,COMCTL_SET,PreServoID
			if (int(PreServoIDs)!PreServoID)|(PreServoIDs="")|(PreServoIDs="0") {
				if PreServoID : settext PreSrvEdtID,str(PreServoID) : else : settext PreSrvEdtID,"all"
			}
			swbreak
		case objinfo_hwnd(NewSrvEdtID)		;VT[{hcGfBbg{bNX
			gettext NewSrvEdtID,NewServoIDs,5 : NewServoID=limit(int(NewServoIDs),1,127)
			updownpos NewServoUpdownID,COMCTL_SET,NewServoID
			if int(NewServoIDs)!NewServoID : settext NewSrvEdtID,str(NewServoID)
			swbreak
		swend
		swbreak
	swend
	return

;--------+---------+---------+---------+---------+---------+---------+---------+
; Ȉ݂
;--------+---------+---------+---------+---------+---------+---------+---------+
;/{^[Close]
*btn_Close
*exit_routine
	gsel 2,-1						;ʔ\
	rs485close						;RS232CN[Y

;/p[^z100Ԃ
	ScrnPosX=ginfo_wx1
	ScrnPosY=ginfo_wy1
	ScrnWidX=ginfo_winx
	ScrnWidY=ginfo_winy

	DataSave p											;ɏݖ
	end

;eof "RS485-IDWriter.hsp"
