/*
 * Soubor:  20110211-Fri-dprc.c
 * Datum:   11.02.2011 08:10
 * Autor:   Marek Nožka, nozka <@t> spseol <d.t> cz
 * Licence: GNU/GPL 
 * Úloha:  Jak psát a používat funkce
 ****************************************************/

#define _GNU_SOURCE

#include <stdio.h>
#include <math.h>
#include <stdbool.h>

/* ***************    Makra    ******************** */
//#define ARREYC 1024

/* ************* Funkční prototypy **************** */
double f_mezni(double r, double c);
void vymena(double *x, double *y);
bool dprc(double r, double c, double f, double *modul, double *faze);

/****************************************************
 *               Hlavní program.
 ****************************************************/
int main(void)
{
    double vysledek;

    double odpor = 1000;
    vysledek = f_mezni(odpor, 33e-9);
    printf("%g\n", vysledek);

    double kapacita = 33e-9;
    printf("%g %g\n", odpor, kapacita);
    vymena(&odpor, &kapacita);
    printf("%g %g\n", odpor, kapacita);


    double aPrenos;
    double fPrenos;
    if (dprc(1000, 33e-9, 4822.8, &aPrenos, &fPrenos)) {
        printf("%g %g\n", aPrenos ,fPrenos );
    } else {
        fprintf(stderr,"spatne hodnoty R,C,f\n");
        return 1;
    }

    return 0;
}

/* ***************   Funkce    ******************** */

/* výpočet mezního kmitočtu */
double f_mezni(double r, double c)
{
/*    double f0;
    f0 = 1/(2*PI*r*c);
    return f0;*/
    return 1 / (2 * M_PI * r * c);
}

/* vymění x a y */
void vymena(double *x, double *y)
{
    double kybl = *x;
    *x = *y;
    *y = kybl;
}


/** 
 * Výpočet přenosu dolní propusti RC
 *
 *        | -jXc |             Xc 
 * Au = ------------- = ------------------
 *       | R - jXc |     sqrt( R² + Xc² )
 *                                                     Xc
 *  φ = arg( -jXc ) - arg( R - jXc ) = -90° + arctg( ----- )
 *                                                     R       
 *                                                            */
bool dprc(double r, double c, double f, double *modul, double *faze)
{
    if (r <= 0 || c <= 0 || f <= 0) {
        return false;           // vyskočí z funkce
    }

    double Xc = 1 / (2 * M_PI * f * c);
    *modul = Xc / (sqrt(r * r + Xc * Xc));
    *faze = -90 + 180 * (atan(Xc / r)) / M_PI;

    return true;
}

