Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/aprs.py
diff options
context:
space:
mode:
Diffstat (limited to 'aprs.py')
-rwxr-xr-xaprs.py153
1 files changed, 118 insertions, 35 deletions
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())
+