Beispiel #1
0
/**
 * Build a vector of Slot from the global_slots map with the
 * offset applied.
 *
 * The clears the global_slots map.
 * @returns true if the offset was applied correctly, false otherwise.
 */
bool ApplyOffset(uint16_t offset, SlotList *all_slots) {
  bool ok = true;
  all_slots->reserve(global_slots.size());
  SlotActionMap::const_iterator iter = global_slots.begin();
  for (; iter != global_slots.end(); ++iter) {
    Slot *slots = iter->second;
    if (slots->SlotOffset() + offset >= ola::DMX_UNIVERSE_SIZE) {
      OLA_FATAL << "Slot " << slots->SlotOffset() << " + offset " <<
        offset << " is greater than " << ola::DMX_UNIVERSE_SIZE - 1;
      ok = false;
      break;
    }
    slots->SetSlotOffset(slots->SlotOffset() + offset);
    all_slots->push_back(slots);
  }

  if (!ok) {
    all_slots->clear();
    STLDeleteValues(&global_slots);
  }

  global_slots.clear();
  return ok;
}
Beispiel #2
0
/*
 * Main
 */
int main(int argc, char *argv[]) {
  ola::AppInit(&argc,
               argv,
               "[options] <config_file>",
               "Run programs based on the values in a DMX stream.");

  if (FLAGS_offset >= ola::DMX_UNIVERSE_SIZE) {
    std::cerr << "Invalid slot offset: " << FLAGS_offset << std::endl;
    exit(ola::EXIT_USAGE);
  }

  if (argc != 2)
    ola::DisplayUsageAndExit();

  // setup the default context
  global_context = new Context();
  OLA_INFO << "Loading config from " << argv[1];

  // open the config file
  if (freopen(argv[1], "r", stdin) == NULL) {
    OLA_FATAL << "File " << argv[1] << " cannot be opened.\n";
    exit(ola::EXIT_DATAERR);
  }

  yyparse();

  if (FLAGS_validate) {
    std::cout << "File " << argv[1] << " is valid." << std::endl;
    // TODO(Peter): Print some stats here, validate the offset if supplied
    STLDeleteValues(&global_slots);
    exit(ola::EXIT_OK);
  }

  // if we got to this stage the config is ok and we want to run it, setup the
  // client
  ola::OlaCallbackClientWrapper wrapper;

  if (!wrapper.Setup())
    exit(ola::EXIT_UNAVAILABLE);

  ss = wrapper.GetSelectServer();

  if (!InstallSignals())
    exit(ola::EXIT_OSERR);

  // create the vector of Slot
  SlotList slots;
  if (ApplyOffset(FLAGS_offset, &slots)) {
    // setup the trigger
    DMXTrigger trigger(global_context, slots);

    // register for DMX
    ola::OlaCallbackClient *client = wrapper.GetClient();
    client->SetDmxCallback(
        ola::NewCallback(&NewDmx,
                         static_cast<unsigned int>(FLAGS_universe),
                         &trigger));
    client->RegisterUniverse(FLAGS_universe, ola::REGISTER, NULL);

    // start the client
    wrapper.GetSelectServer()->Run();
  }

  // cleanup
  STLDeleteElements(&slots);
}