/****************************************************************/
/*			    	  		TMS320C32							*/
/* 	======             BIOS, ÊËÀÈÍ, ÊËÂÑÏ              ====== 	*/
/* 	 		   		ÖÍÈÈ ÑÝÒ	  (ñ) 1998-2001ã.				*/
/****************************************************************/
/*   log_to_mem.c
 ****************************************************************
 *					Çàïèñü ëîãîâ â ïàìyòü						*
 ****************************************************************/

#include <log_to_mem.h>

#include "MemoryFunctions.h"


// ïåðåìåííûå èñïîëüçóåìûå òîëüêî â ýòîì ìîäóëå
// Ïåðåìåííûå èç ï/ï logs_data(), write_to_mem è clear_mem
// Íà÷àëüíûé àäðåñ ïàìyòè äëy çàïèñè ëîãîâ (ñì. ï/ï write_to_mem)
//#pragma DATA_SECTION(count_mem,".fast_vars");
//static long count_mem = START_ADDRESS_LOG;

#pragma DATA_SECTION(count_mem_slow,".fast_vars");
static long count_mem_slow = START_ADDRESS_LOG_SLOW; 


// Îáyçàòåëüíîå íà÷àëüíîå çíà÷åíèå èíà÷å ïîðyäîê çàïèñè 
// íàðóøàåòñy ïðè ïåðâîì çààïîëíåíèè áóôåðà
int hb_logs_data = 0;
#pragma DATA_SECTION(stop_log,".fast_vars");   
int stop_log = 0;   
int stop_log_slow = 0;   


#pragma DATA_SECTION(logpar,".fast_vars");
LOGSPARAMS logpar = LOGSPARAMS_DEFAULTS;

#pragma DATA_SECTION(no_write,".fast_vars");
int no_write = 0; // Ôëàã, ÷òîáû íå ïèñàòü (åñëè ÷òî)
#pragma DATA_SECTION(no_write_slow,".fast_vars");
int no_write_slow = 0; // Ôëàã, ÷òîáû íå ïèñàòü (åñëè ÷òî)

#pragma CODE_SECTION(clear_logpar,".fast_run");
void clear_logpar() {
    logpar.log1 = 0;
    logpar.log2 = 0;
    logpar.log3 = 0;
    logpar.log4 = 0;
    logpar.log5 = 0;
    logpar.log6 = 0;
    logpar.log7 = 0;
    logpar.log8 = 0;
    logpar.log9 = 0;
    logpar.log10 = 0;
    logpar.log11 = 0;
    logpar.log12 = 0;
    logpar.log13 = 0;
    logpar.log14 = 0;
    logpar.log15 = 0;
    logpar.log16 = 0;
    logpar.log17 = 0;
    logpar.log18 = 0;
    logpar.log19 = 0;
    logpar.log20 = 0;
}

// Çàïèñü äâóõ ìëàäøèõ áàéòîâ àðãóìåíòà â ïàìyòü, ãäå ëîãè ëåæàò
#pragma CODE_SECTION(write_to_mem,".fast_run");
void write_to_mem(int tlog,int DataM)
{
//  int DataT;

	if (tlog==FAST_LOG)
	{
        if (no_write) return;

        if (logpar.stop_log_level_1) return;

        if (logpar.addres_mem >= END_ADDRESS_LOG) logpar.addres_mem = END_ADDRESS_LOG;

        i_WriteMemory(logpar.addres_mem,DataM);
        //	*(int *)logpar.count_mem = ((DataM & 0xFFFF) );
        logpar.addres_mem++;
	}

	if (tlog==SLOW_LOG)
	{
        if (no_write_slow) return;

        if (logpar.stop_log_slow_level_1) return;

        if (count_mem_slow >= END_ADDRESS_LOG_SLOW) count_mem_slow = END_ADDRESS_LOG_SLOW;

        i_WriteMemory(count_mem_slow,DataM);
        //	*(int *)logpar.count_mem = ((DataM & 0xFFFF) );
        count_mem_slow++;
	}

	


}


#pragma CODE_SECTION(test_mem_limit,".fast_run");
void test_mem_limit(int tlog,int ciclelog)
{
	if (tlog==FAST_LOG)
	{
		if( logpar.addres_mem >= (END_ADDRESS_LOG - LENGTH_HAZARD))
		{
		    logpar.real_finish_addres_mem = logpar.addres_mem;

			if (ciclelog==1)
			{
				stop_log = 0;
				logpar.stop_log_level_1=0;
				logpar.addres_mem = START_ADDRESS_LOG;
			}
			else
			{
				stop_log = 1;
				logpar.stop_log_level_1=1;
			}
		}
		
		if( logpar.addres_mem >= (END_ADDRESS_LOG_LEVEL_2))
		{
			logpar.stop_log_level_2=1;
		}
		else
		{
			logpar.stop_log_level_2=0;
		}
		
		if( logpar.addres_mem >= (END_ADDRESS_LOG_LEVEL_3))
		{
			logpar.stop_log_level_3=1;
		}
		else
		{
			logpar.stop_log_level_3=0;
		}
	}
	else
	{
		if (tlog==SLOW_LOG)
		{
			if (ciclelog==1)
			{
				logpar.stop_log_slow_level_1=0;
			}
			
			if( count_mem_slow >= (END_ADDRESS_LOG_SLOW - LENGTH_HAZARD))
			{
				if (ciclelog==1)
				{
					stop_log_slow = 0;
					logpar.stop_log_slow_level_1=0;
					count_mem_slow = START_ADDRESS_LOG_SLOW;
				}
				else
				{
					stop_log_slow = 1;
					logpar.stop_log_slow_level_1=1;
				}
			}
			
			if( count_mem_slow >= (END_ADDRESS_LOG_SLOW_LEVEL_2))
			{
				logpar.stop_log_slow_level_2=1;
			}
			else
			{
				logpar.stop_log_slow_level_2=0;
			}
			
			if( count_mem_slow >= (END_ADDRESS_LOG_SLOW_LEVEL_3))
			{
				logpar.stop_log_slow_level_3=1;
			}
			else
			{
				logpar.stop_log_slow_level_3=0;
			}
		}
	}
}



// Î÷èùåíèå ïàìyòè, ãäå ëîãè ëåæàò
void clear_mem(int tlog)
{
	if (tlog==FAST_LOG)
	{
	    logpar.real_finish_addres_mem = 0;

        for (logpar.addres_mem=START_ADDRESS_LOG; logpar.addres_mem<END_ADDRESS_LOG; logpar.addres_mem++)//END_ADDRESS_LOG; logpar.count_mem++)
            i_WriteMemory(logpar.addres_mem,0x0);

        logpar.addres_mem = START_ADDRESS_LOG;
        hb_logs_data = 0;
        stop_log = 0;

        logpar.stop_log_level_1=0;
        logpar.stop_log_level_2=0;
        logpar.stop_log_level_3=0;
        logpar.start_write_fast_log = 1;
	}

	if (tlog==SLOW_LOG)
	{

        for (count_mem_slow=START_ADDRESS_LOG_SLOW; count_mem_slow<END_ADDRESS_LOG_SLOW; count_mem_slow++)
        i_WriteMemory(count_mem_slow,0x0);

        count_mem_slow = START_ADDRESS_LOG_SLOW;
        hb_logs_data = 0;
        stop_log_slow = 0;

        logpar.stop_log_slow_level_1=0;
        logpar.stop_log_slow_level_2=0;
        logpar.stop_log_slow_level_3=0;
	}

}



// Âûñòàâëåíèå ïîçèöèè ëîãîâ â íà÷àëî
void set_start_mem(int tlog)
{

	if (tlog==FAST_LOG)
	{

	    logpar.real_finish_addres_mem = 0;
        logpar.addres_mem = START_ADDRESS_LOG;
        hb_logs_data = 0;
        stop_log = 0;

        logpar.stop_log_level_1=0;
        logpar.stop_log_level_2=0;
        logpar.stop_log_level_3=0;
	}


	if (tlog==SLOW_LOG)
	{

        count_mem_slow = START_ADDRESS_LOG_SLOW;
        hb_logs_data = 0;
        stop_log_slow = 0;

        logpar.stop_log_slow_level_1=0;
        logpar.stop_log_slow_level_2=0;
        logpar.stop_log_slow_level_3=0;
	}


}

void get_log_params_count(void) {
    logpar.count_log_params_fast_log = logpar.addres_mem - START_ADDRESS_LOG;
}