Linduino  1.3.0
Linear Technology Arduino-Compatible Demonstration Board
LT_3887FaultLog.cpp
Go to the documentation of this file.
1 /*!
2 LTC SMBus Support: API for a LTC3887 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_3887FaultLog LT_3887FaultLog
49 //! @}
50 
51 /*! @file
52  @ingroup LT_3887FaultLog
53  Library Header File for LT_3887FaultLog
54 */
55 
56 #include <Arduino.h>
57 #include "LT_3887FaultLog.h"
58 
59 #define RAW_EEPROM
60 
62 {
63  faultLog3887 = NULL;
64 
65  buffer = NULL;
66 }
67 
68 
69 /*
70  * Read LTC3887 fault log
71  *
72  * address: PMBUS address
73  */
74 void
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
88 
89 }
90 
91 
93 {
94  free(faultLog3887);
95  faultLog3887 = 0;
96 }
97 
99 {
100  return (uint8_t *)faultLog3887;
101 }
102 
104 {
105  return 147;
106 }
107 
108 void LT_3887FaultLog::dumpBinary(Print *printer)
109 {
110  dumpBin(printer, (uint8_t *)faultLog3887, 147);
111 }
112 
113 void LT_3887FaultLog::print(Print *printer)
114 {
115  if (printer == 0)
116  printer = &Serial;
117  buffer = new char[FILE_TEXT_LINE_MAX];
118 
119  printTitle(printer);
120 
121  printTime(printer);
122 
123  printPeaks(printer);
124 
125  printAllLoops(printer);
126 
127 
128  delete [] buffer;
129 }
130 
131 
132 void LT_3887FaultLog::printTitle(Print *printer)
133 {
134  printer->print(F("LTC3887 Log Data\n"));
135 
136  uint8_t position = faultLog3887->preamble.position_fault;
137  switch (position)
138  {
139  case 0xFF :
140  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position MFR_FAULT_LOG_STORE\n"));
141  break;
142  case 0x00 :
143  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position TON_MAX_FAULT Channel 0\n"));
144  break;
145  case 0x01 :
146  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position VOUT_OV_FAULT Channel 0\n"));
147  break;
148  case 0x02 :
149  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position VOUT_UV_FAULT Channel 0\n"));
150  break;
151  case 0x03 :
152  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position IOUT_OC_FAULT Channel 0\n"));
153  break;
154  case 0x05 :
155  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position OT_FAULT Channel 0\n"));
156  break;
157  case 0x06 :
158  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position UT_FAULT Channel 0\n"));
159  break;
160  case 0x07 :
161  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position VIN_OV_FAULT Channel 0\n"));
162  break;
163  case 0x0A :
164  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position MFR_OT_FAULT Channel 0\n"));
165  break;
166  case 0x10 :
167  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position TON_MAX_FAULT Channel 1\n"));
168  break;
169  case 0x11 :
170  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position VOUT_OV_FAULT Channel 1\n"));
171  break;
172  case 0x12 :
173  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position VOUT_UV_FAULT Channel 1\n"));
174  break;
175  case 0x13 :
176  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position IOUT_OC_FAULT Channel 1\n"));
177  break;
178  case 0x15 :
179  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position OT_FAULT Channel 1\n"));
180  break;
181  case 0x16 :
182  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position UT_FAULT Channel 1\n"));
183  break;
184  case 0x17 :
185  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position VIN_OV_FAULT Channel 1\n"));
186  break;
187  case 0x1A :
188  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR("Fault Position MFR_OT_FAULT Channel 1\n"));
189  break;
190  }
191 
192  printer->print(buffer);
193 }
194 
195 void LT_3887FaultLog::printTime(Print *printer)
196 {
197  uint8_t *time = (uint8_t *)&faultLog3887->preamble.shared_time;
198  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]);
199  printer->print(buffer);
200  printer->print((long) getSharedTime200us(faultLog3887->preamble.shared_time));
201  printer->println(F(" Ticks (200us each)"));
202 }
203 
204 void LT_3887FaultLog::printPeaks(Print *printer)
205 {
206  printer->println(F("\nHeader Information:\n--------"));
207  printer->print(F("VOUT Peak 0 "));
209  printer->print(F("VOUT Peak 1 "));
211  printer->print(F("IOUT Peak 0 "));
213  printer->print(F("IOUT Peak 1 "));
215  printer->print(F("VIN Peak "));
217  printer->print(F("Temp External Last Event Page 0 "));
219  printer->print(F("Temp External Last Event Page 1 "));
221  printer->print(F("Temp Internal Last Event "));
223 }
224 
225 void LT_3887FaultLog::printAllLoops(Print *printer)
226 {
227  printer->println(F("\nFault Log Loops Follow:"));
228  printer->println(F("(most recent data first)"));
229 
230  for (int index = 0; index < 6; index++)
231  {
232  printLoop(index, printer);
233  }
234 }
235 
236 void LT_3887FaultLog::printLoop(uint8_t index, Print *printer)
237 {
238  printer->println(F("-------"));
239  printer->print(F("Loop: "));
240  printer->println(index);
241  printer->println(F("-------"));
242 
243  printer->print(F("Input: "));
245  printer->print(F(" V "));
247  printer->println(F(" A"));
248  printer->print(F("Chan0: "));
250  printer->print(F(" V, "));
252  printer->println(F(" A"));
253  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR(" STATUS_VOUT: 0x%02x\n"), getRawByteVal(faultLog3887->fault_log_loop[index].status_vout_p0));
254  printer->print(buffer);
255  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR(" STATUS_MFR_SPECIFIC: 0x%02x\n"), getRawByteVal(faultLog3887->fault_log_loop[index].status_mfr_specificP0));
256  printer->print(buffer);
257  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR(" STATUS_WORD: 0x%04x\n"), getRawWordReverseVal(faultLog3887->fault_log_loop[index].status_word_p0));
258  printer->print(buffer);
259  printer->print(F("Chan1: "));
261  printer->print(F(" V, "));
263  printer->println(F(" A"));
264  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR(" STATUS_VOUT: 0x%02x\n"), getRawByteVal(faultLog3887->fault_log_loop[index].status_vout_p1));
265  printer->print(buffer);
266  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR(" STATUS_MFR_SPECIFIC: 0x%02x\n"), getRawByteVal(faultLog3887->fault_log_loop[index].status_mfr_specificP1));
267  printer->print(buffer);
268  snprintf_P(buffer, FILE_TEXT_LINE_MAX, PSTR(" STATUS_WORD: 0x%04x\n"), getRawWordReverseVal(faultLog3887->fault_log_loop[index].status_word_p1));
269  printer->print(buffer);
270 }
struct FaultLogPreambleLtc3887 preamble
uint16_t getLin5_11WordReverseVal(Lin5_11WordReverse value)
void dumpBin(Print *printer, uint8_t *log, uint8_t size)
#define MFR_FAULT_LOG
Definition: LT_PMBus.h:140
uint8_t * getBinary()
Get binary of the fault log or NULL if no log.
float lin16_to_float(lin16_t lin16_mant, lin16m_t vout_mode)
uint16_t getRawWordReverseVal(RawWordReverse value)
LT_PMBusMath math_
void release()
Frees the memory reserved for the fault log.
static LT_PMBus * pmbus
Definition: DC2875A.ino:82
float lin11_to_float(lin11_t xin)
struct FaultLogReadLoopLtc3887 fault_log_loop[6]
#define FILE_TEXT_LINE_MAX
Definition: LT_FaultLog.h:60
LT_PMBus * pmbus_
Definition: LT_FaultLog.h:129
static uint8_t address
Definition: DC2091A.ino:83
union LT_union_int32_4bytes data
Definition: DC2094A.ino:138
struct Lin5_11WordReverse read_iout_p0
struct Lin5_11WordReverse read_iout_p1
void print(Print *printer=0)
Pretty prints this part&#39;s fault log to a Print inheriting object, or Serial if none specified...
void getNvmBlock(uint8_t address, uint16_t offset, uint16_t numWords, uint8_t command, uint8_t *data)
LTC SMBus Support: Implementation for a LTC3887 Fault Log.
LT_3887FaultLog(LT_PMBus *pmbus)
Constructor.
LT_SMBus * smbus()
Definition: LT_PMBus.h:401
uint64_t getSharedTime200us(FaultLogTimeStamp time_stamp)
void read(uint8_t address)
Reads the fault log from the specified address, reserves memory to hold the data. ...
uint16_t getBinarySize()
Get size of binary data.
static int index
virtual uint8_t readBlock(uint8_t address, uint8_t command, uint8_t *block, uint16_t block_size)=0
SMBus read block command.
uint8_t getRawByteVal(RawByte value)
FaultLogLtc3887 * faultLog3887
uint16_t getLin16WordReverseVal(Lin16WordReverse value)
void dumpBinary(Print *printer=0)
Dumps binary of the fault log to a Print inheriting object, or Serial if none specified.
struct FaultLogTelemetrySummaryLtc3887 peaks
PMBus communication.
Definition: LT_PMBus.h:370