diff 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 diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_c_part2/p2_main.c	Sun Dec 26 14:30:13 2010 +0100
@@ -0,0 +1,272 @@
+// **************************************************************
+// ** 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