#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <sysinfoapi.h>

#define DQC 128  // default quantity of channels
#define ITR 360  // default quantity of iterations

int sign(double x) {
    if (x >= 0)
        return 1;
    else
        return 0;
}

int main (int argc, char * argv[]) {
    int itr;  // quantity of iterations
    double da[DQC] = {0};  // da[i] angle between channel 'i' and '0'

    // parse command arguments
    // 1-st argument is the number of iterations
    // if nothing: number of iterations = ITR
    if(argc > 1)
        itr = atoi(argv[1]);
    if(itr == 0)
        itr = ITR;

    double step = 360.0/DQC;  // step between channels
    printf("channels: %d, step: %f\n", DQC, step);

    for(int i = 0; i < DQC; i++) {
        da[i] = i * step;               // fill in degree
        printf("[%d]:%.4f ", i, da[i]); // print in degree and ...
        da[i] = da[i] * M_PI / 180.0;   // convert degree values to radians
    }
    printf("\n");

    srand(GetTickCount());

    step = 2 * M_PI / itr;  // now step = common turn in 1 iteration (in rad)

    for(int n = 0; n < itr; n++) {
        double r = rand() * 2 * M_PI / RAND_MAX;  // common hidden parameter
        int ir[DQC] = {0};  // array of results: '0' and '1'

        ir[0] = sign(sin(-M_PI + r - n * step));
        printf("+%8.4f dg: %d", n * step * 180 / M_PI, ir[0]);

        for(int i = 1; i < DQC; i++) {
            ir[i] = sign(sin(r + da[i]));
            printf("%d", ir[i]);
        }
        printf("\n");
    }
}