]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/chips/stm25p/Stm25pLogP.nc
stm25p: fix seek error
[tinyos-2.x.git] / tos / chips / stm25p / Stm25pLogP.nc
index d00dee0610f1ddcc356ef63694fc89e2dd9cecca..b63cf3f71f5baa507b20b7d2de2b3460337d1b89 100644 (file)
@@ -161,7 +161,7 @@ implementation {
     
     // don't allow appends larger than maximum record size
     if ( len > MAX_RECORD_SIZE )
-      return ESIZE;
+      return EINVAL;
     
     // move to next block if current block doesn't have enough space
     if ( sizeof( m_header ) + len > bytes_left )
@@ -199,6 +199,18 @@ implementation {
     
   }
   
+  uint8_t calcSector( uint8_t client, stm25p_addr_t addr ) {
+    uint8_t sector = call Sector.getNumSectors[ client ]();
+    return (uint8_t)(( addr >> STM25P_SECTOR_SIZE_LOG2 ) % sector);
+  }
+
+  stm25p_addr_t calcAddr( uint8_t client, stm25p_addr_t addr  ) {
+    stm25p_addr_t result = calcSector( client, addr );
+    result <<= STM25P_SECTOR_SIZE_LOG2;
+    result |= addr & STM25P_SECTOR_MASK;
+    return result;
+  }
+
   event void ClientResource.granted[ uint8_t id ]() {
 
     // log never used, need to find start and end of log
@@ -218,9 +230,9 @@ implementation {
        {
          // make sure the cookie is still within the range of valid data
          uint8_t numSectors = call Sector.getNumSectors[ id ]();
-         uint8_t readSector = 
+         uint16_t readSector =
            (m_log_state[ id ].cookie >> STM25P_SECTOR_SIZE_LOG2);
-         uint8_t writeSector =
+         uint16_t writeSector =
            ((m_log_info[ id ].write_addr-1)>>STM25P_SECTOR_SIZE_LOG2)+1;
          // if cookie is overwritten, advance to beginning of log
          if ( (writeSector - readSector) > numSectors ) {
@@ -228,12 +240,14 @@ implementation {
              (storage_cookie_t)(writeSector-numSectors)
                <<STM25P_SECTOR_SIZE_LOG2;
          }
-         m_log_info[ id ].read_addr = m_log_state[ id ].cookie & BLOCK_MASK;
+         m_log_info[ id ].read_addr = m_log_state[ id ].cookie & ~BLOCK_MASK;
          m_log_info[ id ].remaining = 0;
          m_rw_state = S_SEARCH_SEEK;
-         if ( m_log_info[ id ].read_addr != m_log_state[ id ].cookie )
-           call Sector.read[ id ]( m_log_info[ id ].read_addr, &m_header,
-                                   sizeof( m_header ) );
+         if ( m_log_info[ id ].read_addr != m_log_state[ id ].cookie ) {
+           m_log_info[ id ].read_addr += sizeof( m_addr );
+           call Sector.read[ id ]( calcAddr( id, m_log_info[ id ].read_addr ),
+                                   &m_header, sizeof( m_header ) );
+         }
          else
            signalDone( id, SUCCESS );
        }
@@ -255,18 +269,6 @@ implementation {
     
   }
 
-  uint8_t calcSector( uint8_t client, stm25p_addr_t addr ) {
-    uint8_t sector = call Sector.getNumSectors[ client ]();
-    return (uint8_t)( addr >> STM25P_SECTOR_SIZE_LOG2 ) % sector;
-  }
-
-  stm25p_addr_t calcAddr( uint8_t client, stm25p_addr_t addr  ) {
-    stm25p_addr_t result = calcSector( client, addr );
-    result <<= STM25P_SECTOR_SIZE_LOG2;
-    result |= addr & STM25P_SECTOR_MASK;
-    return result;
-  }
-
   void continueReadOp( uint8_t client ) {
     
     stm25p_addr_t read_addr = m_log_info[ client ].read_addr;
@@ -317,7 +319,7 @@ implementation {
     switch( m_rw_state ) {
     case S_SEARCH_BLOCKS: 
       {
-       uint8_t block = addr >> BLOCK_SIZE_LOG2;
+       uint16_t block = addr >> BLOCK_SIZE_LOG2;
        // record potential starting and ending addresses
        if ( m_addr != STM25P_INVALID_ADDRESS ) {
          if ( m_addr < log_info->read_addr )
@@ -340,7 +342,7 @@ implementation {
        else {
          log_info->write_addr += sizeof( m_addr );
          m_rw_state = S_SEARCH_RECORDS;
-         call Sector.read[ id ]( log_info->write_addr, &m_header,
+         call Sector.read[ id ]( calcAddr(id, log_info->write_addr), &m_header,
                                  sizeof( m_header ) );
        }
       }
@@ -355,8 +357,8 @@ implementation {
        // if header is valid and is on same block, move to next record
        if ( m_header != INVALID_HEADER && cur_block == new_block ) {
          log_info->write_addr += sizeof( m_header ) + m_header;
-         call Sector.read[ id ]( log_info->write_addr, &m_header,
-                                 sizeof( m_header ) );
+         call Sector.read[ id ]( calcAddr( id, log_info->write_addr ), 
+                                 &m_header, sizeof( m_header ) );
        }
        // found last record
        else {
@@ -370,8 +372,8 @@ implementation {
        // searching for last log record to read
        log_info->read_addr += sizeof( m_header ) + m_header;
        // if not yet at cookie, keep searching
-       if ( log_info->read_addr < m_log_state->cookie ) {
-         call Sector.read[ id ]( log_info->read_addr, &m_header,
+       if ( log_info->read_addr < m_log_state[ id ].cookie ) {
+         call Sector.read[ id ]( calcAddr(id, log_info->read_addr), &m_header,
                                  sizeof( m_header ) );
        }
        // at or passed cookie, stop
@@ -454,7 +456,7 @@ implementation {
       // (the log could have cycled around)
       stm25p_addr_t volume_size = 
        STM25P_SECTOR_SIZE * ( call Sector.getNumSectors[ id ]() - 1 );
-      if ( m_log_info[ id ].write_addr >= volume_size ) {
+      if ( m_log_info[ id ].write_addr > volume_size ) {
        stm25p_addr_t read_addr = m_log_info[ id ].write_addr - volume_size;
        if ( m_log_info[ id ].read_addr < read_addr )
          m_log_info[ id ].read_addr = read_addr;