handle more usb errors, set max for notifications, usb transfer uses unique ptr over vector, show usb speed in usb menu.

This commit is contained in:
ITotalJustice
2025-07-19 20:29:53 +01:00
parent 4421ac1ceb
commit 7fb973c28d
15 changed files with 149 additions and 183 deletions

View File

@@ -595,7 +595,10 @@ enum class SphairaResult : Result {
UsbBadMagic,
UsbBadVersion,
UsbBadCount,
UsbBadBufferAlign,
UsbBadTransferSize,
UsbEmptyTransferSize,
UsbOverflowTransferSize,
UsbBadTotalSize,
UsbUploadBadMagic,
@@ -726,8 +729,10 @@ enum : Result {
MAKE_SPHAIRA_RESULT_ENUM(UsbBadMagic),
MAKE_SPHAIRA_RESULT_ENUM(UsbBadVersion),
MAKE_SPHAIRA_RESULT_ENUM(UsbBadCount),
MAKE_SPHAIRA_RESULT_ENUM(UsbBadBufferAlign),
MAKE_SPHAIRA_RESULT_ENUM(UsbBadTransferSize),
MAKE_SPHAIRA_RESULT_ENUM(UsbBadTotalSize),
MAKE_SPHAIRA_RESULT_ENUM(UsbEmptyTransferSize),
MAKE_SPHAIRA_RESULT_ENUM(UsbOverflowTransferSize),
MAKE_SPHAIRA_RESULT_ENUM(UsbUploadBadMagic),
MAKE_SPHAIRA_RESULT_ENUM(UsbUploadExit),
MAKE_SPHAIRA_RESULT_ENUM(UsbUploadBadCount),

View File

@@ -27,19 +27,16 @@ struct Menu final : MenuBase {
auto GetShortTitle() const -> const char* override { return "USB"; };
void Update(Controller* controller, TouchInfo* touch) override;
void Draw(NVGcontext* vg, Theme* theme) override;
void OnFocusGained() override;
// this should be private
// private:
void ThreadFunction();
private:
std::unique_ptr<yati::source::Usb> m_usb_source{};
bool m_was_mtp_enabled{};
Thread m_thread{};
Mutex m_mutex{};
// the below are shared across threads, lock with the above mutex!
State m_state{State::None};
std::atomic<State> m_state{State::None};
std::vector<std::string> m_names{};
bool m_usb_has_connection{};
};
} // namespace sphaira::ui::menu::usb

View File

@@ -45,6 +45,7 @@ private:
private:
void Draw(NVGcontext* vg, Theme* theme, Entries& entries);
auto GetEntries(NotifEntry::Side side) -> Entries&;
private:
Entries m_entries_left{};

View File

@@ -2,7 +2,7 @@
#include <vector>
#include <string>
#include <new>
#include <memory>
#include <switch.h>
namespace sphaira::usb {
@@ -39,43 +39,10 @@ struct Base {
ueventSignal(GetCancelEvent());
}
auto& GetTransferBuffer() {
return m_aligned;
}
auto GetTransferTimeout() const {
return m_transfer_timeout;
}
public:
// custom allocator for std::vector that respects alignment.
// https://en.cppreference.com/w/cpp/named_req/Allocator
template <typename T, std::size_t Align>
struct CustomVectorAllocator {
public:
// https://en.cppreference.com/w/cpp/memory/new/operator_new
auto allocate(std::size_t n) -> T* {
n = (n + (Align - 1)) &~ (Align - 1);
return new(align) T[n];
}
// https://en.cppreference.com/w/cpp/memory/new/operator_delete
auto deallocate(T* p, std::size_t n) noexcept -> void {
// ::operator delete[] (p, n, align);
::operator delete[] (p, align);
}
private:
static constexpr inline std::align_val_t align{Align};
};
template <typename T>
struct PageAllocator : CustomVectorAllocator<T, 0x1000> {
using value_type = T; // used by std::vector
};
using PageAlignedVector = std::vector<u8, PageAllocator<u8>>;
protected:
enum UsbSessionEndpoint {
UsbSessionEndpoint_In = 0,
@@ -90,7 +57,7 @@ protected:
private:
u64 m_transfer_timeout{};
UEvent m_uevent{};
PageAlignedVector m_aligned{};
std::unique_ptr<u8*> m_aligned{};
};
} // namespace sphaira::usb

View File

@@ -31,6 +31,7 @@ private:
private:
std::unique_ptr<usb::UsbHs> m_usb;
std::vector<u8> m_buf;
};
} // namespace sphaira::usb::upload

View File

@@ -7,6 +7,9 @@ enum { UsbDeviceSpeed_None = 0x0 };
enum { UsbDeviceSpeed_Low = 0x1 };
Result usbDsGetSpeed(UsbDeviceSpeed *out);
auto GetUsbDsStateStr(UsbState state) -> const char*;
auto GetUsbDsSpeedStr(UsbDeviceSpeed speed) -> const char*;
namespace sphaira::usb {
// Device Host