From 094e43b7e46bb3f677dbd7e2afa7310d18227af9 Mon Sep 17 00:00:00 2001 From: Jack Zielke Date: Tue, 26 May 2009 05:20:17 +0000 Subject: version 12 - cqsrvr, show new bulletins, better URIs, clear button --- diff --git a/NEWS b/NEWS index 4e6bb41..ac2347e 100644 --- a/NEWS +++ b/NEWS @@ -10,3 +10,4 @@ October 18 2008 - version 8 - no journal, 8.2.0 update November 9 2008 - version 9 - journal works, message text in bold, scroll bugfix November 22 2008 - version 10 - changed journal, old messages are bolded on load December 29 2008 - version 11 - auto generate passwords, better bolding (NWS messages) +May 18 2009 - version 12 - cqsrvr, show new bulletins, better URIs, clear button diff --git a/TODO b/TODO index 24da9ec..b773095 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,8 @@ multi language cancel individual messages +retry messages + beep on message receive cleanup timers on disconnect diff --git a/activity/activity.info b/activity/activity.info index 2f265b0..d685ca9 100644 --- a/activity/activity.info +++ b/activity/activity.info @@ -1,6 +1,6 @@ [Activity] name = APRS-XO -activity_version = 11 +activity_version = 12 service_name = org.laptop.APRSXO icon = activity-aprs-xo exec = sugar-activity aprs.APRSActivity diff --git a/aprs.py b/aprs.py index 72e1a99..f5bb649 100755 --- a/aprs.py +++ b/aprs.py @@ -55,7 +55,6 @@ class APRSActivity(activity.Activity): self.sock = None self.location = "home" - self.site = None self.sent_acks = {} self.recv_acks = {} self.timers = [] @@ -70,6 +69,7 @@ class APRSActivity(activity.Activity): self.message_marks = {} self.input_watch = [] self.output_watch = [] + self.cq_watch = [] self.current_message = {} titlefont = pango.FontDescription('Sans bold 8') @@ -84,12 +84,10 @@ class APRSActivity(activity.Activity): activity_toolbar = toolbox.get_activity_toolbar() activity_toolbar.share.props.visible = False -# activity_toolbar.keep.props.visible = False toolbox.show() win = gtk.HBox(False, 10) -# self.set_canvas(win) leftwin = gtk.VBox(False, 10) @@ -128,19 +126,19 @@ class APRSActivity(activity.Activity): findubutton = gtk.Button() findubutton.set_label("FINDU.COM") - findubutton.connect("clicked", self.set_site, "http://www.findu.com/cgi-bin/symbol.cgi?icon=XA&limit=200") + findubutton.connect("clicked", self.open_url_button, "http://www.findu.com/cgi-bin/symbol.cgi?icon=XA&limit=200") sitebox.pack_start(findubutton, False, False, 0) findubutton.show() aprsworldbutton = gtk.Button() aprsworldbutton.set_label("APRSworld") - aprsworldbutton.connect("clicked", self.set_site, "http://aprsworld.net/") + aprsworldbutton.connect("clicked", self.open_url_button, "http://aprsworld.net/") sitebox.pack_start(aprsworldbutton, False, False, 0) aprsworldbutton.show() otherbutton = gtk.Button() otherbutton.set_label("About") - otherbutton.connect("clicked", self.set_site, "http://aprs.org/") + otherbutton.connect("clicked", self.open_url_button, "http://aprs.org/") sitebox.pack_start(otherbutton, False, False, 0) otherbutton.show() @@ -430,15 +428,23 @@ class APRSActivity(activity.Activity): rightwintopbox = gtk.HBox(False, 4) clearbutton = gtk.Button() - clearbutton.set_label(" Cancel Messages ") - clearbutton.connect("clicked", self.clear_msg_queue) - rightwintopbox.pack_start(clearbutton, False, False, 18) +# clearbutton.set_label(" Cancel Messages ") +# clearbutton.connect("clicked", self.clear_msg_queue) + clearbutton.set_label(" Clear/Cancel ") + clearbutton.connect("clicked", self.clear_message_button) + rightwintopbox.pack_start(clearbutton, False, False, 5) clearbutton.show() + self.cqbutton = gtk.CheckButton("CQ") + self.cqbutton.set_active(False) + self.cqbutton.connect("toggled", self.enable_cq, "cq") + rightwintopbox.pack_start(self.cqbutton, False, False, 5) + self.cqbutton.show() + self.beaconbutton = gtk.CheckButton("Beacon every 10 minutes") self.beaconbutton.set_active(True) self.beaconbutton.connect("toggled", self.enable_beacon, "beacon") - rightwintopbox.pack_start(self.beaconbutton, False, False, 18) + rightwintopbox.pack_start(self.beaconbutton, False, False, 5) self.beaconbutton.show() rightwin.pack_start(rightwintopbox, False, False, 0) @@ -450,14 +456,13 @@ class APRSActivity(activity.Activity): self.messageview.set_justification(gtk.JUSTIFY_LEFT) self.messageview.modify_font(smallfont) - self.messagebuffer.set_text("Welcome to APRS-XO.\n\nThis program sends your position information to a server that\nwill display your location on a webpage. This program requires an active Internet connection to work.\n\nSelect an APRS Site\nSelecting a button will copy the URI to the clipboard.\n\nIndentifiers\nEnter your callsign. If you leave the password blank it will be\nautomatically generated.\n\nStation Comment\nData in the Station Comment field will appear after your\nlocation information on the website.") + self.messagebuffer.set_text("Welcome to APRS-XO.\n\nThis program sends your position information to a server that\nwill display your location on a webpage. This program requires an active Internet connection to work.\n\nSelect an APRS Site\nSelecting a button will copy the URI to the journal.\n\nIndentifiers\nEnter your callsign. If you leave the password blank it will be\nautomatically generated.\n\nStation Comment\nData in the Station Comment field will appear after your\nlocation information on the website.") # tags for easier reading of messages self.messagebold = self.messagebuffer.create_tag("bold", weight=pango.WEIGHT_BOLD) self.messagewindow = gtk.ScrolledWindow() self.messagewindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS) -# self.messagewindow.add_with_viewport(self.messageview) self.messagewindow.add(self.messageview) self.messageview.show() rightwin.pack_start(self.messagewindow, True, True, 0) @@ -470,6 +475,7 @@ class APRSActivity(activity.Activity): self.messagecombo.append_text("BEACON") self.messagecombo.append_text("CQ") self.messagecombo.append_text("QST") + self.messagecombo.append_text("CQSRVR") self.messagecombo.set_active(-1) self.messagedest = self.messagecombo.get_child() self.messagedest.set_max_length(9) @@ -505,7 +511,6 @@ class APRSActivity(activity.Activity): self.statuswindow = gtk.ScrolledWindow() self.statuswindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS) -# self.statuswindow.add_with_viewport(self.statusview) self.statuswindow.add(self.statusview) self.statusview.show() rightwin.pack_start(self.statuswindow, True, True, 0) @@ -548,6 +553,16 @@ class APRSActivity(activity.Activity): def clear_message(self, button=None): self.messagebuffer.set_text("") + def clear_message_button(self, button=None): + # cancel all outgoing messages, for now + self.clear_msg_queue() + # clear bulletin list + self.seen_bulletins = {} + # clear message screen + self.clear_message() + # TODO re-add outgoing messages (reset text iters) + # TODO re-add queued messages + def connect_aprs(self, button): if (self.sock == None): @@ -623,11 +638,20 @@ class APRSActivity(activity.Activity): self.send_beacon() self.output_watch.append(gobject.timeout_add(10 * 60 * 1000, self.send_beacon)) + + # Start CQ if checked + if (self.cqbutton.get_active()): + self.send_cq() + self.cq_watch.append(gobject.timeout_add(32 * 60 * 1000, self.send_cq)) + else: self.disconnect_aprs(button) def disconnect(self): if (self.sock != None): + # stop cq + self.stop_cq() + # for test server only if(HOST == "192.168.50.6"): self.sock.sendall("q") @@ -763,10 +787,6 @@ class APRSActivity(activity.Activity): self.messagebuffer.move_mark_by_name("end", self.messagebuffer.get_end_iter()) self.messageview.scroll_mark_onscreen(self.messagebuffer.get_mark("end")) - def set_site(self, widget, data=None): - self.site = data - self.clipboard() - def validate_data(self): stop_here = False self.validating = True @@ -916,8 +936,6 @@ class APRSActivity(activity.Activity): def write_file(self, file_path): try: -# self.metadata['mime_type'] = 'text/plain' - JournalData = {} JournalData['callsign'] = self.calltext.get_text() JournalData['password'] = self.passtext.get_text() @@ -938,6 +956,10 @@ class APRSActivity(activity.Activity): JournalData['hidepass'] = 'True' else: JournalData['hidepass'] = 'False' + if (self.cqbutton.get_active()): + JournalData['cq'] = 'True' + else: + JournalData['cq'] = 'False' callsignlist = [] model = self.messagecombo.get_model() @@ -980,6 +1002,7 @@ class APRSActivity(activity.Activity): stationtext = "" beacon = "True" hidepass = "True" + cq = "False" try: f = open(file_path, 'r') JournalData = json.read(f.read()) @@ -1013,6 +1036,8 @@ class APRSActivity(activity.Activity): beacon = JournalData['beacon'] if JournalData.has_key('hidepass'): hidepass = JournalData['hidepass'] + if JournalData.has_key('cq'): + cq = JournalData['cq'] except: pass finally: @@ -1055,6 +1080,10 @@ class APRSActivity(activity.Activity): self.passbutton.set_active(True) else: self.passbutton.set_active(False) + if (cq == "True"): + self.cqbutton.set_active(True) + else: + self.cqbutton.set_active(False) def msg_check(self, data): mycall = self.calltext.get_text().upper() @@ -1072,8 +1101,9 @@ class APRSActivity(activity.Activity): message = data[firstcheck+12:] self.add_callsign(fromcall, False) bln_id = "%s-%s" % (fromcall, strippedtocall) - if (not bln_id in self.seen_bulletins): - self.seen_bulletins[bln_id] = 1 + # show bulletin if have never seen it or has been at least 1 day since last viewing + if (not bln_id in self.seen_bulletins or time.time() - self.seen_bulletins[bln_id] > 86400): + self.seen_bulletins[bln_id] = time.time() self.message_write("%s %s:%s> %s\n" % (time.strftime("%m/%d %H:%M", time.localtime()), fromcall, strippedtocall, message), True) else: if (strippedtocall == mycall): @@ -1179,11 +1209,12 @@ class APRSActivity(activity.Activity): self.rawtext.set_text("") return True - def send_message(self, widget, data=None): + def send_message(self, widget, data=None, tocall=None, message=None): sendnow = False - tocall = self.messagedest.get_text().upper() - message = self.messagetext.get_text() + if (tocall == None and message == None): + tocall = self.messagedest.get_text().upper() + message = self.messagetext.get_text() if (message == ""): return False @@ -1285,17 +1316,6 @@ class APRSActivity(activity.Activity): # and stop this timer return False - def clipboard(self): - clipboard = gtk.clipboard_get() - target = [("text/uri-list", 0, 0)] - clipboard.set_with_data(target, self.clipboard_get, self.clipboard_clear, (self.site)) - - def clipboard_get(self, clipboard, selection, info, data): - selection.set_uris([data]) - - def clipboard_clear(self, clipboard, data): - pass - def add_callsign(self, callsign, activate): model = self.messagecombo.get_model() notfound = True @@ -1312,6 +1332,9 @@ class APRSActivity(activity.Activity): self.messagecombo.set_active(0) def bulletin_check(self, callsign): + # hard code CQSRVR + if (callsign == "CQSRVR"): + return False for currentcall in self.bulletins: length = len(currentcall) if (currentcall == callsign[:length]): @@ -1501,3 +1524,63 @@ class APRSActivity(activity.Activity): self.passtext.set_visibility(False) else: self.passtext.set_visibility(True) + + def open_url_button(self, widget, data): + self._show_via_journal(data) + + # (mostly) from Chat.Activity + def _show_via_journal(self, url): + """Ask the journal to display a URL""" + import os + import time + from sugar import profile + from sugar.activity.activity import show_object_in_journal + from sugar.datastore import datastore + jobject = datastore.create() + metadata = { + 'title': url, + 'title_set_by_user': '1', + 'icon-color': profile.get_color().to_string(), + 'activity': 'org.laptop.WebActivity', + 'mime_type': 'text/plain', + } + for k,v in metadata.items(): + jobject.metadata[k] = v + file_path = os.path.join(self.get_activity_root(), 'instance', + '%i_' % time.time()) + open(file_path, 'w').write('{"deleted":[],"shared_links":[],"history":[{"url":"' + url + '","title":"' + url + '"}]}') + os.chmod(file_path, 0755) + jobject.set_file_path(file_path) + datastore.write(jobject) + show_object_in_journal(jobject.object_id) + jobject.destroy() + os.unlink(file_path) + + def stop_cq(self): + for source in self.cq_watch: + try: + gobject.source_remove(source) + except: + pass + self.cq_watch = [] + if (self.cqbutton.get_active()): + # send_message fails because disconnect happens too fast. +# self.send_message(None, None, "CQSRVR", "U CQ") + message = ":CQSRVR :U CQ{%s" % self.b90() + self.send_data(message) + + def enable_cq(self, widget, data=None): + if (self.sock != None): + if (self.cqbutton.get_active()): + self.send_cq() + self.cq_watch.append(gobject.timeout_add(32 * 60 * 1000, self.send_cq)) + else: + self.stop_cq() + self.send_message(None, None, "CQSRVR", "U CQ") + + def send_cq(self): + if (self.sock == None): + return False + if (self.cqbutton.get_active()): + self.send_message(None, None, "CQSRVR", "CQ CQ CQ From %s" % self.stationtext.get_text()) + -- cgit v0.9.1