mirror of
https://github.com/citra-mirror/citra.git
synced 2024-08-20 02:13:23 +02:00
Serialize IR service
This commit is contained in:
parent
8bd3e8cd27
commit
eb67167b7c
2
TODO
2
TODO
@ -85,7 +85,7 @@
|
||||
☐ Fix the global weak_ptr to gsp
|
||||
✔ HID @done(19-12-30 14:46)
|
||||
✔ HTTP @done(19-12-30 15:18)
|
||||
☐ IR
|
||||
✔ IR @done(19-12-30 16:06)
|
||||
☐ LDR_RO
|
||||
☐ MIC
|
||||
☐ MVD
|
||||
|
@ -6,6 +6,8 @@
|
||||
|
||||
#include <array>
|
||||
#include <atomic>
|
||||
#include <boost/serialization/array.hpp>
|
||||
#include <boost/serialization/export.hpp>
|
||||
#include "common/bit_field.h"
|
||||
#include "common/swap.h"
|
||||
#include "core/frontend/input.h"
|
||||
@ -65,6 +67,16 @@ private:
|
||||
std::unique_ptr<Input::ButtonDevice> zr;
|
||||
std::unique_ptr<Input::AnalogDevice> c_stick;
|
||||
std::atomic<bool> is_device_reload_pending;
|
||||
|
||||
template <class Archive>
|
||||
void serialize(Archive& ar, const unsigned int) {
|
||||
ar& hid_period;
|
||||
ar& calibration_data; // This isn't writeable for now, but might be in future
|
||||
RequestInputDevicesReload(); // zl, zr, c_stick are loaded here
|
||||
}
|
||||
friend class boost::serialization::access;
|
||||
};
|
||||
|
||||
} // namespace Service::IR
|
||||
|
||||
BOOST_CLASS_EXPORT_KEY(Service::IR::ExtraHID)
|
||||
|
@ -15,6 +15,19 @@
|
||||
|
||||
namespace Service::IR {
|
||||
|
||||
template <class Archive>
|
||||
void IR_USER::serialize(Archive& ar, const unsigned int) {
|
||||
ar& boost::serialization::base_object<Kernel::SessionRequestHandler>(*this);
|
||||
ar& conn_status_event;
|
||||
ar& send_event;
|
||||
ar& receive_event;
|
||||
ar& shared_memory;
|
||||
ar& connected_device;
|
||||
ar& *receive_buffer.get();
|
||||
ar& *extra_hid.get();
|
||||
}
|
||||
SERIALIZE_IMPL(IR_USER)
|
||||
|
||||
// This is a header that will present in the ir:USER shared memory if it is initialized with
|
||||
// InitializeIrNopShared service function. Otherwise the shared memory doesn't have this header if
|
||||
// it is initialized with InitializeIrNop service function.
|
||||
@ -139,6 +152,16 @@ private:
|
||||
u32_le end_index;
|
||||
u32_le packet_count;
|
||||
u32_le unknown;
|
||||
|
||||
private:
|
||||
template <class Archive>
|
||||
void serialize(Archive& ar, const unsigned int) {
|
||||
ar& begin_index;
|
||||
ar& end_index;
|
||||
ar& packet_count;
|
||||
ar& unknown;
|
||||
}
|
||||
friend class boost::serialization::access;
|
||||
};
|
||||
static_assert(sizeof(BufferInfo) == 16, "BufferInfo has wrong size!");
|
||||
|
||||
@ -179,6 +202,18 @@ private:
|
||||
u32 buffer_offset;
|
||||
u32 max_packet_count;
|
||||
u32 max_data_size;
|
||||
|
||||
private:
|
||||
template <class Archive>
|
||||
void serialize(Archive& ar, const unsigned int) {
|
||||
ar& info;
|
||||
ar& shared_memory;
|
||||
ar& info_offset;
|
||||
ar& buffer_offset;
|
||||
ar& max_packet_count;
|
||||
ar& max_data_size;
|
||||
}
|
||||
friend class boost::serialization::access;
|
||||
};
|
||||
|
||||
/// Wraps the payload into packet and puts it to the receive buffer
|
||||
@ -270,8 +305,8 @@ void IR_USER::RequireConnection(Kernel::HLERequestContext& ctx) {
|
||||
shared_memory_ptr[offsetof(SharedMemoryHeader, connection_role)] = 2;
|
||||
shared_memory_ptr[offsetof(SharedMemoryHeader, connected)] = 1;
|
||||
|
||||
connected_device = extra_hid.get();
|
||||
connected_device->OnConnect();
|
||||
connected_device = true;
|
||||
extra_hid->OnConnect();
|
||||
conn_status_event->Signal();
|
||||
} else {
|
||||
LOG_WARNING(Service_IR, "unknown device id {}. Won't connect.", device_id);
|
||||
@ -305,8 +340,8 @@ void IR_USER::GetSendEvent(Kernel::HLERequestContext& ctx) {
|
||||
|
||||
void IR_USER::Disconnect(Kernel::HLERequestContext& ctx) {
|
||||
if (connected_device) {
|
||||
connected_device->OnDisconnect();
|
||||
connected_device = nullptr;
|
||||
extra_hid->OnDisconnect();
|
||||
connected_device = false;
|
||||
conn_status_event->Signal();
|
||||
}
|
||||
|
||||
@ -331,8 +366,8 @@ void IR_USER::GetConnectionStatusEvent(Kernel::HLERequestContext& ctx) {
|
||||
|
||||
void IR_USER::FinalizeIrNop(Kernel::HLERequestContext& ctx) {
|
||||
if (connected_device) {
|
||||
connected_device->OnDisconnect();
|
||||
connected_device = nullptr;
|
||||
extra_hid->OnDisconnect();
|
||||
connected_device = false;
|
||||
}
|
||||
|
||||
shared_memory = nullptr;
|
||||
@ -352,7 +387,7 @@ void IR_USER::SendIrNop(Kernel::HLERequestContext& ctx) {
|
||||
|
||||
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
||||
if (connected_device) {
|
||||
connected_device->OnReceive(buffer);
|
||||
extra_hid->OnReceive(buffer);
|
||||
send_event->Signal();
|
||||
rb.Push(RESULT_SUCCESS);
|
||||
} else {
|
||||
@ -424,7 +459,7 @@ IR_USER::IR_USER(Core::System& system) : ServiceFramework("ir:USER", 1) {
|
||||
|
||||
IR_USER::~IR_USER() {
|
||||
if (connected_device) {
|
||||
connected_device->OnDisconnect();
|
||||
extra_hid->OnDisconnect();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <boost/serialization/shared_ptr.hpp>
|
||||
#include "core/hle/service/service.h"
|
||||
|
||||
namespace Kernel {
|
||||
@ -45,6 +46,7 @@ protected:
|
||||
void Send(const std::vector<u8>& data);
|
||||
|
||||
private:
|
||||
// NOTE: This value is *not* serialized because it's always passed in the constructor
|
||||
const SendFunc send_func;
|
||||
};
|
||||
|
||||
@ -164,9 +166,14 @@ private:
|
||||
|
||||
std::shared_ptr<Kernel::Event> conn_status_event, send_event, receive_event;
|
||||
std::shared_ptr<Kernel::SharedMemory> shared_memory;
|
||||
IRDevice* connected_device{nullptr};
|
||||
bool connected_device;
|
||||
std::unique_ptr<BufferManager> receive_buffer;
|
||||
std::unique_ptr<ExtraHID> extra_hid;
|
||||
|
||||
private:
|
||||
template <class Archive>
|
||||
void serialize(Archive& ar, const unsigned int);
|
||||
friend class boost::serialization::access;
|
||||
};
|
||||
|
||||
} // namespace Service::IR
|
||||
|
Loading…
Reference in New Issue
Block a user