BULK_OUT读数据状态,定义为IDLE;memory数据源发送时,增加进度通知

This commit is contained in:
gb 2023-12-16 15:27:40 +08:00
parent 137ba57a05
commit 04bf018274
6 changed files with 76 additions and 17 deletions

View File

@ -36,19 +36,12 @@ static sys_info g_si;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
packet_data_base::packet_data_base() : pack_cmd_(0), pack_id_(0)
, progress_notify_(PROGRESS_NOTIFYER()), user_data_(nullptr)
{}
{
set_progress_notify();
}
packet_data_base::~packet_data_base()
{}
int packet_data_base::notify_progress(uint64_t total, uint64_t cur_size, uint32_t err)
{
if (progress_notify_)
return progress_notify_(total, cur_size, err, user_data_);
else
return ENOENT;
}
void packet_data_base::set_packet_param(uint32_t cmd, uint32_t id)
{
pack_cmd_ = cmd;
@ -73,9 +66,18 @@ uint32_t packet_data_base::get_session_id(void)
void packet_data_base::set_progress_notify(PROGRESS_NOTIFYER notify, void* param)
{
progress_notify_ = notify;
auto empty_notifyer = [&](uint64_t, uint64_t, uint32_t, void*) -> int
{
return 0;
};
progress_notify_ = notify ? notify : empty_notifyer;
user_data_ = param;
}
int packet_data_base::notify_progress(uint64_t total, uint64_t cur_size, uint32_t err)
{
return progress_notify_(total, cur_size, err, user_data_);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
@ -857,12 +859,13 @@ dyn_mem_ptr dyn_mem_pool::take(void)
if(!pool_[rpos_])
{
utils::to_log(LOG_LEVEL_DEBUG, "memory pool pointer = %u.\n", wpos_);
chronograph watch;
do
{
std::this_thread::sleep_for(std::chrono::milliseconds(1));
} while (run_ && !pool_[rpos_]);
utils::to_log(LOG_LEVEL_DEBUG, "Waiting for taking memory pool took %ums at %u.\n", watch.elapse_ms(), rpos_);
utils::to_log(LOG_LEVEL_DEBUG, "Waiting for taking memory pool took %ums at %u (write pos = %u).\n", watch.elapse_ms(), rpos_, wpos_);
}
if(pool_[rpos_])
{

View File

@ -34,7 +34,6 @@ public:
protected:
virtual ~packet_data_base();
int notify_progress(uint64_t total, uint64_t cur_size, uint32_t err);
public:
void set_packet_param(uint32_t cmd, uint32_t id);
@ -45,6 +44,7 @@ public:
uint32_t get_session_id(void);
void set_progress_notify(PROGRESS_NOTIFYER notify = PROGRESS_NOTIFYER(), void* param = nullptr);
int notify_progress(uint64_t total, uint64_t cur_size, uint32_t err);
};
class file_map : public refer

View File

@ -688,6 +688,9 @@ int usb_device::close_device(void)
}
int usb_device::pull_up(std::string* msg)
{
if(on_)
return 0;
{
int dst = open(udc_.c_str(), O_RDWR);
if(dst == -1)
@ -700,6 +703,7 @@ int usb_device::pull_up(std::string* msg)
if(l == dwc3_.length())
{
utils::to_log(LOG_LEVEL_DEBUG, "pull up device by write '%s' to '%s' directly success.\n", dwc3_.c_str(), udc_.c_str());
on_ = true;
return 0;
}
else
@ -711,6 +715,9 @@ int usb_device::pull_up(std::string* msg)
int err = 0;
std::string info(utils::get_command_result(cmd.c_str(), -1, &err));
if(err == 0)
on_ = true;
if(msg)
*msg = std::move(info);
@ -718,10 +725,37 @@ int usb_device::pull_up(std::string* msg)
}
int usb_device::pull_down(void)
{
if(!on_)
return 0;
{
int dst = open(udc_.c_str(), O_RDWR);
if(dst == -1)
utils::to_log(LOG_LEVEL_DEBUG, "Try write empty to '%s' failed(open): %s\n", udc_.c_str(), strerror(errno));
else
{
int e = 0;
int l = write(dst, &e, 1),
err = errno;
close(dst);
if(l == 1)
{
utils::to_log(LOG_LEVEL_DEBUG, "pull down device by write '' to '%s' directly success.\n", udc_.c_str());
std::this_thread::sleep_for(std::chrono::seconds(3));
on_ = false;
return 0;
}
else
utils::to_log(LOG_LEVEL_DEBUG, "Try write '' to '%s' failed(write): %s\n", udc_.c_str(), strerror(errno));
}
}
std::string cmd("echo " + pwd_ + " | sudo -S sh -c \"echo " + "''" + " > " + udc_ + "\"");
int err = 0;
utils::get_command_result(cmd.c_str(), -1, &err);
if(err == 0)
on_ = false;
return err;
}

View File

@ -20,6 +20,7 @@ class usb_device : public refer
std::string ep_path_[EP_NB_OF_DESCRIPTORS];
ffs_strings ffs_strs_;
bool ffs_mode_ = true;
bool on_ = false;
size_t max_packet_ = 512;
void fill_if_descriptor(bool ffs_mode, usb_gadget * usbctx, struct usb_interface_descriptor * desc);

View File

@ -319,10 +319,23 @@ dyn_mem_ptr async_usb_gadget::handle_ctrl_setup(dyn_mem_ptr data)
return reply;
}
int async_usb_gadget::inner_write_bulk_memory(int fd, uint8_t* buf, uint32_t* len, uint32_t bulk_size)
int async_usb_gadget::inner_write_bulk_memory(int fd, uint8_t* buf, uint32_t* len, uint32_t bulk_size, data_source_ptr prog)
{
int w = 0, to = 0, err = 0, total = *len, off = 0,
size = *len;
uint64_t all = *len,
cur = 0;
auto real_prog = [&](uint64_t total, uint64_t cur, uint32_t err) -> int
{
return prog->notify_progress(total, cur, err);
};
auto empty_prog = [&](uint64_t total, uint64_t cur, uint32_t err) -> int
{
return 0;
};
std::function<int(uint64_t, uint64_t, uint32_t)> progr = empty_prog;
if (prog)
progr = real_prog;
while(!cancel_io_)
{
@ -341,12 +354,20 @@ int async_usb_gadget::inner_write_bulk_memory(int fd, uint8_t* buf, uint32_t* le
continue;
}
err = errno;
{
cur = off;
progr(all, cur, err);
}
break;
}
to = 0;
off += w;
want_bytes_in_ -= w;
{
cur = off;
progr(all, cur, err);
}
if(off >= total)
break;
if(off + bulk_size < total)
@ -497,10 +518,10 @@ void async_usb_gadget::thread_read_bulk(int fd)
continue;
}
statu_out_ = WORKER_STATUS_BUSY;
buf->set_session_id(session_id_);
l = read(fd, buf->ptr(), bulk_size);
statu_out_ = WORKER_STATUS_IDLE;
l = read(fd, buf->ptr(), bulk_size);
statu_out_ = WORKER_STATUS_BUSY;
if (!run_)
{
buf->release();

View File

@ -100,7 +100,7 @@ class async_usb_gadget : public refer
dyn_mem_ptr handle_ctrl_message(dyn_mem_ptr data);
dyn_mem_ptr handle_ctrl_setup(dyn_mem_ptr data); // user command ...
int inner_write_bulk_memory(int fd, uint8_t* buf, uint32_t* len/*in - to sent; out - real sent*/, uint32_t bulk_size); // return error code
int inner_write_bulk_memory(int fd, uint8_t* buf, uint32_t* len/*in - to sent; out - real sent*/, uint32_t bulk_size, data_source_ptr prog = nullptr); // return error code
int inner_write_bulk(int fd, data_source_ptr data, dyn_mem_ptr mem/*to load data in if data was not memory*/, uint32_t bulk_size); // return error
dyn_mem_ptr handle_bulk_command(dyn_mem_ptr data, uint32_t* used, packet_data_base_ptr* pkd);