X-Git-Url: http://git.maemo.org/git/?p=pedometerwidget;a=blobdiff_plain;f=src%2Fusr%2Flib%2Fhildon-desktop%2Fpedometer_widget_home.py;h=5e1b7359ff5cb1123ca005d990c896e726aecc93;hp=e3f3235a4d6354097851eaf16282dd8aebaf4ce7;hb=749abb06cea098136e96e42c5e335242fe00b31d;hpb=424185459d2e7cda02502dbeeddba88e45aefb31 diff --git a/src/usr/lib/hildon-desktop/pedometer_widget_home.py b/src/usr/lib/hildon-desktop/pedometer_widget_home.py index e3f3235..5e1b735 100644 --- a/src/usr/lib/hildon-desktop/pedometer_widget_home.py +++ b/src/usr/lib/hildon-desktop/pedometer_widget_home.py @@ -35,8 +35,15 @@ UNIT = PATH + "/unit" ASPECT = PATH + "/aspect" SECONDVIEW = PATH + "/secondview" GRAPHVIEW = PATH + "/graphview" +NOIDLETIME = PATH + "/noidletime" LOGGING = PATH + "/logging" +ALARM_PATH = PATH + "/alarm" +ALARM_ENABLE = ALARM_PATH + "/enable" +ALARM_FNAME = ALARM_PATH + "/fname" +ALARM_TYPE = ALARM_PATH + "/type" +ALARM_INTERVAL = ALARM_PATH + "/interval" + ICONSPATH = "/opt/pedometerhomewidget/" unit = 0 @@ -146,6 +153,12 @@ class PedoValues(): self.dist + other.dist, self.calories + other.calories) + def __sub__(self, other): + return PedoValues(self.time - other.time, + self.steps - other.steps, + self.dist - other.dist, + self.calories - other.calories) + def get_print_time(self): tdelta = self.time hours = int(tdelta / 3600) @@ -340,7 +353,6 @@ class PedoRepositoryXML(PedoRepository): except Exception, e: logger.error("Error while saving data to xml file: %s" % e) - class PedoRepositoryPickle(PedoRepository): DIR = os.path.join(os.path.expanduser("~"), ".pedometer") FILE = os.path.join(DIR, "pickle.log") @@ -366,6 +378,61 @@ class PedoRepositoryPickle(PedoRepository): except Exception, e: logger.error("Error while saving data to pickle: %s" % e) +class AlarmController(Singleton): + enable = False + fname = "/home/user/MyDocs/.sounds/Ringtones/Bicycle.aac" + interval = 5 + type = 0 + + def __init__(self): + self.client = gconf.client_get_default() + try: + self.enable = self.client.get_bool(ALARM_ENABLE) + self.fname = self.client.get_string(ALARM_FNAME) + self.interval = self.client.get_int(ALARM_INTERVAL) + self.type = self.client.get_int(ALARM_TYPE) + except: + self.client.set_bool(ALARM_ENABLE, self.enable) + self.client.set_string(ALARM_FNAME, self.fname) + self.client.set_int(ALARM_INTERVAL, self.interval) + self.client.set_int(ALARM_TYPE, self.type) + + def update(self): + pass + + def play(self): + pass + + def set_enable(self, value): + self.enable = value + self.client.set_bool(ALARM_ENABLE, value) + + def get_enable(self): + return self.enable + + def set_alarm_file(self, fname): + self.fname = fname + self.client.set_string(ALARM_FNAME, fname) + + def get_alarm_file(self): + if self.fname == None: + return "" + return self.fname + + def set_interval(self, interval): + self.interval = interval + self.client.set_int(ALARM_INTERVAL, interval) + + def get_interval(self): + return self.interval + + def set_type(self, type): + self.type = type + self.client.set_int(ALARM_TYPE, type) + + def get_type(self): + return self.type + class PedoController(Singleton): mode = 0 unit = 0 @@ -373,14 +440,16 @@ class PedoController(Singleton): #what to display in second view - 0 - alltime, 1 - today, 2 - week second_view = 0 callback_update_ui = None + no_idle_time = False STEP_LENGTH = 0.7 #values for the two views in the widget ( current and day/week/alltime) v = [PedoValues(), PedoValues()] - startTime = 0 + last_time = 0 is_running = False - graph_controller = None + + observers = [] def __init__(self): self.pedometer = PedoCounter(self.steps_detected) @@ -389,7 +458,6 @@ class PedoController(Singleton): self.repository = PedoRepositoryXML() self.repository.load() - self.graph_controller = GraphController() self.load_values() def load_values(self): @@ -407,10 +475,10 @@ class PedoController(Singleton): def start_pedometer(self): self.v[0] = PedoValues() - self.startTime = time.time() + self.last_time = time.time() self.is_running = True self.pedometer.start() - self.notify_UI(True) + self.notify(True) def stop_pedometer(self): self.is_running = False @@ -433,20 +501,24 @@ class PedoController(Singleton): self.v[0].calories = self.get_calories(self.v[0].steps) def steps_detected(self, cnt, last_steps=False): - self.v[0].steps += cnt - self.v[0].dist += self.get_distance(cnt) - self.v[0].calories += self.get_distance(cnt) - self.v[0].time = time.time() - self.startTime - if last_steps: - self.save_values() - self.notify_UI() + if not last_steps and cnt == 0 and self.no_idle_time: + logger.info("No steps detected, timer is paused") else: - self.notify_UI(True) + self.v[0].steps += cnt + self.v[0].dist += self.get_distance(cnt) + self.v[0].calories += self.get_distance(cnt) + self.v[0].time += time.time() - self.last_time + if last_steps: + self.save_values() + self.notify() + else: + self.notify(True) + self.last_time = time.time() def set_mode(self, mode): self.mode = mode self.set_height(self.height_interval) - self.notify_UI() + self.notify() def set_unit(self, new_unit): self.unit = new_unit @@ -455,7 +527,7 @@ class PedoController(Singleton): def set_second_view(self, second_view): self.second_view = second_view self.load_values() - self.notify_UI() + self.notify() def set_callback_ui(self, func): self.callback_update_ui = func @@ -476,7 +548,10 @@ class PedoController(Singleton): #increase step length if RUNNING if self.mode == 1: self.STEP_LENGTH *= 1.45 - self.notify_UI() + self.notify() + + def set_no_idle_time(self, value): + self.no_idle_time = value def get_distance(self, steps=None): if steps == None: @@ -486,10 +561,22 @@ class PedoController(Singleton): def get_calories(self, steps): return steps - def notify_UI(self, optional=False): + def add_observer(self, func): + try: + self.observers.index(func) + except: + self.observers.append(func) + + def remove_observer(self, func): + self.observers.remove(func) + + def notify(self, optional=False): if self.callback_update_ui is not None: self.callback_update_ui() - self.graph_controller.update_ui(optional) + + for func in self.observers: + func(optional) + class PedoCounter(Singleton): COORD_FNAME = "/sys/class/i2c-adapter/i2c-3/3-001d/coord" @@ -652,6 +739,7 @@ class GraphController(Singleton): def __init__(self): self.repository = PedoRepositoryXML() self.last_update = 0 + PedoController().add_observer(self.update_ui) def set_graph(self, widget): self.widget = widget @@ -882,13 +970,14 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem): pedometer = None pedometerInterval = None graph_controller = None - startTime = None mode = 0 height = 0 unit = 0 aspect = 0 second_view = 0 + graph_view = 0 + no_idle_time = False logging = False def __init__(self): @@ -905,6 +994,7 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem): self.aspect = self.client.get_int(ASPECT) self.second_view = self.client.get_int(SECONDVIEW) self.graph_view = self.client.get_int(GRAPHVIEW) + self.no_idle_time = self.client.get_bool(NOIDLETIME) self.logging = self.client.get_bool(LOGGING) except: @@ -914,6 +1004,7 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem): self.client.set_int(ASPECT, 0) self.client.set_int(SECONDVIEW, 0) self.client.set_int(GRAPHVIEW, 0) + self.client.set_bool(NOIDLETIME, False) self.client.set_bool(LOGGING, False) self.controller = PedoController() @@ -922,10 +1013,13 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem): self.controller.set_unit(self.unit) self.controller.set_second_view(self.second_view) self.controller.set_callback_ui(self.update_values) + self.controller.set_no_idle_time(self.no_idle_time) self.graph_controller = GraphController() self.graph_controller.set_current_view(self.graph_view) + self.alarm_controller = AlarmController() + self.button = CustomButton(ICONSPATH + "play.png") self.button.connect("clicked", self.button_clicked) @@ -975,7 +1069,6 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem): eventBox.connect("button-press-event", self.eventBox_clicked) eventBox.connect("button-release-event", self.eventBox_clicked_release) - mainHBox.add(buttonVBox) mainHBox.add(descVBox) mainHBox.add(currentVBox) @@ -1060,6 +1153,98 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem): def update_total(self): self.update_ui_values(self.labelsT, self.controller.get_second()) + def show_alarm_settings(self, main_button): + def choose_file(widget): + file = hildon.FileChooserDialog(self, gtk.FILE_CHOOSER_ACTION_OPEN, hildon.FileSystemModel() ) + file.show() + if ( file.run() == gtk.RESPONSE_OK): + fname = file.get_filename() + widget.set_value(fname) + self.alarm_controller.set_alarm_file(fname) + file.destroy() + + def test_sound(button): + try: + self.alarm_controller.play() + except Exception, e: + logger.error("Could not play alarm sound: %s" % e) + hildon.hildon_banner_show_information(self, "None", "Could not play alarm sound") + + def enableButton_changed(button): + value = button.get_active() + self.alarm_controller.set_enable(value) + if value: + main_button.set_value("Enabled") + else: + main_button.set_value("Disabled") + + def selectorType_changed(selector, data, labelEntry2): + self.alarm_controller.set_type(selector.get_active(0)) + labelEntry2.set_label(suffix[self.alarm_controller.get_type()]) + + dialog = gtk.Dialog() + dialog.set_title("Alarm settings") + dialog.add_button("OK", gtk.RESPONSE_OK) + + enableButton = hildon.CheckButton(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT) + enableButton.set_label("Enable alarm") + enableButton.set_active(self.alarm_controller.get_enable()) + enableButton.connect("toggled", enableButton_changed) + + testButton = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL) + testButton.set_alignment(0, 0.8, 1, 1) + testButton.set_title("Test sound") + testButton.connect("pressed", test_sound) + + fileButton = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL) + fileButton.set_alignment(0, 0.8, 1, 1) + fileButton.set_title("Alarm sound") + fileButton.set_value(self.alarm_controller.get_alarm_file()) + fileButton.connect("pressed", choose_file) + + labelEntry = gtk.Label("Notify every:") + suffix = ["mins", "steps", "m/ft", "calories"] + labelEntry2 = gtk.Label(suffix[self.alarm_controller.get_type()]) + intervalEntry = hildon.Entry(gtk.HILDON_SIZE_AUTO_WIDTH) + intervalEntry.set_text(str(self.alarm_controller.get_interval())) + + selectorType = hildon.TouchSelector(text=True) + selectorType.set_column_selection_mode(hildon.TOUCH_SELECTOR_SELECTION_MODE_SINGLE) + selectorType.append_text("Time") + selectorType.append_text("Steps") + selectorType.append_text("Distance") + selectorType.append_text("Calories") + selectorType.connect("changed", selectorType_changed, labelEntry2) + + typePicker = hildon.PickerButton(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL) + typePicker.set_alignment(0.0, 0.5, 1.0, 1.0) + typePicker.set_title("Alarm type") + typePicker.set_selector(selectorType) + typePicker.set_active(self.alarm_controller.get_type()) + + hbox = gtk.HBox() + hbox.add(labelEntry) + hbox.add(intervalEntry) + hbox.add(labelEntry2) + + dialog.vbox.add(enableButton) + dialog.vbox.add(fileButton) + dialog.vbox.add(typePicker) + dialog.vbox.add(hbox) + dialog.show_all() + while 1: + response = dialog.run() + if response != gtk.RESPONSE_OK: + break + try: + value = int(intervalEntry.get_text()) + self.alarm_controller.set_interval(value) + break + except: + hildon.hildon_banner_show_information(self, "None", "Invalid interval") + + dialog.destroy() + def show_settings(self, widget): def reset_total_counter(arg): widget.totalCounter = 0 @@ -1067,6 +1252,9 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem): widget.update_total() hildon.hildon_banner_show_information(self, "None", "Total counter was resetted") + def alarmButton_pressed(widget): + self.show_alarm_settings(widget) + def selector_changed(selector, data): widget.mode = selector.get_active(0) widget.client.set_int(MODE, widget.mode) @@ -1077,7 +1265,6 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem): widget.client.set_int(HEIGHT, widget.height) widget.controller.set_height(widget.height) - def selectorUnit_changed(selector, data): widget.unit = selectorUnit.get_active(0) widget.client.set_int(UNIT, widget.unit) @@ -1092,22 +1279,37 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem): widget.logging = checkButton.get_active() widget.client.set_bool(LOGGING, widget.logging) + def idleButton_changed(idleButton): + widget.no_idle_time = idleButton.get_active() + widget.client.set_bool(NOIDLETIME, widget.no_idle_time) + widget.controller.set_no_idle_time(widget.no_idle_time) + dialog = gtk.Dialog() dialog.set_title("Settings") - dialog.add_button("OK", gtk.RESPONSE_OK) + + button = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL) button.set_title("Reset total counter") button.set_alignment(0, 0.8, 1, 1) button.connect("clicked", reset_total_counter) + alarmButton = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL) + alarmButton.set_title("Alarm") + if self.alarm_controller.get_enable(): + alarmButton.set_value("Enabled") + else: + alarmButton.set_value("Disabled") + alarmButton.set_alignment(0, 0.8, 1, 1) + alarmButton.connect("clicked", alarmButton_pressed) + selector = hildon.TouchSelector(text=True) selector.set_column_selection_mode(hildon.TOUCH_SELECTOR_SELECTION_MODE_SINGLE) selector.append_text("Walk") selector.append_text("Run") selector.connect("changed", selector_changed) - modePicker = hildon.ButtonPickerButton(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL) + modePicker = hildon.PickerButton(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL) modePicker.set_alignment(0.0, 0.5, 1.0, 1.0) modePicker.set_title("Select mode") modePicker.set_selector(selector) @@ -1159,13 +1361,20 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem): logButton.set_active(widget.logging) logButton.connect("toggled", logButton_changed) + idleButton = hildon.CheckButton(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT) + idleButton.set_label("Pause time when not walking") + idleButton.set_active(widget.no_idle_time) + idleButton.connect("toggled", idleButton_changed) + pan_area = hildon.PannableArea() vbox = gtk.VBox() vbox.add(button) + vbox.add(alarmButton) vbox.add(modePicker) vbox.add(heightPicker) vbox.add(unitPicker) vbox.add(UIPicker) + vbox.add(idleButton) #vbox.add(logButton) pan_area.add_with_viewport(vbox)