First run the command line environment and get a prompt:
LSharpConsole.exe
> (+ 2 3 4 5)
14
> (= x 5)
5
> (= y 7)
7
> (* x y)
35
> (reference "System.Windows.Forms")
> (using "System.Windows.Forms")
> (MessageBox.Show "Loaded?" "RoboBuilder is Go!")
OK
> (Load "demo.lisp")
Hello world
> (= x 5)
5
> x
5
> (+ x x)
10
> x
5
> '(a b c d)
(a b c d)
> '(1 2 3)
(1 2 3)
> '(a b 1 2 4.0)
(a b 1 2 4.0)
;;; or even lists of lists [This is a comment by the way!
> '( (a b) (c d))
((a b) ( c d))
;;; I can set a atom to a list
> (= x '(a b c))
(a b c)
> x
(a b c)
> '(+ 2 3)
(+ 2 3)
> (= x '(+ 2 3))
(+ 2 3)
> x
(+ 2 3)
> (= x '(1 2 3 4 3 2 1))
> ( car x)
1
> (cdr x)
(2 3 4 3 2 1)
> (cdr (cdr ( cdr x)))
(4 3 2 1)
> (cdr '())
null
> (cons 'a '(1))
(a 1)
> (cons 'b x)
(b 1 2 3 4 3 2 1)
> (cons '(a b) '(c d))
((a b) c d)
> (car '((a b) c d))
(a b)
> (cons 'a 'b)
Exception : Not a sequence
> (cons 'a (cons 'b nil))
(a b)
>
> (def hello () (prn "hello world"))
LSharp.Function
> (hello)
hello world
"hello world"
> (def addone (x) (+ x 1))
LSharp.Function
> (addone 5)
6
> (addone (addone (addone 7)))
10
> (if null 'true 'false)
false
> (if t 'true 'false)
true
> (if (> 3 5) 'true 'false)
false
> (if (<3>
> (= x 1)
1
> (if (is x 1) 'one (is x 2) 'two 'no)
one
> (= x 2)
2
> (if (is x 1) 'one (is x 2) 'two 'no)
two
> (= x 3)
3
> (if (is x 1) 'one (is x 2) 'two 'no)
no
> (spell 1)
one
> (spell 3)
three
> (spell 21)
twenty one
> (def spell (x) (if (is x 1) 'one (is x 2) 'two 'no))
LSharp.Function
> (spell 1)
one
> (spell 2)
two
> (spell 3)
no
>
> (def spell (x)
(progn
(if (> x 29) ( progn (= x (- x 30)) (pr "thirty ")))
(if (> x 19) ( progn (= x (- x 20)) (pr "twenty ")))
(if (is x 1) 'one (is x 2) 'two (is x 3) 'three (is x 4) 'four (is x 5) 'five (is x 6) 'six 'no )
)
)
*** redefining spell
LSharp.Function
>
(spell 1)
one
> (spell 2)
two
> (spell 21)
twenty one
> (spell 24)
twenty four
> (spell 20)
twenty no
>
(reference "System.Windows.Forms")
(using "System.Windows.Forms")
(MessageBox.Show "Loaded?" "RoboBbuilder is Go!")
> (Console.WriteLine "helloworld")
helloworld
null
> (reference "System.IO.Ports")
null
> (using "System.IO.Ports")
"System.IO.Ports"
> (def connect ()
(= sport (new "SerialPort"))
(.set_BaudRate sport 115200)
(.set_PortName sport "COM3")
)
LSharp.Function
> (connect)
null
> (.open sport)
null
> (.close sport)
null
(reference "RobobuilderLib")
(using "RobobuilderLib")
(using "System.Windows.Forms")
(using "System.IO.Ports")
(= sport ()) ;; initialise global
(= pcr ()) ;; initialise global
(def connect (pn)
(prn "connecting to " pn)
(= sport (new "SerialPort"))
(.set_BaudRate sport 115200)
(.set_PortName sport pn)
(= pcr (new "RobobuilderLib.PCremote" sport))
)
(def askPort ()
(with (k 0 p 0 y 0)
(prn "Available Ports:")
(= p (System.IO.Ports.SerialPort.GetPortNames))
(each y p (prn y))
(prn "Select:")
(while (is (= k (Console.ReadLine)) "" ) (pr ": "))
(if (not (member? k p)) (do (prn "Invalid port?") (askPort)) k)
)
)
(def getsn ()
(do
(.open sport)
(= sn (.readSN pcr))
(.close sport)
sn
)
)
(def run_robobuilder()
(connect (askPort))
(getsn)
)
> (run_robobuilder)
Available Ports:
COM1
COM3
COM9
Select:
: COM3
connecting to COM3
"1041100010***"
>
L Sharp 2.0.0.0 on 2.0.50727.3603
Copyright (c) Rob Blackwell. All rights reserved.
> (load "Day7.lisp")
................
OK
> (run_robobuilder)
Available Ports:
COM1
COM3
COM9
Select:
: COM3
connecting to COM3
Good Firmware loaded (2.26)
Serial Number = 1041100010***
Distance = 10 cm
ok
>
(def run_robobuilder()
(connect (askPort))
(MessageBox.Show "make sure robot is connected to serial port and on" "warning" )
(.open sport)
(checkver)
(prn "Serial Number = " (getsn))
(prn "Distance = " (readdistance) " cm")
(.close sport)
'ok
)
(def checkver ()
(if (not (.Isopen sport))
(.open sport))
(= v (.readVer pcr) )
(if (< v 2.23)
(prn "Download new firmware")
(prn "Good Firmware loaded (" v ")" )
)
v
)
> (runMotion 7)
;; Support for L Sharp
(show-paren-mode t)
(add-to-list 'auto-mode-alist '("\\.ls$" . lisp-mode))
(setq inferior-lisp-program "cmd /c C:\\LSharp\\LSharpConsole\\bin\\Debug\\LSharpConsole.exe")
(= menu '( 1 "GET UP A"
2 "GET UP B"
3 "TURN LEFT"
4 "MOVE FORWARD"
5 "TURN RIGHT"
6 "MOVE LEFT"
7 "BASIC POSTURE"
8 "MOVE RIGHT"
9 "ATTACK LEFT"
10 "MOVE BACKWARDS"
11 "ATTACK RIGHT"
0 "EXIT"))
(def ask (prompt error menu)
(with (k 0 )
(prn prompt)
(each x (pair menu) (prn (car x) " - " (cdr x)))
(while (is (= k (Console.ReadLine)) "" ) (pr ": "))
(= k (coerce k "Int32"))
(if (not (member? k menu))
(do (prn error) (ask menu))
)
k
)
)
;; loop until 0 selected
(def domenu ()
(with (item 1)
(while (not (is item 0))
(= item (ask "Choice :" "No such option" menu))
(if (> item 0) (runMotion item))
)
)
)
L Sharp 2.0.0.0 on 2.0.50727.3603
Copyright (c) Rob Blackwell. All rights reserved.
> (load "Day7.lisp")
> (run_robobuilder)
> (domenu)
L Sharp 2.0.0.0 on 2.0.50727.3603
Copyright (c) Rob Blackwell. All rights reserved.
> (load "lisp/Day7.lisp")
................
OK
> (run_robobuilder)
Available Ports:
COM1
COM3
Select:
: COM3
connecting to COM3
Latest Firmware loaded (2.26)
Serial Number = 1041100010***
Distance = 10 cm
ok
> (.open sport)
> (= xyz (.readXYZ pcr))
System.Int32[]
> (= xyz (tolist (.readXYZ pcr)))
(6 -15 65)
(= xyz (.readXYZ pcr))
System.Int32[]
> (nth xyz 1)
-17
> (def readSensors ()
(if (not (.isopen sport)) (.open sport)) ;; ensure com port open
(do (prn "i X Y Z Distance")
(for i 0 10
(do (= xyz (.readXYZ pcr))
(prn i " " (nth xyz 0) "," (nth xyz 1) "," (nth xyz 2) " : " (.readdistance pcr))
(sleep 0.5))
)
)
)
> (readSensors)
i X Y Z Distance
0 2,-17,61 : 10
1 1,-17,64 : 10
2 -1,-20,60 : 10
3 3,-14,64 : 10
4 -3,-1,63 : 10
5 -1,25,53 : 10
6 0,32,56 : 10
7 1,30,50 : 10
8 -7,10,62 : 10
9 -5,-15,63 : 10
10 -1,-15,65 : 10
null
(def dcmodeOn ()
(if (not (.isopen sport)) (.open sport))
(= wck (new "RobobuilderLib.wckMotion" pcr))
)
(def getServoPos (n)
(.wckReadPos wck n)
(cadr (.respnse wck)) ;; could use nth here!
)
(def setPassive (n)
(.wckPassive wck n)
)
L Sharp 2.0.0.0 on 2.0.50727.3603
Copyright (c) Rob Blackwell. All rights reserved.
> (load "Day7.lisp")
................
OK
> (run_robobuilder)
Available Ports:
COM1
COM3
Select:
: COM3
connecting to COM3
Latest Firmware loaded (2.26)
Serial Number = 1041100010***
Distance = 10 cm
ok
> (def dcmodeOn ()
(if (not (.isopen sport)) (.open sport))
(= wck (new "RobobuilderLib.wckMotion" pcr))
)
LSharp.Function
>
(def dcmodeOff ()
(.Close wck)
)
LSharp.Function
> (def setPassive (n)
(.wckPassive wck n)
)
LSharp.Function
> (def getServoPos (n)
(.wckReadPos wck n)
(cadr (.respnse wck))
)
LSharp.Function
> (dcmodeOn)
RobobuilderLib.wckMotion
> (setPassive 12)
True
> (for i 0 20 (do (prn (getServoPos 12)) (sleep 0.5)))
100
99
100
99
45
114
... etc
(def setServoPos (id pos torq)
(.wckMovePos wck id pos torq)
(cadr (.respnse wck))
)
> (setServoPos 12 60 2)(capture 12 5 0.05)
2
> 20
28
43
57
60
60
(= data ())
(def capture (id n t)
"capture n points every t secs"
(for i 1 n
(do (= data (cons (prn (getServoPos id)) data) )
(sleep t)
)
)
"Captured"
)
(def play (id n t)
(for i 0 (- n 1)
(do (pr ".")
(setServoPos id (nth data i) 2)
(sleep t)
)
)
"Complete"
)
> (setPassive 12)
True
> (capture 12 10 0.5)
45
45
45
73
61
46
29
38
62
62
"Captured"
> (= data (reverse data))
(45 45 45 73 61 46 29 38 62 62)
> (play 12 10 0.5)
.........."Complete"
(def setSyncMove (lastid torq position)
(.SyncPosSend wck lastid torq position 0)
)
(= basic '(143 179 198 83 106 106 69 48 167 141 47 47 49 199 204 204))
(setSyncMove 15 2 (toarray basic))
(def getallServos(n)
(with (current () )
(for i 0 n
(= current (cons (getServoPos (- n i)) current))
)
)
)
> (getServoPos 2)
248
> (getServoPos 1)
184
> (getServoPos 0)
146
> (cons (getServoPos 0) (cons (getServoPos 1) (cons (getServoPos 2) ())))
(146 184 248)
;;or all 15 in one go !
(= cur (getallServos 15))
(146 184 248 46 109 102 60 4 205 142 23 47 62 228 204 204)
(def md (xs ys step)
"calc distance between two list"
(= mlist ())
(for i 0 (- (len xs) 1)
(= t (/ (- (nth xs i) (nth ys i)) step))
(= mlist (cons t mlist))
)
(reverse mlist)
)
(def smove (a b n)
"smooth move position a to b in n steps"
(= interval (md a b (* n 1.0))) ;; calculate distance
(= l (len a))
(for i 0 n
(= slist ())
(for j 0 (- l 1)
(= t (- (nth a j) (* (nth interval j) i)) )
(= slist (cons t slist))
)
(prn "(setSyncMove " l " " 2 " '(" (reverse slist) "))")
;(setSyncMove l 2 (reverse slist)) (sleep 0.1)
)
)
> (smove '(6 3 2) '(3 1 1) 5)
(setSyncMove 3 2 '(6 3 2) )
(setSyncMove 3 2 '(5.4 2.6 1.8))
(setSyncMove 3 2 '(4.8 2.2 1.6))
(setSyncMove 3 2 '(4.2 1.8 1.4))
(setSyncMove 3 2 '(3.6 1.4 1.2))
(setSyncMove 3 2 '(3 1 1) )
(= initpos '( 125 179 199 88 108 126 72 49 163 141 51 47 49 199 205 205 ))
(= Data0 '( 125 179 199 88 108 126 72 49 163 141 51 47 49 199 205 205 ))
(= Scene1 '( 107 164 233 106 95 108 80 29 155 129 56 62 40 166 206 208 ))
(= Scene2 '( 107 164 233 106 95 145 74 40 163 154 117 124 114 166 206 208 ))
(= Scene4 '( 126 164 222 100 107 125 80 29 155 142 79 44 40 166 206 208 ))
(= punchleft (list initpos
(list 1 70 Data0)
(list 8 310 Scene1)
(list 1 420 Scene2)
(list 5 200 Scene4)
(list 15 300 Data0)))
(def playmotion (c x)
"Play a motion list"
(= ip (car x))
;; move from current pos to ip
(prn "Do initial move")
(prl ip)
; move to initial position smoothly ..
(smove c ip 10 0.05)
;;now loop
(play1 ip (cdr x))
)
(def play1 (c x)
"used by play move c -> x"
(if (or x)
( do ;move through list
(prn "Do next move")
(= cur (car x))
(= nof (car cur))
(= trt (/ (cadr cur) nof))
(= gt (car (cdr (cdr cur))))
(smove c gt nof (/ trt 1000.0) ) ;smooth move from c to gt
;recurse
(play1 gt (cdr x))
)
;else we've finished
(prn "Done")
)
)
(def demo ()
(dcmodeOn)
(= cur (getallServos 15))
(smove cur basic 10 0.1)
(playmotion cur punchleft)
)
L Sharp 2.0.0.0 on 2.0.50727.3603
Copyright (c) Rob Blackwell. All rights reserved.
> (load "wckutils.lisp")
.................
.Available Ports:
COM1
COM3
Select:
: COM3
connecting to COM3
.
.
.
> (demo)