#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "CAENHVWrapper.h"
#include <math.h>

int main(void) {
    
	// VARIABLES DECLARATION
	char	address[30], userName[20], passwd[30], name[64], ParName[8], channelname[30], directory_data[80], meteofile[80], meteofile2[80], header[200];
    char    directory_datashort[80], stringaexec[80], stringaexecdb[80], ongoingscan_gap[80];
	int		link, is, n, slot, NrOfCh=1, pw, status, station, day, month, year, hour, min, i, headerline=0;
    float   vmon, imon, hvset, dew, pressure=0, rainlast, rainday, rainmonth, rainyear, heat, temp1=0, temp2=0, rh1=0, rh2=0, wind, gust, dir;
    int     pressurezero = 990, cycles = 30, sleeping = 3, resistivity = 0;
	time_t 	now;
    int picorhint, picotempint;
    float picorh, picotemp;
    
	int channel_temp, slot_temp;
	float channel_offset;
    
	float *param = NULL;
	param = malloc(sizeof(float));
    
	uint *param2 = NULL;
	param2 = malloc(sizeof(uint));
    
	ushort *id_channel = NULL;
	id_channel = malloc(sizeof(ushort));
    
    
	// CAEN SY1527 settings
	sprintf(userName,"%s","admin");
	sprintf(passwd,"%s","admin");
    
    
    // Reading time information for hv scan
    FILE *stream29;
    stream29=fopen("/srv/www/cgi-bin/ongoingscan_gap","r");
    fscanf(stream29,"%s",ongoingscan_gap);
	fflush(stream29);
    fclose(stream29);
    
    
	// SETTING DATA DIRECTORY (it should exist!!)
	strcpy (directory_data,"/home/user/re4data/HVSCAN_GAPS/");
	strcat (directory_data,ongoingscan_gap);
	strcpy (meteofile,"/home/user/meteolog");
	strcpy (meteofile2,"/home/user/meteolog2");
    
    
	// Reading the Configuration file (it cointains the path file also)
	FILE *stream1;
	stream1=fopen("/srv/www/htdocs/conf_gap.txt","r");
	fscanf(stream1,"%s\n",name);
	fscanf(stream1,"%s\n",address);
    
    /*
     // Useful informations
     printf("Configuration file correctly read\n");
     printf("IP address: %s \n", address);
     printf("%s\n", "");
     */
    
    
	// Preparing connection to the mainframe
	CAENHVRESULT  ret_init,ret;
	link = LINKTYPE_TCPIP;
	ret_init =  CAENHVInitSystem(name, link, address, userName, passwd);
	//printf("\nCAENHVInitSystem: %s (num. %d)\n\n", CAENHVGetError(name), ret_init);
    
    
    
	// Reading latest values from the weather station
	FILE *stream3;
	stream3=fopen(meteofile,"r");
	//fgets(header,sizeof(header),stream3);
	while (!feof(stream3)) {
		fscanf(stream3,"%d %d %d %d %d %f %f %f %f %f %f %f %f %f %f %f %f\n",&day,&month,&year,&hour,&min,&temp1,&rh1,&dew,&pressure,&wind,&gust,&dir,&rainlast,&rainday,&rainmonth,&rainyear,&heat);
	}
	fflush(stream3);
	fclose(stream3);
    
    
    
	// Reading latest values from the weather station (indoor values)
	FILE *stream5;
	stream5=fopen(meteofile2,"r");
	while (!feof(stream5)) {
		fscanf(stream5,"%d %d %d %d %d %f %f\n",&day,&month,&year,&hour,&min,&temp1,&rh1);
	}
	fflush(stream5);
	fclose(stream5);
    
    
    // Reading latest values from picoprobe
    FILE *stream59;
    stream59=fopen("/home/user/picoprobe.txt","r");
    while (!feof(stream59)) {
        fscanf(stream59,"%f %f\n",&picorh,&picotemp);
    }
    fflush(stream59);
    fclose(stream59);
    picorhint = (int)picorh ;
    picotempint = (int)picotemp;
    
    // Reading resistivity flag
	FILE *stream51;
	stream51=fopen("/srv/www/htdocs/resistivity.txt","r");
	while (!feof(stream51)) {
		fscanf(stream51,"%d\n",&resistivity);
	}
	fflush(stream51);
	fclose(stream51);
    if (resistivity == 0) cycles = 1;
    
    
    // OPENING FILE FOR THE DB)
    strcpy (stringaexecdb,directory_data);
    strcat (stringaexecdb,"_hvscan.csv");
    FILE *stream35;
    stream35=fopen(stringaexecdb,"a");
    
	// Reading values from the Mainframe
	if ( ret_init == CAENHV_OK ) {
        
        
        
        
		while (!feof(stream1)) {
            headerline++;
			// READING THE CONFIGURATION FILE
			fscanf(stream1,"%s %d %d %d\n",channelname, &slot, &id_channel[0], &station);
			//printf("Slot: %d Channel in the slot = %d \n tdc_station = %d", slot,id_channel[0], station);
			time(&now);
            
            imon = 0;
            for (i = 1; i <= cycles; i++) {
                sleep(sleeping);
                
                // READING THE HIGH VOLTAGE
                sprintf(ParName,"%s","V0Set");
                ret = CAENHVGetChParam(name, slot, ParName, NrOfCh, id_channel, param);
                
                if (ret==CAENHV_OK) {
                    vmon = param[0];
                }
                else {
                    //printf("\nCAEN1527: %s (num. %d)\n Paramenter Name %s \n", CAENHVGetError(name), ret, ParName);
                }
                
                
                
                
                // READING THE CURRENTS
                sprintf(ParName,"%s","IMon");
                ret = CAENHVGetChParam(name, slot, ParName, NrOfCh, id_channel, param);
                
                if (ret==CAENHV_OK) {
                    imon = imon + param[0];
                }
                else {
                    //printf("\nCAEN1527: %s (num. %d)\n Paramenter Name %s \n", CAENHVGetError(name), ret, ParName);
                }
                
                FILE *stream61;
                stream61=fopen("/home/user/workspace/rpcupgrade/CAEN1527_monitoring-1.00/CAEN1527_monitoring/gap_offsets.ini","r");
                while (!feof(stream61)) {
                    fscanf(stream61,"%d %d %f\n", &slot_temp, &channel_temp, &channel_offset);
                    
                    if ( channel_temp == id_channel[0] && slot_temp == slot ) {
                        imon = imon + channel_offset;
                    }
                }
                fflush(stream61);
                fclose(stream61);
                
                
                
                // READING THE STATUS
                sprintf(ParName,"%s","Status");
                ret = CAENHVGetChParam(name, slot, ParName, NrOfCh, id_channel, param2);
                
                if (ret==CAENHV_OK) {
                    status = param2[0];
                }
                else {
                    //printf("\nCAEN1527: %s (num. %d)\n Paramenter Name %s \n", CAENHVGetError(name), ret, ParName);
                }
                
                
                
                
                // READING THE POWER ON/OFF
                sprintf(ParName,"%s","Pw");
                ret = CAENHVGetChParam(name, slot, ParName, NrOfCh, id_channel, param2);
                
                if (ret==CAENHV_OK) {
                    pw = param2[0];
                }
                else {
                    //printf("\nCAEN1527: %s (num. %d)\n Paramenter Name %s \n", CAENHVGetError(name), ret, ParName);
                }
                
                
                // DEBUGGING PRINTOUT OF THE VARIABLES
                //printf("%s %d %s %d %d %.2f %.5f %d %d\n",name, now, channelname, slot, id_channel[0], vmon ,imon ,status, pw);
            }
            //printf("%s","Reading from CAEN finished.");
            if (resistivity == 1) imon = imon / cycles;
            
			// OPENING FILE TO WRITE DATA (chamber by chamber)
            strcpy (stringaexec,directory_data);
            strcat (stringaexec,channelname);
            strcat (stringaexec,"_hvscan.dat");
			FILE *stream2;
			stream2=fopen(stringaexec,"a");
			fprintf(stream2,"%s %d %s %d %d %.2f %.5f %d %d %f %f %f\n",name, now, channelname, slot, id_channel[0], vmon ,imon ,status, pw, temp1, rh1, pressure);
            fflush(stream2);
            fclose(stream2);
            //printf("%s","Raw data file written.");
            
            
            hvset = (vmon * pressurezero / pressure) / 10;
            //hvset = int(vmon);
            hvset = hvset / 10;
            //hvset = floor(hvset + 0.5);
            hvset = hvset * 100;
            
            
            char * pch;
            char whichgap[80];
            
            pch = strtok (channelname,"_");
            i=0;
            while (pch != NULL)
            {
                i=i+1;
                if (i==1) strcpy(channelname, pch);
                if (i==2) strcpy(whichgap, pch);
                pch = strtok (NULL, "_");
            }
            if ( vmon == 1000 && headerline==1) fprintf(stream35,"%s\n","gap_serial_number,HV_eff,HV_app,i_mon,env_t,env_p,env_rh,gas_t,gas_rh");
            if (resistivity == 0) fprintf(stream35,"%s,%.0f,%.0f,%.2f,%4.1f,%3.0f,%4.1f,%d,%d\n", channelname, hvset, vmon, imon, temp1, pressure, rh1,picotempint, picorhint);
            if (resistivity == 1) fprintf(stream35,"%s,%.0f,%.2f,%4.1f,%3.0f,%4.1f,%d,%d\n", channelname, vmon, imon, temp1, pressure, rh1,picotempint, picorhint);
            
            
			// WRITING INFOS INTO THE ELOG
            //strcpy (stringaexec,"elog -h cms904cr1 -p 8080 -l 904lab -a Author=DAQ USER -a Type=""New configuration"" ");
            //strcat (stringaexec,"-a Subject=""Started Chamber HV SCAN"" ");
            //system(stringaexec);
		}
        
        
		ret_init = CAENHVDeinitSystem(name);
		//printf("\nDisconnecting from caen on %s \n",name);
	}
	else {
		//printf("Error connecting to the caen %s (num %d) \n",CAENHVGetError(name),ret_init);
	}
    // CLOSING FILES
    fflush(stream1);
    fclose(stream1);
    
    fflush(stream35);
    fclose(stream35);
    
    
}
