MiniLog.pyw

  1. from Tkinter import *
  2. import tkMessageBox
  3. import re
  4. import time
  5. import socket
  6. import webbrowser
  7.  
  8.  
  9. class TCPclient:
  10.     def __init__(self, host, port):
  11.         try:
  12.             self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  13.             self.connect(host, port)
  14.         except socket.error, msg:
  15.             print "error %s" % msg
  16.  
  17.     def connect(self,host,port):
  18.         try:
  19.             self.sock.connect((host, port))
  20.         except:
  21.             raise
  22.  
  23.     def send(self, command, data):
  24.         try:
  25.             self.sock.sendall('<command:%d>%s<parameters:%d>%s'
  26.                            % (len(command), command, len(data), data) )
  27.         except socket.error, msg:
  28.             return msg
  29.         return 1
  30.        
  31.                
  32.     def close(self):
  33.         self.sock.close()
  34.  
  35.  
  36. class Adif(object):    
  37.     data = {}
  38.     INI = (
  39.             ('call', r"((?:[A-Z]{1,2}|\d[A-Z]{1,2})\d+[A-Z]+(?:/[QP\d])?)", "$1"),
  40.             ('band', r"(\d+[m|cm])", "$1"),
  41.             ('qso_date', r"(\d{4})-(\d{2})-(\d{2})", "$1$2$3"),
  42.             ('time_on',r"(\d{2}):(\d{2})", "$1$2"),
  43.             ('srx', r"\#(\d+)\s", "$1"),
  44.             ('stx', r"\!(\d+)\s", "$1"),
  45.             ('mode', r"(cw|ssb|rtty|sstv|fm|q?psk\d{0,3})","$1"),
  46.             ('rst_rcvd', r"([1-5][1-9][1-9]?)\s","$1"),
  47.             ('rst_sent', r"([1-5][1-9][1-9]?)\>\s","$1"),
  48.             ('freq',r"(\d{1,4}\.\d{3})","$1"),
  49.             ('qth', r"\@(.*?)\n","$1"),
  50.             ('name', r"\/(.*)\n","$1"),
  51.             ('comment', r"\s\:(.*)\n","$1"),
  52.           )
  53.        
  54.     def clear(self):
  55.         self.data = {}
  56.         print "cleared"
  57.         print self.data
  58.  
  59.     def parse(self, text):
  60.         for record in self.INI:            
  61.             record = list(record)
  62.             match = re.search(record[1], text,re.I)
  63.             if match:
  64.                 print match.groups()
  65.                 for output in range(0, len(match.groups()) ):
  66.                      record[2] = record[2].replace('$'+str(output+1), match.groups()[output])
  67.                 self.data[record[0]] = str(record[2])
  68.                 print self.data
  69.  
  70.     def __check(self):
  71.         global stx
  72.  
  73.         if self.data["mode"] == 'ssb':
  74.             default_report = '59'
  75.         else:
  76.             default_report = '599'
  77.  
  78.         if not self.data.has_key("rst_rcvd"):
  79.             self.data['rst_rcvd'] = default_report
  80.            
  81.         if not self.data.has_key("rst_sent"):
  82.             self.data['rst_sent'] = default_report
  83.            
  84.         if self.data.has_key("freq"):
  85.             self.data["freq"] = self.data["freq"].replace(".",",")            
  86.         if not self.data.has_key("qso_date"):
  87.             self.data['qso_date'] = time.strftime("%Y%m%d", time.gmtime())
  88.  
  89.         if not self.data.has_key("time_on"):
  90.             self.data['time_on'] = time.strftime("%H%M%S", time.gmtime())
  91.            
  92.         if self.data.has_key("stx"):
  93.             stx = int( self.data["stx"] ) + 1
  94.         else:
  95.             if self.data.has_key("srx"):
  96.                 self.data['stx'] = str( stx )
  97.                 stx += 1
  98.                 print stx
  99.  
  100.     def __make(self):
  101.         result = ''
  102.         for key, value in self.data.iteritems():
  103.             result += "<" + key + ":" + str(len(value)) + ">" + str(value) + " "
  104.         return result + "<EOR>"
  105.  
  106.     def backup(self):
  107.         try:
  108.             with open("log_%s.txt" % time.strftime("%Y%m%d", time.gmtime()), "a") as logfile:
  109.                 logfile.write("\n===%s===\n" % time.strftime("%H:%M", time.gmtime()))
  110.                 logfile.write("%s\n" % self.__make())        
  111.             return 1
  112.         except:
  113.             return 0
  114.        
  115.     def get(self):
  116.         self.__check()
  117.         return self.__make()
  118.  
  119.  
  120. class MiniLog( Frame ):
  121.     def __init__( self):        
  122.         Frame.__init__(self)
  123.         self.master.title("MiniLog (DXK gateway)")
  124.         self.pack(fill=BOTH, expand = True)
  125.        
  126.         frame1 = Frame(self)
  127.         ip = StringVar()
  128.         ip.set(host)
  129.         self.entry1 = Entry(frame1, width=16, textvariable=ip)
  130.         self.entry1.pack(side=LEFT)
  131.  
  132.         self.label1 = Label(frame1, text = str(stx), anchor=W)
  133.         self.label1.pack(side=RIGHT)
  134.         frame1.pack(fill=X)
  135.        
  136.         self.text1 = Text(self, width=10, height =6, font=("Arial", 10))
  137.         self.text1.insert(END,"20m\nssb\n")
  138.         self.text1.tag_add("sel","1.0","end")
  139.         self.text1.focus_set()
  140.         self.text1.pack(fill=X)
  141.  
  142.         self.text2 = Text(self, height=7,font=("Arial", 10))
  143.         self.text2.pack(fill=BOTH, expand = True )
  144.        
  145.         self.master.bind("<Alt-s>", self.send_key)
  146.         self.master.bind("<Alt-d>", self.debug_key)
  147.  
  148.         self.master.geometry("200x300")
  149.         self.master.minsize(200,265)
  150.        
  151.         frame2 = Frame(self)
  152.         self.button1 = Button(frame2, text="Debug", command=self.debug_action)
  153.         self.button1.pack(side=LEFT)
  154.  
  155.         self.button1 = Button(frame2, text="Help", command=self.help_action)
  156.         self.button1.pack(side=LEFT)
  157.  
  158.         self.button2 = Button(frame2, text="Send", command=self.send_action)
  159.         self.button2.pack(side=LEFT)
  160.         frame2.pack()
  161.  
  162.     def show_help(self):
  163.         return 1
  164.  
  165.     def send_key(self,event):
  166.         self.send_action()
  167.  
  168.     def debug_key(self,event):
  169.         self.debug_action()
  170.                
  171.     def send_action(self):
  172.         remote = self.entry1.get().split(':')
  173.         a.parse(self.text1.get(1.0,END))
  174.         a.parse(self.text2.get(1.0,END))        
  175.         adif =  a.get()
  176.         a.backup()
  177.         tcp = TCPclient(remote[0],int(remote[1]))
  178.         result = tcp.send('LOG',  adif )
  179.         if result != 1: print result
  180.         tcp.close()
  181.        
  182.         self.label1.config(text = str(stx))
  183.         a.clear()
  184.         self.text2.delete(1.0,END)
  185.                
  186.         print "send"
  187.  
  188.     def debug_action(self):
  189.         print self.winfo_width()
  190.         print self.winfo_height()
  191.         a.parse(self.text1.get(1.0,END))
  192.         a.parse(self.text2.get(1.0,END))
  193.         print a.get()
  194.         self.label1.config(text = str(stx))
  195.         a.clear()
  196.  
  197.     def help_action(self):
  198.         webbrowser.open_new('http://web.bxhome.org/blog/ok4bx/2013/06/minilog-gateway-dxkeeper\?source=minilog_help#help')
  199.            
  200.                
  201. host='127.0.0.1:52001'
  202. stx = 1        
  203. a = Adif()
  204. MiniLog().mainloop()

Comments

Thanks for the Minilog

Thanks for this python example. I am thinking how to connect to DXkeeper and have now a real good basic info.

Greetings Peter DF1LX (at darc.de)