summaryrefslogtreecommitdiffstats
path: root/cochran_emc.h
blob: 46a56fe68380cb9fbb92fbd0266c5cbe3d148f1f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/*
 * subsurface
 *
 * Copyright (C) 2014 John Van Ostrand
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301 USA
 */

// 512 bytes for each dive in the log book
struct cochran_emc_log_t {
	// Pre-dive 256 bytes
	unsigned char seconds, minutes, hour;		// 3 bytes
	unsigned char day, month, year;				// 3 bytes
	unsigned char sample_start_offset[4];		// 4 bytes
	unsigned char start_timestamp[4];			// 4 bytes [secs from jan 1,92]
	unsigned char pre_dive_timestamp[4];		// 4 bytes [secs from Jan 1,92]
	unsigned char unknown1[6];					// 6 bytes
	unsigned char water_conductivity;			// 1 byte  [0 =low, 2-high]
	unsigned char unknown2[5];					// 5 bytes
//30
	unsigned char sample_pre_event_offset[4];	// 4 bytes
	unsigned char config_bitfield[6];			// 6 bytes
	unsigned char unknown3[2];					// 2 bytes
	unsigned char start_depth[2];				// 2 bytes [/256]
	unsigned char unknown4[2];					// 2 bytes
	unsigned char start_battery_voltage[2];		// 2 bytes [/256]
//48
	unsigned char unknown5[7];					// 7 bytes
	unsigned char start_temperature;			// 1 byte  [F]
	unsigned char unknown6[28];					// 28 bytes
	unsigned char sit[2];						// 2 bytes [minutes]
	unsigned char number[2];					// 2 bytes
	unsigned char unknown7[1]; 					// 1 bytes
	unsigned char altitude;						// 1 byte [/4 = kft]
	unsigned char start_nofly[2];				// 2 bytes [/256 = hours]
//92
	unsigned char unknown8[18]; 				// 18 bytes
	unsigned char post_dive_sit[2];				// 2 bytes  [seconds]
	unsigned char po2_set_point[9][2];			// 18 bytes	[/256 = %]
	unsigned char unknown9[12]; 				// 12 bytes
	unsigned char po2_alarm[2]; 				// 2 bytes  [/256 = %]
//144
	unsigned char o2_percent[10][2];			// 20 bytes	[/256 = %]
	unsigned char he_percent[10][2];			// 20 bytes	[/256 = %]
	unsigned char alarm_depth[2];				// 2 bytes
	unsigned char unknown10[14]; 				// 14 bytes
	unsigned char conservatism;					// 1 bytes [/256 = fraction]
	unsigned char unknown11[2];					// 2 bytes
	unsigned char repetitive_dive;				// 1 byte
	unsigned char unknown12[12];				// 12 bytes
	unsigned char start_tissue_nsat[20][2];		// 40 bytes [/256]

	// Post-dive 256 bytes
	unsigned char sample_end_offset[4];			// 4 bytes
	unsigned char unknown13[33];				// 33 bytes
	unsigned char temp;							// 1 byte  [F]
	unsigned char unknown14[10];				// 10 bytes
// 48
	unsigned char bt[2];						// 2 bytes [minutes]
	unsigned char max_depth[2];					// 2 bytes [/4 = ft]
	unsigned char unknown15[2];					// 2 bytes
	unsigned char avg_depth[2];					// 2 bytes [/4 = ft]
	unsigned char min_ndc[2];					// 2 bytes [minutes]
	unsigned char min_ndx_bt[2];				// 2 bytes [minutes]
	unsigned char max_forecast_deco[2];			// 2 bytes [minutes]
	unsigned char max_forecast_deco_bt[2];		// 2 bytes [minutes]
//64
	unsigned char max_ceiling[2];				// 2 bytes [*10 = ft]
	unsigned char max_ceiling_bt[2];			// 2 bytes [minutes]
	unsigned char unknown16[10];				// 18 bytes
	unsigned char max_ascent_rate; 				// 1 byte  [ft/min]
	unsigned char unknown17[3];					// 3 bytes
	unsigned char max_ascent_rate_bt[2];		// 2 bytes [seconds]
//84
	unsigned char unknown18[54];				// 54 bytes
//138
	unsigned char end_battery_voltage[2];		// 2 bytes [/256 = v]
	unsigned char unknown19[8];					// 8 bytes
	unsigned char min_temp_bt[2];    			// 2 bytes [seconds]
//150
	unsigned char unknown20[22];				// 22 bytes
//172
	unsigned char end_nofly[2];					// 2 bytes	[/256 = hours]
	unsigned char alarm_count[2];				// 2 byte
	unsigned char actual_deco_time[2];			// 2 bytes [seconds]
//178
	unsigned char unknown21[38];				// 38 bytes
//216
	unsigned char end_tissue_nsat[20][2];		// 40 bytes [/256 = fraction]
} __attribute__((packed));

typedef enum cochran_emc_bitfield_config_t {
	BF_TEMP_DEPENDENT_N2,
	BF_ASCENT_RATE_BAR_GRAPH,
	BF_BLEND_2_SWITCHING,
	BF_ALTITUDE_AS_ONE_ZONE,
	BF_DECOMPRESSION_TIME_DISPLAY,
	BF_BLEND_3_SWITCHING,
	BF_VARIABLE_ASCENT_RATE_ALARM,
	BF_ASCENT_RATE_RESPONSE,
	BF_REPETITIVE_DIVE_DEPENDENT_N2,
	BF_TRAINING_MODE,
	BF_CONSTANT_MODE_COMPUTATIONS,
	BF_DISPLAYED_UNITS,
	BF_AUDIBLE_ALARM,
	BF_CLOCK,
	BF_CEILING_DISPLAY_DIV_BY_10,
	BF_GAS_2_AS_FIRST_GAS,
	BF_ENABLE_HELIUM_COMPUTATIONS,
	BF_AUTOMATIC_PO2_FO2_SWITCHING,
	BF_TOUCH_PROGRAMMING_PO2_FO2_SWITCH,
} cochran_emc_bitfield_config_t;


struct cochran_emc_bitfield_t {
	cochran_emc_bitfield_config_t config;
	unsigned char word;
	unsigned char byte;
	unsigned char mask;
	unsigned char shift;
} cochran_emc_bitfield_t;

static struct cochran_emc_bitfield_t cochran_emc_bits[] = {
// Word BD
	{ BF_TEMP_DEPENDENT_N2, 0xBD, 0, 0x40, 6 }, 			// 0=normal, 1=reduced
	{ BF_ASCENT_RATE_BAR_GRAPH, 0xBD, 0, 0x20, 5 },			// 0=fixed, 1=proportional
	{ BF_BLEND_2_SWITCHING, 0xBD, 0, 0x04, 2 },			// 0=dis, 1=ena
	{ BF_ALTITUDE_AS_ONE_ZONE, 0xBD, 0, 0x02, 1},			// 0=off, 1=on

	{ BF_DECOMPRESSION_TIME_DISPLAY, 0xBD, 1, 0xC0, 5},		// 111=both, 011=stop, 001=total
	{ BF_BLEND_3_SWITCHING, 0xBD, 1, 0x10, 4 },			// 0=dis, 1=ena
	{ BF_VARIABLE_ASCENT_RATE_ALARM, 0xBD, 1, 0x04, 3},		// 0=off, 1=on
	{ BF_ASCENT_RATE_RESPONSE, 0xBD, 1, 0x07, 0},

//WORD BE
	{ BF_REPETITIVE_DIVE_DEPENDENT_N2, 0xBE, 0, 0x80, 7 },		// 0=off, 1=on
	{ BF_TRAINING_MODE, 0xBE, 0, 0x04, 2 }, 			// 0=off, 1=on
	{ BF_CONSTANT_MODE_COMPUTATIONS, 0xBE, 0, 0x04, 2 },		// 0=FO2, 1=PO2
	{ BF_DISPLAYED_UNITS, 0xBE, 0, 0x01, 0 },			// 1=metric, 0=imperial

// WORD BF
	{ BF_AUDIBLE_ALARM, 0xBF, 0, 0x40, 6 }, 			// 0=on, 1=off ***
	{ BF_CLOCK, 0xBF, 0, 0x20, 5 },					// 0=off, 1=on
	{ BF_CEILING_DISPLAY_DIV_BY_10, 0xBF, 0, 0x10, 4 },		// 0=off, 1=on
	{ BF_GAS_2_AS_FIRST_GAS, 0xBF, 0, 0x02, 1 },			// 0=dis, 1=ena
	{ BF_ENABLE_HELIUM_COMPUTATIONS, 0xBF, 0, 0x01, 0 },		// 0=dis, 1=ena

	{ BF_AUTOMATIC_PO2_FO2_SWITCHING, 0xBF, 1, 0x04, 2 },		// 0=dis, 1=ena
	{ BF_TOUCH_PROGRAMMING_PO2_FO2_SWITCH, 0xBF, 1, 0x02, 1 },	// 0=dis, 1=ena
};

struct cochran_emc_config1_t {
	unsigned char unknown1[209];
	unsigned short int dive_count;
	unsigned char unknown2[274];
	unsigned short int serial_num;
	unsigned char unknown3[24];
} __attribute__((packed));