diff --git a/epydial/audio_screen.py b/epydial/audio_screen.py
new file mode 100644
index 0000000..e637ef4
--- /dev/null
+++ b/epydial/audio_screen.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python2.5
+# -*- coding: utf-8 -*-
+__author__ = "Soeren Apel (abraxa@dar-clan.de), Frank Gau (fgau@gau-net.de), Thomas Gstaedner (thomas (a) gstaedtner (.) net)"
+__version__ = "prototype"
+__copyright__ = "Copyright (c) 2008"
+__license__ = "GPL3"
+
+from epydial import *
+
+class AudioScreen(EdjeGroup):
+ toggle = 0
+
+ def __init__(self, screen_manager):
+ EdjeGroup.__init__(self, screen_manager, AUDIO_SCREEN_NAME)
+ PyneoController.get_mp3_tags()
+
+ def register_pyneo_callbacks(self):
+ PyneoController.register_callback("on_get_mp3_tags", self.on_get_mp3_tags)
+
+ def on_get_mp3_tags(self, status):
+ self.part_text_set("mp3_tags", "artist: %s
album: %s
title: %s" % (status['artist'], status['album'], status['title']))
+
+ @edje.decorators.signal_callback("music_player_send", "*")
+ def on_edje_signal_audio_screen_triggered(self, emission, source):
+# if source == "button_play_pause":
+# self.signal_emit("button_play_pause", " ")
+# PyneoController.pause_music()
+# PyneoController.show_dialer_screen()
+ if source == "play_pause":
+ if self.toggle == 0:
+ self.signal_emit("key1", "")
+ PyneoController.play_music()
+ self.toggle = 1
+ elif self.toggle == 1:
+ self.signal_emit("key2", "")
+ PyneoController.pause_music()
+ self.toggle = 0
+ PyneoController.get_mp3_tags()
+ if source == "stop":
+ self.signal_emit("key2", "")
+ PyneoController.pause_music()
+ self.toggle = 0
+ PyneoController.stop_music()
+ PyneoController.get_mp3_tags()
+ if source == "track_right":
+ PyneoController.next_music()
+ PyneoController.get_mp3_tags()
+ if source == "track_left":
+ PyneoController.previous_music()
+ PyneoController.get_mp3_tags()
+ print 'source: ', source
diff --git a/epydial/data/themes/blackwhite/audio_screen.edc b/epydial/data/themes/blackwhite/audio_screen.edc
new file mode 100755
index 0000000..c18e9c4
--- /dev/null
+++ b/epydial/data/themes/blackwhite/audio_screen.edc
@@ -0,0 +1,346 @@
+// audio_screen.edc
+// this is a theme for epydial, a pyneo dialer and more
+
+data {
+ item: "author" "thomasg [thomas (a) gstaedtner (.) net] , fgau (fgau@gau-net.de)";
+ item: "version" "prototype";
+ item: "name" "epydial_blackwhite";
+}
+
+fonts {
+ font: "Vera.ttf" "Vera";
+ font: "VeraBd.ttf" "VeraBd";
+}
+
+images {
+ image: "bg.png" COMP;
+ image: "play.png" COMP;
+ image: "pause.png" COMP;
+ image: "track_left.png" COMP;
+ image: "track_right.png" COMP;
+ image: "stop.png" COMP;
+}
+
+color_classes {
+ color_class {
+ name: "unvisible";
+ color: 0 0 0 0;
+ color2: 128 128 128 255;
+ color3: 128 128 128 255;
+ }
+ color_class {
+ name: "button_inactive";
+ color: 255 255 255 128;
+ color2: 128 128 128 255;
+ color3: 128 128 128 255;;
+ }
+ color_class {
+ name: "scale";
+ color: 255 255 255 64;
+ color2: 0 0 0 255;
+ color3: 0 0 0 255;
+ }
+}
+
+styles {
+ style {
+ name: "textblock_style";
+ base: "font=Vera font_size=20 align=left valign=top color=#fff";
+ tag: "h1" "+ font_size=28";
+ tag: "/h1" "- \n";
+ tag: "p" "+";
+ tag: "/p" "- \n";
+ tag: "em" "+ style=underline underline_color=#000A underline2_color=#0005";
+ tag: "/em" "-";
+ tag: "br" "\n";
+ tag: "c1" "+ color=#fff";
+ tag: "/c1" "-";
+ tag: "c2" "+ color=#f3f";
+ tag: "/c2" "-";
+ }
+}
+
+#define key(n, x, y)\
+part {\
+ name: n;\
+ type: IMAGE;\
+ description {\
+ image {\
+ normal: n".png";\
+ }\
+ rel1 {\
+ to: pad;\
+ relative: (x+1)/4-1/8 (y+1)/5-1/10;\
+ offset: -50 -50;\
+ }\
+ rel2 {\
+ to: pad;\
+ relative: (x+1)/4-1/8 (y+1)/5-1/10;\
+ offset: 50 50;\
+ }\
+ }\
+}\
+program { \
+ name: "button_"n"_signal_emit"; \
+ signal: "mouse,down,*"; \
+ source: n; \
+ action: SIGNAL_EMIT "music_player_send" n; \
+} \
+
+#define key_play_pause(n, n1, n2, x, y)\
+part {\
+ name: n;\
+ type: IMAGE;\
+ description {\
+ state: "default" 0; \
+ image {\
+ normal: n1".png";\
+ }\
+ rel1 {\
+ to: pad;\
+ relative: (x+1)/4-1/8 (y+1)/5-1/10;\
+ offset: -50 -50;\
+ }\
+ rel2 {\
+ to: pad;\
+ relative: (x+1)/4-1/8 (y+1)/5-1/10;\
+ offset: 50 50;\
+ }\
+ }\
+ description {\
+ state: "default" 1; \
+ image {\
+ normal: n2".png";\
+ }\
+ rel1 {\
+ to: pad;\
+ relative: (x+1)/4-1/8 (y+1)/5-1/10;\
+ offset: -50 -50;\
+ }\
+ rel2 {\
+ to: pad;\
+ relative: (x+1)/4-1/8 (y+1)/5-1/10;\
+ offset: 50 50;\
+ }\
+ }\
+}\
+program { \
+ name: "button_"n"_signal_emit"; \
+ signal: "mouse,down,*"; \
+ source: n; \
+ action: SIGNAL_EMIT "music_player_send" n; \
+} \
+program { \
+ name: "press_key1"; \
+ signal: "key1"; \
+ action: STATE_SET "default" 1; \
+ target: n; \
+} \
+program { \
+ name: "press_key2"; \
+ signal: "key2"; \
+ action: STATE_SET "default" 0; \
+ target: n; \
+} \
+
+#define HBAR(barname, bordercolor, borderwidth, rel1x, rel1y, rel2x, rel2y, left_right_offset) \
+part { \
+ name: "description_"barname; \
+ type: TEXT; \
+ mouse_events: 0; \
+ description { \
+ color_class: bordercolor; \
+ rel1 { relative: rel1x rel1y; }; \
+ rel2 { relative: rel2x rel2y; }; \
+ text { \
+ text: barname; \
+ font: "VeraBd"; \
+ size: 16; \
+ } \
+ } \
+} \
+part { \
+ name: "button_left_bg_"barname; \
+ type: RECT; \
+ description { \
+ state: "default" 0; \
+ color_class: "unvisible"; \
+ rel1 { relative: rel1x rel1y; offset: 0 0; }; \
+ rel2 { relative: rel2x/4 rel2y; offset: 0 0; }; \
+ } \
+ description { \
+ state: "default" 0.5; \
+ inherit: "default" 0; \
+ color_class: "unvisible"; \
+ rel1.offset: 0 -5; \
+ rel2.offset: 0 5; \
+ } \
+ description { \
+ state: "default" 1; \
+ inherit: "default" 0; \
+ } \
+} \
+part { \
+ name: "button_right_bg_"barname; \
+ type: RECT; \
+ description { \
+ state: "default" 0; \
+ color_class: "unvisible"; \
+ rel1 { relative: 1-rel2x/4 rel1y; offset: 0 0; }; \
+ rel2 { relative: rel2x rel2y; offset: 0 0; }; \
+ } \
+ description { \
+ state: "default" 0.5; \
+ inherit: "default" 0; \
+ color_class: "unvisible"; \
+ rel1.offset: 0 -5; \
+ rel2.offset: 0 5; \
+ } \
+ description { \
+ state: "default" 1; \
+ inherit: "default" 0; \
+ } \
+} \
+part { \
+ name: "button_left_"barname; \
+ type: TEXT; \
+ mouse_events: 0; \
+ description { \
+ state: "default" 0; \
+ color_class: bordercolor; \
+ rel1 { to: "button_left_bg_"barname; relative: 0 0; }; \
+ rel2 { to: "button_left_bg_"barname; relative: 1 1; }; \
+ text { \
+ text: "-"; \
+ font: "VeraBd"; \
+ size: 52; \
+ fit: 1 1; \
+ } \
+ } \
+} \
+part { \
+ name: "button_right_"barname; \
+ type: TEXT; \
+ mouse_events: 0; \
+ description { \
+ state: "default" 0; \
+ color_class: bordercolor; \
+ rel1 { to: "button_right_bg_"barname; relative: 0 0; }; \
+ rel2 { to: "button_right_bg_"barname; relative: 1 1; }; \
+ text { \
+ text: "+"; \
+ font: "VeraBd"; \
+ size: 52; \
+ fit: 1 1; \
+ } \
+ } \
+} \
+part { \
+ name: "scale_fg_"barname; \
+ type: RECT; \
+ mouse_events: 0; \
+ description { \
+ color_class: scale; \
+ rel1 { relative: rel2x/4 (rel1y+((rel2y-rel1y)/4)); }; \
+ rel2 { relative: 1-rel2x/4 (rel2y-((rel2y-rel1y)/4)); }; \
+ } \
+} \
+program { \
+ name: "button_left_bg_"barname"_animation"; \
+ signal: "mouse,down,*"; \
+ source: "button_left_bg_"barname; \
+ action: STATE_SET "default" 0.5; \
+ target: "button_left_bg_"barname; \
+} \
+program { \
+ name: "button_left_bg_"barname"_animation_end"; \
+ signal: "mouse,up,*"; \
+ source: "button_left_bg_"barname; \
+ action: STATE_SET "default" 1; \
+ target: "button_left_bg_"barname; \
+ transition: DECELERATE 0.1; \
+} \
+program { \
+ name: "button_right_bg_"barname"_animation"; \
+ signal: "mouse,down,*"; \
+ source: "button_right_bg_"barname; \
+ action: STATE_SET "default" 0.5; \
+ target: "button_right_bg_"barname; \
+} \
+program { \
+ name: "button_right_bg_"barname"_animation_end"; \
+ signal: "mouse,up,*"; \
+ source: "button_right_bg_"barname; \
+ action: STATE_SET "default" 1; \
+ target: "button_right_bg_"barname; \
+ transition: DECELERATE 0.1; \
+} \
+
+collections {
+ group {
+ name: "pyneo/audio/screen";
+ min: 100 100;
+ max: 800 800;
+ parts {
+ part {
+ name: "background";
+ type: IMAGE;
+ mouse_events: 0;
+ description {
+ state: "default" 0;
+ rel1 { relative: 0 0; offset: 0 0; };
+ rel2 { relative: 1 1; offset: 0 0; };
+ image { normal: "bg.png"; };
+ }
+ }
+ part {
+ name: "headline";
+ type: TEXT;
+ description {
+ state: "default" 0;
+ color_class: "button_inactive";
+ rel1 { relative: 1/20 1/20; }
+ rel2 { relative: 19/20 3/20; }
+ text {
+ text: "music";
+ size: 20;
+ font: "VeraBd";
+ fit: 1 1;
+ }
+ }
+ }
+ part {
+ name: "mp3_tags";
+ type: TEXTBLOCK;
+ mouse_events: 0;
+ description {
+ color_class: "button_inactive";
+ align: 0.5 0.5;
+ fixed: 1 1;
+ rel1 { relative: 0 4/20; }
+ rel2 { relative: 1 7/20; }
+ text {
+ text: "";
+ style: "textblock_style";
+ }
+ }
+ }
+ part {
+ name: "pad";
+ type: RECT;
+ description {
+ visible: 0;
+ rel1 { relative: 0.0 1.0; offset: 25 -125; }
+ rel2 { relative: 1.0 1.0; offset: -25 -25; }
+ }
+ }
+ key("track_left", 0, 2)
+ key("stop", 1, 2)
+ key_play_pause("play_pause", "play", "pause", 2, 2)
+ key("track_right", 3, 2)
+
+ HBAR("volume", button_inactive, 1, 0, 46/70, 1, 56/70, 10);
+
+ }
+ }
+}
diff --git a/epydial/dialer_screen.py b/epydial/dialer_screen.py
index 582cb23..1fbd063 100644
--- a/epydial/dialer_screen.py
+++ b/epydial/dialer_screen.py
@@ -152,6 +152,11 @@ class DialerScreen(EdjeGroup):
self.text = []
self.part_text_set("numberdisplay_text", "".join(self.text))
PyneoController.show_sms_screen()
+ elif source == "dial" and ''.join(self.text) == "9":
+ print '--- Audio Screen'
+ self.text = []
+ self.part_text_set("numberdisplay_text", "".join(self.text))
+ PyneoController.show_audio_screen()
elif source == "dial":
PyneoController.show_incall_screen('outgoing')
PyneoController.gsm_dial("".join(self.text))
diff --git a/epydial/epydial.py b/epydial/epydial.py
index 15e2872..3673998 100755
--- a/epydial/epydial.py
+++ b/epydial/epydial.py
@@ -21,6 +21,7 @@ PIX_FILE_PATH = "/media/card/hon/"
TRACK_FILE_PATH = "/media/card/track/"
DB_FILE_PATH = "data/db/my.sqlite"
PIX_WEATHER_FILE_PATH = "data/themes_data/blackwhite/images/stardock_weather/"
+MP3_FILE_PATH = "/media/card/mp3/"
DIALER_SCREEN_NAME = "pyneo/dialer/main"
INCALL_SCREEN_NAME = "pyneo/dialer/incall"
@@ -33,6 +34,7 @@ CONTACTS_SCREEN_NAME = "pyneo/contacts/screen"
SMS_SCREEN_NAME = "pyneo/sms/screen"
SMS_DETAIL_SCREEN_NAME = "pyneo/sms/detail"
WEATHER_SCREEN_NAME = "pyneo/weather/screen"
+AUDIO_SCREEN_NAME = "pyneo/audio/screen"
from datetime import datetime
from dbus import SystemBus
@@ -88,6 +90,8 @@ class PyneoController(object):
pwr = None
gps = None
hon = None
+ mp3 = None
+ mp3_music = None
gsm_wireless = None
gsm_keyring = None
gsm_sms = None
@@ -132,6 +136,7 @@ class PyneoController(object):
class_.gps = object_by_url('dbus:///org/pyneo/GpsLocation')
class_.hon = object_by_url('dbus:///org/pyneo/HotOrNot')
class_.hon_hotornot = object_by_url(class_.hon.GetDevice('hotornot', dbus_interface=DIN_POWERED))
+ class_.mp3 = object_by_url('dbus:///org/pyneo/Player')
class_.call_type = 'nix'
class_.brightness_value = 60
class_.call = None
@@ -360,8 +365,8 @@ class PyneoController(object):
@classmethod
def show_dialer_screen(class_):
-# class_.pwr.SetBrightness(class_.brightness_value, dbus_interface=DIN_POWER)
-# class_.pwr.GetStatus(dbus_interface=DIN_POWERED)
+ class_.pwr.SetBrightness(class_.brightness_value, dbus_interface=DIN_POWER)
+ class_.pwr.GetStatus(dbus_interface=DIN_POWERED)
class_.notify_callbacks("show_dialer_screen")
@classmethod
@@ -415,24 +420,18 @@ class PyneoController(object):
def CallStatus(newmap):
newmap = dedbusmap(newmap)
print '---', 'CallStatus'
-# for n, v in newmap.items():
-# print '\t', n, ':', v
def CallRing(newmap):
newmap = dedbusmap(newmap)
class_.notify_callbacks("gsm_phone_ringing")
if newmap['number']: class_.notify_callbacks("gsm_number_display", newmap['number'])
print '---', 'CallRing'
-# for n, v in newmap.items():
-# print '\t', n, ':', v
def CallEnd(newmap):
class_.notify_callbacks("gsm_phone_call_end")
os.system('alsactl -f /usr/share/openmoko/scenarios/stereoout.state restore')
newmap = dedbusmap(newmap)
print '---', 'CallEnd'
-# for n, v in newmap.items():
-# print '\t', n, ':', v
if class_.call:
class_.call = None
while class_.callsigs:
@@ -463,7 +462,7 @@ class PyneoController(object):
content = dedbusmap(sm.GetContent())
InsertSms('REC UNREAD', content['from_msisdn'], content['time'], content['text'].encode('utf-8'))
print '--- NEW SMS:', content['from_msisdn'], content['time'], content['text'].encode('utf-8')
- class_.gsm_sms.DeleteAll(dbus_interface=DIN_STORAGE)
+# class_.gsm_sms.DeleteAll(dbus_interface=DIN_STORAGE)
@classmethod
def first_check_new_sms(class_):
@@ -482,7 +481,7 @@ class PyneoController(object):
InsertSms('REC UNREAD', content['from_msisdn'], content['time'], content['text'].encode('utf-8'))
except:
print '--- NULL new sms'
- class_.gsm_sms.DeleteAll(dbus_interface=DIN_STORAGE)
+# class_.gsm_sms.DeleteAll(dbus_interface=DIN_STORAGE)
@classmethod
def show_sms_screen(class_):
@@ -504,6 +503,37 @@ class PyneoController(object):
def vibrate_stop(class_):
class_.pwr.Vibrate(0, 0, 0, dbus_interface=DIN_POWER)
+ @classmethod
+ def show_audio_screen(class_):
+ class_.notify_callbacks("show_audio_screen")
+
+ @classmethod
+ def play_music(class_):
+ class_.mp3.Play(dbus_interface='org.pyneo.Music')
+
+ @classmethod
+ def stop_music(class_):
+ class_.mp3.Stop(dbus_interface='org.pyneo.Music')
+
+ @classmethod
+ def pause_music(class_):
+ class_.mp3.Pause(dbus_interface='org.pyneo.Music')
+
+ @classmethod
+ def next_music(class_):
+ class_.mp3.Next(dbus_interface='org.pyneo.Music')
+
+ @classmethod
+ def previous_music(class_):
+ class_.mp3.Previous(dbus_interface='org.pyneo.Music')
+
+ @classmethod
+ def set_playlist_from_dir(class_):
+ class_.mp3.SetPlaylistFromDir(MP3_FILE_PATH, dbus_interface='org.pyneo.Music')
+
+ @classmethod
+ def get_mp3_tags(class_):
+ class_.notify_callbacks("on_get_mp3_tags", class_.mp3.GetStatus(dbus_interface='org.pyneo.Music'))
from dialer_screen import *
from incall_screen import *
@@ -516,6 +546,7 @@ from contacts_screen import *
from sms_screen import *
from sms_detail import *
from weather_screen import *
+from audio_screen import *
class Dialer(object):
screens = None
@@ -543,6 +574,7 @@ class Dialer(object):
PyneoController.register_callback("show_sms_screen", self.on_sms_screen)
PyneoController.register_callback("show_sms_screen_detail", self.on_sms_screen_detail)
PyneoController.register_callback("show_weather_screen", self.on_weather_screen)
+ PyneoController.register_callback("show_audio_screen", self.on_audio_screen)
# Initialize the D-Bus interface to pyneo
dbus_ml = e_dbus.DBusEcoreMainLoop()
@@ -555,6 +587,7 @@ class Dialer(object):
self.init_screen(GSM_STATUS_SCREEN_NAME, GsmStatusScreen(self))
self.init_screen(GPS_STATUS_SCREEN_NAME, GpsStatusScreen(self))
+ PyneoController.set_playlist_from_dir()
PyneoController.power_up_gsm()
PyneoController.get_gsm_keyring()
@@ -621,6 +654,9 @@ class Dialer(object):
self.init_screen(WEATHER_SCREEN_NAME, WeatherScreen(self))
self.show_screen(WEATHER_SCREEN_NAME)
+ def on_audio_screen(self):
+ self.init_screen(AUDIO_SCREEN_NAME, AudioScreen(self))
+ self.show_screen(AUDIO_SCREEN_NAME)
class EvasCanvas(object):
def __init__(self, fullscreen, engine_name):
diff --git a/epydial/weather_screen.py b/epydial/weather_screen.py
index 1cf3a09..f713a1a 100644
--- a/epydial/weather_screen.py
+++ b/epydial/weather_screen.py
@@ -5,7 +5,7 @@ __version__ = "prototype"
__copyright__ = "Copyright (c) 2008"
__license__ = "GPL3"
-ZIP_CODE = 'GMXX0007' #GMXX0007 Berlin, GMXX0049 Hamburg
+ZIP_CODE = 'GMXX0049' #GMXX0007 Berlin, GMXX0049 Hamburg
TEMP_UNIT = 'c'
WEATHER_URL = 'http://xml.weather.yahoo.com/forecastrss?p=%s&u=%s'