320 } |
320 } |
321 void inline copy_from_log(uint32_t buffpos, void* buf, uint32_t size){ |
321 void inline copy_from_log(uint32_t buffpos, void* buf, uint32_t size){ |
322 if(buffpos + size < LOG_BUFFER_SIZE){ |
322 if(buffpos + size < LOG_BUFFER_SIZE){ |
323 memcpy(buf, &LogBuff[buffpos], size); |
323 memcpy(buf, &LogBuff[buffpos], size); |
324 }else{ |
324 }else{ |
325 uint32_t remaining = LOG_BUFFER_SIZE - buffpos - 1; |
325 uint32_t remaining = LOG_BUFFER_SIZE - buffpos; |
326 memcpy(buf, &LogBuff[buffpos], remaining); |
326 memcpy(buf, &LogBuff[buffpos], remaining); |
327 memcpy(buf + remaining, LogBuff, size - remaining); |
327 memcpy(buf + remaining, LogBuff, size - remaining); |
328 } |
328 } |
329 } |
329 } |
330 |
330 |
385 |
385 |
386 /* Return message size and content */ |
386 /* Return message size and content */ |
387 uint32_t GetLogMessage(uint32_t msgidx, char* buf, uint32_t max_size){ |
387 uint32_t GetLogMessage(uint32_t msgidx, char* buf, uint32_t max_size){ |
388 uint64_t cursor = LogCursor; |
388 uint64_t cursor = LogCursor; |
389 if(cursor){ |
389 if(cursor){ |
390 /* feeding cursor values */ |
|
391 uint32_t curbuffpos = (uint32_t)cursor; |
|
392 uint32_t curmsgidx = (cursor >> 32); |
|
393 |
|
394 /* seach cursor */ |
390 /* seach cursor */ |
395 uint32_t stailpos = (curbuffpos - sizeof(mTail)) & LOG_BUFFER_MASK; |
391 uint32_t stailpos = (uint32_t)cursor; |
396 uint32_t smsgidx; |
392 uint32_t smsgidx; |
397 mTail tail; |
393 mTail tail; |
398 tail.msgidx = curmsgidx; |
394 tail.msgidx = cursor >> 32; |
|
395 tail.msgsize = 0; |
399 |
396 |
400 /* Message search loop */ |
397 /* Message search loop */ |
401 do { |
398 do { |
402 smsgidx = tail.msgidx; |
399 smsgidx = tail.msgidx; |
|
400 stailpos = (stailpos - sizeof(mTail) - tail.msgsize ) & LOG_BUFFER_MASK; |
403 copy_from_log(stailpos, &tail, sizeof(mTail)); |
401 copy_from_log(stailpos, &tail, sizeof(mTail)); |
404 stailpos = (stailpos - sizeof(mTail) - tail.msgsize ) & LOG_BUFFER_MASK; |
402 }while((tail.msgidx == smsgidx - 1) && (tail.msgidx > msgidx)); |
405 }while(tail.msgidx == smsgidx - 1 && tail.msgidx > msgidx); |
|
406 |
403 |
407 if(tail.msgidx == msgidx){ |
404 if(tail.msgidx == msgidx){ |
408 uint32_t sbuffpos = (stailpos - tail.msgsize ) & LOG_BUFFER_MASK; |
405 uint32_t sbuffpos = (stailpos - tail.msgsize ) & LOG_BUFFER_MASK; |
409 uint32_t totalsize = tail.msgsize + sizeof(mTail); |
406 uint32_t totalsize = tail.msgsize; /*sizeof(mTail);*/ |
410 copy_from_log(stailpos, &tail, totalsize > max_size ? max_size : totalsize); |
407 copy_from_log(sbuffpos, buf, totalsize > max_size ? max_size : totalsize); |
411 return totalsize; |
408 return totalsize; |
412 } |
409 } |
413 } |
410 } |
414 return 0; |
411 return 0; |
415 } |
412 } |