You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
4.4 KiB
154 lines
4.4 KiB
# This python file use the following encoding: utf-8 |
|
|
|
import sys |
|
import os |
|
import datetime |
|
import random |
|
import e |
|
|
|
from efl import evas |
|
from efl import edje |
|
from efl import ecore |
|
|
|
__gadget_name__ = 'Led Clock' |
|
__gadget_vers__ = '0.2' |
|
__gadget_auth__ = 'DaveMDS' |
|
__gadget_mail__ = 'dave@gurumeditation.it' |
|
__gadget_desc__ = 'The usual led clock.' |
|
__gadget_vapi__ = 2 |
|
|
|
|
|
# def DBG(msg): |
|
# print("MEM: %s" % msg) |
|
# sys.stdout.flush() |
|
|
|
|
|
COLORS = ('off', 'red', 'green', 'blu') |
|
|
|
class Gadget(e.Gadget): |
|
|
|
def instance_created(self, obj, site): |
|
super().instance_created(obj, site) |
|
|
|
timer = ecore.Timer(1.0, self.clock_timer_cb, obj) |
|
obj.data['timer'] = timer |
|
|
|
obj.signal_callback_add('mouse,down,1', '*', self.led_click_cb) |
|
|
|
w, h = obj.size_min |
|
obj.size_hint_aspect = evas.EVAS_ASPECT_CONTROL_BOTH , w, h |
|
return obj |
|
|
|
def instance_destroyed(self, obj): |
|
super().instance_destroyed(obj) |
|
|
|
timer = obj.data.get('timer') |
|
if timer: timer.delete() |
|
timer2 = obj.data.get('timer2') |
|
if timer2: timer2.delete() |
|
|
|
def clock_timer_cb(self, obj): |
|
time = datetime.datetime.now() |
|
self.draw_digit(obj, int(time.hour / 10), 1) |
|
self.draw_digit(obj, int(time.hour % 10), 2); |
|
self.draw_digit(obj, int(time.minute / 10), 3); |
|
self.draw_digit(obj, int(time.minute % 10), 4); |
|
return ecore.ECORE_CALLBACK_RENEW |
|
|
|
def draw_digit(self, obj, digit, position): |
|
# build the "framebuffer" |
|
if position == 1: |
|
fb = [0, 0, 0] |
|
elif position == 3: |
|
fb = [0, 0, 0, 0, 0, 0] |
|
else: |
|
fb = [0, 0, 0, 0, 0, 0, 0, 0, 0] |
|
|
|
# turn on the first N 'led' on the array (N = digit) |
|
for i in range(digit): |
|
fb[i] = 1; |
|
|
|
# scramble the grid |
|
random.shuffle(fb) |
|
|
|
# render to the 'fb' |
|
if position == 1: |
|
for i in range(len(fb)): |
|
self.led_set(obj, i + 1, 'red' if fb[i] else 'off') |
|
elif position == 2: |
|
for i in range(len(fb)): |
|
self.led_set(obj, i + 4, 'green' if fb[i] else 'off') |
|
elif position == 3: |
|
for i in range(len(fb)): |
|
self.led_set(obj, i + 13, 'blu' if fb[i] else 'off') |
|
elif position == 4: |
|
for i in range(len(fb)): |
|
self.led_set(obj, i + 19, 'red' if fb[i] else 'off') |
|
|
|
|
|
def led_set(self, obj, led, color): |
|
obj.signal_emit('led,set,' + color, 'led%d' % led) |
|
|
|
def clear_all(self, obj): |
|
for i in range(1, 28): |
|
self.led_set(obj, i, 'off') |
|
|
|
|
|
## Animations |
|
def led_click_cb(self, obj, signal, source): |
|
if source == 'led1': start_func = self.start_anim_1 |
|
elif source == 'led2': start_func = self.start_anim_2 |
|
elif source == 'led3': start_func = self.start_anim_3 |
|
else: return |
|
|
|
timer = obj.data.get('timer') |
|
if timer: timer.delete() |
|
timer2 = obj.data.get('timer2') |
|
if timer2: timer2.delete() |
|
obj.data['timer2'] = ecore.Timer(10.0, self.stop_anim, obj) |
|
start_func(obj) |
|
|
|
def stop_anim(self, obj): |
|
self.clear_all(obj) |
|
del obj.data['timer2'] |
|
obj.data['timer'].delete() |
|
obj.data['timer'] = ecore.Timer(1.0, self.clock_timer_cb, obj) |
|
|
|
return ecore.ECORE_CALLBACK_CANCEL |
|
|
|
|
|
## ANIM 1 (full colors) |
|
def start_anim_1(self, obj): |
|
obj.data['timer'] = ecore.Timer(0.4, self.animator_1, obj) |
|
obj.data['color'] = 0 |
|
|
|
def animator_1(self, obj): |
|
for i in range(1, 28): |
|
self.led_set(obj, i, COLORS[obj.data['color'] % 4]) |
|
obj.data['color'] += 1 |
|
return ecore.ECORE_CALLBACK_RENEW |
|
|
|
|
|
## ANIM 2 (colors carousell) |
|
def start_anim_2(self, obj): |
|
self.clear_all(obj) |
|
obj.data['timer'] = ecore.Timer(0.02, self.animator_2, obj) |
|
obj.data['color'] = 1 |
|
obj.data['count'] = 27 |
|
|
|
def animator_2(self, obj): |
|
self.led_set(obj, obj.data['count'], COLORS[obj.data['color'] % 4]) |
|
obj.data['count'] -= 1 |
|
if obj.data['count'] <= 0: |
|
obj.data['count'] = 27 |
|
obj.data['color'] += 1 |
|
return ecore.ECORE_CALLBACK_RENEW |
|
|
|
## ANIM 3 (randomize) |
|
def start_anim_3(self, obj): |
|
obj.data['timer'] = ecore.Timer(0.075, self.animator_3, obj) |
|
|
|
def animator_3(self, obj): |
|
for i in range(1, 28): |
|
self.led_set(obj, i, random.choice(COLORS)) |
|
return ecore.ECORE_CALLBACK_RENEW
|
|
|