Skip to content

alcalyn/chall-cube

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Challenge Cube

Base API for RaspberryPi Cube.

Cube is physical, and has 6 faces, all drived by Raspberry Pi. Each face is a challenge, has some electronic elements programmatically drived by a Face python class.

This library provides a base class Face to implement a challenge, and then run all 6 faces asynchronously.

It also provides Cube devices API, like accelerometer to know which face is up.

Installation

pip install chall_cube

Usage

Testing with base faces

Implement a cube with 6 blank faces which do nothing:

from chall_cube.Cube import Cube
from chall_cube.face.BlankFace import BlankFace

faces = [
    BlankFace(),
    BlankFace(),
    BlankFace(),
    BlankFace(),
    BlankFace(),
    BlankFace()
]

dice = Cube(faces)

dice.start()

Test to blink a led wired on pin 18 on the face with the class BlinkingFace:

from chall_cube.Cube import Cube
from chall_cube.face.BlinkingFace import BlinkingFace

faces = [
    # ...
    BlinkingFace(18)
]

dice = Cube(faces)

dice.start()

Implement a custom face

When the cube starts, it calls the start method from all its faces.

Face which does nothing:

from chall_cube.face.Face import Face


class MyCustomFace(Face):

    def start(self):
        self.print('My custom face is running.')
        # Face logic here, light on leds, use cube API...

self.print method will print logs on terminal prefixed with the face unique name. Used to identify which face is logging.

To integrate this custom face to the cube, just add it to a Cube instance.

Integrating custom face to cube:

from chall_cube.Cube import Cube
from chall_cube.face.BlankFace import BlankFace

faces = [
    MyCustomFace(),
    BlankFace(),
    BlankFace(),
    BlankFace(),
    BlankFace(),
    BlankFace()
]

dice = Cube(faces)

dice.start()

This library provides some basic faces, like BlankFace which does nothing.

It also provides BlinkingFace, that just makes blinking a led. It can be used to test the cube.

Blinking a led wired on pin 18:

from time import sleep
from chall_cube.face.Face import Face
from gpiocrust import Header, OutputPin


class MyCustomFace(Face):

    def start(self):
        with Header():
            pin = OutputPin(18)

            while True:
                self.print('Pin ON')
                pin.value = 1
                sleep(1)

                self.print('Pin OFF')
                pin.value = 0
                sleep(1)

Note that this thread is blocking, because in a while True loop.

It becomes a problem when you want to quit the cube process with CTRL+C: you'll have to CTRL+C twice to force quit the process.

To avoid this, and softly stop the face process, you can listen to cube stop request, then break the loop.

Listen to cube stop request:

from time import sleep
from chall_cube.face.Face import Face
from gpiocrust import Header, OutputPin


class MyCustomFace(Face):

    def __init__(self):
        super().__init__()

        self.__has_stop_request = False

    def request_stop(self):
        self.__has_stop_request = True

    def start(self):
        with Header():
            pin = OutputPin(18)

            while not self.__has_stop_request:
                self.print('Pin ON')
                pin.value = 1
                sleep(1)

                self.print('Pin OFF')
                pin.value = 0
                sleep(1)

The method request_stop is called by the cube when it want to stop.

In this example, the loop breaks after 2 seconds max after the stop request, and avoid to force stop the face challenge.

Cube devices API

The cube API provides devices API, such as accelerometer.

Accelerometer

Accelerometer provides the current cube orientation.

It is useful to know which face is up.

from chall_cube.device.Accelerometer import Accelerometer

accelerometer = Accelerometer()

accelerometer.get_current_face()
# Returns an integer from 1 to 6

License

This library is under AGPL-3.0 License.

About

Base API for RaspberryPi cube.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages