Command::SlaveList Command::selectedSlaves(MasterDevice &m) { ec_ioctl_master_t master; unsigned int i; ec_ioctl_slave_t slave; SlaveList list; m.getMaster(&master); if (aliases == "-") { // no alias given PositionParser pp(master.slave_count); NumberListParser::List posList = pp.parse(positions.c_str()); NumberListParser::List::const_iterator pi; for (pi = posList.begin(); pi != posList.end(); pi++) { if (*pi < master.slave_count) { m.getSlave(&slave, *pi); list.push_back(slave); } } } else { // aliases given SlaveAliasParser ap(master, m); NumberListParser::List aliasList = ap.parse(aliases.c_str()); NumberListParser::List::const_iterator ai; for (ai = aliasList.begin(); ai != aliasList.end(); ai++) { // gather slaves with that alias (and following) uint16_t lastAlias = 0; vector<ec_ioctl_slave_t> aliasSlaves; for (i = 0; i < master.slave_count; i++) { m.getSlave(&slave, i); if (slave.alias) { if (lastAlias && lastAlias == *ai && slave.alias != *ai) { // ignore multiple ocurrences of the same alias to // assure consistency for the position argument break; } lastAlias = slave.alias; } if (lastAlias == *ai) { aliasSlaves.push_back(slave); } } PositionParser pp(aliasSlaves.size()); NumberListParser::List posList = pp.parse(positions.c_str()); NumberListParser::List::const_iterator pi; for (pi = posList.begin(); pi != posList.end(); pi++) { if (*pi < aliasSlaves.size()) { list.push_back(aliasSlaves[*pi]); } } } } return list; }
void CommandCStruct::execute(const StringVector &args) { MasterIndexList masterIndices; SlaveList slaves; SlaveList::const_iterator si; if (args.size()) { stringstream err; err << "'" << getName() << "' takes no arguments!"; throwInvalidUsageException(err); } masterIndices = getMasterIndices(); MasterIndexList::const_iterator mi; for (mi = masterIndices.begin(); mi != masterIndices.end(); mi++) { MasterDevice m(*mi); m.open(MasterDevice::Read); slaves = selectedSlaves(m); for (si = slaves.begin(); si != slaves.end(); si++) { generateSlaveCStruct(m, *si); } } }
void CommandFoeRead::execute(const StringVector &args) { SlaveList slaves; ec_ioctl_slave_t *slave; ec_ioctl_slave_foe_t data; unsigned int i; stringstream err; if (args.size() != 1) { err << "'" << getName() << "' takes exactly one argument!"; throwInvalidUsageException(err); } MasterDevice m(getSingleMasterIndex()); m.open(MasterDevice::Read); slaves = selectedSlaves(m); if (slaves.size() != 1) { throwSingleSlaveRequired(slaves.size()); } slave = &slaves.front(); data.slave_position = slave->position; /* FIXME: No good idea to have a fixed buffer size. * Read in chunks and fill a buffer instead. */ data.offset = 0; data.buffer_size = 0x8800; data.buffer = new uint8_t[data.buffer_size]; strncpy(data.file_name, args[0].c_str(), sizeof(data.file_name)); try { m.readFoe(&data); } catch (MasterDeviceException &e) { delete [] data.buffer; if (data.result) { if (data.result == FOE_OPCODE_ERROR) { err << "FoE read aborted with error code 0x" << setw(8) << setfill('0') << hex << data.error_code << ": " << errorText(data.error_code); } else { err << "Failed to write via FoE: " << resultText(data.result); } throwCommandException(err); } else { throw e; } } // TODO --output-file for (i = 0; i < data.data_size; i++) { uint8_t *w = data.buffer + i; cout << *(uint8_t *) w ; } delete [] data.buffer; }
void CommandStates::execute(const StringVector &args) { MasterIndexList masterIndices; SlaveList slaves; SlaveList::const_iterator si; stringstream err; string stateStr; uint8_t state = 0x00; if (args.size() != 1) { err << "'" << getName() << "' takes exactly one argument!"; throwInvalidUsageException(err); } stateStr = args[0]; transform(stateStr.begin(), stateStr.end(), stateStr.begin(), (int (*) (int)) std::toupper); if (stateStr == "INIT") { state = 0x01; } else if (stateStr == "PREOP") { state = 0x02; } else if (stateStr == "BOOT") { state = 0x03; } else if (stateStr == "SAFEOP") { state = 0x04; } else if (stateStr == "OP") { state = 0x08; } else { err << "Invalid state '" << args[0] << "'!"; throwInvalidUsageException(err); } masterIndices = getMasterIndices(); MasterIndexList::const_iterator mi; for (mi = masterIndices.begin(); mi != masterIndices.end(); mi++) { MasterDevice m(*mi); m.open(MasterDevice::ReadWrite); slaves = selectedSlaves(m); for (si = slaves.begin(); si != slaves.end(); si++) { m.requestState(si->position, state); } } }
AddAlternatives::AddAlternatives(Item* item, QWidget *parent) : KDialog(parent), m_item(item), m_alternative(0) { setupUi(mainWidget()); mainWidget()->layout()->setMargin(0); setButtons(Ok | Cancel); setCaption(i18n("Add Alternative")); showButtonSeparator(true); m_Path->setWindowTitle( i18n( "Choose Alternative" ) ); m_Path->setFilter( i18n( "*|All Files" ) ); m_Path->setMode( KFile::File | KFile::LocalOnly ); const int slaveCount = item->getSlaves()->count(); if (slaveCount > 0) { SlaveList *slaves = item->getSlaves(); QWidget *w = new QWidget; QVBoxLayout *lay = new QVBoxLayout(w); for (int i = 0; i < slaveCount; ++i) { if (i > 0) lay->addWidget(new KSeparator(Qt::Horizontal, w)); SlaveWidget *sw = new SlaveWidget(slaves->at(i), w); lay->addWidget(sw); m_slaveWidgets.append(sw); connect(sw, SIGNAL(slaveChanged(QString)), this, SLOT(slotCheckSlaves())); } w->show(); m_slavesArea->setWidget(w); } else { m_slavesGroup->hide(); } enableButtonOk(false); connect(m_Path, SIGNAL(textChanged(QString)), this, SLOT(slotCheckSlaves())); connect(this, SIGNAL(okClicked()), this, SLOT(slotOkClicked())); }
int main(int argc, char **argv) { Lock lock; int debug=0; string list_fn; opterr = 0; int c; while ((c = getopt(argc, argv, "di:l:s:v:p")) != -1) switch (c) { case 'd': debug++; break; case 'l': list_fn = string(optarg); break; default: cout << "Usage " << argv[0] << " -l [slave_fn] [-d]" << endl << " -l specifies board list file" << endl << " -d Enable debug ouput" << endl; exit(-1); } // lock this process into memory if (true) { struct sched_param sp; memset(&sp, 0, sizeof(sp)); sp.sched_priority = sched_get_priority_max(SCHED_FIFO); sched_setscheduler(0, SCHED_FIFO, &sp); mlockall(MCL_CURRENT | MCL_FUTURE); } nRF24L01::channel = ensemble::default_channel; memcpy(nRF24L01::master_addr, ensemble::master_addr, nRF24L01::addr_len); memcpy(nRF24L01::broadcast_addr, ensemble::slave_addr[0], nRF24L01::addr_len); memcpy(nRF24L01::slave_addr, ensemble::slave_addr[2], nRF24L01::addr_len); nRF24L01::setup(); if (!nRF24L01::configure_base()) { cout << "Failed to find nRF24L01. Exiting." << endl; return -1; } nRF24L01::configure_PTX(); nRF24L01::flush_tx(); SlaveList todo; if (list_fn.size()) { todo = read_slaves(list_fn); if (debug>2) cout << list_fn << ":" << endl << todo; } else for (int id=1; id < ensemble::num_slaves; id++) todo.push_back(Slave(id)); SlaveList found = scan(todo); cout << "Boards found:" << endl << found << endl; if (debug>2) cout << "No response:" << endl << todo << endl; nRF24L01::shutdown(); return 0; }
void CommandFoeWrite::execute(const StringVector &args) { stringstream err; ec_ioctl_slave_foe_t data; ifstream file; SlaveList slaves; string storeFileName; if (args.size() != 1) { err << "'" << getName() << "' takes exactly one argument!"; throwInvalidUsageException(err); } if (args[0] == "-") { loadFoeData(&data, cin); if (getOutputFile().empty()) { err << "Please specify a filename for the slave side" << " with --output-file!"; throwCommandException(err); } else { storeFileName = getOutputFile(); } } else { file.open(args[0].c_str(), ifstream::in | ifstream::binary); if (file.fail()) { err << "Failed to open '" << args[0] << "'!"; throwCommandException(err); } loadFoeData(&data, file); file.close(); if (getOutputFile().empty()) { char *cpy = strdup(args[0].c_str()); // basename can modify // the string contents storeFileName = basename(cpy); free(cpy); } else { storeFileName = getOutputFile(); } } MasterDevice m(getSingleMasterIndex()); try { m.open(MasterDevice::ReadWrite); } catch (MasterDeviceException &e) { if (data.buffer_size) delete [] data.buffer; throw e; } slaves = selectedSlaves(m); if (slaves.size() != 1) { if (data.buffer_size) delete [] data.buffer; throwSingleSlaveRequired(slaves.size()); } data.slave_position = slaves.front().position; // write data via foe to the slave data.offset = 0; strncpy(data.file_name, storeFileName.c_str(), sizeof(data.file_name)); try { m.writeFoe(&data); } catch (MasterDeviceException &e) { if (data.buffer_size) delete [] data.buffer; if (data.result) { if (data.result == FOE_OPCODE_ERROR) { err << "FoE write aborted with error code 0x" << setw(8) << setfill('0') << hex << data.error_code << ": " << errorText(data.error_code); } else { err << "Failed to write via FoE: " << resultText(data.result); } throwCommandException(err); } else { throw e; } } if (getVerbosity() == Verbose) { cerr << "FoE writing finished." << endl; } if (data.buffer_size) delete [] data.buffer; }