32 const uint16_t *categoryHeader; |
32 const uint16_t *categoryHeader; |
33 uint16_t categoryType, categorySize; |
33 uint16_t categoryType, categorySize; |
34 uint8_t crc; |
34 uint8_t crc; |
35 |
35 |
36 if (slavePosition < 0) { |
36 if (slavePosition < 0) { |
37 err << "'sii_write' requires a slave! Please specify --slave."; |
37 err << "'" << commandName << "' requires a slave! " |
38 throw MasterDeviceException(err.str()); |
38 << "Please specify --slave."; |
|
39 throw InvalidUsageException(err); |
39 } |
40 } |
40 data.slave_position = slavePosition; |
41 data.slave_position = slavePosition; |
41 |
42 |
42 if (commandArgs.size() != 1) { |
43 if (commandArgs.size() != 1) { |
43 err << "'ssi_write' takes exactly one argument!"; |
44 err << "'" << commandName << "' takes exactly one argument!"; |
44 throw MasterDeviceException(err.str()); |
45 throw InvalidUsageException(err); |
45 } |
46 } |
46 |
47 |
47 file.open(commandArgs[0].c_str(), ifstream::in | ifstream::binary); |
48 file.open(commandArgs[0].c_str(), ifstream::in | ifstream::binary); |
48 if (file.fail()) { |
49 if (file.fail()) { |
49 err << "Failed to open '" << commandArgs[0] << "'!"; |
50 err << "Failed to open '" << commandArgs[0] << "'!"; |
50 throw MasterDeviceException(err.str()); |
51 throw CommandException(err); |
51 } |
52 } |
52 |
53 |
53 // get length of file |
54 // get length of file |
54 file.seekg(0, ios::end); |
55 file.seekg(0, ios::end); |
55 byte_size = file.tellg(); |
56 byte_size = file.tellg(); |
56 file.seekg(0, ios::beg); |
57 file.seekg(0, ios::beg); |
57 |
58 |
58 if (!byte_size || byte_size % 2) { |
59 if (!byte_size || byte_size % 2) { |
59 stringstream err; |
|
60 err << "Invalid file size! Must be non-zero and even."; |
60 err << "Invalid file size! Must be non-zero and even."; |
61 throw MasterDeviceException(err.str()); |
61 throw CommandException(err); |
62 } |
62 } |
63 |
63 |
64 data.nwords = byte_size / 2; |
64 data.nwords = byte_size / 2; |
65 if (data.nwords < 0x0041 && !force) { |
65 if (data.nwords < 0x0041 && !force) { |
66 err << "SII data too short (" << data.nwords << " words)! Mimimum is" |
66 err << "SII data too short (" << data.nwords << " words)! Mimimum is" |
67 " 40 fixed words + 1 delimiter. Use --force to write anyway."; |
67 " 40 fixed words + 1 delimiter. Use --force to write anyway."; |
68 throw MasterDeviceException(err.str()); |
68 throw CommandException(err); |
69 } |
69 } |
70 |
70 |
71 // allocate buffer and read file into buffer |
71 // allocate buffer and read file into buffer |
72 data.words = new uint16_t[data.nwords]; |
72 data.words = new uint16_t[data.nwords]; |
73 file.read((char *) data.words, byte_size); |
73 file.read((char *) data.words, byte_size); |
78 crc = calcSiiCrc((const uint8_t *) data.words, 14); |
78 crc = calcSiiCrc((const uint8_t *) data.words, 14); |
79 if (crc != ((const uint8_t *) data.words)[14]) { |
79 if (crc != ((const uint8_t *) data.words)[14]) { |
80 err << "CRC incorrect. Must be 0x" |
80 err << "CRC incorrect. Must be 0x" |
81 << hex << setfill('0') << setw(2) << (unsigned int) crc |
81 << hex << setfill('0') << setw(2) << (unsigned int) crc |
82 << ". Use --force to write anyway."; |
82 << ". Use --force to write anyway."; |
83 throw MasterDeviceException(err.str()); |
83 throw CommandException(err); |
84 } |
84 } |
85 |
85 |
86 // cycle through categories to detect corruption |
86 // cycle through categories to detect corruption |
87 categoryHeader = data.words + 0x0040U; |
87 categoryHeader = data.words + 0x0040U; |
88 categoryType = le16tocpu(*categoryHeader); |
88 categoryType = le16tocpu(*categoryHeader); |
89 while (categoryType != 0xffff) { |
89 while (categoryType != 0xffff) { |
90 if (categoryHeader + 1 > data.words + data.nwords) { |
90 if (categoryHeader + 1 > data.words + data.nwords) { |
91 err << "SII data seem to be corrupted! " |
91 err << "SII data seem to be corrupted! " |
92 << "Use --force to write anyway."; |
92 << "Use --force to write anyway."; |
93 throw MasterDeviceException(err.str()); |
93 throw CommandException(err); |
94 } |
94 } |
95 categorySize = le16tocpu(*(categoryHeader + 1)); |
95 categorySize = le16tocpu(*(categoryHeader + 1)); |
96 if (categoryHeader + 2 + categorySize + 1 |
96 if (categoryHeader + 2 + categorySize + 1 |
97 > data.words + data.nwords) { |
97 > data.words + data.nwords) { |
98 err << "SII data seem to be corrupted! " |
98 err << "SII data seem to be corrupted! " |
99 "Use --force to write anyway."; |
99 "Use --force to write anyway."; |
100 throw MasterDeviceException(err.str()); |
100 throw CommandException(err); |
101 } |
101 } |
102 categoryHeader += 2 + categorySize; |
102 categoryHeader += 2 + categorySize; |
103 categoryType = le16tocpu(*categoryHeader); |
103 categoryType = le16tocpu(*categoryHeader); |
104 } |
104 } |
105 } |
105 } |