#!/usr/bin/env python
# coding: utf-8

# In[4]:


import math

def workdiodes(freq, recv=False):
    """
    Formulas for calculating the frequency:
    
    Fc = freq       For transmitting frequency.
    Fc = freq       For receiving fequency.
    N = Fc/0.4      Disregarding any fractional part.
    A = (Fc - 0.4 * N)/0.01  Rounding up any fractional part.
    K = 0           If the frequency ends in 5 Khz
    K = 1           If the frequency ends in 0 Khz
    
    Example:
    Calculating for 155.995 Mhz.
    
        N = 155.995/0.4 = 389.9875
    
    Therefore, N = 389
    
        A = (155.995 - 0.4 * 389)/0.1 = .395/0.01 = 39.5
    
    Therefore, A = 40
    
    The freqency ends in 5 kHz. Therefore K = 0
    
    Finally, convert the N and A to binary. N = 110000101, A = 101000
    
    In the pinout below, pin 1 is always "1", and 18 
    is always 0.
    
    Pin Number:  1  2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18
    Designation     N8  N7  N6  N5  N4  N3  N2  N1  N0   A5   A4   A3   A2   A1   A0    K   Common
    Decimal Value   256 128 64  32  16  8   4   2   1    32   16   8    4    2    1         
    Binary Code  1  1   1   0   0   0   0   1   0   1    1    0    1    0    0    0     0   0
    
    This is a common cathode array, so the diode's cathode (black band side) are all joined together 
    and connected to pin 18. When connecting diodes, you leave binary "1" disconnected (or cut), and
    only connect "0". 
    """
    if recv:
        Fc = freq - 21.4
    else:
        Fc = freq

    # Pad the frequency for display
    freq_fmt = "{:.3f}" # 3 decimals
    freq = freq_fmt.format(freq)
    
    # if freq ends in 5, K=0, else K =1

    if freq[6:] == "0":
        K = 1
    elif freq[6:] == "5":
        K = 0
    else:
        return "{0}: ERROR".format(freq)
    
    N = int(Fc/0.4) # Disrearding any fractional part
    A = int(math.ceil((Fc - 0.4 * N)/0.01)) # Rounding UP any fractional part

    # N binary will always be 9 characters, A binary will be 6
    # http://stackoverflow.com/a/21732313/895866  
    get_bin = lambda x, n: x >= 0 and str(bin(x))[2:].zfill(n) or "-" + str(bin(x))[3:].zfill(n)
    
    Nb = get_bin(N, 9)
    Ab = get_bin(A, 6)
        
    return "{0}: {1}{2}{3}".format(freq, Nb, Ab, K)

def pinline(line):
    
    # Binary Code  1  1   1   0   0   0   0   1   0   1    1    0    1    0    0    0     0   0
    if len(line) != 25:
        return line
 
    outline = []
    for x in range(0, len(line)):
        if x < 8:
            outline.append(line[x])
        elif x == 8:
            outline.append('     1  ')
        else:
            outline.append('{0}   '.format(line[x]))

    # Now add the common 0
    outline.append('0')
    return ''.join(outline)
#     return """{0[0:9]}     1  {0[0]}   {0[1]}   {0[2]}   {0[3]}   {0[4]}   {0[5]}   {0[6]}   {0[7]}
#            {0[8]}   {0[9]}   {0[10]}   {0[11]}   {0[12]}   {0[13]}   {0[14]}   {0[15]}   {0[16]}
#            {0[17]}""".format(line)
    
print("""
Pin Number:  1  2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18
Designation  -  N8  N7  N6  N5  N4  N3  N2  N1  N0  A5  A4  A3  A2  A1  A0  K   Common
Value        -  256 128 64  32  16  8   4   2   1   32  16  8   4   2   1   -   - """)

print(pinline(workdiodes(155.995)))
print(pinline(workdiodes(150.010)))
print(pinline(workdiodes(150.025)))
print(pinline(workdiodes(155.995)))
print(pinline(workdiodes(146.520)))
print(pinline(workdiodes(145.050)))
print(pinline(workdiodes(145.050, True)))
print(pinline(workdiodes(144.390)))
print(pinline(workdiodes(144.390, True)))
print(pinline(workdiodes(144.392)))
print(pinline(workdiodes(145.047)))
print(pinline(workdiodes(145.049)))