1616 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1717 */
1818
19+ #include < eez/system.h>
20+
1921#include < eez/apps/psu/psu.h>
2022
2123#include < stdio.h>
@@ -402,6 +404,71 @@ scpi_result_t scpi_cmd_diagnosticInformationFanQ(scpi_t *context) {
402404 return SCPI_RES_OK;
403405}
404406
407+ static uint8_t g_ioexpRegisters[CH_MAX][32 ];
408+ static uint8_t g_adcRegisters[CH_MAX][4 ];
409+
410+ void diagCallback () {
411+ for (int i = 0 ; i < CH_MAX; i++) {
412+ Channel& channel = Channel::get (i);
413+ if (channel.isInstalled ()) {
414+ channel.ioexp .readAllRegisters (&g_ioexpRegisters[i][0 ]);
415+ channel.adc .readAllRegisters (&g_adcRegisters[i][0 ]);
416+ }
417+ }
418+ }
419+
420+ scpi_result_t scpi_cmd_diagnosticInformationRegsQ (scpi_t *context) {
421+ g_diagCallback = diagCallback;
422+ while (g_diagCallback) {
423+ osDelay (1 );
424+ }
425+
426+ char buffer[2048 ];
427+
428+ buffer[0 ] = 0 ;
429+
430+ for (int i = 0 ; i < CH_MAX; i++) {
431+ Channel& channel = Channel::get (i);
432+ if (channel.isInstalled ()) {
433+ sprintf (buffer + strlen (buffer), " CH%d:\n " , i + 1 );
434+
435+ sprintf (buffer + strlen (buffer), " \t IOEXP:\n " );
436+ sprintf (buffer + strlen (buffer), " \t\t IODIRA %X\n " , (int )g_ioexpRegisters[i][0 ]);
437+ sprintf (buffer + strlen (buffer), " \t\t IODIRB %X\n " , (int )g_ioexpRegisters[i][1 ]);
438+ sprintf (buffer + strlen (buffer), " \t\t IPOLA %X\n " , (int )g_ioexpRegisters[i][2 ]);
439+ sprintf (buffer + strlen (buffer), " \t\t IPOLB %X\n " , (int )g_ioexpRegisters[i][3 ]);
440+ sprintf (buffer + strlen (buffer), " \t\t GPINTENA %X\n " , (int )g_ioexpRegisters[i][4 ]);
441+ sprintf (buffer + strlen (buffer), " \t\t GPINTENB %X\n " , (int )g_ioexpRegisters[i][5 ]);
442+ sprintf (buffer + strlen (buffer), " \t\t DEFVALA %X\n " , (int )g_ioexpRegisters[i][6 ]);
443+ sprintf (buffer + strlen (buffer), " \t\t DEFVALB %X\n " , (int )g_ioexpRegisters[i][7 ]);
444+ sprintf (buffer + strlen (buffer), " \t\t INTCONA %X\n " , (int )g_ioexpRegisters[i][8 ]);
445+ sprintf (buffer + strlen (buffer), " \t\t INTCONB %X\n " , (int )g_ioexpRegisters[i][9 ]);
446+ sprintf (buffer + strlen (buffer), " \t\t IOCON %X\n " , (int )g_ioexpRegisters[i][10 ]);
447+ sprintf (buffer + strlen (buffer), " \t\t IOCON %X\n " , (int )g_ioexpRegisters[i][11 ]);
448+ sprintf (buffer + strlen (buffer), " \t\t GPPUA %X\n " , (int )g_ioexpRegisters[i][12 ]);
449+ sprintf (buffer + strlen (buffer), " \t\t GPPUB %X\n " , (int )g_ioexpRegisters[i][13 ]);
450+ sprintf (buffer + strlen (buffer), " \t\t INTFA %X\n " , (int )g_ioexpRegisters[i][14 ]);
451+ sprintf (buffer + strlen (buffer), " \t\t INTFB %X\n " , (int )g_ioexpRegisters[i][15 ]);
452+ sprintf (buffer + strlen (buffer), " \t\t INTCAPA %X\n " , (int )g_ioexpRegisters[i][16 ]);
453+ sprintf (buffer + strlen (buffer), " \t\t INTCAPB %X\n " , (int )g_ioexpRegisters[i][17 ]);
454+ sprintf (buffer + strlen (buffer), " \t\t GPIOA %X\n " , (int )g_ioexpRegisters[i][18 ]);
455+ sprintf (buffer + strlen (buffer), " \t\t GPIOB %X\n " , (int )g_ioexpRegisters[i][19 ]);
456+ sprintf (buffer + strlen (buffer), " \t\t OLATA %X\n " , (int )g_ioexpRegisters[i][20 ]);
457+ sprintf (buffer + strlen (buffer), " \t\t OLATB %X\n " , (int )g_ioexpRegisters[i][21 ]);
458+
459+ sprintf (buffer + strlen (buffer), " \t ADC:\n " );
460+ sprintf (buffer + strlen (buffer), " \t\t REG0 %X\n " , (int )g_adcRegisters[i][0 ]);
461+ sprintf (buffer + strlen (buffer), " \t\t REG1 %X\n " , (int )g_adcRegisters[i][1 ]);
462+ sprintf (buffer + strlen (buffer), " \t\t REG2 %X\n " , (int )g_adcRegisters[i][2 ]);
463+ sprintf (buffer + strlen (buffer), " \t\t REG3 %X\n " , (int )g_adcRegisters[i][3 ]);
464+ }
465+ }
466+
467+ SCPI_ResultCharacters (context, buffer, strlen (buffer));
468+
469+ return SCPI_RES_OK;
470+ }
471+
405472} // namespace scpi
406473} // namespace psu
407- } // namespace eez
474+ } // namespace eez
0 commit comments