#include <iostream>
#include <time.h>
#include "AudioCollector.h"
#include "udpClientClass.h"


static AudioCollector *audio;
const int AUDIO_BUFFER_SIZE = 512;  //4096 // orig = 512 return buffer == 1/2 this value
int verbose = 0;
int test = 0;
udpClientClass* client;
//udpClientClass* client2;


int main (int argc, char * const argv[]) {

float max; 

	// verify number of parameters
	
	printf("Argc = %d \n", argc);
	
		
	if (argc < 4) {
		printf("Usage is FFTTransmitter <port>  <hostname> <silent/verbose/test s/v/t>");
		return 0;
		}
	
	// read command line parameters
	
	int port_number = atol(argv[1]);
	char* server_name = argv[2];
	client = new udpClientClass(server_name, port_number);

    if (argv[3][0] == 's'){	
		verbose = 0;
		printf ("Silent..\n\n");
	} else if (argv[3][0] == 'v'){
		verbose = 1;
		printf("Verbose..\n\n");
	} else if (argv[3][0] == 't'){
		verbose = 1;
		test = 1;
		printf("Test...\n\n");
	}
	
	audio = new AudioCollector(AUDIO_BUFFER_SIZE);

	// audio collector initialized
	// Audio->GetHarmonic(s_harm);
	// Audio->SetGain(s_gain);
	// Audio->Process(wavname);
	
	int numBars = audio->GetNumBars();
	float fftHarmonics[numBars];
	char fftChars[numBars+1];

	while (1) {
	
		
		audio->GetFFT();
		
		for (int i = 0; i < numBars; i++){

			if (test == 0){
				fftHarmonics[i] = audio->GetHarmonic(i);
			} else {
				fftHarmonics[i] = ((float) i)/numBars;
			
			}
			
			if (fftHarmonics[i] > 1) {
				if (fftHarmonics[i] > max) {
					max =  fftHarmonics[i];
					cout <<"Error*** > 1  i = " << i << " max = " << max << endl;
				}
				fftHarmonics[i] = 1.0;
			}
			fftChars[i] =  fftHarmonics[i]*124 +1;
		}
		
		fftChars[numBars] = 0x00; 
//		std::cout << endl;
        
		if(verbose){
			std::cout << "fftHarmonics:: ";
			for (int i = 0; i < numBars; i++){
				printf("%f ", fftHarmonics[i]);			
			}
			std::cout << std::endl;

			std::cout << "fftChars:: ";
			for (int i = 0; i < numBars; i++){
				printf("%02x ", fftChars[i]);			
			}
			std::cout << std::endl;
			std::cout << std::endl;
		
		}			

        client->sendString(fftChars);
		
		usleep(15000);
	}
	
	delete audio;
	std::cout << "Exit..." << std::endl;
	client->closeSocket();

	return 0;
}

