Error processing request

Parameters

CONTENT_LENGTH0
REQUEST_METHODGET
REQUEST_URI/revision/OWI535+robot+arm+control?V=0
QUERY_STRINGV=0
CONTENT_TYPE
DOCUMENT_URI/revision/OWI535+robot+arm+control
DOCUMENT_ROOT/var/www/nikit/nikit/nginx/../docroot
SCGI1
SERVER_PROTOCOLHTTP/1.1
HTTPSon
REMOTE_ADDR172.70.134.182
REMOTE_PORT41146
SERVER_PORT4443
SERVER_NAMEwiki.tcl-lang.org
HTTP_HOSTwiki.tcl-lang.org
HTTP_CONNECTIONKeep-Alive
HTTP_ACCEPT_ENCODINGgzip, br
HTTP_X_FORWARDED_FOR3.85.211.2
HTTP_CF_RAY86bb61558d118023-IAD
HTTP_X_FORWARDED_PROTOhttps
HTTP_CF_VISITOR{"scheme":"https"}
HTTP_ACCEPT*/*
HTTP_USER_AGENTclaudebot
HTTP_CF_CONNECTING_IP3.85.211.2
HTTP_CDN_LOOPcloudflare
HTTP_CF_IPCOUNTRYUS

Body


Error

Unknow state transition: LINE -> END

-code

1

-level

0

-errorstack

INNER {returnImm {Unknow state transition: LINE -> END} {}} CALL {my render_wikit {OWI535 robot arm control} \nI\ have\ used\ the\ wiki\ to\ great\ effect\ for\ many\ years\ so\ I\ thought\ I\ would\ \nfinally\ throw\ something\ up\ here.\ This\ started\ as\ a\ project\ for\ my\ son's\nrobotis\ after\ school\ activity.\ The\ OWI535\ robotic\ arm\ is\ a\ very\ low\ cost\nand\ easy\ to\ assemble\ robot\ arm\ with\ 4\ degrees\ os\ freedom\ and\ a\ gripper.\ \nIt\ comes\ stock\ with\ a\ simple\ mechanical\ control\ box\ but\ there\ is\ a\ USB\nadd\ on\ available\ which\ I\ also\ bought.\ The\ protocol\ work\ on\ 3\ byte\ commands.\n\nhttp://www.owirobots.com/store/catalog/robotic-arm-and-accessories/owi-535-robotic-arm-edge-kit-110.html\n\nI\ took\ an\ OWI\ utility\ from\ a\ Raspberry\ utility\ and\ wrote\ a\ small\ SWIG\ \ninterface\ for\ it.\ The\ link\ gives\ an\ excellent\ description\ of\ the\ protocol.\n\nhttp://notbrainsurgery.livejournal.com/38622.html\n\nDirectory\ structure:\n\n*Code_dir\n**package\n**scripts\n**tcl\n\n*Makefile:\n\n======\nCC=cc\nCFLAGS=\ \\\n\ \ \ \ \ \ \ \ -fPIC\ \\\n\ \ \ \ \ \ \ \ -g\ \\\n\ \ \ \ \ \ \ \ -DFREEBSD\n\nINCLUDES=-I/usr/include\ \\\n\ \ \ \ \ \ \ \ -I/usr/local/include\ \\\n\ \ \ \ \ \ \ \ -I/usr/local/include/tcl8.6\n\nLDFLAGS=\\\n\ \ \ \ \ \ \ \ -L/usr/local/lib\ \\\n\ \ \ \ \ \ \ \ -lusb\ -ltcl86\n\nLIBS=\\\n\ \ \ \ \ \ \ \ -L/usr/local/lib\ \\\n\ \ \ \ \ \ \ \ -lusb\ -ltcl86\n\nSHFLAGS+=\\\n\ \ \ \ \ \ \ \ -shared\n\nall:\ tcl/libowi.so\n\nclean:\n\ \ \ \ \ \ \ \ -rm\ rasp_util\n\ \ \ \ \ \ \ \ -rm\ owi_lib.o\n\ \ \ \ \ \ \ \ -rm\ tcl/libowi.so\n\ \ \ \ \ \ \ \ -rm\ tcl/owi_wrap.o\n\ \ \ \ \ \ \ \ -rm\ tcl/owi_wrap.c\n\nrasp_util.o:\ rasp_util.c\n\ \ \ \ \ \ \ \ \$\{CC\}\ \$\{CFLAGS\}\ -c\ rasp_util.c\ -o\ rasp_util.o\n\ \ \ \ \ \ \ \ \nrasp_util:\ rasp_util.o\n\ \ \ \ \ \ \ \ \$\{CC\}\ \$\{LDFLAGS\}\ rasp_util.o\ -o\ rasp_util\n\ \ \ \ \ \ \ \ \nowi_lib.o:\ owi_lib.c\n\ \ \ \ \ \ \ \ \$\{CC\}\ \$\{CFLAGS\}\ -c\ owi_lib.c\ -o\ owi_lib.o\ \n\ntcl/libowi.so:\ tcl/owi_wrap.o\ owi_lib.o\n\ \ \ \ \ \ \ \ \$\{CC\}\ \$\{SHFLAGS\}\ \$\{LIBS\}\ tcl/owi_wrap.o\ owi_lib.o\ -o\ tcl/libowi.so\n\ \ \ \ \ \ \ \ \ntcl/owi_wrap.o:\ tcl/owi_wrap.c\n\ \ \ \ \ \ \ \ \$\{CC\}\ \$\{INCLUDES\}\ \$\{CFLAGS\}\ -c\ tcl/owi_wrap.c\ -o\ tcl/owi_wrap.o\n\ntcl/owi_wrap.c:\ owi.i\n\ \ \ \ \ \ \ \ \$\{SWIG\}\ \$\{SWFLAGS\}\ -tcl\ -itcl\ -namespace\ -outdir\ ./tcl/\ -o\ ./tcl/owi_wrap.c\ \ owi.i\ \n\npackage:\ /dev/null\n\ \ \ \ \ \ \ \ cp\ tcl/libowi.so\ package/libowi.so\n\ \ \ \ \ \ \ \ cp\ scripts/owi.tcl\ package/owi.tcl\n\ \ \ \ \ \ \ \ \ntestload:\ package\n\ \ \ \ \ \ \ \ ./scripts/testload.tcl\n\ \ \ \ \ \ \ \ \ntesttime:\ package\n\ \ \ \ \ \ \ \ ./scripts/testtime.tcl\n======\n\n*owi.i\n\n======\n%module\ owi\n%\{\nint\ owi_send(int,\ char\ **)\;\ \ \ \ \ \ \ \ \n%\}\n//\ ************************************\n//\ SWIG\ voodoo\n%typemap(in)\ char\ **\ \{\n\ \ \ \ \ Tcl_Obj\ **listobjv\;\n\ \ \ \ \ int\ \ \ \ \ \ \ nitems\;\n\ \ \ \ \ int\ \ \ \ \ \ \ i\;\n\ \ \ \ \ if\ (Tcl_ListObjGetElements(interp,\ \$input,\ &nitems,\ &listobjv)\ ==\ TCL_ERROR)\ \{\n\ \ \ \ \ \ \ \ return\ TCL_ERROR\;\n\ \ \ \ \ \}\n\ \ \ \ \ \$1\ =\ (char\ **)\ malloc((nitems+1)*sizeof(char\ *))\;\n\ \ \ \ \ for\ (i\ =\ 0\;\ i\ <\ nitems\;\ i++)\ \{\n\ \ \ \ \ \ \ \ \$1\[i\]\ =\ Tcl_GetStringFromObj(listobjv\[i\],0)\;\n\ \ \ \ \ \}\n\ \ \ \ \ \$1\[i\]\ =\ 0\;\n\}\n\n//\ more\ minor\ voodoo\n%typemap(freearg)\ char\ **\ \{\n\ \ \ \ \ if\ (\$1)\ \{\n\ \ \ \ \ \ \ \ free(\$1)\;\n\ \ \ \ \ \}\n\}\n//\ Now,\ to\ get\ in\ the\ way\ \;)\n%inline\ \n%\{\nint\ wrap_owi_send(char\ **argv)\ \n\{\n\ \ \ \ \ \ \ \ int\ i\ =\ 0\;\n\ \ \ \ \ \ \ \ while\ (argv\[i\])\ \n\ \ \ \ \ \ \ \ \{\n//\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ printf(\"argv\[%d\]\ =\ %s\\n\",\ i,argv\[i\])\;\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ i++\;\n\ \ \ \ \ \ \ \ \}\n//\ \ \ \ \ \ \ \ printf(\"count:%i\\n\",\ i)\;\n\ \ \ \ \ \ \ \ return\ owi_send(i,\ argv)\;\n\}\n%\}\n======\n\n*owi_lib.c\n\n======\n/************************************************************************\n\ *\ Raspberry\ Pi:\ USB\ Robotic\ Arm\ Controller\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Version:\ 1.00\ *\n\ *\ Project\ \ \ \ \ :\ Operate\ the\ USB\ Robotic\ Arm\ using\ Linux\ CLI\ \ \ \ \ \ \ \ \ \ \ \ *\n\ *\ Tested\ on\ \ \ :\ Raspberry\ Pi,\ Model\ B\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *\n\ *\ Exp.\ Level\ \ :\ Beginner/Elementary\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *\n\ ************************************************************************\n\ *\ How\ to\ get\ the\ libusb\ development\ driver:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *\n\ *\ sudo\ apt-get\ install\ -y\ libusb-1.0-0-dev\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *\n\ *----------------------------------------------------------------------*\n\ *\ How\ to\ compile:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *\n\ *\ gcc\ robotarm.c\ -Os\ -I/usr/include/libusb-1.0\ -lusb-1.0\ -o\ robotarm\ \ \ *\n\ ************************************************************************\n\ *\ Operating\ System:\ Raspbian\ \"Wheezy\"\ Linux\ Kernel\ 3.6.11+\ \ \ \ \ \ \ \ \ \ \ \ \ *\n\ *\ Created:\ May\ 28,\ 2013\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Latest\ Revision:\ May\ 28,\ 2013\ *\n\ ************************************************************************\n\ *\ Original\ Credit\ goes\ to\ notbrainsurgery\ at\ LiveJournal\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *\n\ *\ Reference:\ http://notbrainsurgery.livejournal.com/38622.html\ \ \ \ \ \ \ \ \ *\n\ ************************************************************************\n\ *\ \ \ \ \ \ \ \ \ MirandaSoft!\ -\ Pasig\ City,\ Metro\ Manila,\ Philippines\ \ \ \ \ \ \ \ \ *\n\ *\ \ \ \ \ \ \ \ \ http://www.element14.com/community/blogs/mirandasoft\ \ \ \ \ \ \ \ \ *\n\ ************************************************************************/\n\ \n#include\ <stdlib.h>\n#include\ <stdio.h>\n#include\ <sys/types.h>\n#include\ <string.h>\n#include\ <libusb.h>\n\ \n#define\ EP_INTR\ \ (1\ |\ LIBUSB_ENDPOINT_IN)\n\ \n#define\ ARM_VENDOR\ \ \ \ \ \ \ 0x1267\n#define\ ARM_PRODUCT\ \ \ \ \ \ 0\n#define\ CMD_DATALEN\ \ \ \ \ \ 3\n\ \nlibusb_device\ *\ find_arm(libusb_device\ **devs)\n\{\n\ \ libusb_device\ *dev\;\n\ \ \ \ \ int\ i\ =\ 0\;\n\ \n\ \ \ \ \ while\ ((dev\ =\ devs\[i++\])\ !=\ NULL)\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ struct\ libusb_device_descriptor\ desc\;\n\ \ \ \ \ \ \ \ \ \ \ int\ r\ =\ libusb_get_device_descriptor(dev,\ &desc)\;\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ (r\ <\ 0)\ \{\n//\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ fprintf(stderr,\ \"failed\ to\ get\ device\ descriptor\")\;\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ NULL\;\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if(desc.idVendor\ ==\ ARM_VENDOR\ &&\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ desc.idProduct\ ==\ ARM_PRODUCT)\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ dev\;\n\ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \}\n\ \ \ \ \ \ \ return\ NULL\;\n\}\n\n//\ static\ unsigned\ char\ cmd\[3\]\;\n\nint\ owi_send(int\ ac,\ char\ **av)\n\{\n\ \ \ \ if(ac!=3)\n\ \ \ \ \{\n\ \ \ \ char\ buffer\[80\]\;\n\ \ \ \ \ \ \ \ sprintf(buffer,\ \"USB\ Robotic\ Arm\ Control\ Software\\nUsage:\ %s\ CMD0\ CMD1\ CMD2\\n\\n\",\ av\[0\])\;\n//\ \ \ \ \ \ \ \ fprintf(stderr,\ buffer)\;\n\ \ \ \ \ \ \ \ return\ 1\;\n\ \ \ \ \}\n\ \n\ \ \ \ unsigned\ char\ cmd\[3\]\;\n\ \n\ \ \ \ cmd\[0\]=(unsigned\ char)strtol(av\[0\],NULL,16)\;\n\ \ \ \ cmd\[1\]=(unsigned\ char)strtol(av\[1\],NULL,16)\;\n\ \ \ \ cmd\[2\]=(unsigned\ char)strtol(av\[2\],NULL,16)\;\n\ \ \ \ \n\ \ libusb_device\ **devs\;\n\ \ \ \ libusb_device\ *dev\;\n\ \ \ \ struct\ libusb_device_handle\ *devh\ =\ NULL\;\n\ \ \ \ \ \ \ int\ r\;\n\ \ ssize_t\ cnt\;\n\ \n\ \ \ r\ =\ libusb_init(NULL)\;\n\ \ if\ (r\ <\ 0)\n\ \ \ \ \{\n//\ \ \ \ \ fprintf(stderr,\ \"failed\ to\ initialize\ libusb\\n\")\;\n\ \ \ \ \ \ \ return\ r\;\n\ \ \ \ \}\n\ \n\ \ \ \ libusb_set_debug(NULL,2)\;\n\ \ \ \ \n\ \ \ \ cnt\ =\ libusb_get_device_list(NULL,\ &devs)\;\n\ \ \ \ \ \ if\ (cnt\ <\ 0)\n\ \ \ \ \ \ \ \ \ \ \ \ return\ (int)\ cnt\;\n\ \ \ \ dev=find_arm(devs)\;\n\ \ \ \ if(!dev)\n\ \ \ \ \{\n//\ \ \ \ \ \ \ \ \ \ \ fprintf(stderr,\ \"Robot\ Arm\ not\ found\\n\")\;\n\ \ \ \ \ \ \ return\ -1\;\n\ \ \ \ \}\n\ \n\ \ \ \ r\ =\ libusb_open(dev,&devh)\;\n\ \ \ \ if(r!=0)\n\ \ \ \ \{\n//\ \ \ \ \ \ \ \ fprintf(stderr,\ \"Error\ opening\ device\\n\")\;\n//\ \ \ \ \ \ \ \ \ \ \ \ \ \ libusb_free_device_list(devs,\ 1)\;\n//\ \ \ \ \ \ \ \ \ \ \ \ \ libusb_exit(NULL)\;\n\ \ \ \ \ \ \ \ return\ -1\;\n\ \ \ \ \}\n\ \n\ \n//\ \ \ \ fprintf(stderr,\ \"Sending\ %02X\ %02X\ %02X\\n\",\n//\ \ \ \ \ \ \ \ \ \ \ \ (int)cmd\[0\],\n//\ \ \ \ \ \ \ \ \ \ \ \ (int)cmd\[1\],\n//\ \ \ \ \ \ \ \ \ \ \ \ (int)cmd\[2\]\n//\ \ \ \ )\;\n\ \n\ \ \ \ int\ actual_length=-1\;\n\ \ \ \ \n\ \ \ \ r\ =\ libusb_control_transfer(devh,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x40,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ //uint8_t\ \ \ \ \ \ \ \ bmRequestType,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 6,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ //uint8_t\ \ \ \ \ \ \ \ bRequest,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x100,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ //uint16_t\ \ \ \ \ \ \ \ wValue,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ //uint16_t\ \ \ \ \ \ \ \ wIndex,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ cmd,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ CMD_DATALEN,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0\ \ \ \ \ \ \ \ \ \n\ \ \ \ )\;\n\ \ \ \ \n//\ \ \ \ if(!(r\ ==\ 0\ &&\ actual_length\ >=\ CMD_DATALEN))\n//\ \ \ \ \{\n//\ \ \ \ \ \ \ \ fprintf(stderr,\ \"Write\ err\ %d.\ len=%d\\n\",r,actual_length)\;\n//\ \ \ \ \}\n\ \ \ \ \n\ \ \ \ libusb_close(devh)\;\n\ \ \ \ \ libusb_free_device_list(devs,\ 1)\;\n\ \ \ \ \ \ \ libusb_exit(NULL)\;\n\ \n//\ \ \ \ fprintf(stderr,\ \"Done\\n\")\;\n\ \ \ \ \ \ \ return\ 0\;\n\}\n======\n\nA\ script\ to\ test\ loading\ the\ extension\n\n*scripts/testload.tcl:\n\n======\npackage\ require\ tclreadline\n\nlappend\ auto_path\ \[file\ join\ \[pwd\]\ package\]\n#\ catch\ \{\ package\ require\ owi\ \}\npackage\ require\ owi\n\nproc\ arm_exit\ \{\ \}\ \\\n\{\n\ \ \ \ \ \ \ \ exit\n\}\n\n\ \ \ \ \ \ \ \ set\ ARM\ \[::owi::arm\ new\]\n\n\ \ \ \ \ \ \ \ ::tclreadline::Loop\n======\n\nI\ saw\ someone\ posted\ an\ Arduino\ like\ \"Map()\"\ proc\ on\ the\ wiki\ which\ got\ me\ \nthinking\ about\ the\ pieces\ I\ have\ found\ useful\ from\ the\ Arduino\ IDE\ so\ I\nmade\ a\ \"Metro()\"\ like\ knock-off.\ The\ OWI\ arm\ is\ not\ a\ closed\ loop\ system\nand\ I\ was\ testing\ from\ the\ command\ line\ so\ something\ like\ thsi\ was\ nessesary.\nMy\ target\ user\ interface\ is\ my\ Android\ tablet,\ using\ TouchOSC.\n\nhttp://hexler.net/software/touchosc\n\n\n\nThere\ are\ 2\ TCL\ OSC\ packages\ I\ know\ of.\ One\ is\ maintained\ by\ Dave\ Joubert\ who\nwas\ kind\ enough\ to\ assist\ me\ with\ the\ library.\n\nhttp://code.google.com/p/tcl-osc-library/\n\nThe\ other\ is\ from\ v2\ labs'\ project.\n\nhttps://trac.v2.nl/browser/OSC/tclosc?rev=1&order=name\n\nAlthough\ I\ used\ the\ v2\ labs\ package\ with\ this\ project,\ Dave's\ library\ and\ work\nare\ far\ more\ sophisticated,\ e.g.\ timed\ events,\ routing\ between\ recievers,\ 3D\ninterfaces,\ etc.\ I\ have\ other\ projects\ that\ will\ require\ some\ of\ that\ stuff\n\"on\ my\ bench\".\n\n*owi.tcl\n\n======\npackage\ require\ cmdline\npackage\ require\ TclOO\n\npackage\ provide\ owi\ 0.0\n\nputs\ \[info\ script\]\nload\ \[file\ join\ \[file\ dirname\ \[info\ script\]\]\ libowi.so\]\n\n#\ ------------------------------------------------------------------------------\n#\ Like\ the\ Arduino\ Metro::Metro\n#\noo::class\ create\ ::owi::metro\ \\\n\{\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ constructor\ \{\ \{INT\ 1000\}\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ INTERVAL\ \n\ \ \ \ \ \ \ \ my\ variable\ PREVIOUS\ \n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ INTERVAL\ \$INT\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ PREVIOUS\ \[clock\ milliseconds\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ interval\ \{\ INT\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ INTERVAL\n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ INTERVAL\ \$INT\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ check\ \{\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ INTERVAL\n\ \ \ \ \ \ \ \ my\ variable\ PREVIOUS\n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ NOW\ \[clock\ milliseconds\]\n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ #\ puts\ \[expr\ \$NOW\ -\ \$PREVIOUS\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \[expr\ \$NOW\ -\ \$PREVIOUS\]\ >=\ \$INTERVAL\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ PREVIOUS\ \$NOW\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 0\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ reset\ \{\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ PREVIOUS\n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ PREVIOUS\ \[clock\ milliseconds\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\n\}\;\ #\ end\ of\ class\ metro\noo::class\ create\ ::owi::arm\ \\\n\{\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ constructor\ \{\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ GR_MET\n\ \ \ \ \ \ \ \ my\ variable\ GR_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ WR_MET\n\ \ \ \ \ \ \ \ my\ variable\ WR_BIN\n\ \ \ \ \ \ \ \ my\ variable\ EL_MET\n\ \ \ \ \ \ \ \ my\ variable\ EL_BIN\n\ \ \ \ \ \ \ \ my\ variable\ SH_MET\n\ \ \ \ \ \ \ \ my\ variable\ SH_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ BS_MET\n\ \ \ \ \ \ \ \ my\ variable\ BS_BIN\n\ \ \ \ \ \ \ \ my\ variable\ LT_BIN\ 00\n\ \ \ \ \ \ \ \ my\ variable\ LC_MET\n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ GR_MET\ \ \ \ \ \ \ \ \[::owi::metro\ new\ 80\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ GR_BIN\ \ \ \ \ \ \ \ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ WR_MET\ \ \ \ \ \ \ \ \[::owi::metro\ new\ 80\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ WR_BIN\ \ \ \ \ \ \ \ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ EL_MET\ \ \ \ \ \ \ \ \[::owi::metro\ new\ 80\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ EL_BIN\ \ \ \ \ \ \ \ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ SH_MET\ \ \ \ \ \ \ \ \[::owi::metro\ new\ 80\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ SH_BIN\ \ \ \ \ \ \ \ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ BS_MET\ \ \ \ \ \ \ \ \[::owi::metro\ new\ 80\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ BS_BIN\ \ \ \ \ \ \ \ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ LT_BIN\ \ \ \ \ \ \ \ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ LC_MET\ \ \ \ \ \ \ \ 80\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ #after\ \$LC_MET\ \ \ \ \ \ \ \ \[self\ object\]\ upd_bin\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ upd_bin\ \{\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ GR_MET\n\ \ \ \ \ \ \ \ my\ variable\ GR_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ WR_MET\n\ \ \ \ \ \ \ \ my\ variable\ WR_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ EL_MET\n\ \ \ \ \ \ \ \ my\ variable\ EL_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ SH_MET\n\ \ \ \ \ \ \ \ my\ variable\ SH_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ BS_MET\n\ \ \ \ \ \ \ \ my\ variable\ BS_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ LT_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ LC_MET\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \[\$GR_MET\ check\]\ \}\ \{\ set\ GR_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \[\$WR_MET\ check\]\ \}\ \{\ set\ WR_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \[\$EL_MET\ check\]\ \}\ \{\ set\ EL_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \[\$SH_MET\ check\]\ \}\ \{\ set\ SH_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \[\$BS_MET\ check\]\ \}\ \{\ set\ BS_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ #\ puts\ \"B1\ :\ \$GR_BIN\ \$WR_BIN\ \$EL_BIN\ \$SH_BIN\ |\ B2\ :\ 00\ 00\ 00\ \$BS_BIN\ |\ B3\ :\ 00\ 00\ 00\ \$LT_BIN\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ after\ \$LC_MET\ \[self\ object\]\ upd_bin\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \[self\ object\]\ send_bin\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ grip\ \{\ \{\ DIR\ stop\}\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ GR_MET\n\ \ \ \ \ \ \ \ my\ variable\ GR_BIN\ \n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"open\"\ \}\ \ \ \ \ \ \ \ \{\ set\ GR_BIN\ 01\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ elseif\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"close\"\ \}\ \ \ \ \ \ \ \ \{\ set\ GR_BIN\ 10\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ else\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\ set\ GR_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$GR_MET\ reset\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ wrist\ \{\ \{\ DIR\ stop\}\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ WR_MET\n\ \ \ \ \ \ \ \ my\ variable\ WR_BIN\ \n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"up\"\ \}\ \ \ \ \ \ \ \ \{\ set\ WR_BIN\ 01\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ elseif\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"down\"\ \}\ \ \ \ \ \ \ \ \{\ set\ WR_BIN\ 10\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ else\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\ set\ WR_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$WR_MET\ reset\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ elbow\ \{\ \{\ DIR\ stop\}\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ EL_MET\n\ \ \ \ \ \ \ \ my\ variable\ EL_BIN\ \n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"up\"\ \}\ \ \ \ \ \ \ \ \{\ set\ EL_BIN\ 01\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ elseif\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"down\"\ \}\ \ \ \ \ \ \ \ \{\ set\ EL_BIN\ 10\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ else\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\ set\ EL_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$EL_MET\ reset\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ shoulder\ \{\ \{\ DIR\ stop\}\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ SH_MET\n\ \ \ \ \ \ \ \ my\ variable\ SH_BIN\ \n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"up\"\ \}\ \ \ \ \ \ \ \ \{\ set\ SH_BIN\ 01\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ elseif\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"down\"\ \}\ \ \ \ \ \ \ \ \{\ set\ SH_BIN\ 10\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ else\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\ set\ SH_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$SH_MET\ reset\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ base\ \{\ \{\ DIR\ stop\}\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ BS_MET\n\ \ \ \ \ \ \ \ my\ variable\ BS_BIN\ \n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"cw\"\ \}\ \ \ \ \ \ \ \ \{\ set\ BS_BIN\ 01\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ elseif\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"ccw\"\ \}\ \ \ \ \ \ \ \ \{\ set\ BS_BIN\ 10\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ else\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\ set\ BS_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$BS_MET\ reset\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ light\ \{\ \{\ DIR\ stop\}\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ LT_BIN\ \n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \$DIR\ ==\ \"on\"\ \}\ \{\ set\ LT_BIN\ 01\;\ return\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ LT_BIN\ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ start_arm\ \{\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ LC_MET\n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ after\ \$LC_MET\ \ \ \ \ \ \ \ \[self\ object\]\ upd_bin\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ stop\ \{\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ GR_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ WR_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ EL_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ SH_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ BS_BIN\ \n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ GR_BIN\ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ WR_BIN\ 00\ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ EL_BIN\ 00\ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ SH_BIN\ 00\ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ BS_BIN\ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \[self\ object\]\ send_bin\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ send_bin\ \{\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ GR_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ WR_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ EL_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ SH_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ BS_BIN\n\ \ \ \ \ \ \ \ my\ variable\ LT_BIN\n\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ scan\ \$SH_BIN\$EL_BIN\$WR_BIN\$GR_BIN\ \ \ \ \ \ \ \ \"%b\"\ B1\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ scan\ 000000\$BS_BIN\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"%b\"\ B2\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ scan\ 000000\$LT_BIN\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"%b\"\ B3\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ #\ puts\ \"B1:\$B1\ -\ B2:\$B2\ -\ B3:\$B3\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ H1\ \[format\ %X\ \$B1\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ H2\ \[format\ %X\ \$B2\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ H3\ \[format\ %X\ \$B3\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::owi::wrap_owi_send\ \[list\ \$H1\ \$H2\ \$H3\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\}\n======\n\n*osc.tcl\n\n======\npackage\ require\ osc\n\nset\ ARM\ \[::owi::arm\ new\]\n\$ARM\ start_arm\n\nosc::createServer\ arm\ 8000\ \\\n\{\nvariable\ DEBUG\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 1\nvariable\ SCN1_FADER\nvariable\ SCN1_TOGGLE\n\n\ \ \ \ \ \ \ \ #\ ---------------------------------------------------------------------\n\ \ \ \ \ \ \ \ #\ *\ Screen\ 1\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ #\ --\ Four\ joints\n\ \ \ \ \ \ \ \ #\ **\ Joint\ one\ -base\ \n\ \ \ \ \ \ \ \ method\ void\ /base/ccw\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"set\ shoulder\ to\ \$X\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ base\ ccw\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Base\"\n\ \ \ \ \ \ \ \ method\ void\ /base/cw\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"set\ shoulder\ to\ \$X\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ base\ cw\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Base\"\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ void\ /shoulder/up\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"set\ shoulder\ to\ \$X\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ shoulder\ up\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Shoulder\"\n\ \ \ \ \ \ \ \ method\ void\ /shoulder/down\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"set\ shoulder\ to\ \$X\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ shoulder\ down\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Shoulder\"\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ void\ /elbow/up\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ elbow\ up\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Elbow\"\n\ \ \ \ \ \ \ \ method\ void\ /elbow/down\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ elbow\ down\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Elbow\"\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ void\ /wrist/up\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ wrist\ up\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Wrist\"\n\ \ \ \ \ \ \ \ method\ void\ /wrist/down\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"set\ shoulder\ to\ \$X\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ wrist\ down\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Wrist\"\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ void\ /grip/close\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"set\ shoulder\ to\ \$X\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ grip\ close\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"grip\"\n\ \ \ \ \ \ \ \ method\ void\ /grip/open\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"set\ shoulder\ to\ \$X\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ grip\ open\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"grip\"\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ void\ /light\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"set\ lifgt\ to\ \$X\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \$X\ ==\ 1.0\ \}\ \{\ \$::ARM\ light\ on\ \}\ else\ \{\ \$::ARM\ light\ off\ \}\ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Shoulder\"\n\ \ \ \ \ \ \ \ #\ fallback\ method\ -\ useful\ for\ debugging\ and\ tests\n\ \ \ \ \ \ \ \ #\ generic\ methods\ (*)\ are\ called\ last\ if\ at\ all,\ so\n\ \ \ \ \ \ \ \ #\ if\ we\ want\ to\ ...\n\ \ \ \ \ \ \ \ method\ int\ *\ \{*\ args\}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ variable\ DEBUG\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \$DEBUG\ ==\ 1\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"*\ From\ \$SENDER\ received\ \$PATH\ (\$TYPES)\ \$args\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ -code\ ok\ 1\n\ \ \ \ \ \ \ \ \}\ \"Debug\ handler\"\n\n\}\n\n\nIMPROVEMENTS\ :\n1.\ Make\ the\ OSC\ interface\ respond\ to\ contact\ and\ release\ separately\ instead\ of\njust\ contact\ with\ a\ timer\ (Metro).\n2.\ Make\ a\ more\ generic\ SWIG\ wrapper\ for\ libusb\ to\ be\ used\ for\ other\ projects.\n3.\ Fit\ the\ whole\ mess\ into\ a\ proper\ TEA\ compliant\ package.\n4.\ Implement\ a\ static\ global\ or\ hash\ table\ for\ the\ USB\ structures\ so\ I\ can\ stop\ \nopenning\ and\ closing\ on\ every\ call\n4.\ ???\n\n\n<<categories>>Enter\ Category\ Here regexp2} CALL {my render {OWI535 robot arm control} \nI\ have\ used\ the\ wiki\ to\ great\ effect\ for\ many\ years\ so\ I\ thought\ I\ would\ \nfinally\ throw\ something\ up\ here.\ This\ started\ as\ a\ project\ for\ my\ son's\nrobotis\ after\ school\ activity.\ The\ OWI535\ robotic\ arm\ is\ a\ very\ low\ cost\nand\ easy\ to\ assemble\ robot\ arm\ with\ 4\ degrees\ os\ freedom\ and\ a\ gripper.\ \nIt\ comes\ stock\ with\ a\ simple\ mechanical\ control\ box\ but\ there\ is\ a\ USB\nadd\ on\ available\ which\ I\ also\ bought.\ The\ protocol\ work\ on\ 3\ byte\ commands.\n\nhttp://www.owirobots.com/store/catalog/robotic-arm-and-accessories/owi-535-robotic-arm-edge-kit-110.html\n\nI\ took\ an\ OWI\ utility\ from\ a\ Raspberry\ utility\ and\ wrote\ a\ small\ SWIG\ \ninterface\ for\ it.\ The\ link\ gives\ an\ excellent\ description\ of\ the\ protocol.\n\nhttp://notbrainsurgery.livejournal.com/38622.html\n\nDirectory\ structure:\n\n*Code_dir\n**package\n**scripts\n**tcl\n\n*Makefile:\n\n======\nCC=cc\nCFLAGS=\ \\\n\ \ \ \ \ \ \ \ -fPIC\ \\\n\ \ \ \ \ \ \ \ -g\ \\\n\ \ \ \ \ \ \ \ -DFREEBSD\n\nINCLUDES=-I/usr/include\ \\\n\ \ \ \ \ \ \ \ -I/usr/local/include\ \\\n\ \ \ \ \ \ \ \ -I/usr/local/include/tcl8.6\n\nLDFLAGS=\\\n\ \ \ \ \ \ \ \ -L/usr/local/lib\ \\\n\ \ \ \ \ \ \ \ -lusb\ -ltcl86\n\nLIBS=\\\n\ \ \ \ \ \ \ \ -L/usr/local/lib\ \\\n\ \ \ \ \ \ \ \ -lusb\ -ltcl86\n\nSHFLAGS+=\\\n\ \ \ \ \ \ \ \ -shared\n\nall:\ tcl/libowi.so\n\nclean:\n\ \ \ \ \ \ \ \ -rm\ rasp_util\n\ \ \ \ \ \ \ \ -rm\ owi_lib.o\n\ \ \ \ \ \ \ \ -rm\ tcl/libowi.so\n\ \ \ \ \ \ \ \ -rm\ tcl/owi_wrap.o\n\ \ \ \ \ \ \ \ -rm\ tcl/owi_wrap.c\n\nrasp_util.o:\ rasp_util.c\n\ \ \ \ \ \ \ \ \$\{CC\}\ \$\{CFLAGS\}\ -c\ rasp_util.c\ -o\ rasp_util.o\n\ \ \ \ \ \ \ \ \nrasp_util:\ rasp_util.o\n\ \ \ \ \ \ \ \ \$\{CC\}\ \$\{LDFLAGS\}\ rasp_util.o\ -o\ rasp_util\n\ \ \ \ \ \ \ \ \nowi_lib.o:\ owi_lib.c\n\ \ \ \ \ \ \ \ \$\{CC\}\ \$\{CFLAGS\}\ -c\ owi_lib.c\ -o\ owi_lib.o\ \n\ntcl/libowi.so:\ tcl/owi_wrap.o\ owi_lib.o\n\ \ \ \ \ \ \ \ \$\{CC\}\ \$\{SHFLAGS\}\ \$\{LIBS\}\ tcl/owi_wrap.o\ owi_lib.o\ -o\ tcl/libowi.so\n\ \ \ \ \ \ \ \ \ntcl/owi_wrap.o:\ tcl/owi_wrap.c\n\ \ \ \ \ \ \ \ \$\{CC\}\ \$\{INCLUDES\}\ \$\{CFLAGS\}\ -c\ tcl/owi_wrap.c\ -o\ tcl/owi_wrap.o\n\ntcl/owi_wrap.c:\ owi.i\n\ \ \ \ \ \ \ \ \$\{SWIG\}\ \$\{SWFLAGS\}\ -tcl\ -itcl\ -namespace\ -outdir\ ./tcl/\ -o\ ./tcl/owi_wrap.c\ \ owi.i\ \n\npackage:\ /dev/null\n\ \ \ \ \ \ \ \ cp\ tcl/libowi.so\ package/libowi.so\n\ \ \ \ \ \ \ \ cp\ scripts/owi.tcl\ package/owi.tcl\n\ \ \ \ \ \ \ \ \ntestload:\ package\n\ \ \ \ \ \ \ \ ./scripts/testload.tcl\n\ \ \ \ \ \ \ \ \ntesttime:\ package\n\ \ \ \ \ \ \ \ ./scripts/testtime.tcl\n======\n\n*owi.i\n\n======\n%module\ owi\n%\{\nint\ owi_send(int,\ char\ **)\;\ \ \ \ \ \ \ \ \n%\}\n//\ ************************************\n//\ SWIG\ voodoo\n%typemap(in)\ char\ **\ \{\n\ \ \ \ \ Tcl_Obj\ **listobjv\;\n\ \ \ \ \ int\ \ \ \ \ \ \ nitems\;\n\ \ \ \ \ int\ \ \ \ \ \ \ i\;\n\ \ \ \ \ if\ (Tcl_ListObjGetElements(interp,\ \$input,\ &nitems,\ &listobjv)\ ==\ TCL_ERROR)\ \{\n\ \ \ \ \ \ \ \ return\ TCL_ERROR\;\n\ \ \ \ \ \}\n\ \ \ \ \ \$1\ =\ (char\ **)\ malloc((nitems+1)*sizeof(char\ *))\;\n\ \ \ \ \ for\ (i\ =\ 0\;\ i\ <\ nitems\;\ i++)\ \{\n\ \ \ \ \ \ \ \ \$1\[i\]\ =\ Tcl_GetStringFromObj(listobjv\[i\],0)\;\n\ \ \ \ \ \}\n\ \ \ \ \ \$1\[i\]\ =\ 0\;\n\}\n\n//\ more\ minor\ voodoo\n%typemap(freearg)\ char\ **\ \{\n\ \ \ \ \ if\ (\$1)\ \{\n\ \ \ \ \ \ \ \ free(\$1)\;\n\ \ \ \ \ \}\n\}\n//\ Now,\ to\ get\ in\ the\ way\ \;)\n%inline\ \n%\{\nint\ wrap_owi_send(char\ **argv)\ \n\{\n\ \ \ \ \ \ \ \ int\ i\ =\ 0\;\n\ \ \ \ \ \ \ \ while\ (argv\[i\])\ \n\ \ \ \ \ \ \ \ \{\n//\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ printf(\"argv\[%d\]\ =\ %s\\n\",\ i,argv\[i\])\;\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ i++\;\n\ \ \ \ \ \ \ \ \}\n//\ \ \ \ \ \ \ \ printf(\"count:%i\\n\",\ i)\;\n\ \ \ \ \ \ \ \ return\ owi_send(i,\ argv)\;\n\}\n%\}\n======\n\n*owi_lib.c\n\n======\n/************************************************************************\n\ *\ Raspberry\ Pi:\ USB\ Robotic\ Arm\ Controller\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Version:\ 1.00\ *\n\ *\ Project\ \ \ \ \ :\ Operate\ the\ USB\ Robotic\ Arm\ using\ Linux\ CLI\ \ \ \ \ \ \ \ \ \ \ \ *\n\ *\ Tested\ on\ \ \ :\ Raspberry\ Pi,\ Model\ B\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *\n\ *\ Exp.\ Level\ \ :\ Beginner/Elementary\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *\n\ ************************************************************************\n\ *\ How\ to\ get\ the\ libusb\ development\ driver:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *\n\ *\ sudo\ apt-get\ install\ -y\ libusb-1.0-0-dev\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *\n\ *----------------------------------------------------------------------*\n\ *\ How\ to\ compile:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *\n\ *\ gcc\ robotarm.c\ -Os\ -I/usr/include/libusb-1.0\ -lusb-1.0\ -o\ robotarm\ \ \ *\n\ ************************************************************************\n\ *\ Operating\ System:\ Raspbian\ \"Wheezy\"\ Linux\ Kernel\ 3.6.11+\ \ \ \ \ \ \ \ \ \ \ \ \ *\n\ *\ Created:\ May\ 28,\ 2013\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Latest\ Revision:\ May\ 28,\ 2013\ *\n\ ************************************************************************\n\ *\ Original\ Credit\ goes\ to\ notbrainsurgery\ at\ LiveJournal\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *\n\ *\ Reference:\ http://notbrainsurgery.livejournal.com/38622.html\ \ \ \ \ \ \ \ \ *\n\ ************************************************************************\n\ *\ \ \ \ \ \ \ \ \ MirandaSoft!\ -\ Pasig\ City,\ Metro\ Manila,\ Philippines\ \ \ \ \ \ \ \ \ *\n\ *\ \ \ \ \ \ \ \ \ http://www.element14.com/community/blogs/mirandasoft\ \ \ \ \ \ \ \ \ *\n\ ************************************************************************/\n\ \n#include\ <stdlib.h>\n#include\ <stdio.h>\n#include\ <sys/types.h>\n#include\ <string.h>\n#include\ <libusb.h>\n\ \n#define\ EP_INTR\ \ (1\ |\ LIBUSB_ENDPOINT_IN)\n\ \n#define\ ARM_VENDOR\ \ \ \ \ \ \ 0x1267\n#define\ ARM_PRODUCT\ \ \ \ \ \ 0\n#define\ CMD_DATALEN\ \ \ \ \ \ 3\n\ \nlibusb_device\ *\ find_arm(libusb_device\ **devs)\n\{\n\ \ libusb_device\ *dev\;\n\ \ \ \ \ int\ i\ =\ 0\;\n\ \n\ \ \ \ \ while\ ((dev\ =\ devs\[i++\])\ !=\ NULL)\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ struct\ libusb_device_descriptor\ desc\;\n\ \ \ \ \ \ \ \ \ \ \ int\ r\ =\ libusb_get_device_descriptor(dev,\ &desc)\;\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ (r\ <\ 0)\ \{\n//\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ fprintf(stderr,\ \"failed\ to\ get\ device\ descriptor\")\;\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ NULL\;\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if(desc.idVendor\ ==\ ARM_VENDOR\ &&\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ desc.idProduct\ ==\ ARM_PRODUCT)\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ dev\;\n\ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \}\n\ \ \ \ \ \ \ return\ NULL\;\n\}\n\n//\ static\ unsigned\ char\ cmd\[3\]\;\n\nint\ owi_send(int\ ac,\ char\ **av)\n\{\n\ \ \ \ if(ac!=3)\n\ \ \ \ \{\n\ \ \ \ char\ buffer\[80\]\;\n\ \ \ \ \ \ \ \ sprintf(buffer,\ \"USB\ Robotic\ Arm\ Control\ Software\\nUsage:\ %s\ CMD0\ CMD1\ CMD2\\n\\n\",\ av\[0\])\;\n//\ \ \ \ \ \ \ \ fprintf(stderr,\ buffer)\;\n\ \ \ \ \ \ \ \ return\ 1\;\n\ \ \ \ \}\n\ \n\ \ \ \ unsigned\ char\ cmd\[3\]\;\n\ \n\ \ \ \ cmd\[0\]=(unsigned\ char)strtol(av\[0\],NULL,16)\;\n\ \ \ \ cmd\[1\]=(unsigned\ char)strtol(av\[1\],NULL,16)\;\n\ \ \ \ cmd\[2\]=(unsigned\ char)strtol(av\[2\],NULL,16)\;\n\ \ \ \ \n\ \ libusb_device\ **devs\;\n\ \ \ \ libusb_device\ *dev\;\n\ \ \ \ struct\ libusb_device_handle\ *devh\ =\ NULL\;\n\ \ \ \ \ \ \ int\ r\;\n\ \ ssize_t\ cnt\;\n\ \n\ \ \ r\ =\ libusb_init(NULL)\;\n\ \ if\ (r\ <\ 0)\n\ \ \ \ \{\n//\ \ \ \ \ fprintf(stderr,\ \"failed\ to\ initialize\ libusb\\n\")\;\n\ \ \ \ \ \ \ return\ r\;\n\ \ \ \ \}\n\ \n\ \ \ \ libusb_set_debug(NULL,2)\;\n\ \ \ \ \n\ \ \ \ cnt\ =\ libusb_get_device_list(NULL,\ &devs)\;\n\ \ \ \ \ \ if\ (cnt\ <\ 0)\n\ \ \ \ \ \ \ \ \ \ \ \ return\ (int)\ cnt\;\n\ \ \ \ dev=find_arm(devs)\;\n\ \ \ \ if(!dev)\n\ \ \ \ \{\n//\ \ \ \ \ \ \ \ \ \ \ fprintf(stderr,\ \"Robot\ Arm\ not\ found\\n\")\;\n\ \ \ \ \ \ \ return\ -1\;\n\ \ \ \ \}\n\ \n\ \ \ \ r\ =\ libusb_open(dev,&devh)\;\n\ \ \ \ if(r!=0)\n\ \ \ \ \{\n//\ \ \ \ \ \ \ \ fprintf(stderr,\ \"Error\ opening\ device\\n\")\;\n//\ \ \ \ \ \ \ \ \ \ \ \ \ \ libusb_free_device_list(devs,\ 1)\;\n//\ \ \ \ \ \ \ \ \ \ \ \ \ libusb_exit(NULL)\;\n\ \ \ \ \ \ \ \ return\ -1\;\n\ \ \ \ \}\n\ \n\ \n//\ \ \ \ fprintf(stderr,\ \"Sending\ %02X\ %02X\ %02X\\n\",\n//\ \ \ \ \ \ \ \ \ \ \ \ (int)cmd\[0\],\n//\ \ \ \ \ \ \ \ \ \ \ \ (int)cmd\[1\],\n//\ \ \ \ \ \ \ \ \ \ \ \ (int)cmd\[2\]\n//\ \ \ \ )\;\n\ \n\ \ \ \ int\ actual_length=-1\;\n\ \ \ \ \n\ \ \ \ r\ =\ libusb_control_transfer(devh,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x40,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ //uint8_t\ \ \ \ \ \ \ \ bmRequestType,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 6,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ //uint8_t\ \ \ \ \ \ \ \ bRequest,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0x100,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ //uint16_t\ \ \ \ \ \ \ \ wValue,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ //uint16_t\ \ \ \ \ \ \ \ wIndex,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ cmd,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ CMD_DATALEN,\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0\ \ \ \ \ \ \ \ \ \n\ \ \ \ )\;\n\ \ \ \ \n//\ \ \ \ if(!(r\ ==\ 0\ &&\ actual_length\ >=\ CMD_DATALEN))\n//\ \ \ \ \{\n//\ \ \ \ \ \ \ \ fprintf(stderr,\ \"Write\ err\ %d.\ len=%d\\n\",r,actual_length)\;\n//\ \ \ \ \}\n\ \ \ \ \n\ \ \ \ libusb_close(devh)\;\n\ \ \ \ \ libusb_free_device_list(devs,\ 1)\;\n\ \ \ \ \ \ \ libusb_exit(NULL)\;\n\ \n//\ \ \ \ fprintf(stderr,\ \"Done\\n\")\;\n\ \ \ \ \ \ \ return\ 0\;\n\}\n======\n\nA\ script\ to\ test\ loading\ the\ extension\n\n*scripts/testload.tcl:\n\n======\npackage\ require\ tclreadline\n\nlappend\ auto_path\ \[file\ join\ \[pwd\]\ package\]\n#\ catch\ \{\ package\ require\ owi\ \}\npackage\ require\ owi\n\nproc\ arm_exit\ \{\ \}\ \\\n\{\n\ \ \ \ \ \ \ \ exit\n\}\n\n\ \ \ \ \ \ \ \ set\ ARM\ \[::owi::arm\ new\]\n\n\ \ \ \ \ \ \ \ ::tclreadline::Loop\n======\n\nI\ saw\ someone\ posted\ an\ Arduino\ like\ \"Map()\"\ proc\ on\ the\ wiki\ which\ got\ me\ \nthinking\ about\ the\ pieces\ I\ have\ found\ useful\ from\ the\ Arduino\ IDE\ so\ I\nmade\ a\ \"Metro()\"\ like\ knock-off.\ The\ OWI\ arm\ is\ not\ a\ closed\ loop\ system\nand\ I\ was\ testing\ from\ the\ command\ line\ so\ something\ like\ thsi\ was\ nessesary.\nMy\ target\ user\ interface\ is\ my\ Android\ tablet,\ using\ TouchOSC.\n\nhttp://hexler.net/software/touchosc\n\n\n\nThere\ are\ 2\ TCL\ OSC\ packages\ I\ know\ of.\ One\ is\ maintained\ by\ Dave\ Joubert\ who\nwas\ kind\ enough\ to\ assist\ me\ with\ the\ library.\n\nhttp://code.google.com/p/tcl-osc-library/\n\nThe\ other\ is\ from\ v2\ labs'\ project.\n\nhttps://trac.v2.nl/browser/OSC/tclosc?rev=1&order=name\n\nAlthough\ I\ used\ the\ v2\ labs\ package\ with\ this\ project,\ Dave's\ library\ and\ work\nare\ far\ more\ sophisticated,\ e.g.\ timed\ events,\ routing\ between\ recievers,\ 3D\ninterfaces,\ etc.\ I\ have\ other\ projects\ that\ will\ require\ some\ of\ that\ stuff\n\"on\ my\ bench\".\n\n*owi.tcl\n\n======\npackage\ require\ cmdline\npackage\ require\ TclOO\n\npackage\ provide\ owi\ 0.0\n\nputs\ \[info\ script\]\nload\ \[file\ join\ \[file\ dirname\ \[info\ script\]\]\ libowi.so\]\n\n#\ ------------------------------------------------------------------------------\n#\ Like\ the\ Arduino\ Metro::Metro\n#\noo::class\ create\ ::owi::metro\ \\\n\{\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ constructor\ \{\ \{INT\ 1000\}\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ INTERVAL\ \n\ \ \ \ \ \ \ \ my\ variable\ PREVIOUS\ \n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ INTERVAL\ \$INT\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ PREVIOUS\ \[clock\ milliseconds\]\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ interval\ \{\ INT\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ INTERVAL\n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ INTERVAL\ \$INT\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ check\ \{\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ INTERVAL\n\ \ \ \ \ \ \ \ my\ variable\ PREVIOUS\n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ NOW\ \[clock\ milliseconds\]\n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ #\ puts\ \[expr\ \$NOW\ -\ \$PREVIOUS\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \[expr\ \$NOW\ -\ \$PREVIOUS\]\ >=\ \$INTERVAL\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ PREVIOUS\ \$NOW\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 0\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ reset\ \{\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ PREVIOUS\n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ PREVIOUS\ \[clock\ milliseconds\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\n\}\;\ #\ end\ of\ class\ metro\noo::class\ create\ ::owi::arm\ \\\n\{\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ constructor\ \{\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ GR_MET\n\ \ \ \ \ \ \ \ my\ variable\ GR_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ WR_MET\n\ \ \ \ \ \ \ \ my\ variable\ WR_BIN\n\ \ \ \ \ \ \ \ my\ variable\ EL_MET\n\ \ \ \ \ \ \ \ my\ variable\ EL_BIN\n\ \ \ \ \ \ \ \ my\ variable\ SH_MET\n\ \ \ \ \ \ \ \ my\ variable\ SH_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ BS_MET\n\ \ \ \ \ \ \ \ my\ variable\ BS_BIN\n\ \ \ \ \ \ \ \ my\ variable\ LT_BIN\ 00\n\ \ \ \ \ \ \ \ my\ variable\ LC_MET\n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ GR_MET\ \ \ \ \ \ \ \ \[::owi::metro\ new\ 80\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ GR_BIN\ \ \ \ \ \ \ \ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ WR_MET\ \ \ \ \ \ \ \ \[::owi::metro\ new\ 80\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ WR_BIN\ \ \ \ \ \ \ \ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ EL_MET\ \ \ \ \ \ \ \ \[::owi::metro\ new\ 80\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ EL_BIN\ \ \ \ \ \ \ \ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ SH_MET\ \ \ \ \ \ \ \ \[::owi::metro\ new\ 80\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ SH_BIN\ \ \ \ \ \ \ \ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ BS_MET\ \ \ \ \ \ \ \ \[::owi::metro\ new\ 80\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ BS_BIN\ \ \ \ \ \ \ \ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ LT_BIN\ \ \ \ \ \ \ \ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ LC_MET\ \ \ \ \ \ \ \ 80\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ #after\ \$LC_MET\ \ \ \ \ \ \ \ \[self\ object\]\ upd_bin\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ upd_bin\ \{\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ GR_MET\n\ \ \ \ \ \ \ \ my\ variable\ GR_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ WR_MET\n\ \ \ \ \ \ \ \ my\ variable\ WR_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ EL_MET\n\ \ \ \ \ \ \ \ my\ variable\ EL_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ SH_MET\n\ \ \ \ \ \ \ \ my\ variable\ SH_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ BS_MET\n\ \ \ \ \ \ \ \ my\ variable\ BS_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ LT_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ LC_MET\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \[\$GR_MET\ check\]\ \}\ \{\ set\ GR_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \[\$WR_MET\ check\]\ \}\ \{\ set\ WR_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \[\$EL_MET\ check\]\ \}\ \{\ set\ EL_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \[\$SH_MET\ check\]\ \}\ \{\ set\ SH_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \[\$BS_MET\ check\]\ \}\ \{\ set\ BS_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ #\ puts\ \"B1\ :\ \$GR_BIN\ \$WR_BIN\ \$EL_BIN\ \$SH_BIN\ |\ B2\ :\ 00\ 00\ 00\ \$BS_BIN\ |\ B3\ :\ 00\ 00\ 00\ \$LT_BIN\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ after\ \$LC_MET\ \[self\ object\]\ upd_bin\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \[self\ object\]\ send_bin\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ grip\ \{\ \{\ DIR\ stop\}\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ GR_MET\n\ \ \ \ \ \ \ \ my\ variable\ GR_BIN\ \n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"open\"\ \}\ \ \ \ \ \ \ \ \{\ set\ GR_BIN\ 01\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ elseif\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"close\"\ \}\ \ \ \ \ \ \ \ \{\ set\ GR_BIN\ 10\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ else\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\ set\ GR_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$GR_MET\ reset\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ wrist\ \{\ \{\ DIR\ stop\}\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ WR_MET\n\ \ \ \ \ \ \ \ my\ variable\ WR_BIN\ \n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"up\"\ \}\ \ \ \ \ \ \ \ \{\ set\ WR_BIN\ 01\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ elseif\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"down\"\ \}\ \ \ \ \ \ \ \ \{\ set\ WR_BIN\ 10\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ else\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\ set\ WR_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$WR_MET\ reset\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ elbow\ \{\ \{\ DIR\ stop\}\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ EL_MET\n\ \ \ \ \ \ \ \ my\ variable\ EL_BIN\ \n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"up\"\ \}\ \ \ \ \ \ \ \ \{\ set\ EL_BIN\ 01\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ elseif\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"down\"\ \}\ \ \ \ \ \ \ \ \{\ set\ EL_BIN\ 10\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ else\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\ set\ EL_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$EL_MET\ reset\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ shoulder\ \{\ \{\ DIR\ stop\}\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ SH_MET\n\ \ \ \ \ \ \ \ my\ variable\ SH_BIN\ \n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"up\"\ \}\ \ \ \ \ \ \ \ \{\ set\ SH_BIN\ 01\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ elseif\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"down\"\ \}\ \ \ \ \ \ \ \ \{\ set\ SH_BIN\ 10\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ else\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\ set\ SH_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$SH_MET\ reset\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ base\ \{\ \{\ DIR\ stop\}\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ BS_MET\n\ \ \ \ \ \ \ \ my\ variable\ BS_BIN\ \n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"cw\"\ \}\ \ \ \ \ \ \ \ \{\ set\ BS_BIN\ 01\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ elseif\ \ \ \ \ \ \ \ \{\ \$DIR\ ==\ \"ccw\"\ \}\ \ \ \ \ \ \ \ \{\ set\ BS_BIN\ 10\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ else\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\ set\ BS_BIN\ 00\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$BS_MET\ reset\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ light\ \{\ \{\ DIR\ stop\}\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ LT_BIN\ \n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \$DIR\ ==\ \"on\"\ \}\ \{\ set\ LT_BIN\ 01\;\ return\ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ LT_BIN\ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ start_arm\ \{\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ LC_MET\n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ after\ \$LC_MET\ \ \ \ \ \ \ \ \[self\ object\]\ upd_bin\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ stop\ \{\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ GR_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ WR_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ EL_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ SH_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ BS_BIN\ \n\ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ GR_BIN\ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ WR_BIN\ 00\ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ EL_BIN\ 00\ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ SH_BIN\ 00\ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ BS_BIN\ 00\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \[self\ object\]\ send_bin\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ -----------------------------\n\ \ \ \ \ \ \ \ #\ \n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ send_bin\ \{\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ my\ variable\ GR_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ WR_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ EL_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ SH_BIN\ \n\ \ \ \ \ \ \ \ my\ variable\ BS_BIN\n\ \ \ \ \ \ \ \ my\ variable\ LT_BIN\n\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ scan\ \$SH_BIN\$EL_BIN\$WR_BIN\$GR_BIN\ \ \ \ \ \ \ \ \"%b\"\ B1\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ scan\ 000000\$BS_BIN\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"%b\"\ B2\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ scan\ 000000\$LT_BIN\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \"%b\"\ B3\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ #\ puts\ \"B1:\$B1\ -\ B2:\$B2\ -\ B3:\$B3\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ H1\ \[format\ %X\ \$B1\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ H2\ \[format\ %X\ \$B2\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ H3\ \[format\ %X\ \$B3\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::owi::wrap_owi_send\ \[list\ \$H1\ \$H2\ \$H3\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\n\ \ \ \ \ \ \ \ \}\n\}\n======\n\n*osc.tcl\n\n======\npackage\ require\ osc\n\nset\ ARM\ \[::owi::arm\ new\]\n\$ARM\ start_arm\n\nosc::createServer\ arm\ 8000\ \\\n\{\nvariable\ DEBUG\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 1\nvariable\ SCN1_FADER\nvariable\ SCN1_TOGGLE\n\n\ \ \ \ \ \ \ \ #\ ---------------------------------------------------------------------\n\ \ \ \ \ \ \ \ #\ *\ Screen\ 1\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ #\ --\ Four\ joints\n\ \ \ \ \ \ \ \ #\ **\ Joint\ one\ -base\ \n\ \ \ \ \ \ \ \ method\ void\ /base/ccw\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"set\ shoulder\ to\ \$X\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ base\ ccw\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Base\"\n\ \ \ \ \ \ \ \ method\ void\ /base/cw\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"set\ shoulder\ to\ \$X\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ base\ cw\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Base\"\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ void\ /shoulder/up\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"set\ shoulder\ to\ \$X\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ shoulder\ up\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Shoulder\"\n\ \ \ \ \ \ \ \ method\ void\ /shoulder/down\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"set\ shoulder\ to\ \$X\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ shoulder\ down\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Shoulder\"\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ void\ /elbow/up\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ elbow\ up\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Elbow\"\n\ \ \ \ \ \ \ \ method\ void\ /elbow/down\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ elbow\ down\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Elbow\"\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ void\ /wrist/up\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ wrist\ up\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Wrist\"\n\ \ \ \ \ \ \ \ method\ void\ /wrist/down\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"set\ shoulder\ to\ \$X\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ wrist\ down\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Wrist\"\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ void\ /grip/close\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"set\ shoulder\ to\ \$X\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ grip\ close\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"grip\"\n\ \ \ \ \ \ \ \ method\ void\ /grip/open\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"set\ shoulder\ to\ \$X\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \$::ARM\ grip\ open\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"grip\"\n\ \ \ \ \ \ \ \ #\n\ \ \ \ \ \ \ \ method\ void\ /light\ \{\ float\ X\ \}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"set\ lifgt\ to\ \$X\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \$X\ ==\ 1.0\ \}\ \{\ \$::ARM\ light\ on\ \}\ else\ \{\ \$::ARM\ light\ off\ \}\ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ 1\n\ \ \ \ \ \ \ \ \}\ \"Shoulder\"\n\ \ \ \ \ \ \ \ #\ fallback\ method\ -\ useful\ for\ debugging\ and\ tests\n\ \ \ \ \ \ \ \ #\ generic\ methods\ (*)\ are\ called\ last\ if\ at\ all,\ so\n\ \ \ \ \ \ \ \ #\ if\ we\ want\ to\ ...\n\ \ \ \ \ \ \ \ method\ int\ *\ \{*\ args\}\ \\\n\ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ variable\ DEBUG\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\ \$DEBUG\ ==\ 1\ \}\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ puts\ \"*\ From\ \$SENDER\ received\ \$PATH\ (\$TYPES)\ \$args\"\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ -code\ ok\ 1\n\ \ \ \ \ \ \ \ \}\ \"Debug\ handler\"\n\n\}\n\n\nIMPROVEMENTS\ :\n1.\ Make\ the\ OSC\ interface\ respond\ to\ contact\ and\ release\ separately\ instead\ of\njust\ contact\ with\ a\ timer\ (Metro).\n2.\ Make\ a\ more\ generic\ SWIG\ wrapper\ for\ libusb\ to\ be\ used\ for\ other\ projects.\n3.\ Fit\ the\ whole\ mess\ into\ a\ proper\ TEA\ compliant\ package.\n4.\ Implement\ a\ static\ global\ or\ hash\ table\ for\ the\ USB\ structures\ so\ I\ can\ stop\ \nopenning\ and\ closing\ on\ every\ call\n4.\ ???\n\n\n<<categories>>Enter\ Category\ Here} CALL {my revision {OWI535 robot arm control}} CALL {::oo::Obj1062709 process revision/OWI535+robot+arm+control} CALL {::oo::Obj1062707 process}

-errorcode

NONE

-errorinfo

Unknow state transition: LINE -> END
    while executing
"error $msg"
    (class "::Wiki" method "render_wikit" line 6)
    invoked from within
"my render_$default_markup $N $C $mkup_rendering_engine"
    (class "::Wiki" method "render" line 8)
    invoked from within
"my render $name $C"
    (class "::Wiki" method "revision" line 31)
    invoked from within
"my revision $page"
    (class "::Wiki" method "process" line 56)
    invoked from within
"$server process [string trim $uri /]"

-errorline

4