view code_part1/OSTC_code_c_part2/p2_main.c @ 116:14a074e1a375

Split C code, and use direct linking.
author JeanDo
date Sun, 26 Dec 2010 14:30:13 +0100
parents
children cb055a7d75f3
line wrap: on
line source

// **************************************************************
// ** main code for simulation / tests without assembler code  **
// ** This is NOT a part of the OSTC                           **
// **************************************************************

//////////////////////////////////////////////////////////////////////////////
// OSTC - diving computer code
// Copyright (C) 2008 HeinrichsWeikamp GbR
//
//    This program is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//    This program is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with this program.  If not, see <http://www.gnu.org/licenses/>.
//
//////////////////////////////////////////////////////////////////////////////
// history:
// 12/25/10 v110: [jDG] split in three files (deco.c, main.c, definitions.h)

#include <p18f4685.h>
#include <stdlib.h>

#include "p2_definitions.h"

// **************************************************
// ** Make sure to freeze ram banks used elsewhere **
// **************************************************

#pragma udata bank0=0x060
static const unsigned char keep_free_bank0[0xA0];   // used by the assembler code

#pragma udata bank1=0x100
static const unsigned char keep_free_bank1[256];    // used by the assembler code

#pragma udata bank7=0x700
const unsigned char keep_free_bank7[256];           // used by the assembler code (DD font2display)

// ********************************
// ** C O N F I G U R A T I O N  **
// ** for simulation without asm **
// ********************************
#pragma config OSC = IRCIO67
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRT = ON
#pragma config BOREN = OFF
#pragma config WDT = OFF
#pragma config WDTPS = 128
#pragma config MCLRE = ON
#pragma config LPT1OSC = OFF
#pragma config PBADEN = OFF
#pragma config DEBUG = OFF
#pragma config XINST = OFF
#pragma config LVP = OFF
#pragma config STVREN = OFF

// *************************
// ** P R O T O T Y P E S **
// *************************

void main(void);

// *******************************
// ** start                     **
// ** necessary for compilation **
// *******************************
#pragma romdata der_code = 0x0000
#pragma code der_start = 0x0000
void der_start(void)
{
_asm
	goto	main
_endasm
}

#pragma code main = 0x9000
#pragma udata
void main(void)
{
    static unsigned int i;
    static unsigned int debug_temp;
   
#if 1
// new main to test DR-5

char_I_deco_model = 0;

char_I_GF_Low_percentage = 100;
char_I_GF_High_percentage = 100;

deco_clear_CNS_fraction();
//char_I_const_ppO2 = 100;
//for (i=0;i<255;i++)
//{
//calc_CNS_fraction();
//} //for

int_I_pres_respiration = 1000;//980;
int_I_pres_surface = 1000;//980;
char_I_N2_ratio = 79; //38;
char_I_He_ratio = 0; //50;
char_I_deco_distance = 10; // 10 = 1 meter
char_I_depth_last_deco = 3;	// values below 3 (meter) are ignored

char_I_const_ppO2 = 0;
char_I_deco_ppO2_change = 0; // [dm] 10 = 1 meter
char_I_deco_ppO2 = 0;

char_I_deco_gas_change = 20; // [m] 1 = 1 meter
char_I_deco_N2_ratio = 50;
char_I_deco_He_ratio = 0;

char_I_deco_gas_change2 = 6; // [m] 1 = 1 meter
char_I_deco_N2_ratio2 = 0;
char_I_deco_He_ratio2 = 0;

char_I_deco_gas_change3 = 0; // [m] 1 = 1 meter
char_I_deco_gas_change4 = 0; // [m] 1 = 1 meter
char_I_deco_gas_change5 = 0; // [m] 1 = 1 meter

//char_I_actual_ppO2;					// 0x507
char_I_GF_High_percentage = 100;			// 0x514	new in v.102
char_I_GF_Low_percentage = 100;			// 0x515	new in v.102

char_I_saturation_multiplier = 110;
char_I_desaturation_multiplier = 90;
calc_hauptroutine_data_input();

deco_clear_tissue();

char_I_step_is_1min = 1;
int_I_pres_respiration = 4500 + int_I_pres_surface;

for (i=0;i<29;i++)
{
    deco_calc_hauptroutine();
}

char_I_step_is_1min = 0;
char_O_deco_status = 255;
while (char_O_deco_status)
	deco_calc_hauptroutine();
_asm
nop
_endasm

char_O_deco_status = 255;
while (char_O_deco_status)
	deco_calc_hauptroutine();
_asm
nop
_endasm

int_I_pres_respiration = 10000;
for (i=0;i<1500;i++)
{
    deco_calc_hauptroutine();
}

_asm
nop
_endasm


int_I_pres_respiration = 3000;
for (i=0;i<150;i++)
{
	calc_hauptroutine_data_input();
	calc_hauptroutine_update_tissues();
} //for

			update_startvalues();
			clear_decoarray();
			clear_internal_deco_table_GF();
			calc_hauptroutine_calc_ascend_to_deco();
 			if (char_O_deco_status > 15)		// can't go up to first deco, too deep to calculate in the given time slot
			{
				char_O_deco_status = 2;
//				char_O_lock_depth_list = 255;
			}
 			else
			{
//				char_O_lock_depth_list = lock_GF_depth_list;
				calc_hauptroutine_calc_deco();
			}
//			build_debug_output();

_asm
nop
_endasm
while (char_O_deco_status == 1)
{
			char_O_deco_status = 0;
//			char_O_lock_depth_list = 255;
			calc_hauptroutine_calc_deco();
//			build_debug_output();
_asm
nop
_endasm
};
debug_temp = 60; // [mtr Aufstieg in 10 mtr/min (30steps'2sec/min]
int_I_pres_respiration = 9980;
for (i=0;i<debug_temp;i++)
{
int_I_pres_respiration = int_I_pres_respiration - 33;
	calc_hauptroutine_data_input();
	calc_hauptroutine_update_tissues();
int_I_pres_respiration = int_I_pres_respiration - 33;
	calc_hauptroutine_data_input();
	calc_hauptroutine_update_tissues();
int_I_pres_respiration = int_I_pres_respiration - 34;
	calc_hauptroutine_data_input();
	calc_hauptroutine_update_tissues();
} //for
_asm
nop
_endasm

			update_startvalues();
			clear_decoarray();
			clear_internal_deco_table_GF();
			calc_hauptroutine_calc_ascend_to_deco();
 			if (char_O_deco_status > 15)		// can't go up to first deco, too deep to calculate in the given time slot
			{
				char_O_deco_status = 2;
//				char_O_lock_depth_list = 255;
			}
 			else
			{
//				char_O_lock_depth_list = lock_GF_depth_list;
				calc_hauptroutine_calc_deco();
			}
//			build_debug_output();

_asm
nop
_endasm
while (char_O_deco_status == 1)
{
			char_O_deco_status = 0;
//			char_O_lock_depth_list = 255;
			calc_hauptroutine_calc_deco();
//			build_debug_output();
_asm
nop
_endasm
};
_asm
nop
_endasm
debug_temp = 60; // [mtr Aufstieg in 10 mtr/min (30steps'2sec/min]
int_I_pres_respiration = 9980;
debug_temp = debug_temp * 3;
for (i=0;i<debug_temp;i++)
{
	calc_hauptroutine_data_input();
	calc_hauptroutine_update_tissues();
} //for
_asm
nop
_endasm
#endif
// -----------------------

} // main