| Linduino 1.3.0 Linear Technology Arduino-Compatible Demonstration Board

LT_3883FaultLog.cpp
Go to the documentation of this file.
1 /*!
2 LTC SMBus Support: API for a LTC3883 Fault Log
3
4 @verbatim
5
6 This API is shared with Linduino and RTOS code. End users should code to this
7 API to enable use of the PMBus code without modifications.
8
9 @endverbatim
10
11
12 Copyright 2018(c) Analog Devices, Inc.
13
14 All rights reserved.
15
16 Redistribution and use in source and binary forms, with or without
17 modification, are permitted provided that the following conditions are met:
18 - Redistributions of source code must retain the above copyright
19 notice, this list of conditions and the following disclaimer.
20 - Redistributions in binary form must reproduce the above copyright
21 notice, this list of conditions and the following disclaimer in
22 the documentation and/or other materials provided with the
23 distribution.
24 - Neither the name of Analog Devices, Inc. nor the names of its
25 contributors may be used to endorse or promote products derived
26 from this software without specific prior written permission.
27 - The use of this software may or may not infringe the patent rights
28 of one or more patent holders. This license does not release you
29 from the requirement that you obtain separate licenses from these
30 patent holders to use this software.
31 - Use of the software either in source or binary form, must be run
32 on or directly connected to an Analog Devices Inc. component.
33
34 THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR
35 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT,
36 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
37 IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT,
38 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
39 LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR
40 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
41 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
42 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
43 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
44 */
45
46 //! @ingroup PMBus_SMBus
47 //! {@
48 //! @defgroup LT_3883FaultLog LT_3883FaultLog
49 //! @}
50
51 /*! @file
52 @ingroup LT_3883FaultLog
53 Library Header File for LT_3883FaultLog
54 */
55
56 #include <Arduino.h>
57 #include "LT_3883FaultLog.h"
58
59 #define RAW_EEPROM
60
61 LT_3883FaultLog::LT_3883FaultLog(LT_PMBus *pmbus):LT_EEDataFaultLog(pmbus)
62 {
63 faultLog3883 = NULL;
64
65 buffer = NULL;
66 }
67
68
69 /*
70 * Read LTC3883 fault log
71 *
72 * address: PMBUS address
73 */
74 void
75 LT_3883FaultLog::read(uint8_t address)
76 {
77 #ifdef RAW_EEPROM
78 uint8_t *data = (uint8_t *) malloc(sizeof(uint8_t) * 80 * 2); // Becuse CRC is stripped, the acutal data size is smaller
79
80 getNvmBlock(address, 176, 80, 0x00, data);
81 #else
82 uint8_t *data = (uint8_t *) malloc(147);
83 data[0] = 0x00;
84
85 pmbus_->smbus()->readBlock(address, MFR_FAULT_LOG, data, 147);
86 #endif
87
88 faultLog3883 = (struct LT_3883FaultLog::FaultLogLtc3883 *) (data);
89 }
90
91 void LT_3883FaultLog::release()
92 {
93 free(faultLog3883);
94 faultLog3883 = 0;
95 }
96
97 uint8_t *LT_3883FaultLog::getBinary()
98 {
99 return (uint8_t *)faultLog3883;
100 }
101
102 uint16_t LT_3883FaultLog::getBinarySize()
103 {
104 return 147;
105 }
106
107 void LT_3883FaultLog::dumpBinary(Print *printer)
108 {
109 dumpBin(printer, (uint8_t *)faultLog3883, 147);
110 }
111
112 void LT_3883FaultLog::print(Print *printer)
113 {
114 if (printer == 0)
115 printer = &Serial;
116 buffer = new char[FILE_TEXT_LINE_MAX];
117
118 printTitle(printer);
119
120 printTime(printer);
121
122 printPeaks(printer);
123
124 printAllLoops(printer);
125
126
127 delete [] buffer;
128 }
129
130
131 void LT_3883FaultLog::printTitle(Print *printer)
132 {
133 printer->print(F("LTC3883 Log Data\n"));
134
135 uint8_t position = faultLog3883->preamble.position_fault;
136 switch (position)
137 {
138 case 0xFF :
139 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position MFR_FAULT_LOG_STORE\n"));
140 break;
141 case 0x00 :
142 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position TON_MAX_FAULT Channel 0\n"));
143 break;
144 case 0x01 :
145 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position VOUT_OV_FAULT Channel 0\n"));
146 break;
147 case 0x02 :
148 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position VOUT_UV_FAULT Channel 0\n"));
149 break;
150 case 0x03 :
151 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position IOUT_OC_FAULT Channel 0\n"));
152 break;
153 case 0x05 :
154 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position OT_FAULT Channel 0\n"));
155 break;
156 case 0x06 :
157 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position UT_FAULT Channel 0\n"));
158 break;
159 case 0x07 :
160 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position VIN_OV_FAULT Channel 0\n"));
161 break;
162 case 0x0A :
163 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position MFR_OT_FAULT Channel 0\n"));
164 break;
165 case 0x10 :
166 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position TON_MAX_FAULT Channel 1\n"));
167 break;
168 case 0x11 :
169 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position VOUT_OV_FAULT Channel 1\n"));
170 break;
171 case 0x12 :
172 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position VOUT_UV_FAULT Channel 1\n"));
173 break;
174 case 0x13 :
175 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position IOUT_OC_FAULT Channel 1\n"));
176 break;
177 case 0x15 :
178 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position OT_FAULT Channel 1\n"));
179 break;
180 case 0x16 :
181 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position UT_FAULT Channel 1\n"));
182 break;
183 case 0x17 :
184 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position VIN_OV_FAULT Channel 1\n"));
185 break;
186 case 0x1A :
187 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position MFR_OT_FAULT Channel 1\n"));
188 break;
189 }
190
191 printer->print(buffer);
192 }
193
194 void LT_3883FaultLog::printTime(Print *printer)
195 {
196 uint8_t *time = (uint8_t *)&faultLog3883->preamble.shared_time;
197 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Time 0x%02x%02x%02x%02x%02x%02x\n"), time[5], time[4], time[3], time[2], time[1], time[0]);
198 printer->print(buffer);
199 printer->print((long) getSharedTime200us(faultLog3883->preamble.shared_time));
200 printer->println(F(" Ticks (200us each)"));
201 }
202
203 void LT_3883FaultLog::printPeaks(Print *printer)
204 {
205 printer->println(F("\nHeader Information:\n--------"));
206
207 printer->print(F("VOUT Peak 0 "));
208 printer->println(math_.lin16_to_float(getLin16WordReverseVal(faultLog3883->preamble.peaks.mfr_vout_peak_p0), 0x14), 6);
209 printer->print(F("IOUT Peak "));
210 printer->println(math_.lin11_to_float(getLin5_11WordReverseVal(faultLog3883->preamble.peaks.mfr_iout_peak_p0)), 6);
211 printer->print(F("IIN Peak 0 "));
212 printer->println(math_.lin11_to_float(getLin5_11WordReverseVal(faultLog3883->preamble.peaks.mfr_iin_peak_p0)), 6);
213 printer->print(F("VIN Peak "));
214 printer->println(math_.lin11_to_float(getLin5_11WordReverseVal(faultLog3883->preamble.peaks.mfr_vin_peak)), 6);
215 printer->print(F("Temp External Last Event Page 0 "));
216 printer->println(math_.lin11_to_float(getLin5_11WordReverseVal(faultLog3883->preamble.peaks.read_temperature_1_p0)), 6);
217 printer->print(F("Temp Internal Last Event "));
218 printer->println(math_.lin11_to_float(getLin5_11WordReverseVal(faultLog3883->preamble.peaks.read_temperature_2)), 6);
219 printer->print(F("Temp External Peak Page 0 "));
220 printer->println(math_.lin11_to_float(getLin5_11WordReverseVal(faultLog3883->preamble.peaks.read_temperature_1_peak_p0)), 6);
221 }
222
223 void LT_3883FaultLog::printAllLoops(Print *printer)
224 {
225 printer->println(F("\nFault Log Loops Follow:"));
226 printer->println(F("(most recent data first)"));
227
228 for (int index = 0; index < 6; index++)
229 {
230 printLoop(index, printer);
231 }
232 }
233
234 void LT_3883FaultLog::printLoop(uint8_t index, Print *printer)
235 {
236 printer->println(F("-------"));
237 printer->print(F("Loop: "));
238 printer->println(index);
239 printer->println(F("-------"));
240
241 printer->print(F("Input: "));
242 printer->print(math_.lin11_to_float(getLin5_11WordReverseVal(faultLog3883->fault_log_loop[index].read_vin)), 6);
243 printer->print(F(" V, "));
244 printer->print(math_.lin11_to_float(getLin5_11WordReverseVal(faultLog3883->fault_log_loop[index].read_iin)), 6);
245 printer->println(F(" A"));
246 printer->print(F("Chan0: "));
247 printer->print(math_.lin16_to_float(getLin16WordReverseVal(faultLog3883->fault_log_loop[index].read_vout_p0), 0x14), 6);
248 printer->print(F(" V, "));
249 printer->print(math_.lin11_to_float(getLin5_11WordReverseVal(faultLog3883->fault_log_loop[index].read_iout_p0)), 6);
250 printer->println(F(" A"));
251 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR(" STATUS_VOUT: 0x%02x\n"), getRawByteVal(faultLog3883->fault_log_loop[index].status_vout_p0));
252 printer->print(buffer);
253 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR(" STATUS_MFR_SPECIFIC: 0x%02x\n"), getRawByteVal(faultLog3883->fault_log_loop[index].status_mfr_specificP0));
254 printer->print(buffer);
255 snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR(" STATUS_WORD: 0x%04x\n"), getRawWordReverseVal(faultLog3883->fault_log_loop[index].status_word_p0));
256 printer->print(buffer);
257 }
LT_3883FaultLog::FaultLogReadLoopLtc3883::read_iin
struct Lin5_11WordReverse read_iin
Definition: LT_3883FaultLog.h:107
LT_3883FaultLog::FaultLogReadLoopLtc3883::read_vin
struct Lin5_11WordReverse read_vin
Definition: LT_3883FaultLog.h:106
LT_FaultLog::getLin5_11WordReverseVal
uint16_t getLin5_11WordReverseVal(Lin5_11WordReverse value)
Definition: LT_FaultLog.cpp:291
LT_FaultLog::dumpBin
void dumpBin(Print *printer, uint8_t *log, uint8_t size)
Definition: LT_FaultLog.cpp:217
LT_3883FaultLog::FaultLogTelemetrySummaryLtc3883::mfr_vout_peak_p0
struct Lin16WordReverse mfr_vout_peak_p0
Definition: LT_3883FaultLog.h:75
MFR_FAULT_LOG
#define MFR_FAULT_LOG
Definition: LT_PMBus.h:140
LT_3883FaultLog::FaultLogReadLoopLtc3883::status_vout_p0
struct RawByte status_vout_p0
Definition: LT_3883FaultLog.h:109
LT_PMBusMath::lin16_to_float
float lin16_to_float(lin16_t lin16_mant, lin16m_t vout_mode)
Definition: LT_PMBusMath.cpp:435
LT_FaultLog::getRawWordReverseVal
uint16_t getRawWordReverseVal(RawWordReverse value)
Definition: LT_FaultLog.cpp:279
LT_3883FaultLog::read
void read(uint8_t address)
Reads the fault log from the specified address, reserves memory to hold the data. ...
Definition: LT_3883FaultLog.cpp:75
LT_3883FaultLog::getBinarySize
uint16_t getBinarySize()
Get size of binary data.
Definition: LT_3883FaultLog.cpp:102
LT_3883FaultLog::getBinary
uint8_t * getBinary()
Get binary of the fault log or NULL if no log.
Definition: LT_3883FaultLog.cpp:97
LT_3883FaultLog::FaultLogLtc3883::preamble
struct FaultLogPreambleLtc3883 preamble
Definition: LT_3883FaultLog.h:122
LT_3883FaultLog::FaultLogTelemetrySummaryLtc3883::mfr_vin_peak
struct Lin5_11WordReverse mfr_vin_peak
Definition: LT_3883FaultLog.h:81
math_
LT_PMBusMath math_
Definition: LT_PMBusMath.cpp:460
LT_3883FaultLog::FaultLogReadLoopLtc3883::read_iout_p0
struct Lin5_11WordReverse read_iout_p0
Definition: LT_3883FaultLog.h:103
pmbus
static LT_PMBus * pmbus
Definition: DC2875A.ino:82
LT_PMBusMath::lin11_to_float
float lin11_to_float(lin11_t xin)
Definition: LT_PMBusMath.cpp:427
FILE_TEXT_LINE_MAX
#define FILE_TEXT_LINE_MAX
Definition: LT_FaultLog.h:60
LT_FaultLog::pmbus_
LT_PMBus * pmbus_
Definition: LT_FaultLog.h:129
address
static uint8_t address
Definition: DC2091A.ino:83
data
union LT_union_int32_4bytes data
Definition: DC2094A.ino:138
LT_3883FaultLog::FaultLogLtc3883::fault_log_loop
struct FaultLogReadLoopLtc3883 fault_log_loop[6]
Definition: LT_3883FaultLog.h:123
LT_3883FaultLog::FaultLogPreambleLtc3883::peaks
struct FaultLogTelemetrySummaryLtc3883 peaks
Definition: LT_3883FaultLog.h:94
LT_3883FaultLog::print
void print(Print *printer=0)
Pretty prints this part&#39;s fault log to a Print inheriting object, or Serial if none specified...
Definition: LT_3883FaultLog.cpp:112
LT_3883FaultLog::FaultLogReadLoopLtc3883::status_mfr_specificP0
struct RawByte status_mfr_specificP0
Definition: LT_3883FaultLog.h:115
LT_EEDataFaultLog::getNvmBlock
void getNvmBlock(uint8_t address, uint16_t offset, uint16_t numWords, uint8_t command, uint8_t *data)
Definition: LT_EEDataFaultLog.h:65
LT_3883FaultLog::FaultLogTelemetrySummaryLtc3883::mfr_iout_peak_p0
struct Lin5_11WordReverse mfr_iout_peak_p0
Definition: LT_3883FaultLog.h:78
LT_3883FaultLog::FaultLogReadLoopLtc3883::status_word_p0
struct RawWordReverse status_word_p0
Definition: LT_3883FaultLog.h:112
LT_3883FaultLog::dumpBinary
void dumpBinary(Print *printer=0)
Dumps binary of the fault log to a Print inheriting object, or Serial if none specified.
Definition: LT_3883FaultLog.cpp:107
LT_3883FaultLog::FaultLogTelemetrySummaryLtc3883::read_temperature_2
struct Lin5_11WordReverse read_temperature_2
Definition: LT_3883FaultLog.h:84
LT_3883FaultLog::FaultLogPreambleLtc3883::position_fault
uint8_t position_fault
Definition: LT_3883FaultLog.h:92
LT_PMBus::smbus
LT_SMBus * smbus()
Definition: LT_PMBus.h:401
LT_EEDataFaultLog
Definition: LT_EEDataFaultLog.h:56
LT_FaultLog::getSharedTime200us
uint64_t getSharedTime200us(FaultLogTimeStamp time_stamp)
Definition: LT_FaultLog.cpp:247
LT_3883FaultLog::faultLog3883
FaultLogLtc3883 * faultLog3883
Definition: LT_3883FaultLog.h:129
LT_3883FaultLog::FaultLogTelemetrySummaryLtc3883::read_temperature_1_p0
struct Lin5_11WordReverse read_temperature_1_p0
Definition: LT_3883FaultLog.h:82
index
static int index
Definition: device_logger.ino:91
LT_SMBus::readBlock
virtual uint8_t readBlock(uint8_t address, uint8_t command, uint8_t *block, uint16_t block_size)=0
SMBus read block command.
LT_3883FaultLog::release
void release()
Frees the memory reserved for the fault log.
Definition: LT_3883FaultLog.cpp:91
LT_FaultLog::getRawByteVal
uint8_t getRawByteVal(RawByte value)
Definition: LT_FaultLog.cpp:267
LT_3883FaultLog.h
LTC SMBus Support: Implementation for a LTC3883 Fault Log.
LT_FaultLog::getLin16WordReverseVal
uint16_t getLin16WordReverseVal(Lin16WordReverse value)
Definition: LT_FaultLog.cpp:303
LT_3883FaultLog::FaultLogTelemetrySummaryLtc3883::read_temperature_1_peak_p0
struct Lin5_11WordReverse read_temperature_1_peak_p0
Definition: LT_3883FaultLog.h:85
LT_3883FaultLog::FaultLogTelemetrySummaryLtc3883::mfr_iin_peak_p0
struct Lin5_11WordReverse mfr_iin_peak_p0
Definition: LT_3883FaultLog.h:79
LT_3883FaultLog::FaultLogReadLoopLtc3883::read_vout_p0
struct Lin16WordReverse read_vout_p0
Definition: LT_3883FaultLog.h:100
LT_3883FaultLog::LT_3883FaultLog
LT_3883FaultLog(LT_PMBus *pmbus)
Constructor.
Definition: LT_3883FaultLog.cpp:61
LT_3883FaultLog::FaultLogPreambleLtc3883::shared_time
struct FaultLogTimeStamp shared_time
Definition: LT_3883FaultLog.h:93
LT_PMBus
PMBus communication.
Definition: LT_PMBus.h:370
LT_3883FaultLog::FaultLogLtc3883
Definition: LT_3883FaultLog.h:119