Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Zielke <kg4gjy@takeovertheworld.org>2009-05-26 05:20:17 (GMT)
committer Jack Zielke <kg4gjy@takeovertheworld.org>2009-05-26 05:20:17 (GMT)
commit094e43b7e46bb3f677dbd7e2afa7310d18227af9 (patch)
tree43ca378b0213a582eca6b81b378f9814eb7fd07f
parentaf07e062dae12e1829def7aff83e6adb6f30069e (diff)
version 12 - cqsrvr, show new bulletins, better URIs, clear button
-rw-r--r--NEWS1
-rw-r--r--TODO2
-rw-r--r--activity/activity.info2
-rwxr-xr-xaprs.py153
4 files changed, 122 insertions, 36 deletions
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 <timeout> 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())
+