|
1 /***************************************************************************** |
|
2 * |
|
3 * $Id$ |
|
4 * |
|
5 ****************************************************************************/ |
|
6 |
|
7 #include <iostream> |
|
8 #include <iomanip> |
|
9 using namespace std; |
|
10 |
|
11 #include "globals.h" |
|
12 |
|
13 /*****************************************************************************/ |
|
14 |
|
15 const char *help_domains = |
|
16 "[OPTIONS]\n" |
|
17 "\n" |
|
18 "\n" |
|
19 "Command-specific options:\n"; |
|
20 |
|
21 /****************************************************************************/ |
|
22 |
|
23 void showDomain(unsigned int); |
|
24 |
|
25 /****************************************************************************/ |
|
26 |
|
27 void command_domains(void) |
|
28 { |
|
29 masterDev.open(MasterDevice::Read); |
|
30 |
|
31 if (domainIndex == -1) { |
|
32 unsigned int i; |
|
33 ec_ioctl_master_t master; |
|
34 |
|
35 masterDev.getMaster(&master); |
|
36 |
|
37 for (i = 0; i < master.domain_count; i++) { |
|
38 showDomain(i); |
|
39 } |
|
40 } else { |
|
41 showDomain(domainIndex); |
|
42 } |
|
43 } |
|
44 |
|
45 /****************************************************************************/ |
|
46 |
|
47 void showDomain(unsigned int domainIndex) |
|
48 { |
|
49 ec_ioctl_domain_t domain; |
|
50 unsigned char *processData; |
|
51 ec_ioctl_domain_data_t data; |
|
52 unsigned int i, j; |
|
53 ec_ioctl_domain_fmmu_t fmmu; |
|
54 unsigned int dataOffset; |
|
55 |
|
56 masterDev.getDomain(&domain, domainIndex); |
|
57 |
|
58 cout << "Domain" << dec << domainIndex << ":" |
|
59 << " LogBaseAddr 0x" |
|
60 << hex << setfill('0') |
|
61 << setw(8) << domain.logical_base_address |
|
62 << ", Size " << dec << setfill(' ') |
|
63 << setw(3) << domain.data_size |
|
64 << ", WorkingCounter " |
|
65 << domain.working_counter << "/" |
|
66 << domain.expected_working_counter << endl; |
|
67 |
|
68 if (!domain.data_size || verbosity != Verbose) |
|
69 return; |
|
70 |
|
71 processData = new unsigned char[domain.data_size]; |
|
72 |
|
73 try { |
|
74 masterDev.getData(&data, domainIndex, domain.data_size, processData); |
|
75 } catch (MasterDeviceException &e) { |
|
76 delete [] processData; |
|
77 throw e; |
|
78 } |
|
79 |
|
80 for (i = 0; i < domain.fmmu_count; i++) { |
|
81 masterDev.getFmmu(&fmmu, domainIndex, i); |
|
82 |
|
83 cout << " SlaveConfig " |
|
84 << dec << fmmu.slave_config_alias |
|
85 << ":" << fmmu.slave_config_position |
|
86 << ", SM" << (unsigned int) fmmu.sync_index << " (" |
|
87 << setfill(' ') << setw(6) |
|
88 << (fmmu.dir == EC_DIR_INPUT ? "Input" : "Output") |
|
89 << "), LogAddr 0x" |
|
90 << hex << setfill('0') |
|
91 << setw(8) << fmmu.logical_address |
|
92 << ", Size " << dec << fmmu.data_size << endl; |
|
93 |
|
94 dataOffset = fmmu.logical_address - domain.logical_base_address; |
|
95 if (dataOffset + fmmu.data_size > domain.data_size) { |
|
96 stringstream err; |
|
97 err << "Fmmu information corrupted!"; |
|
98 delete [] processData; |
|
99 throw MasterDeviceException(err.str()); |
|
100 } |
|
101 |
|
102 cout << " " << hex << setfill('0'); |
|
103 for (j = 0; j < fmmu.data_size; j++) { |
|
104 if (j && !(j % BreakAfterBytes)) |
|
105 cout << endl << " "; |
|
106 cout << setw(2) |
|
107 << (unsigned int) *(processData + dataOffset + j) << " "; |
|
108 } |
|
109 cout << endl; |
|
110 } |
|
111 |
|
112 delete [] processData; |
|
113 } |
|
114 |
|
115 /*****************************************************************************/ |