-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathClockMaster.cpp
More file actions
65 lines (50 loc) · 2.04 KB
/
ClockMaster.cpp
File metadata and controls
65 lines (50 loc) · 2.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// This file is part of the Open Audio Live System project, a live audio environment
// Copyright (c) 2026 - Mathis DELGADO
//
// This project is distributed under the Creative Commons CC-BY-NC-SA licence. https://creativecommons.org/licenses/by-nc-sa/4.0
//
// Created by mathis on 30/06/25.
//
#include "ClockMaster.h"
ClockMaster::ClockMaster(uint16_t self_uid, const std::string& iface, std::shared_ptr<NetworkMapper> nmapper) {
m_nmapper = nmapper;
m_sync_socket = std::make_shared<LowLatSocket>(self_uid, nmapper);
if (!m_sync_socket->init_socket(iface, EthProtocol::ETH_PROTO_OANSYNC)) {
#ifdef __linux__
std::cerr << "Failed to init clock sync socket !" << std::endl;
#endif // __linux__
}
m_sync_states = {};
}
void ClockMaster::begin_sync_process() {
m_sync_states.clear();
auto slaves = m_nmapper->get_clock_slaves();
for (auto& s : slaves) {
start_clock_sync(s);
}
}
void ClockMaster::sync_process() {
LowLatPacket<ClockSyncPacket> ck_packet{};
if (m_sync_socket->receive_data(&ck_packet) > 0) {
if (ck_packet.payload.header.type == PacketType::CLOCK_SYNC) {
process_packet(ck_packet.payload, ck_packet.llhdr.sender_uid);
}
}
}
void ClockMaster::process_packet(ClockSyncPacket &csp, uint16_t originator) {
if (csp.packet_data.packet_state == ClockSyncState::CKSYNC_DELAY_REQ) {
ClockSyncPacket del_resp{};
del_resp.header.type = PacketType::CLOCK_SYNC;
del_resp.header.timestamp = NetworkMapper::local_now_us();
del_resp.packet_data.packet_state = ClockSyncState::CKSYNC_DELAY_RESP;
m_sync_socket->send_data(del_resp, originator);
}
}
void ClockMaster::start_clock_sync(PeerInfos &slave) {
ClockSyncPacket pck{};
pck.header.type = PacketType::CLOCK_SYNC;
pck.header.timestamp = NetworkMapper::local_now_us();
pck.packet_data.packet_state = ClockSyncState::CKSYNC_SYNC;
m_sync_socket->send_data(pck, slave.peer_data.self_uid);
m_sync_states[slave.peer_data.self_uid] = ClockSyncState::CKSYNC_SYNC;
}