#!/usr/bin/env python

# Priklad ovladani I2C multiplexeru PCA9516
# Jako SLAVE zarizeni jsou pripojeny 3 kusy ATtiny85 s adresami 0x51
# V nich je pouzity mirne upraveny ukazkovy priklad z knihovny TinyWireS.zip  
# (Prvni ATtiny vraci cislo o 10 vetsi, nez prijme. Druhe ATtiny pricita 20, treti ATtiny pricita 30 )
# (Z ukazkoveho prikladu bylo odstraneno dlouhe blikani LEDkou, ktere signalovalo prijate cislo)  
#=============================================================================================================================

import smbus
import RPi.GPIO as GPIO  
import time
import random


addr=0x51    # I2C adresa vsech zarizeni na sbernici je stejna (0x51)
bus = smbus.SMBus(1)


GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(7, GPIO.OUT)     # pin pro zapnuti I2C_1
GPIO.setup(8, GPIO.OUT)     # pin pro zapnuti I2C_2
GPIO.setup(25, GPIO.OUT)    # pin pro zapnuti I2C_3




#---------------------------------------------------------
#  podprogram pro prepinani jednotlivych I2C kanalu
def prepni(kanal_I2C): 

  if (kanal_I2C == 1):
    GPIO.output(7, True)          # zvoleny kanal je True, ostatni (pokud obsahuji zarizeni se stejnou adresou) musi byt False 
    GPIO.output(8, False)
    GPIO.output(25, False)

  if (kanal_I2C == 2):
    GPIO.output(7, False) 
    GPIO.output(8, True)
    GPIO.output(25, False)

  if (kanal_I2C == 3):
    GPIO.output(7, False) 
    GPIO.output(8, False)
    GPIO.output(25, True)
    
#----------------------------------------------------------    



while (True):                           # nekonecna smycka

  for i in range (1,4):                 # vycitat se bude z kanalu I2C_1 az I2C_3

    prepni(i)                           # prepnuti na pozadovany I2C kanal
    nahoda = random.randint(0,9)        # generovani nahodneho cisla od 0 do 9

    bus.write_byte(addr,nahoda)         # do arizeni na zvolenem I2C kanale se posle nahodne cislo
    odpoved = bus.read_byte(addr)       # a precte se odpoved

    print (nahoda , odpoved)            # vypis vstupniho nahodneho cisla a odpovedi 

    time.sleep(1)                       # nejaky cas na dokonceni operace v pripojenych zarizenich (pauzy u blikani LED zdrzuji dalsi komunikaci)  







