import spidev

columns = [0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8]
LEDOn = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF] 
LEDOff = [0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
LEDEmoteSmile = [0x0,0x0,0x24,0x0,0x42,0x3C,0x0,0x0]
LEDEmoteSad = [0x0,0x0,0x24,0x0,0x0,0x3C,0x42,0x0]
LEDEmoteTongue = [0x0,0x0,0x24,0x0,0x42,0x3C,0xC,0x0]
LEDEmoteSurprise = [0x0,0x0,0x24,0x0,0x18,0x24,0x24,0x18]
spi = None

def setup(robot_config):
    global LEDEmoteSmile
    global LEDEmoteSad
    global LEDEmoteTongue
    global LEDEmoteSuprise
    global module
    global spi
    
    #LED controlling
    spi = spidev.SpiDev()
    spi.open(0,0)
    #VCC -> RPi Pin 2
    #GND -> RPi Pin 6
    #DIN -> RPi Pin 19
    #CLK -> RPi Pin 23
    #CS -> RPi Pin 24
    
    # decoding:BCD
    spi.writebytes([0x09])
    spi.writebytes([0x00])
    # Start with low brightness
    spi.writebytes([0x0a])
    spi.writebytes([0x03])
    # scanlimit; 8 LEDs
    spi.writebytes([0x0b])
    spi.writebytes([0x07])
    # Enter normal power-mode
    spi.writebytes([0x0c])
    spi.writebytes([0x01])
    # Activate display
    spi.writebytes([0x0f])
    spi.writebytes([0x00])
    rotate = robot_config.getint('max7219', 'ledrotate')
    if rotate == 180:
        LEDEmoteSmile = LEDEmoteSmile[::-1]
        LEDEmoteSad = LEDEmoteSad[::-1]
        LEDEmoteTongue = LEDEmoteTongue[::-1]
        LEDEmoteSurprise = LEDEmoteSurprise[::-1]
    SetLED_Off()
            
def SetLED_On():
    for i in range(len(columns)):
        spi.xfer([columns[i],LEDOn[i]])

def SetLED_Off():
    for i in range(len(columns)):
        spi.xfer([columns[i],LEDOff[i]])

def SetLED_E_Smiley():
    for i in range(len(columns)):
        spi.xfer([columns[i],LEDEmoteSmile[i]]) 

def SetLED_E_Sad():
    for i in range(len(columns)):
        spi.xfer([columns[i],LEDEmoteSad[i]])

def SetLED_E_Tongue():
    for i in range(len(columns)):
        spi.xfer([columns[i],LEDEmoteTongue[i]])

def SetLED_E_Surprised():
    for i in range(len(columns)):
        spi.xfer([columns[i],LEDEmoteSurprise[i]])

def SetLED_Low():
    # brightness MIN
    spi.writebytes([0x0a])
    spi.writebytes([0x00])

def SetLED_Med():
    #brightness MED
    spi.writebytes([0x0a])
    spi.writebytes([0x06])

def SetLED_Full():
    # brightness MAX
    spi.writebytes([0x0a])
    spi.writebytes([0x0F])
        
def move(args):
    command = args['command']
    
    if command == 'LED_OFF':
        SetLED_Off()
    if command == 'LED_FULL':
        SetLED_On()
        SetLED_Full()
    if command == 'LED_MED':
        SetLED_On()
        SetLED_Med()
    if command == 'LED_LOW':
        SetLED_On()
        SetLED_Low()
    if command == 'LED_E_SMILEY':
        SetLED_On()
        SetLED_E_Smiley()
    if command == 'LED_E_SAD':
        SetLED_On()
        SetLED_E_Sad()
    if command == 'LED_E_TONGUE':
        SetLED_On()
        SetLED_E_Tongue()
    if command == 'LED_E_SURPRISED':
        SetLED_On()
        SetLED_E_Suprised()