Hi David,
  after using your important previous suggestions, the program was running in a 
properly way on 2 motes for testing. But it is correct only if i create packets 
by myself and i receive packets by other nodes. If i try to forward i cannot.
Before using Flash, my code was running properly on my motes but the problem 
was of insufficient memory as you know well. And i checked it also by 
simulations in TOSSIM.
Now, i don't understand why my code seems unable to have the same past 
behaviour.
i mean:
in my program every TOT seconds i create a new packet in each node and i 
broadcast it. Every node stores this packet in a buffer (different buffers for 
different generation periods) where i make some calculations (by using matrix) 
and then, if a random parameter allows me, i forward a coded packet, which is a 
combination of the previous ones stored in the same buffer.
But now, by using flash, my program is no more able to recognize the innovative 
packets->the packets which increase the rank of my matrix->which carry new 
information to my node.
May be it's wrong the way i read in Flash.
When i create a new packet, i send it and i write the corrispondent buffer in 
flash. When i receive, i check if my packet belongs to the same generation of a 
buffer i've already created, so i read from flash, or i write on flash a new 
buffer. But however after reading from flash i need to re-write on flash. Is it 
possible?notice that after the event FlashBridge.writeDone() i flush on flash.
However when i save my buffers on flash, i save many fields, for example:
  
typedef struct Buffer{
 double _sendallowed;
 struct Buffer *next;
 int _sendcount;
 int _recvcount;
 uint8_t _gen;
 struct Datagram *generated_;
 long generated_rank_;
 /* content matrix and rank at last gaussian reduction */
 unsigned char **matrix;
 long _rank;
 int _num_cols;
 int _used_cols;
 bool _innovative;
 /* rows that can already be decoded */
 int *_decoded;
 int label[block_size];
}Buffer; 
 
but when i call the read's function, i return the cast "(Buffer *)" of the 
"void *buffer" specified in the interface.
So for example in my program i have:
 
task void readFlash(){
  if (!call FlashBridge.read(flashAddr,flashBuffer,flashLen)){
   post readFlash();
  }
 }
 Buffer* readInToFlash(uint32_t addr, uint32_t len){
  flashAddr=addr;
  //flashBuffer=buf;
  flashLen=len;
  post readFlash();
  return (Buffer *)flashBuffer;
 }
 
 
 event void FlashBridge.readDone(uint32_t addr, void *buf, uint32_t len, 
result_t result){
  return;
 }
 
where in my main for example, in the receive part, i do:
 
event TOS_MsgPtr ReceiveDataNC.receive(TOS_MsgPtr m){
  Datagram *dg=(Datagram *)m->data;
  int new_decoded,i_new;
  double inc,sc,frac;
  unsigned char *recbuffer = NULL;
  bool is_in_flash;
  Buffer *ibuff = NULL;
  Buf_flash *b;
  is_in_flash=FALSE;
  no_received+=1;
  dbg(DBG_USR1,"rx from node %i\n,  gen %i\n, pckId %i\n, n tot dec 
%i\n",dg->saddr,dg->_gen,dg->pckID,decod);
  
  /******************************************
  /* node_insert(dg);
  /*******************************************/
  b=Head;
  while((b && b->next!=NULL) && b->gen!=dg->_gen)
   b=b->next;
  if (!b || b->gen!=dg->_gen){//it doesn't exist in flash,now check in RAM
   
   ibuff = init_NCBuffer(dg->_gen, dg->len);
  }
  else{//there is in flash
   /* we have to read from Flash*/
   is_in_flash=TRUE;
   ibuff=(Buffer *)calloc(1,sizeof(Buffer));
   
   ibuff=readInToFlash(b->addr_flash,b->len);
    }
  inc_recvcount(ibuff); 
  inject(dg,ibuff);
  
  if (ibuff->_innovative) {
      inn++;
   //dbg(DBG_USR1,"num innovative pcks rx: %i\n",inn);
   inc = 0;
   sc = calc_send_count();
   if (probabilistic_nc) {
    frac = modf(sc, &inc);   //function: sc's fractional part in frac 
(ex.0.8),integer one (ex.0) in inc 
   j=((double)(call Random.rand())/(double)(0xffff));
    if (j < frac)
     inc += 1.0;
   } 
   else {
    // send own packets at least once
    inc = sc;
    if (dg->saddr == TOS_LOCAL_ADDRESS && inc < 1)
     inc = 1.0;
   }
   inc_sendallowed(ibuff,inc);
    
  }
    /******************/
    /* end node_insert*/
    /******************/
    
  if (ibuff->_innovative) {
   new_decoded = 0;
   for (i_new = 0; i_new < block_size; ++i_new) {
      // update stats for newly decodable packets
      if (ibuff->_decoded[i_new] == 1) {
       ++new_decoded;
       ++decod;
       recbuffer=recover(ibuff,i_new);
       if (recbuffer)
        free(recbuffer);
      }  
   }
  }
 
 /* now putting on flash the modified buffer*/
 if(!is_in_flash){
  memcpy(buffer,ibuff,sizeof(Buffer));
  post writeToFlash();
 }
 else{
  b->priority=priority(ibuff);
  memcpy(buffer,ibuff,sizeof(Buffer));
  post writeToFlash();
 }
 free(ibuff);
 return m;
}
 
 
So by the inject function, i must expect that i receive buf->innovative=TRUE. 
This happens without using flash. Do i might use the read function in a wrong 
way?or i cannot re-obtain the same fields of the buffer i wrote before on flash?
I cannot find the solution...
 
PS here there is the write on flash:
 
task void writeToFlash() { 
  Buf_flash *b,*c;
  uint32_t A;
  b=Head;
  while((b && b->next!=NULL) && b->gen!=buffer->_gen)
   b=b->next;
  if (!b || b->gen!=buffer->_gen){
   A=flashWriteAddress;
  }
  else{
   A=b->addr_flash;
  }
  // Write the entire buffer to flash. 
   
  if(!call FlashBridge.write(A,buffer, sizeof(buffer))){
   //FAIL, try again
   post writeToFlash();
  }
  else{
   if (!b || b->gen!=buffer->_gen){
    c=(Buf_flash *)calloc(1,sizeof(Buf_flash));
    c->gen=buffer->_gen;//i take these info from the buffer and then i free it
    c->addr_flash=flashWriteAddress;
    c->len=sizeof(buffer);
    c->priority=priority(buffer);
    add_element(c);
    flashWriteAddress += sizeof(Buffer);
   }
   /*else{
    b->priority=priority(buffer);
    b->addr_flash=flashWriteAddress;
   }*/
   //flashWriteAddress += sizeof(Buffer);
  }
 } 
 
 
  event void FlashBridge.writeDone(uint32_t addr, void *buf, uint32_t 
len,result_t result) { 
  //Buffer *buff;
  //buff=NULL;
    if(result) { 
  
  /* SUCCESS! update our write location to the next page, or something. 
  Note that if we only erased sector 0 on boot, anything after 
  address 0x10000 (the 257'th page on flash') 
  may not be valid to write to */
  //flashWriteAddress += len;
  call Leds.redToggle();
  call FlashBridge.flush();
 } 
  } 
 
i use it both to write a new buffer or to rewrite an old one...
Any helps are really appreciated!
cheers
Daniele

_______________________________________________
Tinyos-help mailing list
Tinyos-help@Millennium.Berkeley.EDU
https://mail.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to