// Adds events to events file; we won't be able to post anything to the file // until we set to permissive mode in tests. No events are posted until then. void ScriptedBeacon::set_state(PlaybackEvent::PlaybackEventType state) {
PlaybackEvent event;
current_state_ = state; if (!events_ostream_.is_open()) {
events_ostream_.open(events_file_, std::ios::out | std::ios::binary | std::ios::trunc); if (!events_ostream_.is_open()) {
INFO("Events file not opened yet, for event: {}",
PlaybackEvent::PlaybackEventType_Name(state)); return;
}
}
populate_event(&event, state);
event.SerializeToOstream(&events_ostream_);
events_ostream_.flush();
}
void ScriptedBeacon::Tick() { switch (current_state_) { case PlaybackEvent::INITIALIZED:
Beacon::Tick(); break; case PlaybackEvent::SCANNED_ONCE:
next_check_time_ = steady_clock::now() + steady_clock::duration(std::chrono::seconds(1));
set_state(PlaybackEvent::WAITING_FOR_FILE); break; case PlaybackEvent::WAITING_FOR_FILE: if (!has_time_elapsed(next_check_time_)) { return;
}
next_check_time_ = steady_clock::now() + steady_clock::duration(std::chrono::seconds(1)); if (access(config_file_.c_str(), F_OK) == -1) { return;
}
set_state(PlaybackEvent::WAITING_FOR_FILE_TO_BE_READABLE); break; case PlaybackEvent::WAITING_FOR_FILE_TO_BE_READABLE: if (access(config_file_.c_str(), R_OK) == -1) { return;
}
set_state(PlaybackEvent::PARSING_FILE); break; case PlaybackEvent::PARSING_FILE: { if (!has_time_elapsed(next_check_time_)) { return;
}
std::fstream input(config_file_, std::ios::in | std::ios::binary); if (!ble_ad_list_.ParseFromIstream(&input)) {
ERROR("Cannot parse playback file {}", config_file_);
set_state(PlaybackEvent::FILE_PARSING_FAILED); return;
}
set_state(PlaybackEvent::PLAYBACK_STARTED);
INFO("Starting Ble advertisement playback from file: {}", config_file_);
next_ad_.ad_time = steady_clock::now();
get_next_advertisement();
input.close(); break;
} case PlaybackEvent::PLAYBACK_STARTED: { while (has_time_elapsed(next_ad_.ad_time)) { auto ad = model::packets::LeLegacyAdvertisingPduBuilder::Create(
next_ad_.address, Address::kEmpty /* Destination */, AddressType::RANDOM,
AddressType::PUBLIC, LegacyAdvertisingType::ADV_NONCONN_IND, next_ad_.ad);
SendLinkLayerPacket(std::move(ad), Phy::Type::LOW_ENERGY); if (packet_num_ < ble_ad_list_.advertisements().size()) {
get_next_advertisement();
} else {
set_state(PlaybackEvent::PLAYBACK_ENDED); if (events_ostream_.is_open()) {
events_ostream_.close();
}
INFO("Completed Ble advertisement playback from file: {} with {} " "packets",
config_file_, packet_num_); break;
}
}
} break; case PlaybackEvent::FILE_PARSING_FAILED: case PlaybackEvent::PLAYBACK_ENDED: case PlaybackEvent::UNKNOWN: return;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.