Don't like ads? PRO users don't see any ads ;-)
Guest

MemoryManagement

By: a guest on Dec 22nd, 2011  |  syntax: C++  |  size: 5.35 KB  |  hits: 23  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #define msGetData 3000           // milliseconds to get data
  2. #define maxTxSize 1500           // max transmit byte size
  3.  
  4. // network
  5. uint8_t  destination[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF};
  6. uint8_t  PANID[2]       = {0x12,0x34};
  7.  
  8. // data variables
  9. char* filename = "YYMMDDHHMM.txt"; // format of each filename
  10. char** data;
  11. int maxDataSize = 0;
  12. int sizePerSave = 50;
  13. int lenFilename = 0;
  14. int index = 0;
  15.  
  16. void setup()
  17. {
  18.   USB.begin();
  19.   RTC.ON();
  20.   ACC.ON();
  21.   delay(500);
  22.  
  23.   printMem();
  24.   // will use GPS instead of RTC
  25.   // 2011, dec, 21, wednesday, 6 pm, 00 min, 00 sec
  26.   RTC.setTime( 11, 12, 21, 4, 18, 0, 0 );
  27.   delay(500);
  28.  
  29.   lenFilename = strlen(filename);
  30.   filename = getFile();
  31.   USB.print("filename = ");
  32.   USB.println(filename);
  33.   //SD.del( filename );
  34.   //SD.OFF();
  35.   // get sizePerSave
  36.   printMem();
  37.   //char* save;
  38.   //save = getData();
  39.   sizePerSave =  strlen( getData() ) + 2;
  40.   //free(save);
  41.   //save = NULL;
  42.   printMem();
  43.   maxDataSize = maxTxSize / sizePerSave;
  44.   maxDataSize = 10;
  45.   printMem();
  46.   data = (char**) calloc(maxDataSize, sizeof(char*));
  47.   printMem();
  48.   // create # array elements to append the SD card with
  49.   //for (int j = 0; j < maxDataSize; j++)
  50.   //  data[ j ] = (char*) calloc(sizePerSave, sizeof(char*));
  51.  
  52.   USB.print("sizePerSave = ");
  53.   USB.print( sizePerSave, DEC );
  54.   USB.print(" | maxDataSize = ");
  55.   USB.print( maxDataSize, DEC );
  56.   USB.print(" | maxTxSize = ");
  57.   USB.println( maxTxSize, DEC );
  58. }
  59.  
  60. void loop()
  61. {
  62.   USB.println("********");
  63.   USB.print("index = ");
  64.   USB.println(index, DEC);
  65.   printMem();
  66.  
  67.   // get data
  68.   data[ index ] = (char*) getData();
  69.   USB.print("Data: ");
  70.   USB.println( data[ index ] );
  71.   index += 1;
  72.  
  73.   //filesize += sizePerSave;
  74.   //USB.print("Filesize: ");
  75.   //USB.println(filesize, DEC);
  76.   // if filesize is too great
  77.   // send it and create a new file
  78.   //if (filesize > maxTxSize)
  79.  
  80.   if ( index >= maxDataSize )
  81.   {
  82.     USB.println("index >= maxDataSize");
  83.     printMem();
  84.     SD.ON();
  85.     saveToSD();
  86.    
  87.     /*
  88.     // send data out
  89.     xbeeDM.ON();
  90.     connectToNetwork();
  91.     if (sendFile() == 1)
  92.       USB.println("Data sent successfully.");
  93.     else
  94.       USB.println("Data failed to send.");
  95.     xbeeDM.OFF();
  96.     */
  97.    
  98.     //USB.println(SD.ls());
  99.     /*
  100.     // check if there isn't any disk space for another file
  101.     if (SD.getDiskFree() < maxTxSize)
  102.     {
  103.       // delete the 20 oldest files
  104.       // array = SD.ls();
  105.       // for (i=0;i<n;i++) { SD.del( array(i) ); }
  106.       //char* arrLS = SD.ls();
  107.       for (int j = 0; j < 20; j++)
  108.         SD.del( SD.ls(0) );
  109.       USB.println(SD.ls());
  110.       //free(arrLS);
  111.     }
  112.     */
  113.    
  114.     SD.OFF();
  115.     printMem();
  116.    
  117.     /*char* newFilename;
  118.     newFilename = getFile();
  119.     //USB.println( newFilename );
  120.     // if it's a different filename...
  121.     if (newFilename != filename)
  122.       filename = newFilename;
  123.     free( newFilename );
  124.     newFilename = NULL;*/
  125.    
  126.     for (int j = 0; j < maxDataSize; j++)
  127.     {
  128.       free(data[ j ]);
  129.       data[ j ] = NULL;
  130.     }
  131.     free(data);
  132.     data = NULL;
  133.     data = (char**) calloc(maxDataSize, sizeof(char*));
  134.     index = 0;
  135.    
  136.     USB.flush();
  137.     printMem();
  138.   }
  139.  
  140.   delay( msGetData );
  141. }
  142.  
  143. char* getData()
  144. {
  145.   //char* result="\0                                                " ;
  146.   char* result;
  147.   result = (char*) calloc(sizePerSave, sizeof(char*));
  148.   //sprintf(result,"%02d%02d,x=%d,y=%d,z=%d,temp=%d,bat=%d%c%c%c",RTC.hour,RTC.minute,ACC.getX(),ACC.getY(),ACC.getZ(),RTC.getTemperature(),PWR.getBatteryLevel(),'%','\r','\n');
  149.   sprintf(result,"**%02d%02d,x=%d,y=%d,z=%d,temp=%d,bat=%d\%\n",RTC.hour,RTC.minute,ACC.getX(),ACC.getY(),ACC.getZ(),RTC.getTemperature(),PWR.getBatteryLevel());
  150.   //USB.println( result );
  151.   return result;
  152. }
  153.  
  154. // determine the next file
  155. char* getFile()
  156. {
  157.   RTC.getTime(); // update time
  158.   //char* result1="\0                                                " ;
  159.   char* result1;
  160.   result1 = (char*) calloc(lenFilename, sizeof(char*));
  161.  
  162.   // YYYYMMDDHHMMSS
  163.   //sprintf(result, "%04d%02d%02d%02d%02d%02d.txt",RTC.year + 2000,RTC.month,RTC.date,RTC.hour,RTC.minute,RTC.second);
  164.   // YYYYMMDDHHMM
  165.   sprintf(result1, "%04d%02d%02d%02d%02d.txt",RTC.year + 2000,RTC.month,RTC.date,RTC.hour,RTC.minute);
  166.   return result1;
  167. }
  168.  
  169. int saveToSD()
  170. {
  171.   USB.print("filename*** = ");
  172.   USB.println(filename);
  173.   if (SD.isFile(filename) == -1)
  174.   {
  175.     USB.println("File does not exist. Attempting to create...");
  176.     if(SD.create(filename))
  177.     {
  178.       USB.print("Created ");
  179.       USB.println(filename);
  180.     }
  181.     else
  182.       USB.println("Failed to create.");
  183.   }
  184.   else
  185.     USB.println("File already exists.");
  186.  
  187.   // if file exists, append it
  188.   if (SD.isFile(filename) == 1)
  189.   {
  190.     USB.println("Attempting to append file...");
  191.     for (int j = 0; j < maxDataSize; j++)
  192.       if(SD.appendln(filename, data[ j ]))
  193.       {
  194.         USB.print("Added data[ ");
  195.         USB.print(j, DEC);
  196.         USB.print(" ] = ");
  197.         USB.println( data[ j ] );
  198.       }  
  199.       else
  200.       {
  201.         USB.print("Failed to add data[ ");
  202.         USB.print( j, DEC );
  203.         USB.print(" ] = ");
  204.         USB.println( data[ j ] );
  205.       }
  206.   }
  207.   else
  208.     USB.println("File still does not exist.");
  209. }
  210.  
  211. void printMem()
  212. {
  213.   USB.print("Memory: ");
  214.   USB.println( freeMemory() );
  215. }