And PyLNP for the RCX

hedgebornabaloneΛογισμικό & κατασκευή λογ/κού

2 Δεκ 2013 (πριν από 3 χρόνια και 8 μήνες)

125 εμφανίσεις

And PyLNP for the RCX

By: Eric Cranmer and Nick Blake

Python?... Isn’t that a snake?


NO!.. It is actually named after the show:


‘Monty Python’s Flying Circus’ on BBC


A programming language that is:


Interpreted


Interactive


Object
-
Oriented


Similar to Java, Perl, and Scheme


Developed in 1990 by CWI in Amsterdam


Now owned by Python Software Foundation

The Skin of the Snake


Python 2.4
-

FREE!!


Interactive


like Scheme, you can run
certain parts of code


Large standard library


Eg: Math functions, regular expressions, file IO


( Software )


On UNIX, type
python

to start command
-
line interpreter


python

c
command [arg] …


Ex:

python

c “import sys; sys.exit()”


Ex:

python

c “print ‘hello’”


If errors occur, HELPFUL error messages
are displayed


The Skin of the Snake (cont..)

( Software )

The Soul Within the Beast


Structure


Data Types


Variables and Scope


Conditionals and Loops


Functions


Parameter Passing / Assignment


Garbage Collection


Classes


I/O


Multi
-
Tasking

( The Language Itself )

Structure


No Special End
-
of
-
Line character like ‘;’


Comments are denoted by the ‘#’


Indentation is a must


YES…. you have to go by the standards


Throws IndentationError if you don’t



Numbers


Arithmetic is infix and operators have regular precedence
that we are use to



(50
-
5*6)/4 outputs 5


Integer division does floor function


Floating point supported


4 * 2.5 / 5 outputs 2.0


Complex numbers also


(2+3j)*4 outputs (8+12j)


z.real and z.imag


Conversions done with functions like:


float(), int(), and long()


Round decimal numbers using round()


round(113.0625, 2) outputs 113.06



Strings


Enclosed by single or double quotes


\

means String continues on next line


Triple quotes can be used also ( ” ” ” ) or ( ‘ ‘ ‘ )


Raw and Unicode Strings


Concatenation with +, Repetition with *


No character type


Strings are indexed


word = ‘help’; word[3] #outputs ‘p’


word[0:2] #outputs ‘he’
-

same as word[:2]


word[:200] #outputs ‘help’


Negative indices go backwards


Can get the length of a String using len()


Lists


Defined within [ ] and don’t need to have same type


Indices and concatenation just like Strings


Length can be found using len()


Can nest lists within other lists


in

statement



Examples:


>>>list = [ 12, ‘eric’, 23.3, ‘nick’ ]


>>>list[1] = ‘bob’ # list now is [ 12, ‘bob’, 23.3, ‘nick ]


>>>other = [ 2, list ]


>>>other[1][0]


12

Lists (cont.)


append(x)


extend(L)


insert(i,x)


remove(x)


remove item
x


pop([i])


remove and return item at index
i


index(x)


index of first occurrence


count(x)
-

# of times in the list


sort()


sort the items in the list


reverse()


reverse the list


del <list
-
name>[ ]


deletes an element from a list

Example


>>> # Fibonacci

. . . a, b = 0, 1

>>> while b < 10:

. . .

print b # if you put comma at end of this line, will print on ONE line

. . .

a, b = b, a+b # multiple assignment

. . .

1

1

2

3

5

8

Variables and Scope


Variables assigned values by ‘=‘


Can assign many variables at once


x = y = z = 10 # x,y, and z all equal 10


After you type an expression, its value is stored into _


>>>10 * 13


#outputs 130


>>>_ / 2


#outputs 65


if Statement

>>>x = int(raw_input(“Integer: ”))

>>>if x < 50:

. . .


x = 0

. . .


print ‘small number’

. . . elif x == 1000:

. . .


print ‘thats a BIG number!’

. . . else:

. . .


print ‘large number’

. . .

for Statement

>>>list = [‘eric’, ‘wow’, ‘hello’]

>>>for item in list:

. . .


print item, len(item)

. . .

eric 4

wow 3

hello 5


Other statements…


range()

function


>>>range(3)


[0,1,2]


break



same as in C


continue



same as in C


pass



does NOTHING! (seriously)

Defining Functions


Keyword: def <function
-
name>(<params>):


Global variables can be referenced in functions
but can NOT be assigned new values


Arguments passed using
call by value


return

statement supported


Default argument values


def function(a, b=4, c):


Keyword arguments


def func(a, b=“hello”, c=25):


^ can be called by: func(10), func(b=“cool”, “man”), etc…


^ can’t do something like: func(a=10, 20)

Lambda


Just like in Lisp and Scheme


>>>def add_em(n, m):

. . .


return lambda n,m: n+m

. . .

>>>f = add_em(0,0)

>>>f(2,3)

5

Classes

class Test:


"This is a test class."




def __init__(self):



print self.__doc__



print self





test = Test()

Class definitions are straight forward.


An optional string can follow the class

definition, it is normally used to describe

the class.


To access this string, used the __doc__

attribute.


The method __init__(self) acts as a

constructor, and is called upon the

creation of a class instance. It is also

optional.

Inheritance

class Car:


"A car."


doors = 4


def __init__(self):



print self.__doc__



print self.doors




def printStuff( self ):



print self.doors


class Sedan(Car):


"A car that is a sedan."


def __init__(self):




Car.__init__(self)





car = Car()

sedan = Sedan()

sedan.printStuff()

To declare inheritance, simply put all super

classes in parenthesis following the class

name, separated by commas if multiple

inheritance.



To call the __init__() of the super class,

just call it using the class name, and pass

the instance of the current class.


Python allows for diamond inheritance, but

as in most cases, it is better to find alternate

models, diamond inheritance has many

problems.



File I/O

Start by creating a file object.


file = open(
filename
,
mode

)

filename

is a string referring to the location
of the file.

mode

can be either ‘r’ for read only, ‘w’ for
write only, or ‘r+’ for read and write. This
parameter is optional, and it will be
assumed read only if omitted.

File I/O
-

Reading

You can use read(), readline(), or readlines()
to read information from a file object.

read()


returns the entire text of the file.

readline()


returns the first unread line of
the file each time it is called.

readlines()


returns a list of all the lines in
the file.

File I/O
-

Writing

You can only write strings, and to do so use:


write(str)

However, the pickle module is similar to
Java’s object serialization.


pickle.dump(object, file)


obj = pickle.load(file)

File I/O


Additional Methods


seek(
offset
,
position

)

offset

is an integer value

position

is either 0, for the start of the file, 1, for the
current position, or 2, for the end of the file.




close()

Closes the file object, and frees any resources it is
taking. No further methods may be invoked on it.

Multi
-
threading

Very similar to Java’s threads.

You must first import
threading

Create an object that inherits from the
threading.Thread

object, making sure to
call the
threading.Thread.__init__(self)

method in your classes
__init__(self)

Next, override the
run(self)

method, and you
have yourself a thread.


Multi
-
threading

Call start() on your thread object to start it, the
main thread will continue to run.

Call join() on your thread object to have the main
thread wait until the thread objects finishes
execution before continuing.


Synchronization can be accomplished through
using a single thread with a Queue in it. Instead
of requesting something from a resource, all
threads instead request it from this one thread,
which then access the resource itself, and sends
it back to the thread that initially requested it.

Why to use it.


It is a high
-
level general
-
purpose
programming language, useful for solving
a very large range of problems.


Enforces good standards.


It is very extensible, there are many third
-
party modules, and the option is always
there to make your own.


Existing modules make tasks difficult in
other languages very simple.

How to get it.

It is simple…


Just go to
http://www.python.org


They also have links to where to find any
module you would need.

Getting it running.

It is a good idea to add python.exe into your
environment variables.


Next, simply run:

python sourceFile.py


You could also run the python interpreter
and use the language interactively.



Does it work with Legos and the
RCX?

…to a degree.


PyLNP is a module that allows for
communication over the IR tower to
LegOS / brickOS.


Homepage of PyLNP:

http://www.hare.demon.co.uk/lego/pylnp.html

PyLNP

PyLNP is linux only


Similar to UDP for IR



Has very poor documentation


There must be a program on the RCX written in
either C or C++ ready to interpret the messages
sent by PyLNP.




Sample PyLNP

import lnp

#Ask the RCX if it is

# active.

lnp.iwrite(‘active?’)

#Read the response

# given

print lnp.iread()

This small program loads the


PyLNP module ( lnp )


It then writes a message to the


RCX over the IR tower.


A program on the RCX (running


LegOS / brickOS) receives the


message, and returns one of


its own, in this case it may be


“Yes.”


The program then prints the

response, again in this case, “Yes.”

For more information..

Go to
www.python.org

!


It has endless tutorials and documentation.


It has links to most third
-
party modules.


It has links to developer’s sites, projects,
and forums.