minimalist hardware testing support

Dependents:   MAX5715BOB_Tester MAX11131BOB_Tester MAX5171BOB_Tester MAX11410BOB_Tester ... more

Committer:
whismanoid
Date:
Mon Jun 10 07:47:42 2019 +0000
Revision:
0:93d4119d3f14
Child:
1:f98ddb04f9e0
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
whismanoid 0:93d4119d3f14 1 // /*******************************************************************************
whismanoid 0:93d4119d3f14 2 // * Copyright (C) 2019 Maxim Integrated Products, Inc., All Rights Reserved.
whismanoid 0:93d4119d3f14 3 // *
whismanoid 0:93d4119d3f14 4 // * Permission is hereby granted, free of charge, to any person obtaining a
whismanoid 0:93d4119d3f14 5 // * copy of this software and associated documentation files (the "Software"),
whismanoid 0:93d4119d3f14 6 // * to deal in the Software without restriction, including without limitation
whismanoid 0:93d4119d3f14 7 // * the rights to use, copy, modify, merge, publish, distribute, sublicense,
whismanoid 0:93d4119d3f14 8 // * and/or sell copies of the Software, and to permit persons to whom the
whismanoid 0:93d4119d3f14 9 // * Software is furnished to do so, subject to the following conditions:
whismanoid 0:93d4119d3f14 10 // *
whismanoid 0:93d4119d3f14 11 // * The above copyright notice and this permission notice shall be included
whismanoid 0:93d4119d3f14 12 // * in all copies or substantial portions of the Software.
whismanoid 0:93d4119d3f14 13 // *
whismanoid 0:93d4119d3f14 14 // * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
whismanoid 0:93d4119d3f14 15 // * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
whismanoid 0:93d4119d3f14 16 // * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
whismanoid 0:93d4119d3f14 17 // * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
whismanoid 0:93d4119d3f14 18 // * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
whismanoid 0:93d4119d3f14 19 // * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
whismanoid 0:93d4119d3f14 20 // * OTHER DEALINGS IN THE SOFTWARE.
whismanoid 0:93d4119d3f14 21 // *
whismanoid 0:93d4119d3f14 22 // * Except as contained in this notice, the name of Maxim Integrated
whismanoid 0:93d4119d3f14 23 // * Products, Inc. shall not be used except as stated in the Maxim Integrated
whismanoid 0:93d4119d3f14 24 // * Products, Inc. Branding Policy.
whismanoid 0:93d4119d3f14 25 // *
whismanoid 0:93d4119d3f14 26 // * The mere transfer of this software does not imply any licenses
whismanoid 0:93d4119d3f14 27 // * of trade secrets, proprietary technology, copyrights, patents,
whismanoid 0:93d4119d3f14 28 // * trademarks, maskwork rights, or any other form of intellectual
whismanoid 0:93d4119d3f14 29 // * property whatsoever. Maxim Integrated Products, Inc. retains all
whismanoid 0:93d4119d3f14 30 // * ownership rights.
whismanoid 0:93d4119d3f14 31 // *******************************************************************************
whismanoid 0:93d4119d3f14 32 // */
whismanoid 0:93d4119d3f14 33 // *********************************************************************
whismanoid 0:93d4119d3f14 34 // @file MaximTinyTester.cpp
whismanoid 0:93d4119d3f14 35 // *********************************************************************
whismanoid 0:93d4119d3f14 36
whismanoid 0:93d4119d3f14 37 #include "MaximTinyTester.h"
whismanoid 0:93d4119d3f14 38
whismanoid 0:93d4119d3f14 39 MaximTinyTester::MaximTinyTester(CmdLine& AssociatedCmdLine,
whismanoid 0:93d4119d3f14 40 AnalogIn& analogInPin0,
whismanoid 0:93d4119d3f14 41 AnalogIn& analogInPin1,
whismanoid 0:93d4119d3f14 42 AnalogIn& analogInPin2,
whismanoid 0:93d4119d3f14 43 AnalogIn& analogInPin3,
whismanoid 0:93d4119d3f14 44 AnalogIn& analogInPin4,
whismanoid 0:93d4119d3f14 45 AnalogIn& analogInPin5)
whismanoid 0:93d4119d3f14 46 : associatedCmdLine(AssociatedCmdLine)
whismanoid 0:93d4119d3f14 47 , analogInPin0(analogInPin0)
whismanoid 0:93d4119d3f14 48 , analogInPin1(analogInPin1)
whismanoid 0:93d4119d3f14 49 , analogInPin2(analogInPin2)
whismanoid 0:93d4119d3f14 50 , analogInPin3(analogInPin3)
whismanoid 0:93d4119d3f14 51 , analogInPin4(analogInPin4)
whismanoid 0:93d4119d3f14 52 , analogInPin5(analogInPin5)
whismanoid 0:93d4119d3f14 53 {
whismanoid 0:93d4119d3f14 54 nPass = 0;
whismanoid 0:93d4119d3f14 55 nFail = 0;
whismanoid 0:93d4119d3f14 56 err_threshold = 0.030; // 30mV
whismanoid 0:93d4119d3f14 57 input_timeout_time_msec = 250;
whismanoid 0:93d4119d3f14 58 settle_time_msec = 250;
whismanoid 0:93d4119d3f14 59 analogInPin_fullScaleVoltage[0] = 3.300;
whismanoid 0:93d4119d3f14 60 analogInPin_fullScaleVoltage[1] = 3.300;
whismanoid 0:93d4119d3f14 61 analogInPin_fullScaleVoltage[2] = 3.300;
whismanoid 0:93d4119d3f14 62 analogInPin_fullScaleVoltage[3] = 3.300;
whismanoid 0:93d4119d3f14 63 analogInPin_fullScaleVoltage[4] = 3.300;
whismanoid 0:93d4119d3f14 64 analogInPin_fullScaleVoltage[5] = 3.300;
whismanoid 0:93d4119d3f14 65 }
whismanoid 0:93d4119d3f14 66
whismanoid 0:93d4119d3f14 67 /** reset the pass/fail counters.
whismanoid 0:93d4119d3f14 68 *
whismanoid 0:93d4119d3f14 69 * @post nPass and nFail are reset to 0
whismanoid 0:93d4119d3f14 70 *
whismanoid 0:93d4119d3f14 71 */
whismanoid 0:93d4119d3f14 72 void MaximTinyTester::clear(void)
whismanoid 0:93d4119d3f14 73 {
whismanoid 0:93d4119d3f14 74 nPass = 0;
whismanoid 0:93d4119d3f14 75 nFail = 0;
whismanoid 0:93d4119d3f14 76 }
whismanoid 0:93d4119d3f14 77
whismanoid 0:93d4119d3f14 78 /** report that a test has completed with success.
whismanoid 0:93d4119d3f14 79 *
whismanoid 0:93d4119d3f14 80 * @post nPass is increased by 1
whismanoid 0:93d4119d3f14 81 *
whismanoid 0:93d4119d3f14 82 */
whismanoid 0:93d4119d3f14 83 void MaximTinyTester::PASS()
whismanoid 0:93d4119d3f14 84 {
whismanoid 0:93d4119d3f14 85 ++nPass;
whismanoid 0:93d4119d3f14 86 associatedCmdLine.serial().printf("\r\n+PASS ");
whismanoid 0:93d4119d3f14 87 }
whismanoid 0:93d4119d3f14 88
whismanoid 0:93d4119d3f14 89 /** report that a test has completed with failure.
whismanoid 0:93d4119d3f14 90 *
whismanoid 0:93d4119d3f14 91 * @post nFail is increased by 1
whismanoid 0:93d4119d3f14 92 *
whismanoid 0:93d4119d3f14 93 */
whismanoid 0:93d4119d3f14 94 void MaximTinyTester::FAIL()
whismanoid 0:93d4119d3f14 95 {
whismanoid 0:93d4119d3f14 96 ++nFail;
whismanoid 0:93d4119d3f14 97 associatedCmdLine.serial().printf("\r\n-FAIL ");
whismanoid 0:93d4119d3f14 98 #if USE_LEDS
whismanoid 0:93d4119d3f14 99 rgb_led.red(); // diagnostic rbg led RED
whismanoid 0:93d4119d3f14 100 //~ rgb_led.green(); // diagnostic rbg led GREEN
whismanoid 0:93d4119d3f14 101 //~ rgb_led.blue(); // diagnostic rbg led BLUE
whismanoid 0:93d4119d3f14 102 //~ rgb_led.white(); // diagnostic rbg led RED+GREEN+BLUE=WHITE
whismanoid 0:93d4119d3f14 103 //~ rgb_led.cyan(); // diagnostic rbg led GREEN+BLUE=CYAN
whismanoid 0:93d4119d3f14 104 //~ rgb_led.magenta(); // diagnostic rbg led RED+BLUE=MAGENTA
whismanoid 0:93d4119d3f14 105 //~ rgb_led.yellow(); // diagnostic rbg led RED+GREEN=YELLOW
whismanoid 0:93d4119d3f14 106 //~ rgb_led.black(); // diagnostic rbg led BLACK
whismanoid 0:93d4119d3f14 107 #endif // USE_LEDS
whismanoid 0:93d4119d3f14 108 }
whismanoid 0:93d4119d3f14 109
whismanoid 0:93d4119d3f14 110 /** Report number of pass and number of fail test results
whismanoid 0:93d4119d3f14 111 */
whismanoid 0:93d4119d3f14 112 void MaximTinyTester::Report_Summary(void)
whismanoid 0:93d4119d3f14 113 {
whismanoid 0:93d4119d3f14 114 associatedCmdLine.serial().printf("\r\nSummary: %d PASS %d FAIL\r\n", nPass, nFail);
whismanoid 0:93d4119d3f14 115 //~ associatedCmdLine.serial().printf(g_SelfTest_nPass);
whismanoid 0:93d4119d3f14 116 //~ associatedCmdLine.serial().printf(" PASS ");
whismanoid 0:93d4119d3f14 117 //~ associatedCmdLine.serial().printf(g_SelfTest_nFail);
whismanoid 0:93d4119d3f14 118 //~ associatedCmdLine.serial().printf(" FAIL\r\n");
whismanoid 0:93d4119d3f14 119 if (nFail == 0) {
whismanoid 0:93d4119d3f14 120 #if USE_LEDS
whismanoid 0:93d4119d3f14 121 //~ rgb_led.red(); // diagnostic rbg led RED
whismanoid 0:93d4119d3f14 122 rgb_led.green(); // diagnostic rbg led GREEN
whismanoid 0:93d4119d3f14 123 //~ rgb_led.blue(); // diagnostic rbg led BLUE
whismanoid 0:93d4119d3f14 124 //~ rgb_led.white(); // diagnostic rbg led RED+GREEN+BLUE=WHITE
whismanoid 0:93d4119d3f14 125 //~ rgb_led.cyan(); // diagnostic rbg led GREEN+BLUE=CYAN
whismanoid 0:93d4119d3f14 126 //~ rgb_led.magenta(); // diagnostic rbg led RED+BLUE=MAGENTA
whismanoid 0:93d4119d3f14 127 //~ rgb_led.yellow(); // diagnostic rbg led RED+GREEN=YELLOW
whismanoid 0:93d4119d3f14 128 //~ rgb_led.black(); // diagnostic rbg led BLACK
whismanoid 0:93d4119d3f14 129 #endif // USE_LEDS
whismanoid 0:93d4119d3f14 130 }
whismanoid 0:93d4119d3f14 131 }
whismanoid 0:93d4119d3f14 132
whismanoid 0:93d4119d3f14 133 /** Test a software function
whismanoid 0:93d4119d3f14 134 *
whismanoid 0:93d4119d3f14 135 * @param[in] nameOfFunctionUnderTest is the user-facing name of the function under test
whismanoid 0:93d4119d3f14 136 *
whismanoid 0:93d4119d3f14 137 * @param[in] functionUnderTest points to the function under test
whismanoid 0:93d4119d3f14 138 *
whismanoid 0:93d4119d3f14 139 * @param[in] voltageV is a test argument given to the function under test
whismanoid 0:93d4119d3f14 140 *
whismanoid 0:93d4119d3f14 141 * @param[in] expect_result contains the expected result
whismanoid 0:93d4119d3f14 142 *
whismanoid 0:93d4119d3f14 143 * @post nPass and nFail counters are updated
whismanoid 0:93d4119d3f14 144 *
whismanoid 0:93d4119d3f14 145 * @return true if success, false if test failed
whismanoid 0:93d4119d3f14 146 *
whismanoid 0:93d4119d3f14 147 */
whismanoid 0:93d4119d3f14 148 bool MaximTinyTester::FunctionCall_Expect(const char *nameOfFunctionUnderTest,
whismanoid 0:93d4119d3f14 149 Callback<uint16_t(double)> functionUnderTest,
whismanoid 0:93d4119d3f14 150 double voltageV, uint16_t expect_result)
whismanoid 0:93d4119d3f14 151 {
whismanoid 0:93d4119d3f14 152 uint16_t actual_result = functionUnderTest(voltageV);
whismanoid 0:93d4119d3f14 153 if (actual_result != expect_result)
whismanoid 0:93d4119d3f14 154 {
whismanoid 0:93d4119d3f14 155 FAIL();
whismanoid 0:93d4119d3f14 156 associatedCmdLine.serial().printf("%s(%6.4fV)", nameOfFunctionUnderTest, voltageV);
whismanoid 0:93d4119d3f14 157 associatedCmdLine.serial().printf(" expect %d", expect_result);
whismanoid 0:93d4119d3f14 158 associatedCmdLine.serial().printf(" but got %d", actual_result);
whismanoid 0:93d4119d3f14 159 return false;
whismanoid 0:93d4119d3f14 160 }
whismanoid 0:93d4119d3f14 161 else
whismanoid 0:93d4119d3f14 162 {
whismanoid 0:93d4119d3f14 163 PASS();
whismanoid 0:93d4119d3f14 164 associatedCmdLine.serial().printf("%s(%6.4fV)", nameOfFunctionUnderTest, voltageV);
whismanoid 0:93d4119d3f14 165 associatedCmdLine.serial().printf(" expect %d", expect_result);
whismanoid 0:93d4119d3f14 166 return true;
whismanoid 0:93d4119d3f14 167 }
whismanoid 0:93d4119d3f14 168 //~ associatedCmdLine.serial().printf("\r\n");
whismanoid 0:93d4119d3f14 169 }
whismanoid 0:93d4119d3f14 170
whismanoid 0:93d4119d3f14 171 /** Test a software function
whismanoid 0:93d4119d3f14 172 *
whismanoid 0:93d4119d3f14 173 * @param[in] nameOfFunctionUnderTest is the user-facing name of the function under test
whismanoid 0:93d4119d3f14 174 *
whismanoid 0:93d4119d3f14 175 * @param[in] functionUnderTest points to the function under test
whismanoid 0:93d4119d3f14 176 *
whismanoid 0:93d4119d3f14 177 * @param[in] value_u16 is a test argument given to the function under test
whismanoid 0:93d4119d3f14 178 *
whismanoid 0:93d4119d3f14 179 * @param[in] expect_result contains the expected result
whismanoid 0:93d4119d3f14 180 *
whismanoid 0:93d4119d3f14 181 * @pre err_threshold determines how closely the result must match the expected value
whismanoid 0:93d4119d3f14 182 *
whismanoid 0:93d4119d3f14 183 * @post nPass and nFail counters are updated
whismanoid 0:93d4119d3f14 184 *
whismanoid 0:93d4119d3f14 185 * @return true if success, false if test failed
whismanoid 0:93d4119d3f14 186 *
whismanoid 0:93d4119d3f14 187 */
whismanoid 0:93d4119d3f14 188 bool MaximTinyTester::FunctionCall_Expect(const char *nameOfFunctionUnderTest,
whismanoid 0:93d4119d3f14 189 Callback<double(uint16_t)> functionUnderTest,
whismanoid 0:93d4119d3f14 190 uint16_t value_u16, double expect_result)
whismanoid 0:93d4119d3f14 191 {
whismanoid 0:93d4119d3f14 192 double actual_result = functionUnderTest(value_u16);
whismanoid 0:93d4119d3f14 193 double err_result = (actual_result - expect_result);
whismanoid 0:93d4119d3f14 194 if (( -err_threshold < err_result) && ( err_result < err_threshold))
whismanoid 0:93d4119d3f14 195 {
whismanoid 0:93d4119d3f14 196 PASS();
whismanoid 0:93d4119d3f14 197 associatedCmdLine.serial().printf("%s(%d)", nameOfFunctionUnderTest, value_u16);
whismanoid 0:93d4119d3f14 198 associatedCmdLine.serial().printf(" expect %6.6f", expect_result);
whismanoid 0:93d4119d3f14 199 return true;
whismanoid 0:93d4119d3f14 200 }
whismanoid 0:93d4119d3f14 201 else
whismanoid 0:93d4119d3f14 202 {
whismanoid 0:93d4119d3f14 203 FAIL();
whismanoid 0:93d4119d3f14 204 associatedCmdLine.serial().printf("%s(%d)", nameOfFunctionUnderTest, value_u16);
whismanoid 0:93d4119d3f14 205 associatedCmdLine.serial().printf(" expect %6.6f", expect_result);
whismanoid 0:93d4119d3f14 206 associatedCmdLine.serial().printf(" but got %6.6f", actual_result);
whismanoid 0:93d4119d3f14 207 associatedCmdLine.serial().printf(" err=%6.6f", err_result);
whismanoid 0:93d4119d3f14 208 return false;
whismanoid 0:93d4119d3f14 209 }
whismanoid 0:93d4119d3f14 210 //~ associatedCmdLine.serial().printf("\r\n");
whismanoid 0:93d4119d3f14 211 }
whismanoid 0:93d4119d3f14 212
whismanoid 0:93d4119d3f14 213 /** Test an analog voltage input to the platform (output from the device under test)
whismanoid 0:93d4119d3f14 214 *
whismanoid 0:93d4119d3f14 215 * @param[in] expect_result contains the expected voltage
whismanoid 0:93d4119d3f14 216 *
whismanoid 0:93d4119d3f14 217 * @pre err_threshold determines how closely the result must match the expected value
whismanoid 0:93d4119d3f14 218 *
whismanoid 0:93d4119d3f14 219 * @post nPass and nFail counters are updated
whismanoid 0:93d4119d3f14 220 *
whismanoid 0:93d4119d3f14 221 * @return true if success, false if test failed
whismanoid 0:93d4119d3f14 222 *
whismanoid 0:93d4119d3f14 223 */
whismanoid 0:93d4119d3f14 224 bool MaximTinyTester::AnalogIn0_Read_Expect_voltageV(double expect_result)
whismanoid 0:93d4119d3f14 225 {
whismanoid 0:93d4119d3f14 226 float adc_full_scale_voltage = analogInPin_fullScaleVoltage[0];
whismanoid 0:93d4119d3f14 227
whismanoid 0:93d4119d3f14 228 // TODO: tinyTester.Analog_Input_Expect_V replaces SelfTest_AnalogInput_Expect_ch_V
whismanoid 0:93d4119d3f14 229 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 230 float normValue_0_1 = analogInPin0.read();
whismanoid 0:93d4119d3f14 231 double actual_result = normValue_0_1 * adc_full_scale_voltage;
whismanoid 0:93d4119d3f14 232 double err_result = (actual_result - expect_result);
whismanoid 0:93d4119d3f14 233 if (( -err_threshold < err_result) && ( err_result < err_threshold))
whismanoid 0:93d4119d3f14 234 {
whismanoid 0:93d4119d3f14 235 PASS();
whismanoid 0:93d4119d3f14 236 //~ SelfTest_print_VoltageOfCode(cmdLine, value_u12);
whismanoid 0:93d4119d3f14 237 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 238 associatedCmdLine.serial().printf("AIN0 = %7.3f%% = %1.3fV ",
whismanoid 0:93d4119d3f14 239 normValue_0_1 * 100.0,
whismanoid 0:93d4119d3f14 240 normValue_0_1 * adc_full_scale_voltage
whismanoid 0:93d4119d3f14 241 );
whismanoid 0:93d4119d3f14 242 //
whismanoid 0:93d4119d3f14 243 associatedCmdLine.serial().printf(" expect %6.6f +/- %6.6f", expect_result, err_threshold);
whismanoid 0:93d4119d3f14 244 return true;
whismanoid 0:93d4119d3f14 245 }
whismanoid 0:93d4119d3f14 246 else
whismanoid 0:93d4119d3f14 247 {
whismanoid 0:93d4119d3f14 248 FAIL();
whismanoid 0:93d4119d3f14 249 //~ SelfTest_print_VoltageOfCode(cmdLine, value_u12);
whismanoid 0:93d4119d3f14 250 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 251 associatedCmdLine.serial().printf("AIN0 = %7.3f%% = %1.3fV ",
whismanoid 0:93d4119d3f14 252 normValue_0_1 * 100.0,
whismanoid 0:93d4119d3f14 253 normValue_0_1 * adc_full_scale_voltage
whismanoid 0:93d4119d3f14 254 );
whismanoid 0:93d4119d3f14 255 //
whismanoid 0:93d4119d3f14 256 associatedCmdLine.serial().printf(" expect %6.6f +/- %6.6f", expect_result, err_threshold);
whismanoid 0:93d4119d3f14 257 associatedCmdLine.serial().printf(" but got %6.6f", actual_result);
whismanoid 0:93d4119d3f14 258 associatedCmdLine.serial().printf(" err=%6.6f", err_result);
whismanoid 0:93d4119d3f14 259 }
whismanoid 0:93d4119d3f14 260 //~ associatedCmdLine.serial().printf("\r\n");
whismanoid 0:93d4119d3f14 261 return false;
whismanoid 0:93d4119d3f14 262 }
whismanoid 0:93d4119d3f14 263
whismanoid 0:93d4119d3f14 264 /** Test an analog voltage input to the platform (output from the device under test)
whismanoid 0:93d4119d3f14 265 *
whismanoid 0:93d4119d3f14 266 * @param[in] expect_result contains the expected voltage
whismanoid 0:93d4119d3f14 267 *
whismanoid 0:93d4119d3f14 268 * @pre err_threshold determines how closely the result must match the expected value
whismanoid 0:93d4119d3f14 269 *
whismanoid 0:93d4119d3f14 270 * @post nPass and nFail counters are updated
whismanoid 0:93d4119d3f14 271 *
whismanoid 0:93d4119d3f14 272 * @return true if success, false if test failed
whismanoid 0:93d4119d3f14 273 *
whismanoid 0:93d4119d3f14 274 */
whismanoid 0:93d4119d3f14 275 bool MaximTinyTester::AnalogIn1_Read_Expect_voltageV(double expect_result)
whismanoid 0:93d4119d3f14 276 {
whismanoid 0:93d4119d3f14 277 float adc_full_scale_voltage = analogInPin_fullScaleVoltage[1];
whismanoid 0:93d4119d3f14 278
whismanoid 0:93d4119d3f14 279 // TODO: tinyTester.Analog_Input_Expect_V replaces SelfTest_AnalogInput_Expect_ch_V
whismanoid 0:93d4119d3f14 280 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 281 float normValue_0_1 = analogInPin1.read();
whismanoid 0:93d4119d3f14 282 double actual_result = normValue_0_1 * adc_full_scale_voltage;
whismanoid 0:93d4119d3f14 283 double err_result = (actual_result - expect_result);
whismanoid 0:93d4119d3f14 284 if (( -err_threshold < err_result) && ( err_result < err_threshold))
whismanoid 0:93d4119d3f14 285 {
whismanoid 0:93d4119d3f14 286 PASS();
whismanoid 0:93d4119d3f14 287 //~ SelfTest_print_VoltageOfCode(cmdLine, value_u12);
whismanoid 0:93d4119d3f14 288 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 289 associatedCmdLine.serial().printf("AIN1 = %7.3f%% = %1.3fV ",
whismanoid 0:93d4119d3f14 290 normValue_0_1 * 100.0,
whismanoid 0:93d4119d3f14 291 normValue_0_1 * adc_full_scale_voltage
whismanoid 0:93d4119d3f14 292 );
whismanoid 0:93d4119d3f14 293 //
whismanoid 0:93d4119d3f14 294 associatedCmdLine.serial().printf(" expect %6.6f +/- %6.6f", expect_result, err_threshold);
whismanoid 0:93d4119d3f14 295 return true;
whismanoid 0:93d4119d3f14 296 }
whismanoid 0:93d4119d3f14 297 else
whismanoid 0:93d4119d3f14 298 {
whismanoid 0:93d4119d3f14 299 FAIL();
whismanoid 0:93d4119d3f14 300 //~ SelfTest_print_VoltageOfCode(cmdLine, value_u12);
whismanoid 0:93d4119d3f14 301 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 302 associatedCmdLine.serial().printf("AIN1 = %7.3f%% = %1.3fV ",
whismanoid 0:93d4119d3f14 303 normValue_0_1 * 100.0,
whismanoid 0:93d4119d3f14 304 normValue_0_1 * adc_full_scale_voltage
whismanoid 0:93d4119d3f14 305 );
whismanoid 0:93d4119d3f14 306 //
whismanoid 0:93d4119d3f14 307 associatedCmdLine.serial().printf(" expect %6.6f +/- %6.6f", expect_result, err_threshold);
whismanoid 0:93d4119d3f14 308 associatedCmdLine.serial().printf(" but got %6.6f", actual_result);
whismanoid 0:93d4119d3f14 309 associatedCmdLine.serial().printf(" err=%6.6f", err_result);
whismanoid 0:93d4119d3f14 310 }
whismanoid 0:93d4119d3f14 311 //~ associatedCmdLine.serial().printf("\r\n");
whismanoid 0:93d4119d3f14 312 return false;
whismanoid 0:93d4119d3f14 313 }
whismanoid 0:93d4119d3f14 314
whismanoid 0:93d4119d3f14 315 /** Test an analog voltage input to the platform (output from the device under test)
whismanoid 0:93d4119d3f14 316 *
whismanoid 0:93d4119d3f14 317 * @param[in] expect_result contains the expected voltage
whismanoid 0:93d4119d3f14 318 *
whismanoid 0:93d4119d3f14 319 * @pre err_threshold determines how closely the result must match the expected value
whismanoid 0:93d4119d3f14 320 *
whismanoid 0:93d4119d3f14 321 * @post nPass and nFail counters are updated
whismanoid 0:93d4119d3f14 322 *
whismanoid 0:93d4119d3f14 323 * @return true if success, false if test failed
whismanoid 0:93d4119d3f14 324 *
whismanoid 0:93d4119d3f14 325 */
whismanoid 0:93d4119d3f14 326 bool MaximTinyTester::AnalogIn2_Read_Expect_voltageV(double expect_result)
whismanoid 0:93d4119d3f14 327 {
whismanoid 0:93d4119d3f14 328 float adc_full_scale_voltage = analogInPin_fullScaleVoltage[2];
whismanoid 0:93d4119d3f14 329
whismanoid 0:93d4119d3f14 330 // TODO: tinyTester.Analog_Input_Expect_V replaces SelfTest_AnalogInput_Expect_ch_V
whismanoid 0:93d4119d3f14 331 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 332 float normValue_0_1 = analogInPin2.read();
whismanoid 0:93d4119d3f14 333 double actual_result = normValue_0_1 * adc_full_scale_voltage;
whismanoid 0:93d4119d3f14 334 double err_result = (actual_result - expect_result);
whismanoid 0:93d4119d3f14 335 if (( -err_threshold < err_result) && ( err_result < err_threshold))
whismanoid 0:93d4119d3f14 336 {
whismanoid 0:93d4119d3f14 337 PASS();
whismanoid 0:93d4119d3f14 338 //~ SelfTest_print_VoltageOfCode(cmdLine, value_u12);
whismanoid 0:93d4119d3f14 339 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 340 associatedCmdLine.serial().printf("AIN2 = %7.3f%% = %1.3fV ",
whismanoid 0:93d4119d3f14 341 normValue_0_1 * 100.0,
whismanoid 0:93d4119d3f14 342 normValue_0_1 * adc_full_scale_voltage
whismanoid 0:93d4119d3f14 343 );
whismanoid 0:93d4119d3f14 344 //
whismanoid 0:93d4119d3f14 345 associatedCmdLine.serial().printf(" expect %6.6f +/- %6.6f", expect_result, err_threshold);
whismanoid 0:93d4119d3f14 346 return true;
whismanoid 0:93d4119d3f14 347 }
whismanoid 0:93d4119d3f14 348 else
whismanoid 0:93d4119d3f14 349 {
whismanoid 0:93d4119d3f14 350 FAIL();
whismanoid 0:93d4119d3f14 351 //~ SelfTest_print_VoltageOfCode(cmdLine, value_u12);
whismanoid 0:93d4119d3f14 352 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 353 associatedCmdLine.serial().printf("AIN2 = %7.3f%% = %1.3fV ",
whismanoid 0:93d4119d3f14 354 normValue_0_1 * 100.0,
whismanoid 0:93d4119d3f14 355 normValue_0_1 * adc_full_scale_voltage
whismanoid 0:93d4119d3f14 356 );
whismanoid 0:93d4119d3f14 357 //
whismanoid 0:93d4119d3f14 358 associatedCmdLine.serial().printf(" expect %6.6f +/- %6.6f", expect_result, err_threshold);
whismanoid 0:93d4119d3f14 359 associatedCmdLine.serial().printf(" but got %6.6f", actual_result);
whismanoid 0:93d4119d3f14 360 associatedCmdLine.serial().printf(" err=%6.6f", err_result);
whismanoid 0:93d4119d3f14 361 }
whismanoid 0:93d4119d3f14 362 //~ associatedCmdLine.serial().printf("\r\n");
whismanoid 0:93d4119d3f14 363 return false;
whismanoid 0:93d4119d3f14 364 }
whismanoid 0:93d4119d3f14 365
whismanoid 0:93d4119d3f14 366 /** Test an analog voltage input to the platform (output from the device under test)
whismanoid 0:93d4119d3f14 367 *
whismanoid 0:93d4119d3f14 368 * @param[in] expect_result contains the expected voltage
whismanoid 0:93d4119d3f14 369 *
whismanoid 0:93d4119d3f14 370 * @pre err_threshold determines how closely the result must match the expected value
whismanoid 0:93d4119d3f14 371 *
whismanoid 0:93d4119d3f14 372 * @post nPass and nFail counters are updated
whismanoid 0:93d4119d3f14 373 *
whismanoid 0:93d4119d3f14 374 * @return true if success, false if test failed
whismanoid 0:93d4119d3f14 375 *
whismanoid 0:93d4119d3f14 376 */
whismanoid 0:93d4119d3f14 377 bool MaximTinyTester::AnalogIn3_Read_Expect_voltageV(double expect_result)
whismanoid 0:93d4119d3f14 378 {
whismanoid 0:93d4119d3f14 379 float adc_full_scale_voltage = analogInPin_fullScaleVoltage[3];
whismanoid 0:93d4119d3f14 380
whismanoid 0:93d4119d3f14 381 // TODO: tinyTester.Analog_Input_Expect_V replaces SelfTest_AnalogInput_Expect_ch_V
whismanoid 0:93d4119d3f14 382 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 383 float normValue_0_1 = analogInPin3.read();
whismanoid 0:93d4119d3f14 384 double actual_result = normValue_0_1 * adc_full_scale_voltage;
whismanoid 0:93d4119d3f14 385 double err_result = (actual_result - expect_result);
whismanoid 0:93d4119d3f14 386 if (( -err_threshold < err_result) && ( err_result < err_threshold))
whismanoid 0:93d4119d3f14 387 {
whismanoid 0:93d4119d3f14 388 PASS();
whismanoid 0:93d4119d3f14 389 //~ SelfTest_print_VoltageOfCode(cmdLine, value_u12);
whismanoid 0:93d4119d3f14 390 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 391 associatedCmdLine.serial().printf("AIN3 = %7.3f%% = %1.3fV ",
whismanoid 0:93d4119d3f14 392 normValue_0_1 * 100.0,
whismanoid 0:93d4119d3f14 393 normValue_0_1 * adc_full_scale_voltage
whismanoid 0:93d4119d3f14 394 );
whismanoid 0:93d4119d3f14 395 //
whismanoid 0:93d4119d3f14 396 associatedCmdLine.serial().printf(" expect %6.6f +/- %6.6f", expect_result, err_threshold);
whismanoid 0:93d4119d3f14 397 return true;
whismanoid 0:93d4119d3f14 398 }
whismanoid 0:93d4119d3f14 399 else
whismanoid 0:93d4119d3f14 400 {
whismanoid 0:93d4119d3f14 401 FAIL();
whismanoid 0:93d4119d3f14 402 //~ SelfTest_print_VoltageOfCode(cmdLine, value_u12);
whismanoid 0:93d4119d3f14 403 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 404 associatedCmdLine.serial().printf("AIN3 = %7.3f%% = %1.3fV ",
whismanoid 0:93d4119d3f14 405 normValue_0_1 * 100.0,
whismanoid 0:93d4119d3f14 406 normValue_0_1 * adc_full_scale_voltage
whismanoid 0:93d4119d3f14 407 );
whismanoid 0:93d4119d3f14 408 //
whismanoid 0:93d4119d3f14 409 associatedCmdLine.serial().printf(" expect %6.6f +/- %6.6f", expect_result, err_threshold);
whismanoid 0:93d4119d3f14 410 associatedCmdLine.serial().printf(" but got %6.6f", actual_result);
whismanoid 0:93d4119d3f14 411 associatedCmdLine.serial().printf(" err=%6.6f", err_result);
whismanoid 0:93d4119d3f14 412 }
whismanoid 0:93d4119d3f14 413 //~ associatedCmdLine.serial().printf("\r\n");
whismanoid 0:93d4119d3f14 414 return false;
whismanoid 0:93d4119d3f14 415 }
whismanoid 0:93d4119d3f14 416
whismanoid 0:93d4119d3f14 417 /** Test an analog voltage input to the platform (output from the device under test)
whismanoid 0:93d4119d3f14 418 *
whismanoid 0:93d4119d3f14 419 * @param[in] expect_result contains the expected voltage
whismanoid 0:93d4119d3f14 420 *
whismanoid 0:93d4119d3f14 421 * @pre err_threshold determines how closely the result must match the expected value
whismanoid 0:93d4119d3f14 422 *
whismanoid 0:93d4119d3f14 423 * @post nPass and nFail counters are updated
whismanoid 0:93d4119d3f14 424 *
whismanoid 0:93d4119d3f14 425 * @return true if success, false if test failed
whismanoid 0:93d4119d3f14 426 *
whismanoid 0:93d4119d3f14 427 */
whismanoid 0:93d4119d3f14 428 bool MaximTinyTester::AnalogIn4_Read_Expect_voltageV(double expect_result)
whismanoid 0:93d4119d3f14 429 {
whismanoid 0:93d4119d3f14 430 float adc_full_scale_voltage = analogInPin_fullScaleVoltage[4];
whismanoid 0:93d4119d3f14 431
whismanoid 0:93d4119d3f14 432 // TODO: tinyTester.Analog_Input_Expect_V replaces SelfTest_AnalogInput_Expect_ch_V
whismanoid 0:93d4119d3f14 433 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 434 float normValue_0_1 = analogInPin4.read();
whismanoid 0:93d4119d3f14 435 double actual_result = normValue_0_1 * adc_full_scale_voltage;
whismanoid 0:93d4119d3f14 436 double err_result = (actual_result - expect_result);
whismanoid 0:93d4119d3f14 437 if (( -err_threshold < err_result) && ( err_result < err_threshold))
whismanoid 0:93d4119d3f14 438 {
whismanoid 0:93d4119d3f14 439 PASS();
whismanoid 0:93d4119d3f14 440 //~ SelfTest_print_VoltageOfCode(cmdLine, value_u12);
whismanoid 0:93d4119d3f14 441 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 442 associatedCmdLine.serial().printf("AIN4 = %7.3f%% = %1.3fV ",
whismanoid 0:93d4119d3f14 443 normValue_0_1 * 100.0,
whismanoid 0:93d4119d3f14 444 normValue_0_1 * adc_full_scale_voltage
whismanoid 0:93d4119d3f14 445 );
whismanoid 0:93d4119d3f14 446 //
whismanoid 0:93d4119d3f14 447 associatedCmdLine.serial().printf(" expect %6.6f +/- %6.6f", expect_result, err_threshold);
whismanoid 0:93d4119d3f14 448 return true;
whismanoid 0:93d4119d3f14 449 }
whismanoid 0:93d4119d3f14 450 else
whismanoid 0:93d4119d3f14 451 {
whismanoid 0:93d4119d3f14 452 FAIL();
whismanoid 0:93d4119d3f14 453 //~ SelfTest_print_VoltageOfCode(cmdLine, value_u12);
whismanoid 0:93d4119d3f14 454 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 455 associatedCmdLine.serial().printf("AIN4 = %7.3f%% = %1.3fV ",
whismanoid 0:93d4119d3f14 456 normValue_0_1 * 100.0,
whismanoid 0:93d4119d3f14 457 normValue_0_1 * adc_full_scale_voltage
whismanoid 0:93d4119d3f14 458 );
whismanoid 0:93d4119d3f14 459 //
whismanoid 0:93d4119d3f14 460 associatedCmdLine.serial().printf(" expect %6.6f +/- %6.6f", expect_result, err_threshold);
whismanoid 0:93d4119d3f14 461 associatedCmdLine.serial().printf(" but got %6.6f", actual_result);
whismanoid 0:93d4119d3f14 462 associatedCmdLine.serial().printf(" err=%6.6f", err_result);
whismanoid 0:93d4119d3f14 463 }
whismanoid 0:93d4119d3f14 464 //~ associatedCmdLine.serial().printf("\r\n");
whismanoid 0:93d4119d3f14 465 return false;
whismanoid 0:93d4119d3f14 466 }
whismanoid 0:93d4119d3f14 467
whismanoid 0:93d4119d3f14 468 /** Test an analog voltage input to the platform (output from the device under test)
whismanoid 0:93d4119d3f14 469 *
whismanoid 0:93d4119d3f14 470 * @param[in] expect_result contains the expected voltage
whismanoid 0:93d4119d3f14 471 *
whismanoid 0:93d4119d3f14 472 * @pre err_threshold determines how closely the result must match the expected value
whismanoid 0:93d4119d3f14 473 *
whismanoid 0:93d4119d3f14 474 * @post nPass and nFail counters are updated
whismanoid 0:93d4119d3f14 475 *
whismanoid 0:93d4119d3f14 476 * @return true if success, false if test failed
whismanoid 0:93d4119d3f14 477 *
whismanoid 0:93d4119d3f14 478 */
whismanoid 0:93d4119d3f14 479 bool MaximTinyTester::AnalogIn5_Read_Expect_voltageV(double expect_result)
whismanoid 0:93d4119d3f14 480 {
whismanoid 0:93d4119d3f14 481 float adc_full_scale_voltage = analogInPin_fullScaleVoltage[5];
whismanoid 0:93d4119d3f14 482
whismanoid 0:93d4119d3f14 483 // TODO: tinyTester.Analog_Input_Expect_V replaces SelfTest_AnalogInput_Expect_ch_V
whismanoid 0:93d4119d3f14 484 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 485 float normValue_0_1 = analogInPin5.read();
whismanoid 0:93d4119d3f14 486 double actual_result = normValue_0_1 * adc_full_scale_voltage;
whismanoid 0:93d4119d3f14 487 double err_result = (actual_result - expect_result);
whismanoid 0:93d4119d3f14 488 if (( -err_threshold < err_result) && ( err_result < err_threshold))
whismanoid 0:93d4119d3f14 489 {
whismanoid 0:93d4119d3f14 490 PASS();
whismanoid 0:93d4119d3f14 491 //~ SelfTest_print_VoltageOfCode(cmdLine, value_u12);
whismanoid 0:93d4119d3f14 492 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 493 associatedCmdLine.serial().printf("AIN5 = %7.3f%% = %1.3fV ",
whismanoid 0:93d4119d3f14 494 normValue_0_1 * 100.0,
whismanoid 0:93d4119d3f14 495 normValue_0_1 * adc_full_scale_voltage
whismanoid 0:93d4119d3f14 496 );
whismanoid 0:93d4119d3f14 497 //
whismanoid 0:93d4119d3f14 498 associatedCmdLine.serial().printf(" expect %6.6f +/- %6.6f", expect_result, err_threshold);
whismanoid 0:93d4119d3f14 499 return true;
whismanoid 0:93d4119d3f14 500 }
whismanoid 0:93d4119d3f14 501 else
whismanoid 0:93d4119d3f14 502 {
whismanoid 0:93d4119d3f14 503 FAIL();
whismanoid 0:93d4119d3f14 504 //~ SelfTest_print_VoltageOfCode(cmdLine, value_u12);
whismanoid 0:93d4119d3f14 505 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 506 associatedCmdLine.serial().printf("AIN5 = %7.3f%% = %1.3fV ",
whismanoid 0:93d4119d3f14 507 normValue_0_1 * 100.0,
whismanoid 0:93d4119d3f14 508 normValue_0_1 * adc_full_scale_voltage
whismanoid 0:93d4119d3f14 509 );
whismanoid 0:93d4119d3f14 510 //
whismanoid 0:93d4119d3f14 511 associatedCmdLine.serial().printf(" expect %6.6f +/- %6.6f", expect_result, err_threshold);
whismanoid 0:93d4119d3f14 512 associatedCmdLine.serial().printf(" but got %6.6f", actual_result);
whismanoid 0:93d4119d3f14 513 associatedCmdLine.serial().printf(" err=%6.6f", err_result);
whismanoid 0:93d4119d3f14 514 }
whismanoid 0:93d4119d3f14 515 //~ associatedCmdLine.serial().printf("\r\n");
whismanoid 0:93d4119d3f14 516 return false;
whismanoid 0:93d4119d3f14 517 }
whismanoid 0:93d4119d3f14 518
whismanoid 0:93d4119d3f14 519 bool MaximTinyTester::AnalogIn_Read_Expect_voltageV(AnalogIn& analogInPin, double expect_result)
whismanoid 0:93d4119d3f14 520 {
whismanoid 0:93d4119d3f14 521 float adc_full_scale_voltage = analogInPin_fullScaleVoltage[0];
whismanoid 0:93d4119d3f14 522
whismanoid 0:93d4119d3f14 523 // TODO: tinyTester.Analog_Input_Expect_V replaces SelfTest_AnalogInput_Expect_ch_V
whismanoid 0:93d4119d3f14 524 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 525 float normValue_0_1 = analogInPin.read();
whismanoid 0:93d4119d3f14 526 double actual_result = normValue_0_1 * adc_full_scale_voltage;
whismanoid 0:93d4119d3f14 527 double err_result = (actual_result - expect_result);
whismanoid 0:93d4119d3f14 528 if (( -err_threshold < err_result) && ( err_result < err_threshold))
whismanoid 0:93d4119d3f14 529 {
whismanoid 0:93d4119d3f14 530 PASS();
whismanoid 0:93d4119d3f14 531 //~ SelfTest_print_VoltageOfCode(cmdLine, value_u12);
whismanoid 0:93d4119d3f14 532 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 533 associatedCmdLine.serial().printf("AIN0 = %7.3f%% = %1.3fV ",
whismanoid 0:93d4119d3f14 534 normValue_0_1 * 100.0,
whismanoid 0:93d4119d3f14 535 normValue_0_1 * adc_full_scale_voltage
whismanoid 0:93d4119d3f14 536 );
whismanoid 0:93d4119d3f14 537 //
whismanoid 0:93d4119d3f14 538 associatedCmdLine.serial().printf(" expect %6.6f +/- %6.6f", expect_result, err_threshold);
whismanoid 0:93d4119d3f14 539 return true;
whismanoid 0:93d4119d3f14 540 }
whismanoid 0:93d4119d3f14 541 else
whismanoid 0:93d4119d3f14 542 {
whismanoid 0:93d4119d3f14 543 FAIL();
whismanoid 0:93d4119d3f14 544 //~ SelfTest_print_VoltageOfCode(cmdLine, value_u12);
whismanoid 0:93d4119d3f14 545 // Platform board uses simple analog inputs
whismanoid 0:93d4119d3f14 546 associatedCmdLine.serial().printf("AIN0 = %7.3f%% = %1.3fV ",
whismanoid 0:93d4119d3f14 547 normValue_0_1 * 100.0,
whismanoid 0:93d4119d3f14 548 normValue_0_1 * adc_full_scale_voltage
whismanoid 0:93d4119d3f14 549 );
whismanoid 0:93d4119d3f14 550 //
whismanoid 0:93d4119d3f14 551 associatedCmdLine.serial().printf(" expect %6.6f +/- %6.6f", expect_result, err_threshold);
whismanoid 0:93d4119d3f14 552 associatedCmdLine.serial().printf(" but got %6.6f", actual_result);
whismanoid 0:93d4119d3f14 553 associatedCmdLine.serial().printf(" err=%6.6f", err_result);
whismanoid 0:93d4119d3f14 554 }
whismanoid 0:93d4119d3f14 555 //~ associatedCmdLine.serial().printf("\r\n");
whismanoid 0:93d4119d3f14 556 return false;
whismanoid 0:93d4119d3f14 557 }
whismanoid 0:93d4119d3f14 558
whismanoid 0:93d4119d3f14 559 bool MaximTinyTester::DigitalIn_Read_Expect_WarnOnly(DigitalIn& digitalInPin, const char* pinName, int expect_result, const char *expect_description)
whismanoid 0:93d4119d3f14 560 {
whismanoid 0:93d4119d3f14 561 int actual_UPO_value = -1;
whismanoid 0:93d4119d3f14 562 for (int retry_count = 0; retry_count < 10; retry_count++) {
whismanoid 0:93d4119d3f14 563 actual_UPO_value = digitalInPin.read(); // g_MAX5171_device.UPOinputValue();
whismanoid 0:93d4119d3f14 564 if (actual_UPO_value == expect_result) {
whismanoid 0:93d4119d3f14 565 PASS();
whismanoid 0:93d4119d3f14 566 associatedCmdLine.serial().printf("%s signal=%d %s", pinName, expect_result, expect_description);
whismanoid 0:93d4119d3f14 567 return true;
whismanoid 0:93d4119d3f14 568 }
whismanoid 0:93d4119d3f14 569 // UPO condition not met, retry for a while until give up
whismanoid 0:93d4119d3f14 570 wait_ms(input_timeout_time_msec / 10); // delay
whismanoid 0:93d4119d3f14 571 }
whismanoid 0:93d4119d3f14 572 associatedCmdLine.serial().printf("\r\n!WARN "); // SelfTest_FAIL(cmdLine);
whismanoid 0:93d4119d3f14 573 associatedCmdLine.serial().printf("expected %s signal=%d %s", pinName, expect_result, expect_description);
whismanoid 0:93d4119d3f14 574 associatedCmdLine.serial().printf(", but got actual %s=%d", pinName, actual_UPO_value);
whismanoid 0:93d4119d3f14 575 associatedCmdLine.serial().printf(", missing %s connections?", pinName);
whismanoid 0:93d4119d3f14 576 return false;
whismanoid 0:93d4119d3f14 577 }
whismanoid 0:93d4119d3f14 578
whismanoid 0:93d4119d3f14 579 void MaximTinyTester::Wait_Output_Settling()
whismanoid 0:93d4119d3f14 580 {
whismanoid 0:93d4119d3f14 581 wait_ms(settle_time_msec); // delay
whismanoid 0:93d4119d3f14 582 }
whismanoid 0:93d4119d3f14 583
whismanoid 0:93d4119d3f14 584
whismanoid 0:93d4119d3f14 585 // End of file
whismanoid 0:93d4119d3f14 586