gross hacks to allow CSV export of motor test stand data
[fw/altos] / altoslib / AltosEepromRecordFireTwo.java
1 /*
2  * Copyright © 2017 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17  */
18
19 package org.altusmetrum.altoslib_14;
20
21 import java.io.*;
22 import java.util.*;
23 import java.text.*;
24
25 public class AltosEepromRecordFireTwo extends AltosEepromRecord {
26         public static final int record_length = 32;
27
28         /* AO_LOG_FLIGHT elements */
29         public int flight() { return data16(0); }
30
31         /* AO_LOG_STATE elements */
32         public int state() { return data16(0); }
33         public int reason() { return data16(2); }
34
35         /* AO_LOG_SENSOR elements */
36         public int pres() { return data16(0); }
37         public int thrust() { return data16(2); }
38         public int temp(int i) { return data16(4+i*2); }
39
40         private static final double r_above = 5600.0;
41         private static final double r_below = 10000.0;
42         private static final double v_adc = 3.3;
43
44         private static double firetwo_adc(int raw) {
45                 return raw / 4095.0;
46         }
47
48         public static double adc_to_pa(int adc) {
49
50 //              /* 1600psi sensor measured 2019.04.30, these values based on that */
51 //              double ADC_MIN = 405;
52 //              double ADC_SLOPE = 1.95;
53
54                 /* 2500psi sensor measured 2019.04.30, these values based on that */
55                 double ADC_MIN = 392;
56                 double ADC_SLOPE = 0.46;        /* adc counts per psi */
57
58                 /* sensor is asserted to be linear 0 - max psi over ADC_MIN to ADC_MAX */
59                 double raw = adc;
60                 double psi = ((raw - ADC_MIN) / ADC_SLOPE);
61
62                 return AltosConvert.psi_to_pa(psi);
63
64         }
65
66         public static double adc_to_n(int adc) {
67
68                 /* sensor looks linear once it "gets going" */
69                 double ADC_MIN = 156;           /* first non-zero cal value */
70                 double ADC_SLOPE = 3.343;       /* adc counts per lb */
71                 double ADC_OFFSET = 26.5;       /* lbs at ADC_MIN */
72
73                 double raw = adc;
74                 double lb = ((raw - ADC_MIN) / ADC_SLOPE) + ADC_OFFSET;
75                 return AltosConvert.lb_to_n(lb);
76         }
77
78         public void provide_data(AltosDataListener listener, AltosCalData cal_data) {
79                 super.provide_data(listener, cal_data);
80
81                 switch (cmd()) {
82                 case AltosLib.AO_LOG_FLIGHT:
83                         cal_data.set_flight(flight());
84                         break;
85                 case AltosLib.AO_LOG_STATE:
86                         listener.set_state(state());
87                         break;
88                 case AltosLib.AO_LOG_SENSOR:
89                         listener.set_pressure(adc_to_pa(pres()));
90                         listener.set_thrust(adc_to_n(thrust()));
91                         break;
92                 }
93         }
94
95         public AltosEepromRecord next() {
96                 int     s = next_start();
97                 if (s < 0)
98                         return null;
99                 return new AltosEepromRecordFireTwo(eeprom, s);
100         }
101
102         public AltosEepromRecordFireTwo(AltosEeprom eeprom, int start) {
103                 super(eeprom, start, record_length);
104         }
105
106         public AltosEepromRecordFireTwo(AltosEeprom eeprom) {
107                 this(eeprom, 0);
108         }
109 }