@@ -59,30 +59,33 @@ class HexagonIOHandler {
5959 public:
6060 explicit HexagonIOHandler (uint8_t * read_buffer, size_t read_buffer_size_bytes)
6161 : read_buffer_{read_buffer},
62+ read_buffer_index_{0 },
6263 read_buffer_size_bytes_{read_buffer_size_bytes},
63- read_buffer_index_ {0 } {}
64+ write_buffer_available_length_ {0 } {}
6465
6566 void MessageStart (size_t message_size_bytes) {}
6667
6768 ssize_t PosixWrite (const uint8_t * buf, size_t write_len_bytes) {
68- HEXAGON_PRINT (ALWAYS, " HexagonIOHandler PosixWrite called, write_len_bytes: %d " ,
69+ HEXAGON_PRINT (ALWAYS, " INFO: HexagonIOHandler PosixWrite called, write_len_bytes(%d) " ,
6970 write_len_bytes);
70- size_t written_size = static_cast <size_t >(
71- write_buffer_.sputn (reinterpret_cast <const char *>(buf), write_len_bytes));
71+ int32_t written_size = write_buffer_.sputn (reinterpret_cast <const char *>(buf), write_len_bytes);
7272 if (written_size != write_len_bytes) {
73- HEXAGON_PRINT (ALWAYS, " HexagonIOHandler written_size failed " );
73+ HEXAGON_PRINT (ALWAYS, " ERROR: written_size(%lld) != write_len_bytes(%d) " );
7474 }
75+ write_buffer_available_length_ += written_size;
7576 return (ssize_t )written_size;
7677 }
7778
78- void MessageDone () {}
79+ void MessageDone () { HEXAGON_PRINT (HIGH, " INFO: Message Done. " ); }
7980
8081 ssize_t PosixRead (uint8_t * buf, size_t read_len_bytes) {
81- HEXAGON_PRINT (ALWAYS, " HexagonIOHandler PosixRead called, %d, %d" , read_len_bytes,
82- read_buffer_index_);
82+ HEXAGON_PRINT (
83+ ALWAYS,
84+ " INFO: HexagonIOHandler PosixRead called, read_len_bytes(%d), read_buffer_index_(%d)" ,
85+ read_len_bytes, read_buffer_index_);
8386
8487 uint32_t bytes_to_read = 0 ;
85- if (( read_buffer_index_ - read_len_bytes) < 0 ) {
88+ if (read_buffer_index_ < read_len_bytes ) {
8689 bytes_to_read = read_buffer_index_;
8790 } else {
8891 bytes_to_read = read_len_bytes;
@@ -91,10 +94,6 @@ class HexagonIOHandler {
9194 std::memcpy (buf, read_buffer_, bytes_to_read);
9295 read_buffer_ += bytes_to_read;
9396 read_buffer_index_ -= bytes_to_read;
94- if (bytes_to_read != read_len_bytes) {
95- HEXAGON_PRINT (ERROR, " Error bytes_to_read (%d) < read_len_bytes (%d)." , bytes_to_read,
96- read_len_bytes);
97- }
9897 return (ssize_t )bytes_to_read;
9998 }
10099
@@ -106,39 +105,51 @@ class HexagonIOHandler {
106105 * \return The status
107106 */
108107 AEEResult SetReadBuffer (const uint8_t * data, size_t data_size_bytes) {
109- HEXAGON_PRINT (ALWAYS, " HexagonIOHandler SetReadBuffer called: %d, prev read_buffer_index_: " ,
110- data_size_bytes, read_buffer_index_);
108+ HEXAGON_PRINT (ALWAYS,
109+ " INFO: HexagonIOHandler SetReadBuffer: data_size_bytes(%d), "
110+ " read_buffer_index_(%d), read_buffer_size_bytes_(%d)" ,
111+ data_size_bytes, read_buffer_index_, read_buffer_size_bytes_);
111112 if (data_size_bytes > read_buffer_size_bytes_) {
113+ HEXAGON_PRINT (ERROR, " ERROR: data_size_bytes(%d) > read_buffer_size_bytes_(%d)" );
112114 return AEE_EFAILED;
113115 }
114- read_buffer_ = data;
116+ std::memcpy (reinterpret_cast <void *>(read_buffer_), reinterpret_cast <const void *>(data),
117+ data_size_bytes);
115118 read_buffer_index_ = data_size_bytes;
116119 return AEE_SUCCESS;
117120 }
118121
119122 /* !
120- * \brief Get pointer to the buffer that a packet has been written to.
123+ * \brief Read from the write buffer that a packet has been written to.
121124 * \param buf The data pointer.
122125 * \param read_size_bytes The size of read in bytes.
123126 *
124127 * \return The size of data that is read in bytes.
125128 */
126- int64_t GetWriteBuffer (uint8_t * buf, size_t read_size_bytes) {
127- HEXAGON_PRINT (ALWAYS, " HexagonIOHandler GetWriteBuffer called, read_len_bytes : %d" ,
129+ int64_t ReadFromWriteBuffer (uint8_t * buf, size_t read_size_bytes) {
130+ HEXAGON_PRINT (ALWAYS, " INFO: HexagonIOHandler ReadFromWriteBuffer called, read_size_bytes : %d" ,
128131 read_size_bytes);
129- return write_buffer_.sgetn (reinterpret_cast <char *>(buf), read_size_bytes);
132+ int64_t size = (int64_t )write_buffer_.sgetn (reinterpret_cast <char *>(buf), read_size_bytes);
133+ write_buffer_available_length_ -= size;
134+
135+ // Clear buffer
136+ if (write_buffer_available_length_ == 0 ) {
137+ write_buffer_.str (" " );
138+ }
139+ return size;
130140 }
131141
132- void Close () { HEXAGON_PRINT (ALWAYS, " HexagonIOHandler Close called" ); }
142+ void Close () { HEXAGON_PRINT (ALWAYS, " INFO: HexagonIOHandler Close called" ); }
133143
134144 void Exit (int code) { exit (code); }
135145
136146 private:
137- const uint8_t * read_buffer_;
147+ uint8_t * read_buffer_;
138148 uint32_t read_buffer_index_;
139149 size_t read_buffer_size_bytes_;
140150
141151 std::stringbuf write_buffer_;
152+ uint32_t write_buffer_available_length_;
142153};
143154
144155class HexagonRPCServer {
@@ -169,7 +180,7 @@ class HexagonRPCServer {
169180 * \return The size of data that is read in bytes.
170181 */
171182 int64_t Read (uint8_t * buf, size_t read_size_bytes) {
172- return io_.GetWriteBuffer (buf, read_size_bytes);
183+ return io_.ReadFromWriteBuffer (buf, read_size_bytes);
173184 }
174185
175186 private:
@@ -209,6 +220,7 @@ int __QAIC_HEADER(hexagon_rpc_open)(const char* uri, remote_handle64* handle) {
209220 }
210221 reset_device_api ();
211222 get_hexagon_rpc_server ();
223+
212224 return AEE_SUCCESS;
213225}
214226
@@ -233,8 +245,8 @@ AEEResult __QAIC_HEADER(hexagon_rpc_send)(remote_handle64 _handle, const unsigne
233245 int64_t written_size = get_hexagon_rpc_server ()->Write (reinterpret_cast <const uint8_t *>(data),
234246 static_cast <size_t >(dataLen));
235247 if (written_size != dataLen) {
236- HEXAGON_PRINT (ERROR, " RPC Server Write failed, written_size (%d) != dataLen (%d)" , written_size ,
237- dataLen);
248+ HEXAGON_PRINT (ERROR, " ERROR: hexagon_rpc_send failed, written_size (%d) != dataLen (%d)" ,
249+ written_size, dataLen);
238250 return AEE_EFAILED;
239251 }
240252 return AEE_SUCCESS;
@@ -254,11 +266,11 @@ AEEResult __QAIC_HEADER(hexagon_rpc_receive)(remote_handle64 _handle, unsigned c
254266 int64_t read_size =
255267 get_hexagon_rpc_server ()->Read (reinterpret_cast <uint8_t *>(buf), static_cast <size_t >(bufLen));
256268 *buf_written_size = read_size;
257- if (read_size == bufLen) {
269+ if (read_size == static_cast < int64_t >( bufLen) ) {
258270 return AEE_SUCCESS;
259271 } else {
260- HEXAGON_PRINT (ALWAYS , " RPC Server Read failed, read_size (%d ) != dataLen (%d) " , read_size ,
261- bufLen);
272+ HEXAGON_PRINT (ERROR , " ERROR: RPC Server Read failed, read_size (%lld ) != bufLen (%lld) " ,
273+ read_size, static_cast < int64_t >( bufLen) );
262274 return AEE_EFAILED;
263275 }
264276}
0 commit comments