//  STM32F103
//  ---------
//  infra dalkove ovladani a cidlo gest
//========================================================================================

#include <SparkFun_APDS9960.h>                     // knihovna pro cidlo gest
                                                   // ( https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor )

#define pin_infra            PB9                   // pin, na kterem je pripojene infracidlo dalkoveho ovladani

SparkFun_APDS9960 apds = SparkFun_APDS9960();

volatile unsigned long     InfraKod  = 0;



//========================================================================================
void setup()
  {
    Serial.begin(9600);
    pinMode(pin_infra, INPUT_PULLUP);

    attachInterrupt(digitalPinToInterrupt(pin_infra), INTERRUPT_infra  , FALLING);      // na zacatku prijmu kodu nejakeho tlacitka se spusti preruseni

    apds.init();
    apds.enableGestureSensor(false);      // gesta bez interruptu
  }


//========================================================================================
void loop()
  {

    Serial.println("smycka...");


    //--------------------------------------------------------------
    // vyhodnoceni pohybu bez interruptu
    if (apds.isGestureAvailable() and InfraKod == 0)
      {
        byte smer = apds.readGesture();
        Serial.print("Pohyb: ");
        Serial.println(smer);
      }

    //--------------------------------------------------------------




    //--------------------------------------------------------------
    // vyhodnoceni infrakodu dalkoveho ovladace
    if (InfraKod > 0)
      {
        Serial.print("Infra: ");
        Serial.println(InfraKod,HEX);
        InfraKod = 0;
        attachInterrupt(digitalPinToInterrupt(pin_infra), INTERRUPT_infra  , FALLING);
      }
    //--------------------------------------------------------------


    delay(2000);   // dalsi podprogramy v hlavni smycce trvaji nejakou dobu (cidla, displej, komunikace ...)
  
  
  }
//========================================================================================



//-------------------------------------------------------
// obsluha preruseni pri prijmu nejakeho infra tlacitka na dalkovem ovladaci
void INTERRUPT_infra(void)
  {
    unsigned int pole_impulzu[36];
    unsigned int sirka;
    detachInterrupt(digitalPinToInterrupt(pin_infra));     // zruseni interruptu (aby se vyhodnotil jen jeden kod z dalkoveho ovladace)
                                                             
    for (byte i = 0; i < 36 ; i++)
      {
        sirka = pulseIn(pin_infra, HIGH, 10000) ;
        if (sirka >  400 and sirka <  700) pole_impulzu[i] = 0;     // sirka impulzu je kratka
        if (sirka > 1400 and sirka < 1800) pole_impulzu[i] = 1;     // sirka impulzu je dlouha
      }


    InfraKod = 0;

    for (byte i = 0; i < 32 ; i++)
      {
        if (pole_impulzu[i] == 1)
          {
            InfraKod = InfraKod + ( 1 << (31 - i));
          }
      }
     


  }