#include "mcfg_dcm.h"

#include "mem_dcm.h"




#define NULLNV ((nvector)0)



uchar current_main_config_data[]= {
0x84,0x80,0x2e,0x00,0x02,0xd0,0xf7,0xd0,0xf0,0xd0,0xf6,0xd0,0x58,0xd1,0x1d,0xd9,
0x00,0x00,0x0c,0x7e,0x5e,0xd1,0x3f,0x3f,0xf4,0xd1,0x3f,0x00,0x71,0xc7,0x00,0x00,
0x00,0x00,0x00,0x00,0x07,0x08,0x07,0x07,0x08,0x08,0x07,0x07,0x05,0x05,0x08,0x08,
0x08,0x09,0x66,0x00,0x00,0x03,0x06,0x0a,0xff,0x00,0xfb,0xff,0x7e,0x02,0xc1,0x02,
0x00,0xf2,0x19,0xf2,0x32,0xf2,0xa0,0xf2,0x8f,0xf2,0x7e,0xf2,0x6d,0xf2,0x5c,0xf2,
0x4b,0xf2,0xb8,0xf1,0xc4,0xf1,0x8c,0xf1,0x8c,0xc8,0x9c,0xf1,0xc6,0xf2,0x07,0x08,
0x07,0x00,0x08,0x08,0x07,0x07,0x05,0x05,0x08,0x08,0x08,0x09,0x66,0x00 
};

/*  #define MCONFIG_SIZE sizeof(current_main_config_data)  */





int decom_mconfig(packet *pk,Mconfig *mcfg)
{
	uchar *u;
	uint2 crc0=96;
	int i;

	if(pk==0){
		u = current_main_config_data;  /* default configuration */
		mcfg->valid = 0;
	}
	else{
		u = pk->data;
		mcfg->valid =1;
	}

	mcfg->time = pk->time;

	mcfg->sst_mode_cmnd = u[0x1f];
	mcfg->sst_tst_cmnd = u[0x20];
	mcfg->sst_t_lut = u[0x21];
	mcfg->sst_o_lut = u[0x22];
	mcfg->sst_f_lut = u[0x23];
	mcfg->sst_thrf1 = u[0x24]+u[0x34];
	mcfg->sst_thrf5 = u[0x25]+u[0x34];
	mcfg->sst_thrf4 = u[0x26]+u[0x34];
	mcfg->sst_thrf3 = u[0x27]+u[0x34];
	mcfg->sst_thro1 = u[0x28]+u[0x34];
	mcfg->sst_thro5 = u[0x29]+u[0x34];
	mcfg->sst_thro4 = u[0x2a]+u[0x34];
	mcfg->sst_thro3 = u[0x2b]+u[0x34];
	mcfg->sst_thrf2 = u[0x2c]+u[0x34];
	mcfg->sst_thrf6 = u[0x2d]+u[0x34];
	mcfg->sst_thro2 = u[0x2e]+u[0x34];
	mcfg->sst_thro6 = u[0x2f]+u[0x34];
	mcfg->sst_thrt2 = u[0x30]+u[0x34];
	mcfg->sst_thrt6 = u[0x31]+u[0x34];
	mcfg->sst_hvref = u[0x32];
	mcfg->sst_tg_ref = u[0x33];
	mcfg->inst_crc = str_to_uint2(u + 0x5c);
	
	for(i=0;i<0x5c;i+=2)
		crc0 += str_to_uint2(u + i);

	if(mcfg->inst_crc == crc0)
			mcfg->valid = 1;
	else {
		mcfg->valid = 0;
		printf("SST Config Checksum Error at %s: expected %x: received %x\r\n",
			time_to_YMDHMS(pk->time),crc0,mcfg->inst_crc);
	}
	return(1);  
}

int4 mcfg_to_idl(int argc,void *argv[])
{
        mcfg_data *mcfg;
        Mconfig mc;
        int4 size,advance,index,*options,ok,i;
        double *time;
        static packet_selector pks;
        pklist *pkl;
        packet *pk;

        if(argc == 0)
                return( number_of_packets(M_CFG_ID, 0.,1e12) );
        if(argc != 3 && argc !=2){
                printf("Incorrect number of arguments\r\n");
                return(0);
        }
        options = (int4 *)argv[0];
        time = (double *)argv[1];
        mcfg = (mcfg_data *)argv[2];
        

        size =  options[0];
        advance = options[1];
        index   = options[2];

        if(argc ==2){
            ok = get_time_points(M_CFG_ID,size,time);
            return(ok);
        }

        if(size != sizeof(mcfg_data)){
            printf("Incorrect structure size %d (should be %d).  Aborting.\r\n",size,sizeof(mcfg_data));
            return(0);
        }
	
        if (advance ) {
            SET_PKS_BY_INDEX(pks,pks.index+advance,M_CFG_ID) ;
        }
        else if (index < 0) {    /* negative index means get by time*/
            SET_PKS_BY_LASTT(pks,time[0],M_CFG_ID) ;
        }
        else {
            SET_PKS_BY_INDEX(pks,index,M_CFG_ID) ;
        }
	
	pk = get_packet(&pks);
	mcfg->time = pk->time;
	mcfg->index = pks.index;
	
	for (i=0; i<92; i++)
		mcfg->data[i] = pk->data[i];
	
	decom_mconfig(pk,&mc);
	
	mcfg->valid = mc.valid;

        return(1);

}