#include <Arduino_FreeRTOS.h>
#include <queue.h>


//USTAWIENIE PODSTAWOWYCH CZESTOTLIWOSCI SWIECENIA DIOD
int LEDRFreq = 100;
int LEDGFreq = 100;
int LEDBFreq = 100;
//DEKLARACAJ KOLEJKI
QueueHandle_t kolejka;
void setup() {
  //TWORZENIE KOLEJKI
  kolejka = xQueueCreate(3, sizeof(char[10]));


  Serial.begin(9600);



  // TWORZENIE ZADAN
  xTaskCreate(TaskBlink1, "Blink1", 128, NULL, 2, NULL);
  xTaskCreate(TaskBlink2, "Blink2", 128, NULL, 2, NULL);
  xTaskCreate(TaskBlink3, "Blink3", 128, NULL, 2, NULL);
  xTaskCreate(OdbierzKolejke, "OdbierzKolejke", 128, NULL, 1, NULL);
  xTaskCreate(TaskAnalogRead, "AnalogRead", 128, NULL, 1, NULL);


}

void loop()
{
}

// ZADANIA
//ZADANIE DO MIGANIA DIODA
void TaskBlink1(void *pvParameters)  
{
  (void) pvParameters;
  pinMode(LED_BUILTIN, OUTPUT);

  for(;;)
  {
    //POCZATKOWO UZYWALEM SEMAFOROW, JEDNAKZE Z NICH ZREZYGNOWALEM
    //xSemaphoreTake(mutex, portMAX_DELAY); 
    digitalWrite(13, HIGH);   // ZMIANA TRYBU NA HIGH
    vTaskDelay( LEDRFreq / portTICK_PERIOD_MS ); // delay
    digitalWrite(13, LOW);    
    //xSemaphoreGive(mutex);  

    vTaskDelay( LEDRFreq / portTICK_PERIOD_MS );
  }
}

void TaskBlink2(void *pvParameters)  
{
  (void) pvParameters;
  pinMode(LED_BUILTIN, OUTPUT);
  for(;;)
  { 
    //POCZATKOWO UZYWALEM SEMAFOROW, JEDNAKZE Z NICH ZREZYGNOWALEM
    //xSemaphoreTake(mutex, portMAX_DELAY); 
    digitalWrite(12, HIGH);  
    vTaskDelay( LEDGFreq / portTICK_PERIOD_MS ); 
    digitalWrite(12, LOW);    
    //xSemaphoreGive(mutex);  

    vTaskDelay( LEDGFreq / portTICK_PERIOD_MS );
  }
}

void TaskBlink3(void *pvParameters) 
{
  (void) pvParameters;
  pinMode(LED_BUILTIN, OUTPUT);
  for(;;)
  {   

    //POCZATKOWO UZYWALEM SEMAFOROW, JEDNAKZE Z NICH ZREZYGNOWALEM
    //xSemaphoreTake(mutex, portMAX_DELAY); 
    digitalWrite(11, HIGH);   
    vTaskDelay( LEDBFreq / portTICK_PERIOD_MS ); 
    digitalWrite(11, LOW);    
    //xSemaphoreGive(mutex);  

    vTaskDelay( LEDBFreq / portTICK_PERIOD_MS );
  }
}
//ZADANIE DO ODCZYTYWANIA WARTOSCI Z ANALOGOWYCH PORTOW POTENCJOMETRU
void TaskAnalogRead( void *pvParameters __attribute__((unused)) )  
{

  
  char buf[10];
  for (;;)
  {
    // wczytanie wartosci z potencjometrow
    int sensorValue1 = analogRead(A0);
    int sensorValue2 = analogRead(A1);
    int sensorValue3 = analogRead(A5);


      
            // ZMIANA CZESTOTLIWOSCI MIGANIA DIOD ( POD WARUNKIEM, ZE NIE JEST ROWNA 0)
      if(sensorValue1 != 0){
        LEDRFreq = sensorValue1;
      }
      if(sensorValue2 != 0){
        LEDGFreq = sensorValue2;
      }
      if(sensorValue3 != 0){
        LEDBFreq = sensorValue3;
      }
      //PRZESLANIE WARTOSCI KOLEJKA
      sprintf(buf, "R! %d", LEDRFreq);
      xQueueSend(kolejka, &buf, 100);
      //Serial.println(buf);
      sprintf(buf, "G! %d", LEDGFreq);
      xQueueSend(kolejka, &buf, 100);
      //Serial.println(buf);
      sprintf(buf, "B! %d", LEDBFreq);
      xQueueSend(kolejka, &buf, 100);
      //Serial.println(buf);
      vTaskDelay(100);
      
      }

    vTaskDelay(5);  
  }

//ODBIERANIE WARTOSCI PRZEZ KOLEJKE I WYPISANIE ICH W KONSOLI.
void OdbierzKolejke(void *pvParameters){
  char myBuf[10];
  while(1){
    if(kolejka != 0){
      if(xQueueReceive( kolejka, &myBuf, 100));
      Serial.println(myBuf);
    }

  }
}
 


uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
led1:A
led1:C
r1:1
r1:2
led2:A
led2:C
r2:1
r2:2
led3:A
led3:C
r3:1
r3:2
pot1:GND
pot1:SIG
pot1:VCC
pot2:GND
pot2:SIG
pot2:VCC
pot3:GND
pot3:SIG
pot3:VCC