buffer stream FIFO

来源:互联网 发布:java 解压缩 编辑:程序博客网 时间:2024/05/16 19:41

class buffer_stream{
public:
 unsigned char * buf;
 int len;
 buffer_stream(unsigned char * buf_in,int len_in)
 {

  buf= new unsigned char [len_in];

  memcpy(buf,buf_in,len_in);
  len=len_in;
  //cout << "buffer_stream buf="<< std::hex<<(int)buf<<"len="<<len<<endl; 

 }
 buffer_stream(const buffer_stream & c)
 {
  buf =new unsigned char [c.len];  
  memcpy(buf,c.buf,c.len);
  len =c.len;
 }

 


 buffer_stream & buffer_stream::operator=(const buffer_stream & v){
  
  if(buf)
   delete [] buf;
  len=vd.len;

  buf=new unsigned char [len];  
  memcpy(buf,v.buf,len);

  return *this;
 }

 

 ~buffer_stream()
 {
  //cout << "~buffer_stream buf="<<std::hex<<(int)buf<<"len="<<len<<endl;
  if(buf)
   delete [] buf;
 }
 void read_realloc(int read_len)
 {
  if(read_len >len)  
   return;  
  else
  {
   unsigned char * buf_left=new unsigned char [len-read_len];
   memcpy(buf_left,buf+read_len,len-read_len);
   delete [] buf;
   buf= buf_left;
   len=len-read_len;
  }
 }
};

typedef std::queue<buffer_stream>  buffer_stream_q;

buffer_stream_q   g_buf_send_q;
buffer_stream_q   g_buf_recv_q;

//////////////////////////////////////////////////////////////////////////////////////////

void data_capture_thread_proc()

{

  while(!bExit){

   ...  //capture data into buf

 

   EnterCriticalSection(&cs_r);
   buffer_stream bs((unsigned char *)buf,rVal);
   g_buf_recv_q.push(bs);
   //cout << " recv queue size="<< g_buf_recv_q.size()<<endl;
   LeaveCriticalSection(&cs_r);

   ...

}

}

void data_send_thread_proc()

{

while (!bExit){

    ...

    wait_for_sendevent();

 

    EnterCriticalSection(&cs_s);
    buffer_stream & bs= g_buf_send_q.front();
    send(); //to hardware
    g_buf_send_q.pop();
    LeaveCriticalSection(&cs_s);

}

 

}

//////////////////////////////////////////////////////////////////////////////////////////
int recv_api(unsigned char * buf, int len)
{
 int retVal=0;

 EnterCriticalSection(&cs_r);
 if(g_buf_recv_q.empty())
  retVal=0;
 else
 {
  buffer_stream & bs=g_buf_recv_q.front(); // access the first item
  if(bs.len>len)
  {
   memcpy(buf,bs.buf,len);   
   bs.read_realloc(len); 
   retVal= len;
   //cout << "recv queue read_realloc size="<< g_buf_recv_q.size()<<endl;
  }else
  {
   memcpy(buf,bs.buf,bs.len);   
   retVal= bs.len;
   //cout << "recv queue size="<< g_buf_recv_q.size()<<endl;
   g_buf_recv_q.pop();
  }
 }

 LeaveCriticalSection(&cs_r);
 //cout << "port_recv -- "<<retVal<<endl;
 return retVal;
}
void send_api(unsigned char * buf, int len)
{

 buffer_stream bs(buf,len);
 EnterCriticalSection(&cs_s);
 g_buf_send_q.push(bs); //add a item at the end
 SetEvent(port_send_event);

 LeaveCriticalSection(&cs_s);
}