John's Vademecum

Try to learn something about everything, and everything about something -Thomas Huxley “Darwin's bulldog” (1824-1895)

User Tools

Site Tools


public:radio:radio_database:ic-r75

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
public:radio:radio_database:ic-r75 [12/07/22 21:41 BST] – [3. Remote Control] johnpublic:radio:radio_database:ic-r75 [Unknown date] (current) – removed - external edit (Unknown date) 127.0.0.1
Line 1: Line 1:
-<-[[.:start]] 
- 
- 
-====== IC-R75 ====== 
- 
-===== - Details ===== 
- 
- 
-===== - Repairs / Mods ===== 
- 
-  * -5V DC/DC converter 
-    * capacitor failures 
- 
-  * "Turn Off" fault - due to overheating of 13V regulator 
-    * Cured by  
-      * Reduce input voltage to 13.8V 
-      * Improve heatsinking of regulator IC to chassis 
- 
-===== - Remote Control ===== 
- 
-  * connected to ''shack'' server via RS232 
-  * ''shack'' server running Python netradio ''server.py'' to give TCP/IP network control 
-  * ''laptop'' PC running Python netradio ''client.py'' to give user access 
-    * Available controls: <code>gm4slv@laptop:~/Python/PythonProjects/netradio $ python2 client.py 
-There are currently 1 radios connected. 
-================================= 
-Status of Radio 1 (IC-R75) 
- 
-Frequency : 391.000 kHz 
-Mode: CW 
-S-Meter: -113.0dBm 
-1 : 0 
-================================= 
- 
-Please choose a radio 
- 
-There are currently 1 radios connected. 
-Radio 1 is IC-R75 
-Choose a radio number from the list : 1 
- 
-The available commands are: 
-lr   : List Radios 
-sr   : Select the Radio to control 
-gr   : Get currently selected Radio name 
-gm   : Get Mode 
-sm   : Set Mode 
-gf   : Get Freq 
-sf   : Set Freq 
-gs   : Get S-meter 
-gp   : Get Pre-amp 
-pon  : Set Pre-amp On 
-poff : Set Pre-amp Off 
-gatt : Get Attn 
-aton : Set Attn On 
-atoff: Set Attn Off 
-ga   : Get All (status of all radios) 
-sync : Sync freq/mode on two radios 
-log  : Setup background logging to file 
-h    : Help (show this command list) 
-q    : quit 
- 
-IC-R75 > 
-</code>  
-  * audio via network using ''PicoPhone'' 
-    * running on shack ''laptop'' via ''Wine'' 
-    * running on Windows laptop //natively// 
- 
-Remote control is achieved via a SSH connection to shack ''laptop'' to run the netradio ''client.py'' and the RX audio can be heard via PicoPhone. 
- 
-===== - Further Reading ===== 
- 
-  * Python code for the remote control at ''github'' [[https://github.com/gm4slv/netradio]] 
- 
-  * server.py 
- 
-<code python> 
-#from aor import * 
-from icom import * 
-from conf import * 
-#from m710 import * 
-import SocketServer 
-import time 
- 
-try: 
-    import readline 
-except: 
-    pass 
- 
-lock = threading.Lock() 
- 
-radios = [] 
- 
- 
-#r1 = m710(n4) 
-#radios.append(n4) 
- 
-r1 = Icom(n1, a1, cal1) 
-radios.append(n1) 
- 
-#r2 = Icom(n2, a2, cal2) 
-#radios.append(n2) 
- 
-#r3 = Ar7030(n3) 
-#radios.append(n3) 
- 
-print radios 
-print r1.digi_off() 
- 
-def list_radios(): 
-    radiolist = "" 
-    for n in range(0, len(radios)): 
-        r = radios[n] 
-        radiolist += (r + " ") 
-    return radiolist 
- 
- 
-def write_file(text): 
-    filename = 'commandlog.txt' 
-    f = open(filename, 'a+' # a+ is "append to file, create it if it doesn't exist" 
-    timenow = time.strftime("%d/%m/%Y %H:%M:%S", time.gmtime(time.time())) 
-    log = " ".join((timenow, text))  # make an entry for the log by joining the timestamp with the text passed in 
-    f.write(log) 
-    f.close() 
- 
- 
-def write_con(text): 
-    filename = 'conlog.txt' 
-    f = open(filename, 'a+' # a+ is "append to file, create it if it doesn't exist" 
-    timenow = time.strftime("%d/%m/%Y %H:%M:%S", time.gmtime(time.time())) 
-    log = " ".join((timenow, text))  # make an entry for the log by joining the timestamp with the text passed in 
-    f.write(log) 
-    f.close() 
- 
- 
-# The Server 
-class ThreadedRequestHandler(SocketServer.StreamRequestHandler): 
-    def handle(self): 
-        # we find the current thread for the client connection just set up, to 
-        # use in the log file 
-        cur_thread = threading.currentThread() 
-        # log the new connection details 
-        write_con("Connect from %s using %s \n" % ((self.client_address[0]), cur_thread.getName())) 
-        # print to the server's console the new connection IP address/port 
-        print self.client_address 
-        # loop to handle client requests.... 
-        while True: 
-            # using StreamRequestHandler means our input from the client 
-            # is  "file-like" and can be read with "file-like" commands 
-            # we read a line at a time, using readline() 
-            cmd = self.rfile.readline().lower() 
-            # to keep things clean, we remove any characters that aren't 
-            # "printable" simple ASCII 
-            # these are between 32 and 127 in the ASCII table 
-            # we look at each character, and then make a new word by 
-            # .join()ing each accepted character with no space in between 
-            asccmd = "".join(x for x in cmd if ord(x) < 128 and ord(x) > 31) 
-            # we make a list called "words" holding the received words which 
-            # will be inspected by various functions 
-            words = asccmd.split() 
-            # If a client uses sock.close() itself, to disconnect, it appears that 
-            # we read a continuous stream of "" on the dead 
-            # socket, which puts CPU to 100%. 
-            # 
-            # The "While" loop is probably responsible, but I can't see another 
-            # way to keep the connection up for multiple commands. 
-            # 
-            # Further connection are accepted due to the Threaded nature of the server. 
-            # The CPU load is unacceptable though 
-            # HACK ?>>>>> 
-            # Looking for "" and then breaking 
-            # the connection from the server end (even though the client has 
-            # gone) cures this. 
-            if cmd == "": 
-                break 
-            else: 
-                pass 
-            # if the words list is empty, go back and get more input 
-            if not words: 
-                continue 
-            # we have input.... 
-            # filter based on the first word - these are the 
-            # pre-set commands the server will accept 
-            # the client wants to know the currently available 
-            # radio names - held in the variable "rnames" 
-            elif words[0] == "getnames": 
-                self.wfile.write(rnames) 
-            # words[-1] (the last word in the list) will always be the 
-            # radio name. We give the variable "my_radio" this value, for 
-            # identifying which radio object to apply the method to 
-            elif words[0] == "getmode": 
-                my_radio = eval(words[-1]) 
-                mode = my_radio.get_mode() 
-                self.wfile.write(mode) 
-            elif words[0] == "getfreq": 
-                my_radio = eval(words[-1]) 
-                freq = words[1] 
-                freq = my_radio.get_freq() 
-                self.wfile.write(freq) 
-            elif words[0] == "setmode": 
-                my_radio = eval(words[-1]) 
-                mode = words[1] 
-                newmode = my_radio.set_mode(mode) 
-                self.wfile.write(newmode) 
-            elif words[0] == "setfreq": 
-                my_radio = eval(words[-1]) 
-                freq = float(words[1]) 
-                newfreq = my_radio.set_freq(freq) 
-                self.wfile.write(newfreq) 
-            elif words[0] == "getsmeter": 
-                my_radio = eval(words[-1]) 
-                smeter = round(float(my_radio.get_smeter()), 1) 
-                self.wfile.write(smeter) 
-            elif words[0] == "gets": 
-                my_radio = eval(words[-1]) 
-                s = my_radio.get_s() 
-                self.wfile.write(s) 
-            elif words[0] == "listradios": 
-                radios = list_radios() 
-                self.wfile.write(radios) 
-            elif words[0] == "getpreamp": 
-                my_radio = eval(words[-1]) 
-                preamp = my_radio.get_pre() 
-                self.wfile.write(preamp) 
-            elif words[0] == "preampon": 
-                my_radio = eval(words[-1]) 
-                preamp = my_radio.pre_on() 
-                self.wfile.write(preamp) 
-            elif words[0] == "preampoff": 
-                my_radio = eval(words[-1]) 
-                preamp = my_radio.pre_off() 
-                self.wfile.write(preamp) 
-            elif words[0] == "getatt": 
-                my_radio = eval(words[-1]) 
-                att = my_radio.get_att() 
-                self.wfile.write(att) 
-            elif words[0] == "atton": 
-                my_radio = eval(words[-1]) 
-                att = my_radio.att_on() 
-                self.wfile.write(att) 
-            elif words[0] == "attoff": 
-                my_radio = eval(words[-1]) 
-                att = my_radio.att_off() 
-                self.wfile.write(att) 
-            elif words[0] == "tune": 
-                my_radio = eval(words[-1]) 
-                tune = my_radio.tune() 
-                self.wfile.write(tune) 
-            elif words[0] == "getpwr": 
-                my_radio = eval(words[-1]) 
-                pwr = my_radio.get_pwr() 
-                self.wfile.write(pwr) 
-            elif words[0] == "setpwr": 
-                my_radio = eval(words[-1]) 
-                spwr = words[1] 
-                pwr = my_radio.set_pwr(spwr) 
-                self.wfile.write(pwr) 
-            elif words[0] == "quit": 
-                write_con("Got quit from {}\n".format(self.client_address[0]))  # log it 
-                self.wfile.write("Goodbye! \r\n" # say Goodbye 
-                break 
-            else:  # nothing in words[0] matches a pre-set command.... 
-                write_file("Received %s\n" % words)  # log it, it's unusual 
-                self.wfile.write("Command not recognized\r\n" # inform the client 
- 
- 
-class ThreadedIcomServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): 
-    pass 
- 
- 
-if __name__ == '__main__': 
-    # define the lock to be used on the serial port access 
-    lock = threading.Lock() 
- 
-    # address ('' = all available interfaces) to listen on, and port number 
-    address = ('', 9999) 
-    server = ThreadedIcomServer(address, ThreadedRequestHandler) 
-    server.allow_reuse_address = True 
- 
-    # define that the server will be threaded, and will serve "forever" ie. not quit after the client disconnects 
-    t = threading.Thread(target=server.serve_forever) 
-    # start the server thread 
-    t.start() 
- 
-    write_con( 
-        "Server loop running in thread: %s\n" % "".join(t.getName()))  
-</code> 
-==== Page Info ==== 
- 
-Page created Wed May 25 00:06:01 2022 by John Pumford-Green 
- 
-Page last updated: ~~LASTMOD~~ 
- 
- 
- 
-{{tag>radio}} 
- 
  
public/radio/radio_database/ic-r75.1657658469.txt.gz · Last modified: (external edit)