commit 3f7f5cd8e9afb876ecfe9eda19679ebab33109ce Author: Bill Greiman Date: Wed Aug 6 05:05:57 2014 -0700 Initial Commit diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..412eeda --- /dev/null +++ b/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b9d6bd9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,215 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +build/ +[Bb]in/ +[Oo]bj/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml +*.pubxml + +# NuGet Packages Directory +## TODO: If you have NuGet Package Restore enabled, uncomment the next line +#packages/ + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + +############# +## Windows detritus +############# + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac crap +.DS_Store + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist/ +build/ +eggs/ +parts/ +var/ +sdist/ +develop-eggs/ +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg diff --git a/AnalogBinLoggerExtras/ADC_ENOB.PNG b/AnalogBinLoggerExtras/ADC_ENOB.PNG new file mode 100644 index 0000000..8f23768 Binary files /dev/null and b/AnalogBinLoggerExtras/ADC_ENOB.PNG differ diff --git a/AnalogBinLoggerExtras/ADCdocs/ATmegaADCAccuracy.pdf b/AnalogBinLoggerExtras/ADCdocs/ATmegaADCAccuracy.pdf new file mode 100644 index 0000000..46ede85 Binary files /dev/null and b/AnalogBinLoggerExtras/ADCdocs/ATmegaADCAccuracy.pdf differ diff --git a/AnalogBinLoggerExtras/ADCdocs/ExcelFFT.pdf b/AnalogBinLoggerExtras/ADCdocs/ExcelFFT.pdf new file mode 100644 index 0000000..5e7c94b Binary files /dev/null and b/AnalogBinLoggerExtras/ADCdocs/ExcelFFT.pdf differ diff --git a/AnalogBinLoggerExtras/AdcErrorStudy.txt b/AnalogBinLoggerExtras/AdcErrorStudy.txt new file mode 100644 index 0000000..d24d1f6 --- /dev/null +++ b/AnalogBinLoggerExtras/AdcErrorStudy.txt @@ -0,0 +1,98 @@ +Static Tests of the Arduino Internal ADC. + +Several people have asked about the DC accuracy of the Arduino ADC when used in my data logging applications at slow sample rates. + +Here are my results of some "hobby level" measurements of the Arduino ADC. + +One question is how important is the ADC clock rate. I did measurents for an ADC clock rate of 125 kHz to 2MHz. + +Another question is how much does Noise Reduction Mode help. I did a series of measurements using this mode. + +Noise Reduction Mode only reduced the mean absolute error slightly. + +I do calibration to remove Offset Error and Gain Error. Calibration is very important for good accuracy. + +These tests depend on the Arduino voltage regulator providing a stable voltage during the tests. The Arduino ADC reference voltage is Vcc for these tests. This may not be realistic for practical applications + +Integral Non-linearity (INL) is the main remaining source of error. + +Here are my results for static (DC) tests of the internal ADC for three UNOs. + +The Arduinos are powered by a high quality nine volt power supply. + +These tests measure a DC level so do not include problems due to time jitter, S/H time, and other dynamic errors. +There are several studies of the dynamic behavior of the Arduino ADC that determine ENOB (Effective Number Of Bits). + +I used a shield with a 12-bit MCP4921 DAC to generate voltage levels. This ADC has an output buffer so it provides a very low impedance source. + +I measured the voltage of the DAC with a calibrated 18-bit MCP3422 ADC on the shield. + +I used DAC levels from 20 to 4075 to avoid zero offset errors at low voltages and DAC buffer problems at high voltages. + +Each series of measurements has 4056 data points. + +This is a voltage range of about 0.023 to 4.972 volts. + +I calibrated the Arduino ADC for each series of measurements with a linear fit of the form. + +v = a + b*adcValue + +Errors are the difference between the value measured with the 18-bit ADC and the calibrated value measured with the AVR ADC. + +I also show the results for no calibration, the NoCal column, using the datasheet formula. + +Vin = Vref*adcValue/1024 + + +The rows in the tables tables are. + +Min - minimum error in millivolts + +Max - maximum error in millivolts + +MAE - mean absolute error in millivolts + + +The columns in the tables are: + +Ideal - results for a perfect 10-bit ADC for comparison. + +NoCal - datasheet formula (5/1024)*adcValue with Noise Reduction Mode. + +NR128 - Noise Reduction mode with Prescaler of 128 (ADC clock of 125 kHz). + +PS128 - analogRead with Prescaler of 128 (ADC clock of 125 kHz). + +PS64 - analogRead with Prescaler of 64 (ADC clock of 250 kHz). + +PS32 - analogRead with Prescaler of 32 (ADC clock of 500 kHz). + +PS16 - analogRead with Prescaler of 16 (ADC clock of 1 MHz). + +PS8 - analogRead with Prescaler of 8 (ADC clock of 2 MHz). + + +Results for three UNO Arduinos + + First Arduino - Error Millivolts + + Ideal NoCal NR128 PS128 PS64 PS32 PS16 PS8 +Min -2.44 -2.43 -3.72 -4.01 -3.88 -4.53 -6.57 -27.18 +Max 2.44 11.69 3.74 4.24 4.15 5.17 8.69 23.21 +MAE 1.22 5.02 1.33 1.38 1.37 1.44 1.96 4.11 + + Second Arduino - Error Millivolts + + Ideal NoCal NR128 PS128 PS64 PS32 PS16 PS8 +Min -2.44 -9.24 -4.87 -4.86 -5.05 -5.34 -6.52 -24.04 +Max 2.44 11.62 3.95 4.64 4.69 5.71 8.41 21.29 +MAE 1.22 5.33 1.41 1.43 1.44 1.53 2.02 4.05 + + Third Arduino - Error Millivolts + + Ideal NoCal NR128 PS128 PS64 PS32 PS16 PS8 +Min -2.44 -7.88 -4.12 -4.40 -4.32 -4.41 -6.97 -26.93 +Max 2.44 12.53 3.80 4.04 4.18 5.27 8.84 24.59 +MAE 1.22 4.85 1.29 1.33 1.34 1.42 1.91 4.10 + + diff --git a/AnalogBinLoggerExtras/DATA.png b/AnalogBinLoggerExtras/DATA.png new file mode 100644 index 0000000..a9b31aa Binary files /dev/null and b/AnalogBinLoggerExtras/DATA.png differ diff --git a/AnalogBinLoggerExtras/FFT.png b/AnalogBinLoggerExtras/FFT.png new file mode 100644 index 0000000..dc481a6 Binary files /dev/null and b/AnalogBinLoggerExtras/FFT.png differ diff --git a/AnalogBinLoggerExtras/RateTable.txt b/AnalogBinLoggerExtras/RateTable.txt new file mode 100644 index 0000000..554ba11 --- /dev/null +++ b/AnalogBinLoggerExtras/RateTable.txt @@ -0,0 +1,21 @@ +Maximum Sample Rate Table + + ADC clock kHz + 125 250 500 1000 +pins +1 7692 14286 25000 40000 +2 3810 6667 11111 16667 +3 2572 4790 8421 13559 +4 1942 3636 6452 10526 +5 1559 2930 5229 8602 +6 1303 2454 4396 7273 +7 1119 2111 3791 6299 +8 980 1852 3333 5556 +9 872 1649 2974 4969 +10 786 1487 2685 4494 +11 715 1354 2446 4103 +12 656 1242 2247 3774 +13 606 1148 2078 3493 +14 563 1067 1932 3252 +15 525 996 1806 3042 +16 493 935 1695 2857 diff --git a/AnalogBinLoggerExtras/bintocsv/AnalogBinLogger.h b/AnalogBinLoggerExtras/bintocsv/AnalogBinLogger.h new file mode 100644 index 0000000..da4d448 --- /dev/null +++ b/AnalogBinLoggerExtras/bintocsv/AnalogBinLogger.h @@ -0,0 +1,39 @@ +#ifndef AnalogBinLogger_h +#define AnalogBinLogger_h +//------------------------------------------------------------------------------ +// First block of file. +struct metadata_t { + unsigned long adcFrequency; // ADC clock frequency + unsigned long cpuFrequency; // CPU clock frequency + unsigned long sampleInterval; // Sample interval in CPU cycles. + unsigned long recordEightBits; // Size of ADC values, nonzero for 8-bits. + unsigned long pinCount; // Number of analog pins in a sample. + unsigned long pinNumber[123]; // List of pin numbers in a sample. +}; +//------------------------------------------------------------------------------ +// Data block for 8-bit ADC mode. +const size_t DATA_DIM8 = 508; +struct block8_t { + unsigned short count; // count of data bytes + unsigned short overrun; // count of overruns since last block + unsigned char data[DATA_DIM8]; +}; +//------------------------------------------------------------------------------ +// Data block for 10-bit ADC mode. +const size_t DATA_DIM16 = 254; +struct block16_t { + unsigned short count; // count of data bytes + unsigned short overrun; // count of overruns since last block + unsigned short data[DATA_DIM16]; +}; +//------------------------------------------------------------------------------ +// Data block for PC use +struct adcdata_t { + unsigned short count; // count of data bytes + unsigned short overrun; // count of overruns since last block + union { + unsigned char u8[DATA_DIM8]; + unsigned short u16[DATA_DIM16]; + } data; +}; +#endif // AnalogBinLogger_h \ No newline at end of file diff --git a/AnalogBinLoggerExtras/bintocsv/bintocsv.cpp b/AnalogBinLoggerExtras/bintocsv/bintocsv.cpp new file mode 100644 index 0000000..922644b --- /dev/null +++ b/AnalogBinLoggerExtras/bintocsv/bintocsv.cpp @@ -0,0 +1,82 @@ +#include +#include "AnalogBinLogger.h" +FILE *source; +FILE *destination; +int count = 0; + +int main(int argc, char** argv) { + metadata_t meta; + adcdata_t adc; + // Make sure no padding/size problems. + if (sizeof(meta) != 512 || sizeof(adc) != 512) { + printf("block size error\n"); + return 0; + } + if (argc != 3) { + printf("missing arguments:\n"); + printf("%s binFile csvFile\n", argv[0]); + return 0; + } + source = fopen(argv[1], "rb"); + if (!source) { + printf("open failed for %s\n", argv[1]); + return 0; + } + if (fread(&meta, sizeof(meta), 1, source) != 1) { + printf("read meta data failed\n"); + return 0; + } + if ( meta.pinCount == 0 + || meta.pinCount > (sizeof(meta.pinNumber)/sizeof(meta.pinNumber[0])) + || meta.adcFrequency < 50000 || meta.adcFrequency > 4000000) { + printf("Invalid meta data\n"); + return 0; + } + destination = fopen(argv[2], "w"); + if (!destination) { + printf("open failed for %s\n", argv[2]); + return 0; + } + int pinCount = meta.pinCount; + printf("pinCount: %d\n", pinCount); + printf("Sample pins:"); + for (unsigned i = 0; i < meta.pinCount; i++) { + printf(" %d", meta.pinNumber[i]); + } + printf("\n"); + printf("ADC clock rate: %g kHz\n", 0.001*meta.adcFrequency); + float sampleInterval = (float)meta.sampleInterval/(float)meta.cpuFrequency; + printf("Sample rate: %g per sec\n", 1.0/sampleInterval); + printf("Sample interval: %.4f usec\n", 1.0e6*sampleInterval); + + fprintf(destination, "Interval,%.4f,usec\n", 1.0e6*sampleInterval); + // Write header with pin numbers + for (int i = 0; i < ((int)meta.pinCount - 1); i++) { + fprintf(destination, "pin%d,", meta.pinNumber[i]); + } + fprintf(destination, "pin%d\n", meta.pinNumber[meta.pinCount - 1]); + unsigned maxCount = meta.recordEightBits ? DATA_DIM8 : DATA_DIM16; + while (!feof(source)) { + if (fread(&adc, sizeof(adc), 1, source) != 1) break; + if (adc.count > maxCount) { + printf("****Invalid data block****\n"); + return 0; + } + if (adc.overrun) { + fprintf(destination, "Overruns,%d\n", adc.overrun); + } + for (int i = 0; i < adc.count; i++) { + unsigned value = meta.recordEightBits ? adc.data.u8[i] : adc.data.u16[i]; + if ((i + 1)%pinCount) { + fprintf(destination, "%d,", value); + } else { + fprintf(destination, "%d\n", value); + } + } + count += adc.count; + } + printf("%d ADC values read\n", count); + fclose(source); + fclose(destination); + return 0; +} \ No newline at end of file diff --git a/AnalogBinLoggerExtras/bintocsv/bintocsv.exe b/AnalogBinLoggerExtras/bintocsv/bintocsv.exe new file mode 100644 index 0000000..de52203 Binary files /dev/null and b/AnalogBinLoggerExtras/bintocsv/bintocsv.exe differ diff --git a/AnalogBinLoggerExtras/readme.txt b/AnalogBinLoggerExtras/readme.txt new file mode 100644 index 0000000..e7a6fe2 --- /dev/null +++ b/AnalogBinLoggerExtras/readme.txt @@ -0,0 +1,96 @@ +AnalogBinLogger.ino logs analog data to a binary SD file at high rates. + +Samples are logged at regular intervals by using timer1. Timer/Counter1 +Compare Match B is used to trigger the ADC for the first pin in a sample. +The ADC is triggered for remaining sample pins in the ADC conversion complete +interrupt routine. + +Data is captured in the ADC interrupt routine and saved in 512 byte buffers. + +Buffered data is written to the SD in a function called from loop(). The +entire data set is written to a large contiguous file as a single multi-block +write. This reduces write latency problems. + +Many inexpensive SD cards work well at lower rates. I used a $6.00 +SanDisk 4 GB class 4 card for testing. + +SanDisk class 4 cards work well at fairly high rates. I used the 4 GB SanDisk +card to log a single pin at 40,000 samples per second. + +You may need to increase the time between samples if your card has higher +latency. Using a Mega Arduino can help since it has more buffering. + +The bintocsv folder contains a PC program for converting binary files to +CSV files. I have included a executable for Windows. Linux and Mac users +can build from the included source files. bintocvs is a command line program. + +bintocsv binFile csvFile + +AnalogBinLogger requires a recent version of the SdFat library. The SdFat +folder contains a beta version I used for development. + +The latest stable version is here: +http://code.google.com/p/sdfatlib/downloads/list + +You also need to install the included BufferedWriter library. It provides +fast text formatting. + +Example data for a 2 kHz sine wave logged at 40,000 samples per second is +shown in DATA.PNG and FFT.PNG shows a FFT of the data. See ExcelFFT.pdf +in the ADCdocs folder for details on calculating a FFT. + +The accuracy of the ADC samples depends on the ADC clock rate. See the +ADC_ENOB.PNG file for a plot of accuracy vs ADC clock frequency. + +See files in the ADCdocs folder for more information on ADC accuracy. + +To modify this program you will need a good knowledge of the Arduino +ADC, timer1 and C++ programming. This is not for the newbie. + +I have an LED and resistor connected to pin 3 to signal fatal errors and +data overruns. Fatal errors are indicated by a blinking led. Overrun errors +are indicated by a solid lit led. The count of samples dropped is written +to the SD and data logging continues. + +You can disable the error led feature by setting the error pin number negative: + +To use AnalogBinLogger, install these items. + +Place the BufferWriter and SdFat folders in your sketchbook libraries folder. + +Place the AnalogIsrLogger folder in your sketchbook folder. + +You must edit the configuration constants at the beginning of the program +to set the sample pins, sample rate, and other configuration values. + +Initially the program is setup to log the first five analog pins at 5000 +samples per second. Change these values to suit your needs. + +See RateTable.txt for maximum allowed sample rates vs pin count and ADC clock +frequency. + +The program has four commands: + +c - convert file to CSV +d - dump data to Serial +e - overrun error details +r - record ADC data + +All commands can be terminated by entering a character from the serial monitor. + +The c command converts the current binary file to a text file. Entering a +character on the serial monitor terminates the command. + +The d command converts the binary file to text and displays it on the serial +monitor. Entering a character on the serial monitor terminates the command. + +The e command displays details about overruns in the current binary file. +Data overruns happen when data samples are lost due to long write latency +of the SD. + +The r command will record ADC data to a binary file. It will terminate +when a character is entered on the serial monitor or the the maximum file +block count has been reached. + +A number of program options can be set by changing constants at the beginning +of the program. \ No newline at end of file diff --git a/ArduinoDue.txt b/ArduinoDue.txt new file mode 100644 index 0000000..b672f40 --- /dev/null +++ b/ArduinoDue.txt @@ -0,0 +1,62 @@ +Support has been added for the Arduino Due. + +You must connect your SD socket to the 6-pin "ISP connector". You must have short +wires or a custom shield to run at full speed, 42 MHz. + +If you have problems use a lower SPI speed. You can also check for SPI +errors by editing SdFatCobfig.h to enable CRC checking. + +You should be be able to use any digital pin for SD chip select. The default +pin is SS which is pin 10 for Due. + +The default SPI rate is 42 MHz. You can set SD chip select and the SPI rate +by calling: + +bool SdFat::begin(uint8_t chipSelectPin, uint8_t spiRateID); + +The second argument, spiRateID, sets the SCK rate and can be these symbols: + +SPI_FULL_SPEED - 42 MHz + +SPI_DIV3_SPEED - 28 MHz + +SPI_HALF_SPEED - 21 MHz + +SPI_DIV6_SPEED - 14 MHz + +SPI_QUARTER_SPEED 10.5 MHz + +SPI_EIGHTH_SPEED 5.25 MHz + +Large reads and writes use fast multi-block SD read/write commands. For optimal +speed, use records that are a multiple of 512 bytes. + +Run the bench.ino example to explore large read/write speed. + +Replace this line: + +#define BUF_SIZE 100 + +With a large size like this: + +#define BUF_SIZE 8192 + +For best results the record size should be a power of two (512, 1024, 2048, +4096, 8192). In this case records will be aligned with FAT cluster boundaries. + +Since Due is fast, increase the test file size by editing this line: + +#define FILE_SIZE_MB 5 + +Run the PrintBenchmark.ino example to compare text formatting speed of Due +with AVR boards. + +A number of options are available to configure SPI for the Due board. + +You can use the standard SPI.h library by editing SdFatConfig.h and set +USE_ARDUINO_SPI_LIBRARY nonzero. You must include SPI.h in your sketch. + +Several options can be set in Sd2Card.cpp in the USE_NATIVE_SAM3X_SPI +section. These include USE_SAM3X_DMAC to control use of DMA and +USE_SAM3X_BUS_MATRIX_FIX to change Bus Matrix operation. Most people +will not need to change these. \ No newline at end of file diff --git a/MultipleCards.txt b/MultipleCards.txt new file mode 100644 index 0000000..d962989 --- /dev/null +++ b/MultipleCards.txt @@ -0,0 +1,13 @@ +SdFat has support for multiple SD cards. This requires multiple instances +of SdFat objects. + +You must edit SdFatConfig.h to enable multiple instances of SdFat. Set +USE_MULTIPLE_CARDS nonzero like this: + +#define USE_MULTIPLE_CARDS 1 + +Look at TwoCards.pde in the SdFat/examples folder. This example demonstrates +use of two SD cards. + +Read WorkingDirectory.txt for more information on volume working +directories and the current working directory. diff --git a/QuickStart.txt b/QuickStart.txt new file mode 100644 index 0000000..5a82970 --- /dev/null +++ b/QuickStart.txt @@ -0,0 +1,21 @@ +For those who don't like too much documentation. + +To use this library place the SdFat folder into the libraries +subfolder in your main sketches folder. You may need to +create the libraries folder. Restart the Arduino IDE if +it was open. + +Run the QuickStart.ino sketch from the +libraries/SdFat/examples/QuickStart folder. Click the +IDE up-arrow icon then -> libraries -> SdFat -> QuickStart. + +You can also click File -> Examples -> SdFat -> QuickStart. + +If problems occur try reading more documentation and use these +forums for help: + +http://forums.adafruit.com/ + +http://arduino.cc/forum/ + +If QuickStart.ino runs successfully try more examples. diff --git a/SdFat.html b/SdFat.html new file mode 100644 index 0000000..a01f20b --- /dev/null +++ b/SdFat.html @@ -0,0 +1,10 @@ + + +A web page that points a browser to a different page + + + + +Your browser didn't automatically redirect. Open html/index.html manually. + + diff --git a/SdFat/ArduinoStream.h b/SdFat/ArduinoStream.h new file mode 100644 index 0000000..c6d53b9 --- /dev/null +++ b/SdFat/ArduinoStream.h @@ -0,0 +1,119 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef ArduinoStream_h +#define ArduinoStream_h +/** + * \file + * \brief ArduinoInStream and ArduinoOutStream classes + */ +#include +//============================================================================== +/** + * \class ArduinoInStream + * \brief Input stream for Arduino Stream objects + */ +class ArduinoInStream : public ibufstream { + public: + /** + * Constructor + * \param[in] hws hardware stream + * \param[in] buf buffer for input line + * \param[in] size size of input buffer + */ + ArduinoInStream(Stream &hws, char* buf, size_t size) { + m_hw = &hws; + m_line = buf; + m_size = size; + } + /** read a line. */ + void readline() { + size_t i = 0; + uint32_t t; + m_line[0] = '\0'; + while (!m_hw->available()) {} + + while (1) { + t = millis(); + while (!m_hw->available()) { + if ((millis() - t) > 10) goto done; + } + if (i >= (m_size - 1)) { + setstate(failbit); + return; + } + m_line[i++] = m_hw->read(); + m_line[i] = '\0'; + } + done: + init(m_line); + } + + protected: + /** Internal - do not use. + * \param[in] off + * \param[in] way + * \return true/false. + */ + bool seekoff(off_type off, seekdir way) {return false;} + /** Internal - do not use. + * \param[in] pos + * \return true/false. + */ + bool seekpos(pos_type pos) {return false;} + + private: + char *m_line; + size_t m_size; + Stream* m_hw; +}; +//============================================================================== +/** + * \class ArduinoOutStream + * \brief Output stream for Arduino Print objects + */ +class ArduinoOutStream : public ostream { + public: + /** constructor + * + * \param[in] pr Print object for this ArduinoOutStream. + */ + explicit ArduinoOutStream(Print& pr) : m_pr(&pr) {} + + protected: + /// @cond SHOW_PROTECTED + /** + * Internal do not use + * \param[in] c + */ + void putch(char c) { + if (c == '\n') m_pr->write('\r'); + m_pr->write(c); + } + void putstr(const char* str) {m_pr->write(str);} + bool seekoff(off_type off, seekdir way) {return false;} + bool seekpos(pos_type pos) {return false;} + bool sync() {return true;} + pos_type tellpos() {return 0;} + /// @endcond + private: + ArduinoOutStream() {} + Print* m_pr; +}; +#endif // ArduinoStream_h diff --git a/SdFat/MinimumSerial.cpp b/SdFat/MinimumSerial.cpp new file mode 100644 index 0000000..122a8a1 --- /dev/null +++ b/SdFat/MinimumSerial.cpp @@ -0,0 +1,71 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#include +#if defined(UDR0) || defined(DOXYGEN) +#include +//------------------------------------------------------------------------------ +/** + * Set baud rate for serial port zero and enable in non interrupt mode. + * Do not call this function if you use another serial library. + * \param[in] baud rate + */ +void MinimumSerial::begin(uint32_t baud) { + uint16_t baud_setting; + // don't worry, the compiler will squeeze out F_CPU != 16000000UL + if (F_CPU != 16000000UL || baud != 57600) { + // Double the USART Transmission Speed + UCSR0A = 1 << U2X0; + baud_setting = (F_CPU / 4 / baud - 1) / 2; + } else { + // hardcoded exception for compatibility with the bootloader shipped + // with the Duemilanove and previous boards and the firmware on the 8U2 + // on the Uno and Mega 2560. + UCSR0A = 0; + baud_setting = (F_CPU / 8 / baud - 1) / 2; + } + // assign the baud_setting + UBRR0H = baud_setting >> 8; + UBRR0L = baud_setting; + // enable transmit and receive + UCSR0B |= (1 << TXEN0) | (1 << RXEN0); +} +//------------------------------------------------------------------------------ +/** + * Unbuffered read + * \return -1 if no character is available or an available character. + */ +int MinimumSerial::read() { + if (UCSR0A & (1 << RXC0)) return UDR0; + return -1; +} +//------------------------------------------------------------------------------ +/** + * Unbuffered write + * + * \param[in] b byte to write. + * \return 1 + */ +size_t MinimumSerial::write(uint8_t b) { + while (((1 << UDRIE0) & UCSR0B) || !(UCSR0A & (1 << UDRE0))) {} + UDR0 = b; + return 1; +} +MinimumSerial MiniSerial; +#endif // defined(UDR0) || defined(DOXYGEN) diff --git a/SdFat/MinimumSerial.h b/SdFat/MinimumSerial.h new file mode 100644 index 0000000..57003c8 --- /dev/null +++ b/SdFat/MinimumSerial.h @@ -0,0 +1,36 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef MinimumSerial_h +#define MinimumSerial_h +/** + * \class MinimumSerial + * \brief mini serial class for the %SdFat library. + */ +class MinimumSerial : public Print { + public: + void begin(uint32_t baud); + int read(); + size_t write(uint8_t b); + using Print::write; +}; +#ifdef UDR0 +extern MinimumSerial MiniSerial; +#endif // UDR0 +#endif // MinimumSerial_h diff --git a/SdFat/Sd2Card.cpp b/SdFat/Sd2Card.cpp new file mode 100644 index 0000000..c49dbe4 --- /dev/null +++ b/SdFat/Sd2Card.cpp @@ -0,0 +1,633 @@ +/* Arduino Sd2Card Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino Sd2Card Library. If not, see + * . + */ +#include +#include +// debug trace macro +#define SD_TRACE(m, b) +// #define SD_TRACE(m, b) Serial.print(m);Serial.println(b); +//------------------------------------------------------------------------------ +SdSpi Sd2Card::m_spi; +//============================================================================== +#if USE_SD_CRC +// CRC functions +//------------------------------------------------------------------------------ +static uint8_t CRC7(const uint8_t* data, uint8_t n) { + uint8_t crc = 0; + for (uint8_t i = 0; i < n; i++) { + uint8_t d = data[i]; + for (uint8_t j = 0; j < 8; j++) { + crc <<= 1; + if ((d & 0x80) ^ (crc & 0x80)) crc ^= 0x09; + d <<= 1; + } + } + return (crc << 1) | 1; +} +//------------------------------------------------------------------------------ +#if USE_SD_CRC == 1 +// slower CRC-CCITT +// uses the x^16,x^12,x^5,x^1 polynomial. +static uint16_t CRC_CCITT(const uint8_t *data, size_t n) { + uint16_t crc = 0; + for (size_t i = 0; i < n; i++) { + crc = (uint8_t)(crc >> 8) | (crc << 8); + crc ^= data[i]; + crc ^= (uint8_t)(crc & 0xff) >> 4; + crc ^= crc << 12; + crc ^= (crc & 0xff) << 5; + } + return crc; +} +#elif USE_SD_CRC > 1 // CRC_CCITT +//------------------------------------------------------------------------------ +// faster CRC-CCITT +// uses the x^16,x^12,x^5,x^1 polynomial. +#ifdef __AVR__ +static const uint16_t crctab[] PROGMEM = { +#else // __AVR__ +static const uint16_t crctab[] = { +#endif // __AVR__ + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, + 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, + 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, + 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, + 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, + 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, + 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, + 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, + 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, + 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, + 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, + 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, + 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, + 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, + 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, + 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, + 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, + 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, + 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, + 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, + 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, + 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, + 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 +}; +static uint16_t CRC_CCITT(const uint8_t* data, size_t n) { + uint16_t crc = 0; + for (size_t i = 0; i < n; i++) { +#ifdef __AVR__ + crc = pgm_read_word(&crctab[(crc >> 8 ^ data[i]) & 0XFF]) ^ (crc << 8); +#else // __AVR__ + crc = crctab[(crc >> 8 ^ data[i]) & 0XFF] ^ (crc << 8); +#endif // __AVR__ + } + return crc; +} +#endif // CRC_CCITT +#endif // USE_SD_CRC +//============================================================================== +// Sd2Card member functions +//------------------------------------------------------------------------------ +/** + * Initialize an SD flash memory card. + * + * \param[in] chipSelectPin SD chip select pin number. + * \param[in] sckDivisor SPI SCK clock rate divisor. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. The reason for failure + * can be determined by calling errorCode() and errorData(). + */ +bool Sd2Card::begin(uint8_t chipSelectPin, uint8_t sckDivisor) { + m_errorCode = m_type = 0; + m_chipSelectPin = chipSelectPin; + // 16-bit init start time allows over a minute + uint16_t t0 = (uint16_t)millis(); + uint32_t arg; + + pinMode(m_chipSelectPin, OUTPUT); + digitalWrite(m_chipSelectPin, HIGH); + m_spi.begin(); + + // set SCK rate for initialization commands + m_sckDivisor = SPI_SCK_INIT_DIVISOR; + m_spi.init(m_sckDivisor); + + // must supply min of 74 clock cycles with CS high. + for (uint8_t i = 0; i < 10; i++) m_spi.send(0XFF); + + // command to go idle in SPI mode + while (cardCommand(CMD0, 0) != R1_IDLE_STATE) { + if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { + error(SD_CARD_ERROR_CMD0); + goto fail; + } + } +#if USE_SD_CRC + if (cardCommand(CMD59, 1) != R1_IDLE_STATE) { + error(SD_CARD_ERROR_CMD59); + goto fail; + } +#endif // USE_SD_CRC + // check SD version + while (1) { + if (cardCommand(CMD8, 0x1AA) == (R1_ILLEGAL_COMMAND | R1_IDLE_STATE)) { + type(SD_CARD_TYPE_SD1); + break; + } + for (uint8_t i = 0; i < 4; i++) m_status = m_spi.receive(); + if (m_status == 0XAA) { + type(SD_CARD_TYPE_SD2); + break; + } + if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { + error(SD_CARD_ERROR_CMD8); + goto fail; + } + } + // initialize card and send host supports SDHC if SD2 + arg = type() == SD_CARD_TYPE_SD2 ? 0X40000000 : 0; + + while (cardAcmd(ACMD41, arg) != R1_READY_STATE) { + // check for timeout + if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { + error(SD_CARD_ERROR_ACMD41); + goto fail; + } + } + // if SD2 read OCR register to check for SDHC card + if (type() == SD_CARD_TYPE_SD2) { + if (cardCommand(CMD58, 0)) { + error(SD_CARD_ERROR_CMD58); + goto fail; + } + if ((m_spi.receive() & 0XC0) == 0XC0) type(SD_CARD_TYPE_SDHC); + // Discard rest of ocr - contains allowed voltage range. + for (uint8_t i = 0; i < 3; i++) m_spi.receive(); + } + chipSelectHigh(); + m_sckDivisor = sckDivisor; + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +// send command and return error code. Return zero for OK +uint8_t Sd2Card::cardCommand(uint8_t cmd, uint32_t arg) { + // select card + chipSelectLow(); + + // wait if busy + waitNotBusy(SD_WRITE_TIMEOUT); + + uint8_t *pa = reinterpret_cast(&arg); + +#if USE_SD_CRC + // form message + uint8_t d[6] = {cmd | 0X40, pa[3], pa[2], pa[1], pa[0]}; + + // add crc + d[5] = CRC7(d, 5); + + // send message + for (uint8_t k = 0; k < 6; k++) m_spi.send(d[k]); +#else // USE_SD_CRC + // send command + m_spi.send(cmd | 0x40); + + // send argument + for (int8_t i = 3; i >= 0; i--) m_spi.send(pa[i]); + + // send CRC - correct for CMD0 with arg zero or CMD8 with arg 0X1AA + m_spi.send(cmd == CMD0 ? 0X95 : 0X87); +#endif // USE_SD_CRC + + // skip stuff byte for stop read + if (cmd == CMD12) m_spi.receive(); + + // wait for response + for (uint8_t i = 0; ((m_status = m_spi.receive()) & 0X80) && i != 0XFF; i++) { + } + return m_status; +} +//------------------------------------------------------------------------------ +/** + * Determine the size of an SD flash memory card. + * + * \return The number of 512 byte data blocks in the card + * or zero if an error occurs. + */ +uint32_t Sd2Card::cardSize() { + csd_t csd; + if (!readCSD(&csd)) return 0; + if (csd.v1.csd_ver == 0) { + uint8_t read_bl_len = csd.v1.read_bl_len; + uint16_t c_size = (csd.v1.c_size_high << 10) + | (csd.v1.c_size_mid << 2) | csd.v1.c_size_low; + uint8_t c_size_mult = (csd.v1.c_size_mult_high << 1) + | csd.v1.c_size_mult_low; + return (uint32_t)(c_size + 1) << (c_size_mult + read_bl_len - 7); + } else if (csd.v2.csd_ver == 1) { + uint32_t c_size = 0X10000L * csd.v2.c_size_high + 0X100L + * (uint32_t)csd.v2.c_size_mid + csd.v2.c_size_low; + return (c_size + 1) << 10; + } else { + error(SD_CARD_ERROR_BAD_CSD); + return 0; + } +} +//------------------------------------------------------------------------------ +void Sd2Card::chipSelectHigh() { + digitalWrite(m_chipSelectPin, HIGH); + // insure MISO goes high impedance + m_spi.send(0XFF); +} +//------------------------------------------------------------------------------ +void Sd2Card::chipSelectLow() { + m_spi.init(m_sckDivisor); + digitalWrite(m_chipSelectPin, LOW); +} +//------------------------------------------------------------------------------ +/** Erase a range of blocks. + * + * \param[in] firstBlock The address of the first block in the range. + * \param[in] lastBlock The address of the last block in the range. + * + * \note This function requests the SD card to do a flash erase for a + * range of blocks. The data on the card after an erase operation is + * either 0 or 1, depends on the card vendor. The card must support + * single block erase. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool Sd2Card::erase(uint32_t firstBlock, uint32_t lastBlock) { + csd_t csd; + if (!readCSD(&csd)) goto fail; + // check for single block erase + if (!csd.v1.erase_blk_en) { + // erase size mask + uint8_t m = (csd.v1.sector_size_high << 1) | csd.v1.sector_size_low; + if ((firstBlock & m) != 0 || ((lastBlock + 1) & m) != 0) { + // error card can't erase specified area + error(SD_CARD_ERROR_ERASE_SINGLE_BLOCK); + goto fail; + } + } + if (m_type != SD_CARD_TYPE_SDHC) { + firstBlock <<= 9; + lastBlock <<= 9; + } + if (cardCommand(CMD32, firstBlock) + || cardCommand(CMD33, lastBlock) + || cardCommand(CMD38, 0)) { + error(SD_CARD_ERROR_ERASE); + goto fail; + } + if (!waitNotBusy(SD_ERASE_TIMEOUT)) { + error(SD_CARD_ERROR_ERASE_TIMEOUT); + goto fail; + } + chipSelectHigh(); + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** Determine if card supports single block erase. + * + * \return The value one, true, is returned if single block erase is supported. + * The value zero, false, is returned if single block erase is not supported. + */ +bool Sd2Card::eraseSingleBlockEnable() { + csd_t csd; + return readCSD(&csd) ? csd.v1.erase_blk_en : false; +} +//------------------------------------------------------------------------------ +/** + * Check for busy. MISO low indicates the card is busy. + * + * \return true if busy else false. + */ +bool Sd2Card::isBusy() { + bool rtn; + chipSelectLow(); + for (uint8_t i = 0; i < 8; i++) { + rtn = m_spi.receive() != 0XFF; + if (!rtn) break; + } + chipSelectHigh(); + return rtn; +} +//------------------------------------------------------------------------------ +/** + * Read a 512 byte block from an SD card. + * + * \param[in] blockNumber Logical block to be read. + * \param[out] dst Pointer to the location that will receive the data. + + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t* dst) { + SD_TRACE("RB", blockNumber); + // use address if not SDHC card + if (type()!= SD_CARD_TYPE_SDHC) blockNumber <<= 9; + if (cardCommand(CMD17, blockNumber)) { + error(SD_CARD_ERROR_CMD17); + goto fail; + } + return readData(dst, 512); + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** Read one data block in a multiple block read sequence + * + * \param[in] dst Pointer to the location for the data to be read. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool Sd2Card::readData(uint8_t *dst) { + chipSelectLow(); + return readData(dst, 512); +} +//------------------------------------------------------------------------------ +bool Sd2Card::readData(uint8_t* dst, size_t count) { +#if USE_SD_CRC + uint16_t crc; +#endif // USE_SD_CRC + // wait for start block token + uint16_t t0 = millis(); + while ((m_status = m_spi.receive()) == 0XFF) { + if (((uint16_t)millis() - t0) > SD_READ_TIMEOUT) { + error(SD_CARD_ERROR_READ_TIMEOUT); + goto fail; + } + } + if (m_status != DATA_START_BLOCK) { + error(SD_CARD_ERROR_READ); + goto fail; + } + // transfer data + if ((m_status = m_spi.receive(dst, count))) { + error(SD_CARD_ERROR_SPI_DMA); + goto fail; + } + +#if USE_SD_CRC + // get crc + crc = (m_spi.receive() << 8) | m_spi.receive(); + if (crc != CRC_CCITT(dst, count)) { + error(SD_CARD_ERROR_READ_CRC); + goto fail; + } +#else + // discard crc + m_spi.receive(); + m_spi.receive(); +#endif // USE_SD_CRC + + chipSelectHigh(); + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** read CID or CSR register */ +bool Sd2Card::readRegister(uint8_t cmd, void* buf) { + uint8_t* dst = reinterpret_cast(buf); + if (cardCommand(cmd, 0)) { + error(SD_CARD_ERROR_READ_REG); + goto fail; + } + return readData(dst, 16); + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** Start a read multiple blocks sequence. + * + * \param[in] blockNumber Address of first block in sequence. + * + * \note This function is used with readData() and readStop() for optimized + * multiple block reads. SPI chipSelect must be low for the entire sequence. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool Sd2Card::readStart(uint32_t blockNumber) { + SD_TRACE("RS", blockNumber); + if (type()!= SD_CARD_TYPE_SDHC) blockNumber <<= 9; + if (cardCommand(CMD18, blockNumber)) { + error(SD_CARD_ERROR_CMD18); + goto fail; + } + chipSelectHigh(); + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** End a read multiple blocks sequence. + * +* \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool Sd2Card::readStop() { + if (cardCommand(CMD12, 0)) { + error(SD_CARD_ERROR_CMD12); + goto fail; + } + chipSelectHigh(); + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +// wait for card to go not busy +bool Sd2Card::waitNotBusy(uint16_t timeoutMillis) { + uint16_t t0 = millis(); + while (m_spi.receive() != 0XFF) { + if (((uint16_t)millis() - t0) >= timeoutMillis) goto fail; + } + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** + * Writes a 512 byte block to an SD card. + * + * \param[in] blockNumber Logical block to be written. + * \param[in] src Pointer to the location of the data to be written. + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) { + SD_TRACE("WB", blockNumber); + // use address if not SDHC card + if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; + if (cardCommand(CMD24, blockNumber)) { + error(SD_CARD_ERROR_CMD24); + goto fail; + } + if (!writeData(DATA_START_BLOCK, src)) goto fail; + +#define CHECK_PROGRAMMING 0 +#if CHECK_PROGRAMMING + // wait for flash programming to complete + if (!waitNotBusy(SD_WRITE_TIMEOUT)) { + error(SD_CARD_ERROR_WRITE_TIMEOUT); + goto fail; + } + // response is r2 so get and check two bytes for nonzero + if (cardCommand(CMD13, 0) || m_spi.receive()) { + error(SD_CARD_ERROR_WRITE_PROGRAMMING); + goto fail; + } +#endif // CHECK_PROGRAMMING + + chipSelectHigh(); + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** Write one data block in a multiple block write sequence + * \param[in] src Pointer to the location of the data to be written. + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool Sd2Card::writeData(const uint8_t* src) { + chipSelectLow(); + // wait for previous write to finish + if (!waitNotBusy(SD_WRITE_TIMEOUT)) goto fail; + if (!writeData(WRITE_MULTIPLE_TOKEN, src)) goto fail; + chipSelectHigh(); + return true; + + fail: + error(SD_CARD_ERROR_WRITE_MULTIPLE); + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +// send one block of data for write block or write multiple blocks +bool Sd2Card::writeData(uint8_t token, const uint8_t* src) { +#if USE_SD_CRC + uint16_t crc = CRC_CCITT(src, 512); +#else // USE_SD_CRC + uint16_t crc = 0XFFFF; +#endif // USE_SD_CRC + + m_spi.send(token); + m_spi.send(src, 512); + m_spi.send(crc >> 8); + m_spi.send(crc & 0XFF); + + m_status = m_spi.receive(); + if ((m_status & DATA_RES_MASK) != DATA_RES_ACCEPTED) { + error(SD_CARD_ERROR_WRITE); + goto fail; + } + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** Start a write multiple blocks sequence. + * + * \param[in] blockNumber Address of first block in sequence. + * \param[in] eraseCount The number of blocks to be pre-erased. + * + * \note This function is used with writeData() and writeStop() + * for optimized multiple block writes. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool Sd2Card::writeStart(uint32_t blockNumber, uint32_t eraseCount) { + SD_TRACE("WS", blockNumber); + // send pre-erase count + if (cardAcmd(ACMD23, eraseCount)) { + error(SD_CARD_ERROR_ACMD23); + goto fail; + } + // use address if not SDHC card + if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; + if (cardCommand(CMD25, blockNumber)) { + error(SD_CARD_ERROR_CMD25); + goto fail; + } + chipSelectHigh(); + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** End a write multiple blocks sequence. + * +* \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool Sd2Card::writeStop() { + chipSelectLow(); + if (!waitNotBusy(SD_WRITE_TIMEOUT)) goto fail; + m_spi.send(STOP_TRAN_TOKEN); + if (!waitNotBusy(SD_WRITE_TIMEOUT)) goto fail; + chipSelectHigh(); + return true; + + fail: + error(SD_CARD_ERROR_STOP_TRAN); + chipSelectHigh(); + return false; +} diff --git a/SdFat/Sd2Card.h b/SdFat/Sd2Card.h new file mode 100644 index 0000000..d6a5add --- /dev/null +++ b/SdFat/Sd2Card.h @@ -0,0 +1,200 @@ +/* Arduino Sd2Card Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino Sd2Card Library. If not, see + * . + */ +#ifndef SpiCard_h +#define SpiCard_h +/** + * \file + * \brief Sd2Card class for V2 SD/SDHC cards + */ +#include +#include +#include +#include +//------------------------------------------------------------------------------ +// SD card errors +/** timeout error for command CMD0 (initialize card in SPI mode) */ +uint8_t const SD_CARD_ERROR_CMD0 = 0X1; +/** CMD8 was not accepted - not a valid SD card*/ +uint8_t const SD_CARD_ERROR_CMD8 = 0X2; +/** card returned an error response for CMD12 (stop multiblock read) */ +uint8_t const SD_CARD_ERROR_CMD12 = 0X3; +/** card returned an error response for CMD17 (read block) */ +uint8_t const SD_CARD_ERROR_CMD17 = 0X4; +/** card returned an error response for CMD18 (read multiple block) */ +uint8_t const SD_CARD_ERROR_CMD18 = 0X5; +/** card returned an error response for CMD24 (write block) */ +uint8_t const SD_CARD_ERROR_CMD24 = 0X6; +/** WRITE_MULTIPLE_BLOCKS command failed */ +uint8_t const SD_CARD_ERROR_CMD25 = 0X7; +/** card returned an error response for CMD58 (read OCR) */ +uint8_t const SD_CARD_ERROR_CMD58 = 0X8; +/** SET_WR_BLK_ERASE_COUNT failed */ +uint8_t const SD_CARD_ERROR_ACMD23 = 0X9; +/** ACMD41 initialization process timeout */ +uint8_t const SD_CARD_ERROR_ACMD41 = 0XA; +/** card returned a bad CSR version field */ +uint8_t const SD_CARD_ERROR_BAD_CSD = 0XB; +/** erase block group command failed */ +uint8_t const SD_CARD_ERROR_ERASE = 0XC; +/** card not capable of single block erase */ +uint8_t const SD_CARD_ERROR_ERASE_SINGLE_BLOCK = 0XD; +/** Erase sequence timed out */ +uint8_t const SD_CARD_ERROR_ERASE_TIMEOUT = 0XE; +/** card returned an error token instead of read data */ +uint8_t const SD_CARD_ERROR_READ = 0XF; +/** read CID or CSD failed */ +uint8_t const SD_CARD_ERROR_READ_REG = 0X10; +/** timeout while waiting for start of read data */ +uint8_t const SD_CARD_ERROR_READ_TIMEOUT = 0X11; +/** card did not accept STOP_TRAN_TOKEN */ +uint8_t const SD_CARD_ERROR_STOP_TRAN = 0X12; +/** card returned an error token as a response to a write operation */ +uint8_t const SD_CARD_ERROR_WRITE = 0X13; +/** attempt to write protected block zero */ +uint8_t const SD_CARD_ERROR_WRITE_BLOCK_ZERO = 0X14; // REMOVE - not used +/** card did not go ready for a multiple block write */ +uint8_t const SD_CARD_ERROR_WRITE_MULTIPLE = 0X15; +/** card returned an error to a CMD13 status check after a write */ +uint8_t const SD_CARD_ERROR_WRITE_PROGRAMMING = 0X16; +/** timeout occurred during write programming */ +uint8_t const SD_CARD_ERROR_WRITE_TIMEOUT = 0X17; +/** incorrect rate selected */ +uint8_t const SD_CARD_ERROR_SCK_RATE = 0X18; +/** init() not called */ +uint8_t const SD_CARD_ERROR_INIT_NOT_CALLED = 0X19; +/** card returned an error for CMD59 (CRC_ON_OFF) */ +uint8_t const SD_CARD_ERROR_CMD59 = 0X1A; +/** invalid read CRC */ +uint8_t const SD_CARD_ERROR_READ_CRC = 0X1B; +/** SPI DMA error */ +uint8_t const SD_CARD_ERROR_SPI_DMA = 0X1C; +//------------------------------------------------------------------------------ +// card types +/** Standard capacity V1 SD card */ +uint8_t const SD_CARD_TYPE_SD1 = 1; +/** Standard capacity V2 SD card */ +uint8_t const SD_CARD_TYPE_SD2 = 2; +/** High Capacity SD card */ +uint8_t const SD_CARD_TYPE_SDHC = 3; +//------------------------------------------------------------------------------ +/** + * \class Sd2Card + * \brief Raw access to SD and SDHC flash memory cards. + */ +class Sd2Card { + public: + /** Construct an instance of Sd2Card. */ + Sd2Card() : m_errorCode(SD_CARD_ERROR_INIT_NOT_CALLED), m_type(0) {} + bool begin(uint8_t chipSelectPin = SD_CHIP_SELECT_PIN, + uint8_t sckDivisor = SPI_FULL_SPEED); + uint32_t cardSize(); + bool erase(uint32_t firstBlock, uint32_t lastBlock); + bool eraseSingleBlockEnable(); + /** + * Set SD error code. + * \param[in] code value for error code. + */ + void error(uint8_t code) {m_errorCode = code;} + /** + * \return error code for last error. See Sd2Card.h for a list of error codes. + */ + int errorCode() const {return m_errorCode;} + /** \return error data for last error. */ + int errorData() const {return m_status;} + /** + * Initialize an SD flash memory card. + * + * \param[in] chipSelectPin SD chip select pin number. + * \param[in] sckDivisor SPI SCK clock rate divisor. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. The reason for failure + * can be determined by calling errorCode() and errorData(). + */ + bool init(uint8_t sckDivisor = SPI_FULL_SPEED, + uint8_t chipSelectPin = SD_CHIP_SELECT_PIN) { + return begin(chipSelectPin, sckDivisor); + } + bool isBusy(); + bool readBlock(uint32_t block, uint8_t* dst); + /** + * Read a card's CID register. The CID contains card identification + * information such as Manufacturer ID, Product name, Product serial + * number and Manufacturing date. + * + * \param[out] cid pointer to area for returned data. + * + * \return true for success or false for failure. + */ + bool readCID(cid_t* cid) { + return readRegister(CMD10, cid); + } + /** + * Read a card's CSD register. The CSD contains Card-Specific Data that + * provides information regarding access to the card's contents. + * + * \param[out] csd pointer to area for returned data. + * + * \return true for success or false for failure. + */ + bool readCSD(csd_t* csd) { + return readRegister(CMD9, csd); + } + bool readData(uint8_t *dst); + bool readStart(uint32_t blockNumber); + bool readStop(); + /** Return SCK divisor. + * + * \return Requested SCK divisor. + */ + uint8_t sckDivisor() {return m_sckDivisor;} + /** Return the card type: SD V1, SD V2 or SDHC + * \return 0 - SD V1, 1 - SD V2, or 3 - SDHC. + */ + int type() const {return m_type;} + bool writeBlock(uint32_t blockNumber, const uint8_t* src); + bool writeData(const uint8_t* src); + bool writeStart(uint32_t blockNumber, uint32_t eraseCount); + bool writeStop(); + + private: + //---------------------------------------------------------------------------- + // private functions + uint8_t cardAcmd(uint8_t cmd, uint32_t arg) { + cardCommand(CMD55, 0); + return cardCommand(cmd, arg); + } + uint8_t cardCommand(uint8_t cmd, uint32_t arg); + bool readData(uint8_t* dst, size_t count); + bool readRegister(uint8_t cmd, void* buf); + void chipSelectHigh(); + void chipSelectLow(); + void type(uint8_t value) {m_type = value;} + bool waitNotBusy(uint16_t timeoutMillis); + bool writeData(uint8_t token, const uint8_t* src); + // private data + static SdSpi m_spi; + uint8_t m_chipSelectPin; + uint8_t m_errorCode; + uint8_t m_sckDivisor; + uint8_t m_status; + uint8_t m_type; +}; +#endif // SpiCard_h diff --git a/SdFat/SdBaseFile.cpp b/SdFat/SdBaseFile.cpp new file mode 100644 index 0000000..232d3b6 --- /dev/null +++ b/SdFat/SdBaseFile.cpp @@ -0,0 +1,2024 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#include +//------------------------------------------------------------------------------ +// pointer to cwd directory +SdBaseFile* SdBaseFile::m_cwd = 0; +// callback function for date/time +void (*SdBaseFile::m_dateTime)(uint16_t* date, uint16_t* time) = 0; +//------------------------------------------------------------------------------ +// add a cluster to a file +bool SdBaseFile::addCluster() { + if (!m_vol->allocContiguous(1, &m_curCluster)) { + DBG_FAIL_MACRO; + goto fail; + } + // if first cluster of file link to directory entry + if (m_firstCluster == 0) { + m_firstCluster = m_curCluster; + m_flags |= F_FILE_DIR_DIRTY; + } + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +// Add a cluster to a directory file and zero the cluster. +// return with first block of cluster in the cache +cache_t* SdBaseFile::addDirCluster() { + uint32_t block; + cache_t* pc; + // max folder size + if (m_fileSize/sizeof(dir_t) >= 0XFFFF) { + DBG_FAIL_MACRO; + goto fail; + } + if (!addCluster()) { + DBG_FAIL_MACRO; + goto fail; + } + block = m_vol->clusterStartBlock(m_curCluster); + pc = m_vol->cacheFetch(block, SdVolume::CACHE_RESERVE_FOR_WRITE); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + memset(pc, 0, 512); + // zero rest of clusters + for (uint8_t i = 1; i < m_vol->blocksPerCluster(); i++) { + if (!m_vol->writeBlock(block + i, pc->data)) { + DBG_FAIL_MACRO; + goto fail; + } + } + // Increase directory file size by cluster size + m_fileSize += 512UL*m_vol->blocksPerCluster(); + return pc; + + fail: + return 0; +} +//------------------------------------------------------------------------------ +// cache a file's directory entry +// return pointer to cached entry or null for failure +dir_t* SdBaseFile::cacheDirEntry(uint8_t action) { + cache_t* pc; + pc = m_vol->cacheFetch(m_dirBlock, action); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + return pc->dir + m_dirIndex; + + fail: + return 0; +} +//------------------------------------------------------------------------------ +/** Close a file and force cached data and directory information + * to be written to the storage device. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include no file is open or an I/O error. + */ +bool SdBaseFile::close() { + bool rtn = sync(); + m_type = FAT_FILE_TYPE_CLOSED; + return rtn; +} +//------------------------------------------------------------------------------ +/** Check for contiguous file and return its raw block range. + * + * \param[out] bgnBlock the first block address for the file. + * \param[out] endBlock the last block address for the file. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include file is not contiguous, file has zero length + * or an I/O error occurred. + */ +bool SdBaseFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock) { + // error if no blocks + if (m_firstCluster == 0) { + DBG_FAIL_MACRO; + goto fail; + } + for (uint32_t c = m_firstCluster; ; c++) { + uint32_t next; + if (!m_vol->fatGet(c, &next)) { + DBG_FAIL_MACRO; + goto fail; + } + // check for contiguous + if (next != (c + 1)) { + // error if not end of chain + if (!m_vol->isEOC(next)) { + DBG_FAIL_MACRO; + goto fail; + } + *bgnBlock = m_vol->clusterStartBlock(m_firstCluster); + *endBlock = m_vol->clusterStartBlock(c) + + m_vol->blocksPerCluster() - 1; + return true; + } + } + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Create and open a new contiguous file of a specified size. + * + * \note This function only supports short DOS 8.3 names. + * See open() for more information. + * + * \param[in] dirFile The directory where the file will be created. + * \param[in] path A path with a valid DOS 8.3 file name. + * \param[in] size The desired file size. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include \a path contains + * an invalid DOS 8.3 file name, the FAT volume has not been initialized, + * a file is already open, the file already exists, the root + * directory is full or an I/O error. + * + */ +bool SdBaseFile::createContiguous(SdBaseFile* dirFile, + const char* path, uint32_t size) { + uint32_t count; + // don't allow zero length file + if (size == 0) { + DBG_FAIL_MACRO; + goto fail; + } + if (!open(dirFile, path, O_CREAT | O_EXCL | O_RDWR)) { + DBG_FAIL_MACRO; + goto fail; + } + // calculate number of clusters needed + count = ((size - 1) >> (m_vol->clusterSizeShift() + 9)) + 1; + + // allocate clusters + if (!m_vol->allocContiguous(count, &m_firstCluster)) { + remove(); + DBG_FAIL_MACRO; + goto fail; + } + m_fileSize = size; + + // insure sync() will update dir entry + m_flags |= F_FILE_DIR_DIRTY; + + return sync(); + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Return a file's directory entry. + * + * \param[out] dir Location for return of the file's directory entry. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool SdBaseFile::dirEntry(dir_t* dir) { + dir_t* p; + // make sure fields on SD are correct + if (!sync()) { + DBG_FAIL_MACRO; + goto fail; + } + // read entry + p = cacheDirEntry(SdVolume::CACHE_FOR_READ); + if (!p) { + DBG_FAIL_MACRO; + goto fail; + } + // copy to caller's struct + memcpy(dir, p, sizeof(dir_t)); + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Format the name field of \a dir into the 13 byte array + * \a name in standard 8.3 short name format. + * + * \param[in] dir The directory structure containing the name. + * \param[out] name A 13 byte char array for the formatted name. + */ +void SdBaseFile::dirName(const dir_t& dir, char* name) { + uint8_t j = 0; + for (uint8_t i = 0; i < 11; i++) { + if (dir.name[i] == ' ')continue; + if (i == 8) name[j++] = '.'; + name[j++] = dir.name[i]; + } + name[j] = 0; +} +//------------------------------------------------------------------------------ +/** Test for the existence of a file in a directory + * + * \param[in] name Name of the file to be tested for. + * + * The calling instance must be an open directory file. + * + * dirFile.exists("TOFIND.TXT") searches for "TOFIND.TXT" in the directory + * dirFile. + * + * \return true if the file exists else false. + */ +bool SdBaseFile::exists(const char* name) { + SdBaseFile file; + return file.open(this, name, O_READ); +} +//------------------------------------------------------------------------------ +/** + * Get a string from a file. + * + * fgets() reads bytes from a file into the array pointed to by \a str, until + * \a num - 1 bytes are read, or a delimiter is read and transferred to \a str, + * or end-of-file is encountered. The string is then terminated + * with a null byte. + * + * fgets() deletes CR, '\\r', from the string. This insures only a '\\n' + * terminates the string for Windows text files which use CRLF for newline. + * + * \param[out] str Pointer to the array where the string is stored. + * \param[in] num Maximum number of characters to be read + * (including the final null byte). Usually the length + * of the array \a str is used. + * \param[in] delim Optional set of delimiters. The default is "\n". + * + * \return For success fgets() returns the length of the string in \a str. + * If no data is read, fgets() returns zero for EOF or -1 if an error occurred. + **/ +int16_t SdBaseFile::fgets(char* str, int16_t num, char* delim) { + char ch; + int16_t n = 0; + int16_t r = -1; + while ((n + 1) < num && (r = read(&ch, 1)) == 1) { + // delete CR + if (ch == '\r') continue; + str[n++] = ch; + if (!delim) { + if (ch == '\n') break; + } else { + if (strchr(delim, ch)) break; + } + } + if (r < 0) { + // read error + return -1; + } + str[n] = '\0'; + return n; +} +//------------------------------------------------------------------------------ +/** Get a file's name + * + * \param[out] name An array of 13 characters for the file's name. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool SdBaseFile::getFilename(char* name) { + dir_t* p; + if (!isOpen()) { + DBG_FAIL_MACRO; + goto fail; + } + if (isRoot()) { + name[0] = '/'; + name[1] = '\0'; + return true; + } + // cache entry + p = cacheDirEntry(SdVolume::CACHE_FOR_READ); + if (!p) { + DBG_FAIL_MACRO; + goto fail; + } + // format name + dirName(*p, name); + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +void SdBaseFile::getpos(FatPos_t* pos) { + pos->position = m_curPosition; + pos->cluster = m_curCluster; +} +//------------------------------------------------------------------------------ +// format directory name field from a 8.3 name string +bool SdBaseFile::make83Name(const char* str, uint8_t* name, const char** ptr) { + uint8_t c; + uint8_t n = 7; // max index for part before dot + uint8_t i = 0; + // blank fill name and extension + while (i < 11) name[i++] = ' '; + i = 0; + while (*str != '\0' && *str != '/') { + c = *str++; + if (c == '.') { + if (n == 10) { + // only one dot allowed + DBG_FAIL_MACRO; + goto fail; + } + n = 10; // max index for full 8.3 name + i = 8; // place for extension + } else { + // illegal FAT characters +#ifdef __AVR__ + // store chars in flash + PGM_P p = PSTR("|<>^+=?/[];,*\"\\"); + uint8_t b; + while ((b = pgm_read_byte(p++))) if (b == c) { + DBG_FAIL_MACRO; + goto fail; + } +#else // __AVR__ + // store chars in RAM + if (strchr("|<>^+=?/[];,*\"\\", c)) { + DBG_FAIL_MACRO; + goto fail; + } +#endif // __AVR__ + + // check size and only allow ASCII printable characters + if (i > n || c < 0X21 || c > 0X7E) { + DBG_FAIL_MACRO; + goto fail; + } + // only upper case allowed in 8.3 names - convert lower to upper + name[i++] = c < 'a' || c > 'z' ? c : c + ('A' - 'a'); + } + } + *ptr = str; + // must have a file name, extension is optional + return name[0] != ' '; + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Make a new directory. + * + * \param[in] parent An open SdFat instance for the directory that will contain + * the new directory. + * + * \param[in] path A path with a valid 8.3 DOS name for the new directory. + * + * \param[in] pFlag Create missing parent directories if true. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include this file is already open, \a parent is not a + * directory, \a path is invalid or already exists in \a parent. + */ +bool SdBaseFile::mkdir(SdBaseFile* parent, const char* path, bool pFlag) { + uint8_t dname[11]; + SdBaseFile dir1, dir2; + SdBaseFile* sub = &dir1; + SdBaseFile* start = parent; + + if (!parent || isOpen()) { + DBG_FAIL_MACRO; + goto fail; + } + if (*path == '/') { + while (*path == '/') path++; + if (!parent->isRoot()) { + if (!dir2.openRoot(parent->m_vol)) { + DBG_FAIL_MACRO; + goto fail; + } + parent = &dir2; + } + } + while (1) { + if (!make83Name(path, dname, &path)) { + DBG_FAIL_MACRO; + goto fail; + } + while (*path == '/') path++; + if (!*path) break; + if (!sub->open(parent, dname, O_READ)) { + if (!pFlag || !sub->mkdir(parent, dname)) { + DBG_FAIL_MACRO; + goto fail; + } + } + if (parent != start) parent->close(); + parent = sub; + sub = parent != &dir1 ? &dir1 : &dir2; + } + return mkdir(parent, dname); + + fail: + return false; +} +//------------------------------------------------------------------------------ +bool SdBaseFile::mkdir(SdBaseFile* parent, const uint8_t dname[11]) { + uint32_t block; + dir_t d; + dir_t* p; + cache_t* pc; + + if (!parent->isDir()) { + DBG_FAIL_MACRO; + goto fail; + } + // create a normal file + if (!open(parent, dname, O_CREAT | O_EXCL | O_RDWR)) { + DBG_FAIL_MACRO; + goto fail; + } + // convert file to directory + m_flags = O_READ; + m_type = FAT_FILE_TYPE_SUBDIR; + + // allocate and zero first cluster + if (!addDirCluster()) { + DBG_FAIL_MACRO; + goto fail; + } + // force entry to SD + if (!sync()) { + DBG_FAIL_MACRO; + goto fail; + } + // cache entry - should already be in cache due to sync() call + p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!p) { + DBG_FAIL_MACRO; + goto fail; + } + // change directory entry attribute + p->attributes = DIR_ATT_DIRECTORY; + + // make entry for '.' + memcpy(&d, p, sizeof(d)); + d.name[0] = '.'; + for (uint8_t i = 1; i < 11; i++) d.name[i] = ' '; + + // cache block for '.' and '..' + block = m_vol->clusterStartBlock(m_firstCluster); + pc = m_vol->cacheFetch(block, SdVolume::CACHE_FOR_WRITE); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + // copy '.' to block + memcpy(&pc->dir[0], &d, sizeof(d)); + // make entry for '..' + d.name[1] = '.'; + if (parent->isRoot()) { + d.firstClusterLow = 0; + d.firstClusterHigh = 0; + } else { + d.firstClusterLow = parent->m_firstCluster & 0XFFFF; + d.firstClusterHigh = parent->m_firstCluster >> 16; + } + // copy '..' to block + memcpy(&pc->dir[1], &d, sizeof(d)); + // write first block + return m_vol->cacheSync(); + + fail: + return false; +} +//------------------------------------------------------------------------------ + /** Open a file in the current working directory. + * + * \param[in] path A path with a valid 8.3 DOS name for a file to be opened. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of open flags. see SdBaseFile::open(SdBaseFile*, const char*, uint8_t). + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ + bool SdBaseFile::open(const char* path, uint8_t oflag) { + return open(m_cwd, path, oflag); + } +//------------------------------------------------------------------------------ +/** Open a file or directory by name. + * + * \param[in] dirFile An open SdFat instance for the directory containing the + * file to be opened. + * + * \param[in] path A path with a valid 8.3 DOS name for a file to be opened. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of flags from the following list + * + * O_READ - Open for reading. + * + * O_RDONLY - Same as O_READ. + * + * O_WRITE - Open for writing. + * + * O_WRONLY - Same as O_WRITE. + * + * O_RDWR - Open for reading and writing. + * + * O_APPEND - If set, the file offset shall be set to the end of the + * file prior to each write. + * + * O_AT_END - Set the initial position at the end of the file. + * + * O_CREAT - If the file exists, this flag has no effect except as noted + * under O_EXCL below. Otherwise, the file shall be created + * + * O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists. + * + * O_SYNC - Call sync() after each write. This flag should not be used with + * write(uint8_t), write_P(PGM_P), writeln_P(PGM_P), or the Arduino Print class. + * These functions do character at a time writes so sync() will be called + * after each byte. + * + * O_TRUNC - If the file exists and is a regular file, and the file is + * successfully opened and is not read only, its length shall be truncated to 0. + * + * WARNING: A given file must not be opened by more than one SdBaseFile object + * of file corruption may occur. + * + * \note Directory files must be opened read only. Write and truncation is + * not allowed for directory files. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include this file is already open, \a dirFile is not + * a directory, \a path is invalid, the file does not exist + * or can't be opened in the access mode specified by oflag. + */ +bool SdBaseFile::open(SdBaseFile* dirFile, const char* path, uint8_t oflag) { + uint8_t dname[11]; + SdBaseFile dir1, dir2; + SdBaseFile *parent = dirFile; + SdBaseFile *sub = &dir1; + + if (!dirFile) { + DBG_FAIL_MACRO; + goto fail; + } + // error if already open + if (isOpen()) { + DBG_FAIL_MACRO; + goto fail; + } + if (*path == '/') { + while (*path == '/') path++; + if (*path == 0) return openRoot(dirFile->m_vol); + if (!dirFile->isRoot()) { + if (!dir2.openRoot(dirFile->m_vol)) { + DBG_FAIL_MACRO; + goto fail; + } + parent = &dir2; + } + } + while (1) { + if (!make83Name(path, dname, &path)) { + DBG_FAIL_MACRO; + goto fail; + } + while (*path == '/') path++; + if (!*path) break; + if (!sub->open(parent, dname, O_READ)) { + DBG_FAIL_MACRO; + goto fail; + } + if (parent != dirFile) parent->close(); + parent = sub; + sub = parent != &dir1 ? &dir1 : &dir2; + } + return open(parent, dname, oflag); + + fail: + return false; +} +//------------------------------------------------------------------------------ +// open with filename in dname +bool SdBaseFile::open(SdBaseFile* dirFile, + const uint8_t dname[11], uint8_t oflag) { + cache_t* pc; + bool emptyFound = false; + bool fileFound = false; + uint8_t index; + dir_t* p; + + m_vol = dirFile->m_vol; + + dirFile->rewind(); + // search for file + + while (dirFile->m_curPosition < dirFile->m_fileSize) { + // Cache directory block. + if (dirFile->read() < 0) { + DBG_FAIL_MACRO; + goto fail; + } + // Position to to next block + dirFile->m_curPosition += 511; + + for (index = 0; index < 16; index++) { + p = &m_vol->cacheAddress()->dir[index]; + if (p->name[0] == DIR_NAME_FREE || p->name[0] == DIR_NAME_DELETED) { + // remember first empty slot + if (!emptyFound) { + m_dirBlock = m_vol->cacheBlockNumber(); + m_dirIndex = index; + emptyFound = true; + } + // done if no entries follow + if (p->name[0] == DIR_NAME_FREE) { + goto done; + } + } else if (!memcmp(dname, p->name, 11)) { + fileFound = true; + goto done; + } + } + } + done: + + if (fileFound) { + // don't open existing file if O_EXCL + if (oflag & O_EXCL) { + DBG_FAIL_MACRO; + goto fail; + } + } else { + // don't create unless O_CREAT and O_WRITE + if (!(oflag & O_CREAT) || !(oflag & O_WRITE)) { + DBG_FAIL_MACRO; + goto fail; + } + if (emptyFound) { + index = m_dirIndex; + p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!p) { + DBG_FAIL_MACRO; + goto fail; + } + } else { + if (dirFile->m_type == FAT_FILE_TYPE_ROOT_FIXED) { + DBG_FAIL_MACRO; + goto fail; + } + // add and zero cluster for dirFile - first cluster is in cache for write + pc = dirFile->addDirCluster(); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + // use first entry in cluster + p = pc->dir; + index = 0; + } + // initialize as empty file + memset(p, 0, sizeof(dir_t)); + memcpy(p->name, dname, 11); + + // set timestamps + if (m_dateTime) { + // call user date/time function + m_dateTime(&p->creationDate, &p->creationTime); + } else { + // use default date/time + p->creationDate = FAT_DEFAULT_DATE; + p->creationTime = FAT_DEFAULT_TIME; + } + p->lastAccessDate = p->creationDate; + p->lastWriteDate = p->creationDate; + p->lastWriteTime = p->creationTime; + + // write entry to SD + if (!dirFile->m_vol->cacheSync()) { + DBG_FAIL_MACRO; + goto fail; + } + } + // open entry in cache + return openCachedEntry(index, oflag); + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Open a file by index. + * + * \param[in] dirFile An open SdFat instance for the directory. + * + * \param[in] index The \a index of the directory entry for the file to be + * opened. The value for \a index is (directory file position)/32. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC. + * + * See open() by path for definition of flags. + * \return true for success or false for failure. + */ +bool SdBaseFile::open(SdBaseFile* dirFile, uint16_t index, uint8_t oflag) { + dir_t* p; + + m_vol = dirFile->m_vol; + + // error if already open + if (isOpen() || !dirFile) { + DBG_FAIL_MACRO; + goto fail; + } + + // don't open existing file if O_EXCL - user call error + if (oflag & O_EXCL) { + DBG_FAIL_MACRO; + goto fail; + } + // seek to location of entry + if (!dirFile->seekSet(32 * index)) { + DBG_FAIL_MACRO; + goto fail; + } + // read entry into cache + p = dirFile->readDirCache(); + if (!p) { + DBG_FAIL_MACRO; + goto fail; + } + // error if empty slot or '.' or '..' + if (p->name[0] == DIR_NAME_FREE || + p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') { + DBG_FAIL_MACRO; + goto fail; + } + // open cached entry + return openCachedEntry(index & 0XF, oflag); + + fail: + return false; +} +//------------------------------------------------------------------------------ +// open a cached directory entry. Assumes m_vol is initialized +bool SdBaseFile::openCachedEntry(uint8_t dirIndex, uint8_t oflag) { + // location of entry in cache + dir_t* p = &m_vol->cacheAddress()->dir[dirIndex]; + + // write or truncate is an error for a directory or read-only file + if (p->attributes & (DIR_ATT_READ_ONLY | DIR_ATT_DIRECTORY)) { + if (oflag & (O_WRITE | O_TRUNC)) { + DBG_FAIL_MACRO; + goto fail; + } + } + // remember location of directory entry on SD + m_dirBlock = m_vol->cacheBlockNumber(); + m_dirIndex = dirIndex; + + // copy first cluster number for directory fields + m_firstCluster = (uint32_t)p->firstClusterHigh << 16; + m_firstCluster |= p->firstClusterLow; + + // make sure it is a normal file or subdirectory + if (DIR_IS_FILE(p)) { + m_fileSize = p->fileSize; + m_type = FAT_FILE_TYPE_NORMAL; + } else if (DIR_IS_SUBDIR(p)) { + if (!setDirSize()) { + DBG_FAIL_MACRO; + goto fail; + } + m_type = FAT_FILE_TYPE_SUBDIR; + } else { + DBG_FAIL_MACRO; + goto fail; + } + // save open flags for read/write + m_flags = oflag & F_OFLAG; + + // set to start of file + m_curCluster = 0; + m_curPosition = 0; + if ((oflag & O_TRUNC) && !truncate(0)) { + DBG_FAIL_MACRO; + goto fail; + } + return oflag & O_AT_END ? seekEnd(0) : true; + + fail: + m_type = FAT_FILE_TYPE_CLOSED; + return false; +} +//------------------------------------------------------------------------------ +/** Open the next file or subdirectory in a directory. + * + * \param[in] dirFile An open SdFat instance for the directory containing the + * file to be opened. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC. + * + * See open() by path for definition of flags. + * \return true for success or false for failure. + */ +bool SdBaseFile::openNext(SdBaseFile* dirFile, uint8_t oflag) { + dir_t* p; + uint8_t index; + + if (!dirFile) { + DBG_FAIL_MACRO; + goto fail; + } + // error if already open + if (isOpen()) { + DBG_FAIL_MACRO; + goto fail; + } + m_vol = dirFile->m_vol; + + while (1) { + index = 0XF & (dirFile->m_curPosition >> 5); + + // read entry into cache + p = dirFile->readDirCache(); + if (!p) { + DBG_FAIL_MACRO; + goto fail; + } + // done if last entry + if (p->name[0] == DIR_NAME_FREE) { + DBG_FAIL_MACRO; + goto fail; + } + // skip empty slot or '.' or '..' + if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') { + continue; + } + // must be file or dir + if (DIR_IS_FILE_OR_SUBDIR(p)) { + return openCachedEntry(index, oflag); + } + } + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Open a directory's parent directory. + * + * \param[in] dir Parent of this directory will be opened. Must not be root. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool SdBaseFile::openParent(SdBaseFile* dir) { + dir_t entry; + dir_t* p; + SdBaseFile file; + uint32_t c; + uint32_t cluster; + uint32_t lbn; + cache_t* pc; + // error if already open or dir is root or dir is not a directory + if (isOpen() || !dir || dir->isRoot() || !dir->isDir()) { + DBG_FAIL_MACRO; + goto fail; + } + m_vol = dir->m_vol; + // position to '..' + if (!dir->seekSet(32)) { + DBG_FAIL_MACRO; + goto fail; + } + // read '..' entry + if (dir->read(&entry, sizeof(entry)) != 32) { + DBG_FAIL_MACRO; + goto fail; + } + // verify it is '..' + if (entry.name[0] != '.' || entry.name[1] != '.') { + DBG_FAIL_MACRO; + goto fail; + } + // start cluster for '..' + cluster = entry.firstClusterLow; + cluster |= (uint32_t)entry.firstClusterHigh << 16; + if (cluster == 0) return openRoot(m_vol); + // start block for '..' + lbn = m_vol->clusterStartBlock(cluster); + // first block of parent dir + pc = m_vol->cacheFetch(lbn, SdVolume::CACHE_FOR_READ); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + p = &pc->dir[1]; + // verify name for '../..' + if (p->name[0] != '.' || p->name[1] != '.') { + DBG_FAIL_MACRO; + goto fail; + } + // '..' is pointer to first cluster of parent. open '../..' to find parent + if (p->firstClusterHigh == 0 && p->firstClusterLow == 0) { + if (!file.openRoot(dir->volume())) { + DBG_FAIL_MACRO; + goto fail; + } + } else { + if (!file.openCachedEntry(1, O_READ)) { + DBG_FAIL_MACRO; + goto fail; + } + } + // search for parent in '../..' + do { + if (file.readDir(&entry) != 32) { + DBG_FAIL_MACRO; + goto fail; + } + c = entry.firstClusterLow; + c |= (uint32_t)entry.firstClusterHigh << 16; + } while (c != cluster); + // open parent + return open(&file, file.curPosition()/32 - 1, O_READ); + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Open a volume's root directory. + * + * \param[in] vol The FAT volume containing the root directory to be opened. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include the file is already open, the FAT volume has + * not been initialized or it a FAT12 volume. + */ +bool SdBaseFile::openRoot(SdVolume* vol) { + // error if file is already open + if (isOpen()) { + DBG_FAIL_MACRO; + goto fail; + } + m_vol = vol; + if (vol->fatType() == 16 || (FAT12_SUPPORT && vol->fatType() == 12)) { + m_type = FAT_FILE_TYPE_ROOT_FIXED; + m_firstCluster = 0; + m_fileSize = 32 * vol->rootDirEntryCount(); + } else if (vol->fatType() == 32) { + m_type = FAT_FILE_TYPE_ROOT32; + m_firstCluster = vol->rootDirStart(); + if (!setDirSize()) { + DBG_FAIL_MACRO; + goto fail; + } + } else { + // volume is not initialized, invalid, or FAT12 without support + DBG_FAIL_MACRO; + goto fail; + } + // read only + m_flags = O_READ; + + // set to start of file + m_curCluster = 0; + m_curPosition = 0; + + // root has no directory entry + m_dirBlock = 0; + m_dirIndex = 0; + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Return the next available byte without consuming it. + * + * \return The byte if no error and not at eof else -1; + */ +int SdBaseFile::peek() { + FatPos_t pos; + getpos(&pos); + int c = read(); + if (c >= 0) setpos(&pos); + return c; +} +//------------------------------------------------------------------------------ +/** Read the next byte from a file. + * + * \return For success read returns the next byte in the file as an int. + * If an error occurs or end of file is reached -1 is returned. + */ +int16_t SdBaseFile::read() { + uint8_t b; + return read(&b, 1) == 1 ? b : -1; +} +//------------------------------------------------------------------------------ +/** Read data from a file starting at the current position. + * + * \param[out] buf Pointer to the location that will receive the data. + * + * \param[in] nbyte Maximum number of bytes to read. + * + * \return For success read() returns the number of bytes read. + * A value less than \a nbyte, including zero, will be returned + * if end of file is reached. + * If an error occurs, read() returns -1. Possible errors include + * read() called before a file has been opened, corrupt file system + * or an I/O error occurred. + */ +int SdBaseFile::read(void* buf, size_t nbyte) { + uint8_t blockOfCluster; + uint8_t* dst = reinterpret_cast(buf); + uint16_t offset; + size_t toRead; + uint32_t block; // raw device block number + cache_t* pc; + + // error if not open or write only + if (!isOpen() || !(m_flags & O_READ)) { + DBG_FAIL_MACRO; + goto fail; + } + // max bytes left in file + if (nbyte >= (m_fileSize - m_curPosition)) { + nbyte = m_fileSize - m_curPosition; + } + // amount left to read + toRead = nbyte; + while (toRead > 0) { + size_t n; + offset = m_curPosition & 0X1FF; // offset in block + blockOfCluster = m_vol->blockOfCluster(m_curPosition); + if (m_type == FAT_FILE_TYPE_ROOT_FIXED) { + block = m_vol->rootDirStart() + (m_curPosition >> 9); + } else { + if (offset == 0 && blockOfCluster == 0) { + // start of new cluster + if (m_curPosition == 0) { + // use first cluster in file + m_curCluster = m_firstCluster; + } else { + // get next cluster from FAT + if (!m_vol->fatGet(m_curCluster, &m_curCluster)) { + DBG_FAIL_MACRO; + goto fail; + } + } + } + + block = m_vol->clusterStartBlock(m_curCluster) + blockOfCluster; + } + if (offset != 0 || toRead < 512 || block == m_vol->cacheBlockNumber()) { + // amount to be read from current block + n = 512 - offset; + if (n > toRead) n = toRead; + // read block to cache and copy data to caller + pc = m_vol->cacheFetch(block, SdVolume::CACHE_FOR_READ); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + uint8_t* src = pc->data + offset; + memcpy(dst, src, n); + } else if (!USE_MULTI_BLOCK_SD_IO || toRead < 1024) { + // read single block + n = 512; + if (!m_vol->readBlock(block, dst)) { + DBG_FAIL_MACRO; + goto fail; + } + } else { + uint8_t nb = toRead >> 9; + if (m_type != FAT_FILE_TYPE_ROOT_FIXED) { + uint8_t mb = m_vol->blocksPerCluster() - blockOfCluster; + if (mb < nb) nb = mb; + } + n = 512*nb; + if (m_vol->cacheBlockNumber() <= block + && block < (m_vol->cacheBlockNumber() + nb)) { + // flush cache if a block is in the cache + if (!m_vol->cacheSync()) { + DBG_FAIL_MACRO; + goto fail; + } + } + if (!m_vol->sdCard()->readStart(block)) { + DBG_FAIL_MACRO; + goto fail; + } + for (uint8_t b = 0; b < nb; b++) { + if (!m_vol->sdCard()->readData(dst + b*512)) { + DBG_FAIL_MACRO; + goto fail; + } + } + if (!m_vol->sdCard()->readStop()) { + DBG_FAIL_MACRO; + goto fail; + } + } + dst += n; + m_curPosition += n; + toRead -= n; + } + return nbyte; + + fail: + return -1; +} +//------------------------------------------------------------------------------ +/** Read the next directory entry from a directory file. + * + * \param[out] dir The dir_t struct that will receive the data. + * + * \return For success readDir() returns the number of bytes read. + * A value of zero will be returned if end of file is reached. + * If an error occurs, readDir() returns -1. Possible errors include + * readDir() called before a directory has been opened, this is not + * a directory file or an I/O error occurred. + */ +int8_t SdBaseFile::readDir(dir_t* dir) { + int16_t n; + // if not a directory file or miss-positioned return an error + if (!isDir() || (0X1F & m_curPosition)) return -1; + + while (1) { + n = read(dir, sizeof(dir_t)); + if (n != sizeof(dir_t)) return n == 0 ? 0 : -1; + // last entry if DIR_NAME_FREE + if (dir->name[0] == DIR_NAME_FREE) return 0; + // skip empty entries and entry for . and .. + if (dir->name[0] == DIR_NAME_DELETED || dir->name[0] == '.') continue; + // return if normal file or subdirectory + if (DIR_IS_FILE_OR_SUBDIR(dir)) return n; + } +} +//------------------------------------------------------------------------------ +// Read next directory entry into the cache +// Assumes file is correctly positioned +dir_t* SdBaseFile::readDirCache() { + uint8_t i; + // error if not directory + if (!isDir()) { + DBG_FAIL_MACRO; + goto fail; + } + // index of entry in cache + i = (m_curPosition >> 5) & 0XF; + + // use read to locate and cache block + if (read() < 0) { + DBG_FAIL_MACRO; + goto fail; + } + // advance to next entry + m_curPosition += 31; + + // return pointer to entry + return m_vol->cacheAddress()->dir + i; + + fail: + return 0; +} +//------------------------------------------------------------------------------ +/** Remove a file. + * + * The directory entry and all data for the file are deleted. + * + * \note This function should not be used to delete the 8.3 version of a + * file that has a long name. For example if a file has the long name + * "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT". + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include the file read-only, is a directory, + * or an I/O error occurred. + */ +bool SdBaseFile::remove() { + dir_t* d; + // free any clusters - will fail if read-only or directory + if (!truncate(0)) { + DBG_FAIL_MACRO; + goto fail; + } + // cache directory entry + d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) { + DBG_FAIL_MACRO; + goto fail; + } + // mark entry deleted + d->name[0] = DIR_NAME_DELETED; + + // set this file closed + m_type = FAT_FILE_TYPE_CLOSED; + + // write entry to SD + return m_vol->cacheSync(); + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Remove a file. + * + * The directory entry and all data for the file are deleted. + * + * \param[in] dirFile The directory that contains the file. + * \param[in] path Path for the file to be removed. + * + * \note This function should not be used to delete the 8.3 version of a + * file that has a long name. For example if a file has the long name + * "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT". + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include the file is a directory, is read only, + * \a dirFile is not a directory, \a path is not found + * or an I/O error occurred. + */ +bool SdBaseFile::remove(SdBaseFile* dirFile, const char* path) { + SdBaseFile file; + if (!file.open(dirFile, path, O_WRITE)) { + DBG_FAIL_MACRO; + goto fail; + } + return file.remove(); + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Rename a file or subdirectory. + * + * \param[in] dirFile Directory for the new path. + * \param[in] newPath New path name for the file/directory. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include \a dirFile is not open or is not a directory + * file, newPath is invalid or already exists, or an I/O error occurs. + */ +bool SdBaseFile::rename(SdBaseFile* dirFile, const char* newPath) { + dir_t entry; + uint32_t dirCluster = 0; + SdBaseFile file; + cache_t* pc; + dir_t* d; + + // must be an open file or subdirectory + if (!(isFile() || isSubDir())) { + DBG_FAIL_MACRO; + goto fail; + } + // can't move file + if (m_vol != dirFile->m_vol) { + DBG_FAIL_MACRO; + goto fail; + } + // sync() and cache directory entry + sync(); + d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) { + DBG_FAIL_MACRO; + goto fail; + } + // save directory entry + memcpy(&entry, d, sizeof(entry)); + + // mark entry deleted + d->name[0] = DIR_NAME_DELETED; + + // make directory entry for new path + if (isFile()) { + if (!file.open(dirFile, newPath, O_CREAT | O_EXCL | O_WRITE)) { + goto restore; + } + } else { + // don't create missing path prefix components + if (!file.mkdir(dirFile, newPath, false)) { + goto restore; + } + // save cluster containing new dot dot + dirCluster = file.m_firstCluster; + } + // change to new directory entry + m_dirBlock = file.m_dirBlock; + m_dirIndex = file.m_dirIndex; + + // mark closed to avoid possible destructor close call + file.m_type = FAT_FILE_TYPE_CLOSED; + + // cache new directory entry + d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) { + DBG_FAIL_MACRO; + goto fail; + } + // copy all but name field to new directory entry + memcpy(&d->attributes, &entry.attributes, sizeof(entry) - sizeof(d->name)); + + // update dot dot if directory + if (dirCluster) { + // get new dot dot + uint32_t block = m_vol->clusterStartBlock(dirCluster); + pc = m_vol->cacheFetch(block, SdVolume::CACHE_FOR_READ); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + memcpy(&entry, &pc->dir[1], sizeof(entry)); + + // free unused cluster + if (!m_vol->freeChain(dirCluster)) { + DBG_FAIL_MACRO; + goto fail; + } + // store new dot dot + block = m_vol->clusterStartBlock(m_firstCluster); + pc = m_vol->cacheFetch(block, SdVolume::CACHE_FOR_WRITE); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + memcpy(&pc->dir[1], &entry, sizeof(entry)); + } + return m_vol->cacheSync(); + + restore: + d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) { + DBG_FAIL_MACRO; + goto fail; + } + // restore entry + d->name[0] = entry.name[0]; + m_vol->cacheSync(); + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Remove a directory file. + * + * The directory file will be removed only if it is empty and is not the + * root directory. rmdir() follows DOS and Windows and ignores the + * read-only attribute for the directory. + * + * \note This function should not be used to delete the 8.3 version of a + * directory that has a long name. For example if a directory has the + * long name "New folder" you should not delete the 8.3 name "NEWFOL~1". + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include the file is not a directory, is the root + * directory, is not empty, or an I/O error occurred. + */ +bool SdBaseFile::rmdir() { + // must be open subdirectory + if (!isSubDir()) { + DBG_FAIL_MACRO; + goto fail; + } + rewind(); + + // make sure directory is empty + while (m_curPosition < m_fileSize) { + dir_t* p = readDirCache(); + if (!p) { + DBG_FAIL_MACRO; + goto fail; + } + // done if past last used entry + if (p->name[0] == DIR_NAME_FREE) break; + // skip empty slot, '.' or '..' + if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; + // error not empty + if (DIR_IS_FILE_OR_SUBDIR(p)) { + DBG_FAIL_MACRO; + goto fail; + } + } + // convert empty directory to normal file for remove + m_type = FAT_FILE_TYPE_NORMAL; + m_flags |= O_WRITE; + return remove(); + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Recursively delete a directory and all contained files. + * + * This is like the Unix/Linux 'rm -rf *' if called with the root directory + * hence the name. + * + * Warning - This will remove all contents of the directory including + * subdirectories. The directory will then be removed if it is not root. + * The read-only attribute for files will be ignored. + * + * \note This function should not be used to delete the 8.3 version of + * a directory that has a long name. See remove() and rmdir(). + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool SdBaseFile::rmRfStar() { + uint16_t index; + SdBaseFile f; + rewind(); + while (m_curPosition < m_fileSize) { + // remember position + index = m_curPosition/32; + + dir_t* p = readDirCache(); + if (!p) { + DBG_FAIL_MACRO; + goto fail; + } + // done if past last entry + if (p->name[0] == DIR_NAME_FREE) break; + + // skip empty slot or '.' or '..' + if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; + + // skip if part of long file name or volume label in root + if (!DIR_IS_FILE_OR_SUBDIR(p)) continue; + + if (!f.open(this, index, O_READ)) { + DBG_FAIL_MACRO; + goto fail; + } + if (f.isSubDir()) { + // recursively delete + if (!f.rmRfStar()) { + DBG_FAIL_MACRO; + goto fail; + } + } else { + // ignore read-only + f.m_flags |= O_WRITE; + if (!f.remove()) { + DBG_FAIL_MACRO; + goto fail; + } + } + // position to next entry if required + if (m_curPosition != (32UL*(index + 1))) { + if (!seekSet(32UL*(index + 1))) { + DBG_FAIL_MACRO; + goto fail; + } + } + } + // don't try to delete root + if (!isRoot()) { + if (!rmdir()) { + DBG_FAIL_MACRO; + goto fail; + } + } + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Create a file object and open it in the current working directory. + * + * \param[in] path A path with a valid 8.3 DOS name for a file to be opened. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of open flags. see SdBaseFile::open(SdBaseFile*, const char*, uint8_t). + */ +SdBaseFile::SdBaseFile(const char* path, uint8_t oflag) { + m_type = FAT_FILE_TYPE_CLOSED; + writeError = false; + open(path, oflag); +} +//------------------------------------------------------------------------------ +/** Sets a file's position. + * + * \param[in] pos The new position in bytes from the beginning of the file. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool SdBaseFile::seekSet(uint32_t pos) { + uint32_t nCur; + uint32_t nNew; + // error if file not open or seek past end of file + if (!isOpen() || pos > m_fileSize) { + DBG_FAIL_MACRO; + goto fail; + } + if (m_type == FAT_FILE_TYPE_ROOT_FIXED) { + m_curPosition = pos; + goto done; + } + if (pos == 0) { + // set position to start of file + m_curCluster = 0; + m_curPosition = 0; + goto done; + } + // calculate cluster index for cur and new position + nCur = (m_curPosition - 1) >> (m_vol->clusterSizeShift() + 9); + nNew = (pos - 1) >> (m_vol->clusterSizeShift() + 9); + + if (nNew < nCur || m_curPosition == 0) { + // must follow chain from first cluster + m_curCluster = m_firstCluster; + } else { + // advance from curPosition + nNew -= nCur; + } + while (nNew--) { + if (!m_vol->fatGet(m_curCluster, &m_curCluster)) { + DBG_FAIL_MACRO; + goto fail; + } + } + m_curPosition = pos; + + done: + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +// set m_fileSize for a directory +bool SdBaseFile::setDirSize() { + uint16_t s = 0; + uint32_t cluster = m_firstCluster; + do { + if (!m_vol->fatGet(cluster, &cluster)) { + DBG_FAIL_MACRO; + goto fail; + } + s += m_vol->blocksPerCluster(); + // max size if a directory file is 4096 blocks + if (s >= 4096) { + DBG_FAIL_MACRO; + goto fail; + } + } while (!m_vol->isEOC(cluster)); + m_fileSize = 512L*s; + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +void SdBaseFile::setpos(FatPos_t* pos) { + m_curPosition = pos->position; + m_curCluster = pos->cluster; +} +//------------------------------------------------------------------------------ +/** The sync() call causes all modified data and directory fields + * to be written to the storage device. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include a call to sync() before a file has been + * opened or an I/O error. + */ +bool SdBaseFile::sync() { + // only allow open files and directories + if (!isOpen()) { + DBG_FAIL_MACRO; + goto fail; + } + if (m_flags & F_FILE_DIR_DIRTY) { + dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + // check for deleted by another open file object + if (!d || d->name[0] == DIR_NAME_DELETED) { + DBG_FAIL_MACRO; + goto fail; + } + // do not set filesize for dir files + if (!isDir()) d->fileSize = m_fileSize; + + // update first cluster fields + d->firstClusterLow = m_firstCluster & 0XFFFF; + d->firstClusterHigh = m_firstCluster >> 16; + + // set modify time if user supplied a callback date/time function + if (m_dateTime) { + m_dateTime(&d->lastWriteDate, &d->lastWriteTime); + d->lastAccessDate = d->lastWriteDate; + } + // clear directory dirty + m_flags &= ~F_FILE_DIR_DIRTY; + } + return m_vol->cacheSync(); + + fail: + writeError = true; + return false; +} +//------------------------------------------------------------------------------ +/** Copy a file's timestamps + * + * \param[in] file File to copy timestamps from. + * + * \note + * Modify and access timestamps may be overwritten if a date time callback + * function has been set by dateTimeCallback(). + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool SdBaseFile::timestamp(SdBaseFile* file) { + dir_t* d; + dir_t dir; + + // get timestamps + if (!file->dirEntry(&dir)) { + DBG_FAIL_MACRO; + goto fail; + } + // update directory fields + if (!sync()) { + DBG_FAIL_MACRO; + goto fail; + } + d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) { + DBG_FAIL_MACRO; + goto fail; + } + // copy timestamps + d->lastAccessDate = dir.lastAccessDate; + d->creationDate = dir.creationDate; + d->creationTime = dir.creationTime; + d->creationTimeTenths = dir.creationTimeTenths; + d->lastWriteDate = dir.lastWriteDate; + d->lastWriteTime = dir.lastWriteTime; + + // write back entry + return m_vol->cacheSync(); + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Set a file's timestamps in its directory entry. + * + * \param[in] flags Values for \a flags are constructed by a bitwise-inclusive + * OR of flags from the following list + * + * T_ACCESS - Set the file's last access date. + * + * T_CREATE - Set the file's creation date and time. + * + * T_WRITE - Set the file's last write/modification date and time. + * + * \param[in] year Valid range 1980 - 2107 inclusive. + * + * \param[in] month Valid range 1 - 12 inclusive. + * + * \param[in] day Valid range 1 - 31 inclusive. + * + * \param[in] hour Valid range 0 - 23 inclusive. + * + * \param[in] minute Valid range 0 - 59 inclusive. + * + * \param[in] second Valid range 0 - 59 inclusive + * + * \note It is possible to set an invalid date since there is no check for + * the number of days in a month. + * + * \note + * Modify and access timestamps may be overwritten if a date time callback + * function has been set by dateTimeCallback(). + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool SdBaseFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, + uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { + uint16_t dirDate; + uint16_t dirTime; + dir_t* d; + + if (!isOpen() + || year < 1980 + || year > 2107 + || month < 1 + || month > 12 + || day < 1 + || day > 31 + || hour > 23 + || minute > 59 + || second > 59) { + DBG_FAIL_MACRO; + goto fail; + } + // update directory entry + if (!sync()) { + DBG_FAIL_MACRO; + goto fail; + } + d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) { + DBG_FAIL_MACRO; + goto fail; + } + dirDate = FAT_DATE(year, month, day); + dirTime = FAT_TIME(hour, minute, second); + if (flags & T_ACCESS) { + d->lastAccessDate = dirDate; + } + if (flags & T_CREATE) { + d->creationDate = dirDate; + d->creationTime = dirTime; + // seems to be units of 1/100 second not 1/10 as Microsoft states + d->creationTimeTenths = second & 1 ? 100 : 0; + } + if (flags & T_WRITE) { + d->lastWriteDate = dirDate; + d->lastWriteTime = dirTime; + } + return m_vol->cacheSync(); + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Truncate a file to a specified length. The current file position + * will be maintained if it is less than or equal to \a length otherwise + * it will be set to end of file. + * + * \param[in] length The desired length for the file. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include file is read only, file is a directory, + * \a length is greater than the current file size or an I/O error occurs. + */ +bool SdBaseFile::truncate(uint32_t length) { + uint32_t newPos; + // error if not a normal file or read-only + if (!isFile() || !(m_flags & O_WRITE)) { + DBG_FAIL_MACRO; + goto fail; + } + // error if length is greater than current size + if (length > m_fileSize) { + DBG_FAIL_MACRO; + goto fail; + } + // fileSize and length are zero - nothing to do + if (m_fileSize == 0) return true; + + // remember position for seek after truncation + newPos = m_curPosition > length ? length : m_curPosition; + + // position to last cluster in truncated file + if (!seekSet(length)) { + DBG_FAIL_MACRO; + goto fail; + } + if (length == 0) { + // free all clusters + if (!m_vol->freeChain(m_firstCluster)) { + DBG_FAIL_MACRO; + goto fail; + } + m_firstCluster = 0; + } else { + uint32_t toFree; + if (!m_vol->fatGet(m_curCluster, &toFree)) { + DBG_FAIL_MACRO; + goto fail; + } + if (!m_vol->isEOC(toFree)) { + // free extra clusters + if (!m_vol->freeChain(toFree)) { + DBG_FAIL_MACRO; + goto fail; + } + // current cluster is end of chain + if (!m_vol->fatPutEOC(m_curCluster)) { + DBG_FAIL_MACRO; + goto fail; + } + } + } + m_fileSize = length; + + // need to update directory entry + m_flags |= F_FILE_DIR_DIRTY; + + if (!sync()) { + DBG_FAIL_MACRO; + goto fail; + } + // set file to correct position + return seekSet(newPos); + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Write data to an open file. + * + * \note Data is moved to the cache but may not be written to the + * storage device until sync() is called. + * + * \param[in] buf Pointer to the location of the data to be written. + * + * \param[in] nbyte Number of bytes to write. + * + * \return For success write() returns the number of bytes written, always + * \a nbyte. If an error occurs, write() returns -1. Possible errors + * include write() is called before a file has been opened, write is called + * for a read-only file, device is full, a corrupt file system or an I/O error. + * + */ +int SdBaseFile::write(const void* buf, size_t nbyte) { + // convert void* to uint8_t* - must be before goto statements + const uint8_t* src = reinterpret_cast(buf); + cache_t* pc; + uint8_t cacheOption; + // number of bytes left to write - must be before goto statements + size_t nToWrite = nbyte; + size_t n; + // error if not a normal file or is read-only + if (!isFile() || !(m_flags & O_WRITE)) { + DBG_FAIL_MACRO; + goto fail; + } + // seek to end of file if append flag + if ((m_flags & O_APPEND) && m_curPosition != m_fileSize) { + if (!seekEnd()) { + DBG_FAIL_MACRO; + goto fail; + } + } + // Don't exceed max fileSize. + if (nbyte > (0XFFFFFFFF - m_curPosition)) { + DBG_FAIL_MACRO; + goto fail; + } + while (nToWrite) { + uint8_t blockOfCluster = m_vol->blockOfCluster(m_curPosition); + uint16_t blockOffset = m_curPosition & 0X1FF; + if (blockOfCluster == 0 && blockOffset == 0) { + // start of new cluster + if (m_curCluster != 0) { + uint32_t next; + if (!m_vol->fatGet(m_curCluster, &next)) { + DBG_FAIL_MACRO; + goto fail; + } + if (m_vol->isEOC(next)) { + // add cluster if at end of chain + if (!addCluster()) { + DBG_FAIL_MACRO; + goto fail; + } + } else { + m_curCluster = next; + } + } else { + if (m_firstCluster == 0) { + // allocate first cluster of file + if (!addCluster()) { + DBG_FAIL_MACRO; + goto fail; + } + } else { + m_curCluster = m_firstCluster; + } + } + } + // block for data write + uint32_t block = m_vol->clusterStartBlock(m_curCluster) + blockOfCluster; + + if (blockOffset != 0 || nToWrite < 512) { + // partial block - must use cache + if (blockOffset == 0 && m_curPosition >= m_fileSize) { + // start of new block don't need to read into cache + cacheOption = SdVolume::CACHE_RESERVE_FOR_WRITE; + } else { + // rewrite part of block + cacheOption = SdVolume::CACHE_FOR_WRITE; + } + pc = m_vol->cacheFetch(block, cacheOption); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + + // max space in block + uint16_t space = 512 - blockOffset; + + // lesser of space and amount to write + n = space < nToWrite ? space : nToWrite; + + uint8_t* dst = pc->data + blockOffset; + memcpy(dst, src, n); + + // flush cache if all space used. + if (n == space) { + if (!m_vol->cacheWriteData()) { + DBG_FAIL_MACRO; + goto fail; + } + } + + } else if (!USE_MULTI_BLOCK_SD_IO || nToWrite < 1024) { + // use single block write command + n = 512; + if (m_vol->cacheBlockNumber() == block) { + m_vol->cacheInvalidate(); + } + if (!m_vol->writeBlock(block, src)) { + DBG_FAIL_MACRO; + goto fail; + } + } else { + // use multiple block write command + uint8_t maxBlocks = m_vol->blocksPerCluster() - blockOfCluster; + uint8_t nBlock = nToWrite >> 9; + if (nBlock > maxBlocks) nBlock = maxBlocks; + + n = 512*nBlock; + if (!m_vol->sdCard()->writeStart(block, nBlock)) { + DBG_FAIL_MACRO; + goto fail; + } + for (uint8_t b = 0; b < nBlock; b++) { + // invalidate cache if block is in cache + if ((block + b) == m_vol->cacheBlockNumber()) { + m_vol->cacheInvalidate(); + } + if (!m_vol->sdCard()->writeData(src + 512*b)) { + DBG_FAIL_MACRO; + goto fail; + } + } + if (!m_vol->sdCard()->writeStop()) { + DBG_FAIL_MACRO; + goto fail; + } + } + m_curPosition += n; + src += n; + nToWrite -= n; + } + if (m_curPosition > m_fileSize) { + // update fileSize and insure sync will update dir entry + m_fileSize = m_curPosition; + m_flags |= F_FILE_DIR_DIRTY; + } else if (m_dateTime && nbyte) { + // insure sync will update modified date and time + m_flags |= F_FILE_DIR_DIRTY; + } + + if (m_flags & O_SYNC) { + if (!sync()) { + DBG_FAIL_MACRO; + goto fail; + } + } + return nbyte; + + fail: + // return for write error + writeError = true; + return -1; +} diff --git a/SdFat/SdBaseFile.h b/SdFat/SdBaseFile.h new file mode 100644 index 0000000..da2b9d5 --- /dev/null +++ b/SdFat/SdBaseFile.h @@ -0,0 +1,288 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef SdBaseFile_h +#define SdBaseFile_h +/** + * \file + * \brief SdBaseFile class + */ +#ifdef __AVR__ +#include +#else // __AVR__ +#ifndef PGM_P +/** pointer to flash for ARM */ +#define PGM_P const char* +#endif // PGM_P +#ifndef PSTR +/** store literal string in flash for ARM */ +#define PSTR(x) (x) +#endif // PSTR +#ifndef pgm_read_byte +/** read 8-bits from flash for ARM */ +#define pgm_read_byte(addr) (*(const unsigned char*)(addr)) +#endif // pgm_read_byte +#ifndef pgm_read_word +/** read 16-bits from flash for ARM */ +#define pgm_read_word(addr) (*(const uint16_t*)(addr)) +#endif // pgm_read_word +#ifndef PROGMEM +/** store in flash for ARM */ +#define PROGMEM const +#endif // PROGMEM +#endif // __AVR__ +#include +#include +#include +#include +//------------------------------------------------------------------------------ +/** + * \struct FatPos_t + * \brief internal type for istream + * do not use in user apps + */ +struct FatPos_t { + /** stream position */ + uint32_t position; + /** cluster for position */ + uint32_t cluster; + FatPos_t() : position(0), cluster(0) {} +}; + +// values for m_type +/** This file has not been opened. */ +uint8_t const FAT_FILE_TYPE_CLOSED = 0; +/** A normal file */ +uint8_t const FAT_FILE_TYPE_NORMAL = 1; +/** A FAT12 or FAT16 root directory */ +uint8_t const FAT_FILE_TYPE_ROOT_FIXED = 2; +/** A FAT32 root directory */ +uint8_t const FAT_FILE_TYPE_ROOT32 = 3; +/** A subdirectory file*/ +uint8_t const FAT_FILE_TYPE_SUBDIR = 4; +/** Test value for directory type */ +uint8_t const FAT_FILE_TYPE_MIN_DIR = FAT_FILE_TYPE_ROOT_FIXED; + +//------------------------------------------------------------------------------ +/** + * \class SdBaseFile + * \brief Base class for SdFile with Print and C++ streams. + */ +class SdBaseFile { + public: + /** Create an instance. */ + SdBaseFile() : writeError(false), m_type(FAT_FILE_TYPE_CLOSED) {} + SdBaseFile(const char* path, uint8_t oflag); +#if DESTRUCTOR_CLOSES_FILE + ~SdBaseFile() {if(isOpen()) close();} +#endif // DESTRUCTOR_CLOSES_FILE + /** + * writeError is set to true if an error occurs during a write(). + * Set writeError to false before calling print() and/or write() and check + * for true after calls to print() and/or write(). + */ + bool writeError; + /** \return value of writeError */ + bool getWriteError() {return writeError;} + /** Set writeError to zero */ + void clearWriteError() {writeError = 0;} + //---------------------------------------------------------------------------- + // helpers for stream classes + /** get position for streams + * \param[out] pos struct to receive position + */ + void getpos(FatPos_t* pos); + /** set position for streams + * \param[out] pos struct with value for new position + */ + void setpos(FatPos_t* pos); + //---------------------------------------------------------------------------- + /** \return number of bytes available from yhe current position to EOF */ + uint32_t available() {return fileSize() - curPosition();} + bool close(); + bool contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock); + bool createContiguous(SdBaseFile* dirFile, + const char* path, uint32_t size); + /** \return The current cluster number for a file or directory. */ + uint32_t curCluster() const {return m_curCluster;} + /** \return The current position for a file or directory. */ + uint32_t curPosition() const {return m_curPosition;} + /** \return Current working directory */ + static SdBaseFile* cwd() {return m_cwd;} + /** Set the date/time callback function + * + * \param[in] dateTime The user's call back function. The callback + * function is of the form: + * + * \code + * void dateTime(uint16_t* date, uint16_t* time) { + * uint16_t year; + * uint8_t month, day, hour, minute, second; + * + * // User gets date and time from GPS or real-time clock here + * + * // return date using FAT_DATE macro to format fields + * *date = FAT_DATE(year, month, day); + * + * // return time using FAT_TIME macro to format fields + * *time = FAT_TIME(hour, minute, second); + * } + * \endcode + * + * Sets the function that is called when a file is created or when + * a file's directory entry is modified by sync(). All timestamps, + * access, creation, and modify, are set when a file is created. + * sync() maintains the last access date and last modify date/time. + * + * See the timestamp() function. + */ + static void dateTimeCallback( + void (*dateTime)(uint16_t* date, uint16_t* time)) { + m_dateTime = dateTime; + } + /** Cancel the date/time callback function. */ + static void dateTimeCallbackCancel() {m_dateTime = 0;} + bool dirEntry(dir_t* dir); + static void dirName(const dir_t& dir, char* name); + bool exists(const char* name); + int16_t fgets(char* str, int16_t num, char* delim = 0); + /** \return The total number of bytes in a file or directory. */ + uint32_t fileSize() const {return m_fileSize;} + /** \return The first cluster number for a file or directory. */ + uint32_t firstCluster() const {return m_firstCluster;} + bool getFilename(char* name); + /** \return True if this is a directory else false. */ + bool isDir() const {return m_type >= FAT_FILE_TYPE_MIN_DIR;} + /** \return True if this is a normal file else false. */ + bool isFile() const {return m_type == FAT_FILE_TYPE_NORMAL;} + /** \return True if this is an open file/directory else false. */ + bool isOpen() const {return m_type != FAT_FILE_TYPE_CLOSED;} + /** \return True if this is a subdirectory else false. */ + bool isSubDir() const {return m_type == FAT_FILE_TYPE_SUBDIR;} + /** \return True if this is the root directory. */ + bool isRoot() const { + return m_type == FAT_FILE_TYPE_ROOT_FIXED || m_type == FAT_FILE_TYPE_ROOT32; + } + void ls(Print* pr, uint8_t flags = 0, uint8_t indent = 0); + void ls(uint8_t flags = 0); + bool mkdir(SdBaseFile* dir, const char* path, bool pFlag = true); + // alias for backward compactability + bool makeDir(SdBaseFile* dir, const char* path) { + return mkdir(dir, path, false); + } + bool open(SdBaseFile* dirFile, uint16_t index, uint8_t oflag); + bool open(SdBaseFile* dirFile, const char* path, uint8_t oflag); + bool open(const char* path, uint8_t oflag = O_READ); + bool openNext(SdBaseFile* dirFile, uint8_t oflag); + bool openRoot(SdVolume* vol); + int peek(); + bool printCreateDateTime(Print* pr); + static void printFatDate(uint16_t fatDate); + static void printFatDate(Print* pr, uint16_t fatDate); + static void printFatTime(uint16_t fatTime); + static void printFatTime(Print* pr, uint16_t fatTime); + int printField(int16_t value, char term); + int printField(uint16_t value, char term); + int printField(int32_t value, char term); + int printField(uint32_t value, char term); + bool printModifyDateTime(Print* pr); + size_t printName(); + size_t printName(Print* pr); + size_t printFileSize(Print* pr); + int16_t read(); + int read(void* buf, size_t nbyte); + int8_t readDir(dir_t* dir); + static bool remove(SdBaseFile* dirFile, const char* path); + bool remove(); + /** Set the file's current position to zero. */ + void rewind() {seekSet(0);} + bool rename(SdBaseFile* dirFile, const char* newPath); + bool rmdir(); + // for backward compatibility + bool rmDir() {return rmdir();} + bool rmRfStar(); + /** Set the files position to current position + \a pos. See seekSet(). + * \param[in] offset The new position in bytes from the current position. + * \return true for success or false for failure. + */ + bool seekCur(int32_t offset) { + return seekSet(m_curPosition + offset); + } + /** Set the files position to end-of-file + \a offset. See seekSet(). + * \param[in] offset The new position in bytes from end-of-file. + * \return true for success or false for failure. + */ + bool seekEnd(int32_t offset = 0) {return seekSet(m_fileSize + offset);} + bool seekSet(uint32_t pos); + bool sync(); + bool timestamp(SdBaseFile* file); + bool timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, + uint8_t hour, uint8_t minute, uint8_t second); + /** Type of file. You should use isFile() or isDir() instead of type() + * if possible. + * + * \return The file or directory type. + */ + uint8_t type() const {return m_type;} + bool truncate(uint32_t size); + /** \return SdVolume that contains this file. */ + SdVolume* volume() const {return m_vol;} + int write(const void* buf, size_t nbyte); +//------------------------------------------------------------------------------ + private: + // allow SdFat to set m_cwd + friend class SdFat; + /** experimental don't use */ + bool openParent(SdBaseFile* dir); + + // private functions + bool addCluster(); + cache_t* addDirCluster(); + dir_t* cacheDirEntry(uint8_t action); + int8_t lsPrintNext(Print *pr, uint8_t flags, uint8_t indent); + static bool make83Name(const char* str, uint8_t* name, const char** ptr); + bool mkdir(SdBaseFile* parent, const uint8_t dname[11]); + bool open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag); + bool openCachedEntry(uint8_t cacheIndex, uint8_t oflags); + dir_t* readDirCache(); + static void setCwd(SdBaseFile* cwd) {m_cwd = cwd;} + bool setDirSize(); + + // bits defined in m_flags + // should be 0X0F + static uint8_t const F_OFLAG = (O_ACCMODE | O_APPEND | O_SYNC); + // sync of directory entry required + static uint8_t const F_FILE_DIR_DIRTY = 0X80; + + // global pointer to cwd dir + static SdBaseFile* m_cwd; + // data time callback function + static void (*m_dateTime)(uint16_t* date, uint16_t* time); + // private data + uint8_t m_flags; // See above for definition of m_flags bits + uint8_t m_type; // type of file see above for values + uint8_t m_dirIndex; // index of directory entry in dirBlock + SdVolume* m_vol; // volume where file is located + uint32_t m_curCluster; // cluster for current file position + uint32_t m_curPosition; // current file position in bytes from beginning + uint32_t m_dirBlock; // block for this files directory entry + uint32_t m_fileSize; // file size in bytes + uint32_t m_firstCluster; // first cluster of file +}; +#endif // SdBaseFile_h diff --git a/SdFat/SdBaseFilePrint.cpp b/SdFat/SdBaseFilePrint.cpp new file mode 100644 index 0000000..e48b3eb --- /dev/null +++ b/SdFat/SdBaseFilePrint.cpp @@ -0,0 +1,322 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#include +#include +//------------------------------------------------------------------------------ +/** List directory contents to stdOut. + * + * \param[in] flags The inclusive OR of + * + * LS_DATE - %Print file modification date + * + * LS_SIZE - %Print file size. + * + * LS_R - Recursive list of subdirectories. + */ +void SdBaseFile::ls(uint8_t flags) { + ls(SdFat::stdOut(), flags, 0); +} +//------------------------------------------------------------------------------ +/** List directory contents. + * + * \param[in] pr Print stream for list. + * + * \param[in] flags The inclusive OR of + * + * LS_DATE - %Print file modification date + * + * LS_SIZE - %Print file size. + * + * LS_R - Recursive list of subdirectories. + * + * \param[in] indent Amount of space before file name. Used for recursive + * list to indicate subdirectory level. + */ +//------------------------------------------------------------------------------ +void SdBaseFile::ls(Print* pr, uint8_t flags, uint8_t indent) { + if (!isDir()) { + pr->println(F("bad dir")); + return; + } + rewind(); + int8_t status; + while ((status = lsPrintNext(pr, flags, indent))) { + if (status > 1 && (flags & LS_R)) { + uint16_t index = curPosition()/32 - 1; + SdBaseFile s; + if (s.open(this, index, O_READ)) s.ls(pr, flags, indent + 2); + seekSet(32 * (index + 1)); + } + } +} +//------------------------------------------------------------------------------ +// saves 32 bytes on stack for ls recursion +// return 0 - EOF, 1 - normal file, or 2 - directory +int8_t SdBaseFile::lsPrintNext(Print *pr, uint8_t flags, uint8_t indent) { + dir_t dir; + uint8_t w = 0; + + while (1) { + if (read(&dir, sizeof(dir)) != sizeof(dir)) return 0; + if (dir.name[0] == DIR_NAME_FREE) return 0; + + // skip deleted entry and entries for . and .. + if (dir.name[0] != DIR_NAME_DELETED && dir.name[0] != '.' + && DIR_IS_FILE_OR_SUBDIR(&dir)) break; + } + // indent for dir level + for (uint8_t i = 0; i < indent; i++) pr->write(' '); + + // print name + for (uint8_t i = 0; i < 11; i++) { + if (dir.name[i] == ' ')continue; + if (i == 8) { + pr->write('.'); + w++; + } + pr->write(dir.name[i]); + w++; + } + if (DIR_IS_SUBDIR(&dir)) { + pr->write('/'); + w++; + } + if (flags & (LS_DATE | LS_SIZE)) { + while (w++ < 14) pr->write(' '); + } + // print modify date/time if requested + if (flags & LS_DATE) { + pr->write(' '); + printFatDate(pr, dir.lastWriteDate); + pr->write(' '); + printFatTime(pr, dir.lastWriteTime); + } + // print size if requested + if (!DIR_IS_SUBDIR(&dir) && (flags & LS_SIZE)) { + pr->write(' '); + pr->print(dir.fileSize); + } + pr->println(); + return DIR_IS_FILE(&dir) ? 1 : 2; +} +//------------------------------------------------------------------------------ +// print uint8_t with width 2 +static void print2u(Print* pr, uint8_t v) { + if (v < 10) pr->write('0'); + pr->print(v, DEC); +} +//------------------------------------------------------------------------------ +/** Print a file's creation date and time + * + * \param[in] pr Print stream for output. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool SdBaseFile::printCreateDateTime(Print* pr) { + dir_t dir; + if (!dirEntry(&dir)) { + DBG_FAIL_MACRO; + goto fail; + } + printFatDate(pr, dir.creationDate); + pr->write(' '); + printFatTime(pr, dir.creationTime); + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** %Print a directory date field to stdOut. + * + * Format is yyyy-mm-dd. + * + * \param[in] fatDate The date field from a directory entry. + */ +void SdBaseFile::printFatDate(uint16_t fatDate) { + printFatDate(SdFat::stdOut(), fatDate); +} +//------------------------------------------------------------------------------ +/** %Print a directory date field. + * + * Format is yyyy-mm-dd. + * + * \param[in] pr Print stream for output. + * \param[in] fatDate The date field from a directory entry. + */ +void SdBaseFile::printFatDate(Print* pr, uint16_t fatDate) { + pr->print(FAT_YEAR(fatDate)); + pr->write('-'); + print2u(pr, FAT_MONTH(fatDate)); + pr->write('-'); + print2u(pr, FAT_DAY(fatDate)); +} +//------------------------------------------------------------------------------ +/** %Print a directory time field to stdOut. + * + * Format is hh:mm:ss. + * + * \param[in] fatTime The time field from a directory entry. + */ +void SdBaseFile::printFatTime(uint16_t fatTime) { + printFatTime(SdFat::stdOut(), fatTime); +} +//------------------------------------------------------------------------------ +/** %Print a directory time field. + * + * Format is hh:mm:ss. + * + * \param[in] pr Print stream for output. + * \param[in] fatTime The time field from a directory entry. + */ +void SdBaseFile::printFatTime(Print* pr, uint16_t fatTime) { + print2u(pr, FAT_HOUR(fatTime)); + pr->write(':'); + print2u(pr, FAT_MINUTE(fatTime)); + pr->write(':'); + print2u(pr, FAT_SECOND(fatTime)); +} +//------------------------------------------------------------------------------ +/** Template for SdBaseFile::printField() */ +template +static int printFieldT(SdBaseFile* file, char sign, Type value, char term) { + char buf[3*sizeof(Type) + 3]; + char* str = &buf[sizeof(buf)]; + + if (term) { + *--str = term; + if (term == '\n') { + *--str = '\r'; + } + } + do { + Type m = value; + value /= 10; + *--str = '0' + m - 10*value; + } while (value); + if (sign) { + *--str = sign; + } + return file->write(str, &buf[sizeof(buf)] - str); +} +//------------------------------------------------------------------------------ +/** Print a number followed by a field terminator. + * \param[in] value The number to be printed. + * \param[in] term The field terminator. Use '\\n' for CR LF. + * \return The number of bytes written or -1 if an error occurs. + */ +int SdBaseFile::printField(uint16_t value, char term) { + return printFieldT(this, 0, value, term); +} +//------------------------------------------------------------------------------ +/** Print a number followed by a field terminator. + * \param[in] value The number to be printed. + * \param[in] term The field terminator. Use '\\n' for CR LF. + * \return The number of bytes written or -1 if an error occurs. + */ +int SdBaseFile::printField(int16_t value, char term) { + char sign = 0; + if (value < 0) { + sign = '-'; + value = -value; + } + return printFieldT(this, sign, (uint16_t)value, term); +} +//------------------------------------------------------------------------------ +/** Print a number followed by a field terminator. + * \param[in] value The number to be printed. + * \param[in] term The field terminator. Use '\\n' for CR LF. + * \return The number of bytes written or -1 if an error occurs. + */ +int SdBaseFile::printField(uint32_t value, char term) { + return printFieldT(this, 0, value, term); +} +//------------------------------------------------------------------------------ +/** Print a number followed by a field terminator. + * \param[in] value The number to be printed. + * \param[in] term The field terminator. Use '\\n' for CR LF. + * \return The number of bytes written or -1 if an error occurs. + */ +int SdBaseFile::printField(int32_t value, char term) { + char sign = 0; + if (value < 0) { + sign = '-'; + value = -value; + } + return printFieldT(this, sign, (uint32_t)value, term); +} +//------------------------------------------------------------------------------ +/** Print a file's modify date and time + * + * \param[in] pr Print stream for output. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool SdBaseFile::printModifyDateTime(Print* pr) { + dir_t dir; + if (!dirEntry(&dir)) { + DBG_FAIL_MACRO; + goto fail; + } + printFatDate(pr, dir.lastWriteDate); + pr->write(' '); + printFatTime(pr, dir.lastWriteTime); + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Print a file's name + * + * \param[in] pr Print stream for output. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +size_t SdBaseFile::printName(Print* pr) { + char name[13]; + if (!getFilename(name)) { + DBG_FAIL_MACRO; + goto fail; + } + return pr->print(name); + + fail: + return 0; +} +//------------------------------------------------------------------------------ +/** Print a file's name to stdOut + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +size_t SdBaseFile::printName() { + return printName(SdFat::stdOut()); +} +//------------------------------------------------------------------------------ +size_t SdBaseFile::printFileSize(Print* pr) { + char buf[10]; + char *ptr = fmtDec(fileSize(), buf + sizeof(buf)); + while (ptr > buf) *--ptr = ' '; + return pr->write(reinterpret_cast(buf), sizeof(buf)); +} diff --git a/SdFat/SdFat.cpp b/SdFat/SdFat.cpp new file mode 100644 index 0000000..b2dacfe --- /dev/null +++ b/SdFat/SdFat.cpp @@ -0,0 +1,247 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#include +//------------------------------------------------------------------------------ +#if USE_SERIAL_FOR_STD_OUT || !defined(UDR0) +Print* SdFat::m_stdOut = &Serial; +#else // USE_SERIAL_FOR_STD_OUT +#include +Print* SdFat::m_stdOut = &MiniSerial; +#endif // USE_SERIAL_FOR_STD_OUT +//------------------------------------------------------------------------------ +/** + * Initialize an SdFat object. + * + * Initializes the SD card, SD volume, and root directory. + * + * \param[in] chipSelectPin SD chip select pin. See Sd2Card::init(). + * \param[in] sckDivisor value for SPI SCK divisor. See Sd2Card::init(). + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool SdFat::begin(uint8_t chipSelectPin, uint8_t sckDivisor) { + return m_card.begin(chipSelectPin, sckDivisor) + && m_vol.init(&m_card) && chdir(1); +} +//------------------------------------------------------------------------------ +/** Change a volume's working directory to root + * + * Changes the volume's working directory to the SD's root directory. + * Optionally set the current working directory to the volume's + * working directory. + * + * \param[in] set_cwd Set the current working directory to this volume's + * working directory if true. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool SdFat::chdir(bool set_cwd) { + if (set_cwd) SdBaseFile::setCwd(&m_vwd); + if (m_vwd.isOpen()) m_vwd.close(); + return m_vwd.openRoot(&m_vol); +} +//------------------------------------------------------------------------------ +/** Change a volume's working directory + * + * Changes the volume working directory to the \a path subdirectory. + * Optionally set the current working directory to the volume's + * working directory. + * + * Example: If the volume's working directory is "/DIR", chdir("SUB") + * will change the volume's working directory from "/DIR" to "/DIR/SUB". + * + * If path is "/", the volume's working directory will be changed to the + * root directory + * + * \param[in] path The name of the subdirectory. + * + * \param[in] set_cwd Set the current working directory to this volume's + * working directory if true. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool SdFat::chdir(const char *path, bool set_cwd) { + SdBaseFile dir; + dir.open(&m_vwd, path, O_READ); + // Check for correctly open directory. + if (!dir.isDir()) goto fail; + m_vwd = dir; + if (set_cwd) SdBaseFile::setCwd(&m_vwd); + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Set the current working directory to a volume's working directory. + * + * This is useful with multiple SD cards. + * + * The current working directory is changed to this volume's working directory. + * + * This is like the Windows/DOS \: command. + */ +void SdFat::chvol() { + SdBaseFile::setCwd(&m_vwd); +} +//------------------------------------------------------------------------------ +/** + * Test for the existence of a file. + * + * \param[in] name Name of the file to be tested for. + * + * \return true if the file exists else false. + */ +bool SdFat::exists(const char* name) { + return m_vwd.exists(name); +} +//------------------------------------------------------------------------------ +/** List the directory contents of the volume working directory to stdOut. + * + * \param[in] flags The inclusive OR of + * + * LS_DATE - %Print file modification date + * + * LS_SIZE - %Print file size. + * + * LS_R - Recursive list of subdirectories. + */ +void SdFat::ls(uint8_t flags) { + m_vwd.ls(m_stdOut, flags); +} +//------------------------------------------------------------------------------ +/** List the directory contents of the volume working directory to stdOut. + * + * \param[in] path directory to list. + * + * \param[in] flags The inclusive OR of + * + * LS_DATE - %Print file modification date + * + * LS_SIZE - %Print file size. + * + * LS_R - Recursive list of subdirectories. + */ +void SdFat::ls(const char* path, uint8_t flags) { + ls(m_stdOut, path, flags); +} +//------------------------------------------------------------------------------ +/** List the directory contents of the volume working directory. + * + * \param[in] pr Print stream for list. + * + * \param[in] flags The inclusive OR of + * + * LS_DATE - %Print file modification date + * + * LS_SIZE - %Print file size. + * + * LS_R - Recursive list of subdirectories. + */ +void SdFat::ls(Print* pr, uint8_t flags) { + m_vwd.ls(pr, flags); +} +//------------------------------------------------------------------------------ +void SdFat::ls(Print* pr, const char* path, uint8_t flags) { + SdBaseFile dir(path, O_READ); + dir.ls(pr, flags); +} +//------------------------------------------------------------------------------ +/** Make a subdirectory in the volume working directory. + * + * \param[in] path A path with a valid 8.3 DOS name for the subdirectory. + * + * \param[in] pFlag Create missing parent directories if true. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool SdFat::mkdir(const char* path, bool pFlag) { + SdBaseFile sub; + return sub.mkdir(&m_vwd, path, pFlag); +} +//------------------------------------------------------------------------------ +/** Remove a file from the volume working directory. +* +* \param[in] path A path with a valid 8.3 DOS name for the file. +* +* \return The value one, true, is returned for success and +* the value zero, false, is returned for failure. +*/ +bool SdFat::remove(const char* path) { + return SdBaseFile::remove(&m_vwd, path); +} +//------------------------------------------------------------------------------ +/** Rename a file or subdirectory. + * + * \param[in] oldPath Path name to the file or subdirectory to be renamed. + * + * \param[in] newPath New path name of the file or subdirectory. + * + * The \a newPath object must not exist before the rename call. + * + * The file to be renamed must not be open. The directory entry may be + * moved and file system corruption could occur if the file is accessed by + * a file object that was opened before the rename() call. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool SdFat::rename(const char *oldPath, const char *newPath) { + SdBaseFile file; + if (!file.open(oldPath, O_READ)) return false; + return file.rename(&m_vwd, newPath); +} +//------------------------------------------------------------------------------ +/** Remove a subdirectory from the volume's working directory. + * + * \param[in] path A path with a valid 8.3 DOS name for the subdirectory. + * + * The subdirectory file will be removed only if it is empty. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool SdFat::rmdir(const char* path) { + SdBaseFile sub; + if (!sub.open(path, O_READ)) return false; + return sub.rmdir(); +} +//------------------------------------------------------------------------------ +/** Truncate a file to a specified length. The current file position + * will be maintained if it is less than or equal to \a length otherwise + * it will be set to end of file. + * + * \param[in] path A path with a valid 8.3 DOS name for the file. + * \param[in] length The desired length for the file. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include file is read only, file is a directory, + * \a length is greater than the current file size or an I/O error occurs. + */ +bool SdFat::truncate(const char* path, uint32_t length) { + SdBaseFile file; + if (!file.open(path, O_WRITE)) return false; + return file.truncate(length); +} diff --git a/SdFat/SdFat.h b/SdFat/SdFat.h new file mode 100644 index 0000000..ccfc7f1 --- /dev/null +++ b/SdFat/SdFat.h @@ -0,0 +1,99 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef SdFat_h +#define SdFat_h +/** + * \file + * \brief SdFat class + */ +//------------------------------------------------------------------------------ +/** Macro for debug. */ +#define DBG_FAIL_MACRO // Serial.print(__FILE__);Serial.println(__LINE__) +//------------------------------------------------------------------------------ +/** SdFat version YYYYMMDD */ +#define SD_FAT_VERSION 20140806 +//------------------------------------------------------------------------------ +/** error if old IDE */ +#if !defined(ARDUINO) || ARDUINO < 100 +#error Arduino IDE must be 1.0 or greater +#endif // ARDUINO < 100 +//------------------------------------------------------------------------------ +#include +#include +#include +#include +//------------------------------------------------------------------------------ +/** + * \class SdFat + * \brief Integration class for the %SdFat library. + */ +class SdFat { + public: + SdFat() {} + /** \return a pointer to the Sd2Card object. */ + Sd2Card* card() {return &m_card;} + bool chdir(bool set_cwd = false); + bool chdir(const char* path, bool set_cwd = false); + void chvol(); + void errorHalt(); + void errorHalt(char const *msg); + void errorPrint(); + void errorPrint(char const *msg); + bool exists(const char* name); + bool begin(uint8_t chipSelectPin = SD_CHIP_SELECT_PIN, + uint8_t sckDivisor = SPI_FULL_SPEED); + void initErrorHalt(); + void initErrorHalt(char const *msg); + void initErrorPrint(); + void initErrorPrint(char const *msg); + void ls(uint8_t flags = 0); + void ls(const char* path, uint8_t flags = 0); + void ls(Print* pr, uint8_t flags = 0); + void ls(Print* pr, const char* path, uint8_t flags = 0); + bool mkdir(const char* path, bool pFlag = true); + bool remove(const char* path); + bool rename(const char *oldPath, const char *newPath); + bool rmdir(const char* path); + bool truncate(const char* path, uint32_t length); + /** \return a pointer to the SdVolume object. */ + SdVolume* vol() {return &m_vol;} + /** \return a pointer to the volume working directory. */ + SdBaseFile* vwd() {return &m_vwd;} + //---------------------------------------------------------------------------- + void errorHalt_P(PGM_P msg); + void errorPrint_P(PGM_P msg); + void initErrorHalt_P(PGM_P msg); + void initErrorPrint_P(PGM_P msg); + //---------------------------------------------------------------------------- + /** + * Set stdOut Print stream for messages. + * \param[in] stream The new Print stream. + */ + static void setStdOut(Print* stream) {m_stdOut = stream;} + /** \return Print stream for messages. */ + static Print* stdOut() {return m_stdOut;} + + private: + Sd2Card m_card; + SdVolume m_vol; + SdBaseFile m_vwd; + static Print* m_stdOut; +}; +#endif // SdFat_h diff --git a/SdFat/SdFatConfig.h b/SdFat/SdFatConfig.h new file mode 100644 index 0000000..e344daa --- /dev/null +++ b/SdFat/SdFatConfig.h @@ -0,0 +1,164 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +/** + * \file + * \brief configuration definitions + */ +#ifndef SdFatConfig_h +#define SdFatConfig_h +#include +//------------------------------------------------------------------------------ +/** + * Set USE_SEPARATE_FAT_CACHE nonzero to use a second 512 byte cache + * for FAT table entries. Improves performance for large writes that + * are not a multiple of 512 bytes. + */ +#ifdef __arm__ +#define USE_SEPARATE_FAT_CACHE 1 +#else // __arm__ +#define USE_SEPARATE_FAT_CACHE 0 +#endif // __arm__ +//------------------------------------------------------------------------------ +/** + * Set USE_MULTI_BLOCK_SD_IO nonzero to use multi-block SD read/write. + * + * Don't use mult-block read/write on small AVR boards. + */ +#if defined(RAMEND) && RAMEND < 3000 +#define USE_MULTI_BLOCK_SD_IO 0 +#else +#define USE_MULTI_BLOCK_SD_IO 1 +#endif +//------------------------------------------------------------------------------ +/** + * Force use of Arduino Standard SPI library if USE_ARDUINO_SPI_LIBRARY + * is nonzero. + */ +#define USE_ARDUINO_SPI_LIBRARY 0 +//------------------------------------------------------------------------------ +/** + * To enable SD card CRC checking set USE_SD_CRC nonzero. + * + * Set USE_SD_CRC to 1 to use a smaller slower CRC-CCITT function. + * + * Set USE_SD_CRC to 2 to used a larger faster table driven CRC-CCITT function. + */ +#define USE_SD_CRC 0 +//------------------------------------------------------------------------------ +/** + * To use multiple SD cards set USE_MULTIPLE_CARDS nonzero. + * + * Using multiple cards costs about 200 bytes of flash. + * + * Each card requires about 550 bytes of SRAM so use of a Mega is recommended. + */ +#define USE_MULTIPLE_CARDS 0 +//------------------------------------------------------------------------------ +/** + * Set DESTRUCTOR_CLOSES_FILE nonzero to close a file in its destructor. + * + * Causes use of lots of heap in ARM. + */ +#define DESTRUCTOR_CLOSES_FILE 0 +//------------------------------------------------------------------------------ +/** + * For AVR + * + * Set USE_SERIAL_FOR_STD_OUT nonzero to use Serial (the HardwareSerial class) + * for error messages and output from print functions like ls(). + * + * If USE_SERIAL_FOR_STD_OUT is zero, a small non-interrupt driven class + * is used to output messages to serial port zero. This allows an alternate + * Serial library like SerialPort to be used with SdFat. + * + * You can redirect stdOut with SdFat::setStdOut(Print* stream) and + * get the current stream with SdFat::stdOut(). + */ +#define USE_SERIAL_FOR_STD_OUT 0 +//------------------------------------------------------------------------------ +/** + * Call flush for endl if ENDL_CALLS_FLUSH is nonzero + * + * The standard for iostreams is to call flush. This is very costly for + * SdFat. Each call to flush causes 2048 bytes of I/O to the SD. + * + * SdFat has a single 512 byte buffer for SD I/O so it must write the current + * data block to the SD, read the directory block from the SD, update the + * directory entry, write the directory block to the SD and read the data + * block back into the buffer. + * + * The SD flash memory controller is not designed for this many rewrites + * so performance may be reduced by more than a factor of 100. + * + * If ENDL_CALLS_FLUSH is zero, you must call flush and/or close to force + * all data to be written to the SD. + */ +#define ENDL_CALLS_FLUSH 0 +//------------------------------------------------------------------------------ +/** + * Allow FAT12 volumes if FAT12_SUPPORT is nonzero. + * FAT12 has not been well tested. + */ +#define FAT12_SUPPORT 0 +//------------------------------------------------------------------------------ +/** + * SPI SCK divisor for SD initialization commands. + * or greater + */ +#ifdef __AVR__ +const uint8_t SPI_SCK_INIT_DIVISOR = 64; +#else +const uint8_t SPI_SCK_INIT_DIVISOR = 128; +#endif +//------------------------------------------------------------------------------ +/** + * Define MEGA_SOFT_SPI nonzero to use software SPI on Mega Arduinos. + * Default pins used are SS 10, MOSI 11, MISO 12, and SCK 13. + * Edit Software Spi pins to change pin numbers. + * + * MEGA_SOFT_SPI allows an unmodified 328 Shield to be used + * on Mega Arduinos. + */ +#define MEGA_SOFT_SPI 0 +//------------------------------------------------------------------------------ +/** + * Define LEONARDO_SOFT_SPI nonzero to use software SPI on Leonardo Arduinos. + * Default pins used are SS 10, MOSI 11, MISO 12, and SCK 13. + * Edit Software Spi pins to change pin numbers. + * + * LEONARDO_SOFT_SPI allows an unmodified 328 Shield to be used + * on Leonardo Arduinos. + */ +#define LEONARDO_SOFT_SPI 0 +//------------------------------------------------------------------------------ +/** + * Set USE_SOFTWARE_SPI nonzero to always use software SPI on AVR. + */ +#define USE_SOFTWARE_SPI 0 +// define software SPI pins so Mega can use unmodified 168/328 shields +/** Default Software SPI chip select pin */ +uint8_t const SOFT_SPI_CS_PIN = 10; +/** Software SPI Master Out Slave In pin */ +uint8_t const SOFT_SPI_MOSI_PIN = 11; +/** Software SPI Master In Slave Out pin */ +uint8_t const SOFT_SPI_MISO_PIN = 12; +/** Software SPI Clock pin */ +uint8_t const SOFT_SPI_SCK_PIN = 13; +#endif // SdFatConfig_h diff --git a/SdFat/SdFatErrorPrint.cpp b/SdFat/SdFatErrorPrint.cpp new file mode 100644 index 0000000..9240301 --- /dev/null +++ b/SdFat/SdFatErrorPrint.cpp @@ -0,0 +1,145 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#include +#ifndef PSTR +#define PSTR(x) x +#define PGM_P const char* +#endif +//------------------------------------------------------------------------------ +static void pstrPrint(PGM_P str) { + for (uint8_t c; (c = pgm_read_byte(str)); str++) SdFat::stdOut()->write(c); +} +//------------------------------------------------------------------------------ +static void pstrPrintln(PGM_P str) { + pstrPrint(str); + SdFat::stdOut()->println(); +} +//------------------------------------------------------------------------------ +/** %Print any SD error code and halt. */ +void SdFat::errorHalt() { + errorPrint(); + while (1) {} +} +//------------------------------------------------------------------------------ +/** %Print msg, any SD error code, and halt. + * + * \param[in] msg Message to print. + */ +void SdFat::errorHalt(char const* msg) { + errorPrint(msg); + while (1) {} +} +//------------------------------------------------------------------------------ +/** %Print msg, any SD error code, and halt. + * + * \param[in] msg Message in program space (flash memory) to print. + */ +void SdFat::errorHalt_P(PGM_P msg) { + errorPrint_P(msg); + while (1) {} +} +//------------------------------------------------------------------------------ +/** %Print any SD error code. */ +void SdFat::errorPrint() { + if (!m_card.errorCode()) return; + pstrPrint(PSTR("SD errorCode: 0X")); + m_stdOut->print(m_card.errorCode(), HEX); + pstrPrint(PSTR(",0X")); + m_stdOut->println(m_card.errorData(), HEX); +} +//------------------------------------------------------------------------------ +/** %Print msg, any SD error code. + * + * \param[in] msg Message to print. + */ +void SdFat::errorPrint(char const* msg) { + pstrPrint(PSTR("error: ")); + m_stdOut->println(msg); + errorPrint(); +} +//------------------------------------------------------------------------------ +/** %Print msg, any SD error code. + * + * \param[in] msg Message in program space (flash memory) to print. + */ +void SdFat::errorPrint_P(PGM_P msg) { + pstrPrint(PSTR("error: ")); + pstrPrintln(msg); + errorPrint(); +} +//------------------------------------------------------------------------------ +/** %Print error details and halt after SdFat::init() fails. */ +void SdFat::initErrorHalt() { + initErrorPrint(); + while (1) {} +} +//------------------------------------------------------------------------------ +/**Print message, error details, and halt after SdFat::init() fails. + * + * \param[in] msg Message to print. + */ +void SdFat::initErrorHalt(char const *msg) { + m_stdOut->println(msg); + initErrorHalt(); +} +//------------------------------------------------------------------------------ +/**Print message, error details, and halt after SdFat::init() fails. + * + * \param[in] msg Message in program space (flash memory) to print. + */ +void SdFat::initErrorHalt_P(PGM_P msg) { + pstrPrintln(msg); + initErrorHalt(); +} +//------------------------------------------------------------------------------ +/** Print error details after SdFat::init() fails. */ +void SdFat::initErrorPrint() { + if (m_card.errorCode()) { + pstrPrintln(PSTR("Can't access SD card. Do not reformat.")); + if (m_card.errorCode() == SD_CARD_ERROR_CMD0) { + pstrPrintln(PSTR("No card, wrong chip select pin, or SPI problem?")); + } + errorPrint(); + } else if (m_vol.fatType() == 0) { + pstrPrintln(PSTR("Invalid format, reformat SD.")); + } else if (!m_vwd.isOpen()) { + pstrPrintln(PSTR("Can't open root directory.")); + } else { + pstrPrintln(PSTR("No error found.")); + } +} +//------------------------------------------------------------------------------ +/**Print message and error details and halt after SdFat::init() fails. + * + * \param[in] msg Message to print. + */ +void SdFat::initErrorPrint(char const *msg) { + m_stdOut->println(msg); + initErrorPrint(); +} +//------------------------------------------------------------------------------ +/**Print message and error details after SdFat::init() fails. + * + * \param[in] msg Message in program space (flash memory) to print. + */ +void SdFat::initErrorPrint_P(PGM_P msg) { + pstrPrintln(msg); + initErrorHalt(); +} diff --git a/SdFat/SdFatUtil.cpp b/SdFat/SdFatUtil.cpp new file mode 100644 index 0000000..b0b2aa8 --- /dev/null +++ b/SdFat/SdFatUtil.cpp @@ -0,0 +1,76 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#include +#include +#include +#ifdef __arm__ +// should use uinstd.h to define sbrk but Due causes a conflict +extern "C" char* sbrk(int incr); +#else // __ARM__ +extern char *__brkval; +extern char __bss_end; +#endif // __arm__ +//------------------------------------------------------------------------------ +/** Amount of free RAM + * \return The number of free bytes. + */ +int SdFatUtil::FreeRam() { + char top; +#ifdef __arm__ + return &top - reinterpret_cast(sbrk(0)); +#else // __arm__ + return __brkval ? &top - __brkval : &top - &__bss_end; +#endif // __arm__ +} +//------------------------------------------------------------------------------ +/** %Print a string in flash memory. + * + * \param[in] pr Print object for output. + * \param[in] str Pointer to string stored in flash memory. + */ +void SdFatUtil::print_P(Print* pr, PGM_P str) { + for (uint8_t c; (c = pgm_read_byte(str)); str++) pr->write(c); +} +//------------------------------------------------------------------------------ +/** %Print a string in flash memory followed by a CR/LF. + * + * \param[in] pr Print object for output. + * \param[in] str Pointer to string stored in flash memory. + */ +void SdFatUtil::println_P(Print* pr, PGM_P str) { + print_P(pr, str); + pr->println(); +} +//------------------------------------------------------------------------------ +/** %Print a string in flash memory to Serial. + * + * \param[in] str Pointer to string stored in flash memory. + */ +void SdFatUtil::SerialPrint_P(PGM_P str) { + print_P(SdFat::stdOut(), str); +} +//------------------------------------------------------------------------------ +/** %Print a string in flash memory to Serial followed by a CR/LF. + * + * \param[in] str Pointer to string stored in flash memory. + */ +void SdFatUtil::SerialPrintln_P(PGM_P str) { + println_P(SdFat::stdOut(), str); +} diff --git a/SdFat/SdFatUtil.h b/SdFat/SdFatUtil.h new file mode 100644 index 0000000..54dbab6 --- /dev/null +++ b/SdFat/SdFatUtil.h @@ -0,0 +1,40 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef SdFatUtil_h +#define SdFatUtil_h +/** + * \file + * \brief Useful utility functions. + */ +#include +/** Store and print a string in flash memory.*/ +#define PgmPrint(x) SerialPrint_P(PSTR(x)) +/** Store and print a string in flash memory followed by a CR/LF.*/ +#define PgmPrintln(x) SerialPrintln_P(PSTR(x)) + +namespace SdFatUtil { + int FreeRam(); + void print_P(Print* pr, PGM_P str); + void println_P(Print* pr, PGM_P str); + void SerialPrint_P(PGM_P str); + void SerialPrintln_P(PGM_P str); +} +using namespace SdFatUtil; // NOLINT +#endif // #define SdFatUtil_h diff --git a/SdFat/SdFatmainpage.h b/SdFat/SdFatmainpage.h new file mode 100644 index 0000000..993e762 --- /dev/null +++ b/SdFat/SdFatmainpage.h @@ -0,0 +1,219 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ + +/** +\mainpage Arduino %SdFat Library +
Copyright © 2012, 2013, 2014 by William Greiman +
+ +\section Intro Introduction +The Arduino %SdFat Library is a minimal implementation of FAT16 and FAT32 +file systems on SD flash memory cards. Standard SD and high capacity SDHC +cards are supported. + +Experimental support for FAT12 can be enabled by setting FAT12_SUPPORT +nonzero in SdFatConfig.h. + +The %SdFat library only supports short 8.3 names. + +The main classes in %SdFat are SdFat, SdFile, StdioStream, \ref fstream, +\ref ifstream, and \ref ofstream. + +The SdFat class maintains a volume working directories, a current working +directory, and simplifies initialization of other classes. + +The SdFile class provides binary file access functions such as open(), read(), +remove(), write(), close() and sync(). This class supports access to the root +directory and subdirectories. + +The StdioStream class implements functions similar to Linux/Unix standard +buffered input/output. + +The \ref fstream class implements C++ iostreams for both reading and writing +text files. + +The \ref ifstream class implements the C++ iostreams for reading text files. + +The \ref ofstream class implements the C++ iostreams for writing text files. + +The classes \ref ibufstream and \ref obufstream format and parse character + strings in memory buffers. + +the classes ArduinoInStream and ArduinoOutStream provide iostream functions +for Serial, LiquidCrystal, and other devices. + +The SdVolume class supports FAT16 and FAT32 partitions. Most applications +will not need to call SdVolume member function. + +The Sd2Card class supports access to standard SD cards and SDHC cards. Most +applications will not need to call Sd2Card functions. The Sd2Card class can +be used for raw access to the SD card. + +A number of example are provided in the %SdFat/examples folder. These were +developed to test %SdFat and illustrate its use. + +%SdFat was developed for high speed data recording. %SdFat was used to +implement an audio record/play class, WaveRP, for the Adafruit Wave Shield. +This application uses special Sd2Card calls to write to contiguous files in +raw mode. These functions reduce write latency so that audio can be +recorded with the small amount of RAM in the Arduino. + +\section SDcard SD\SDHC Cards + +Arduinos access SD cards using the cards SPI protocol. PCs, Macs, and +most consumer devices use the 4-bit parallel SD protocol. A card that +functions well on A PC or Mac may not work well on the Arduino. + +Most cards have good SPI read performance but cards vary widely in SPI +write performance. Write performance is limited by how efficiently the +card manages internal erase/remapping operations. The Arduino cannot +optimize writes to reduce erase operations because of its limit RAM. + +SanDisk cards generally have good write performance. They seem to have +more internal RAM buffering than other cards and therefore can limit +the number of flash erase operations that the Arduino forces due to its +limited RAM. + +\section Hardware Hardware Configuration + +%SdFat was developed using an + Adafruit Industries +Data Logging Shield. + +The hardware interface to the SD card should not use a resistor based level +shifter. %SdFat sets the SPI bus frequency to 8 MHz which results in signal +rise times that are too slow for the edge detectors in many newer SD card +controllers when resistor voltage dividers are used. + +The 5 to 3.3 V level shifter for 5 V Arduinos should be IC based like the +74HC4050N based circuit shown in the file SdLevel.png. The Adafruit Wave Shield +uses a 74AHC125N. Gravitech sells SD and MicroSD Card Adapters based on the +74LCX245. + +If you are using a resistor based level shifter and are having problems try +setting the SPI bus frequency to 4 MHz. This can be done by using +card.init(SPI_HALF_SPEED) to initialize the SD card. + +\section comment Bugs and Comments + +If you wish to report bugs or have comments, send email to fat16lib@sbcglobal.net. + +\section SdFatClass SdFat Usage + +%SdFat uses a slightly restricted form of short names. +Only printable ASCII characters are supported. No characters with code point +values greater than 127 are allowed. Space is not allowed even though space +was allowed in the API of early versions of DOS. + +Short names are limited to 8 characters followed by an optional period (.) +and extension of up to 3 characters. The characters may be any combination +of letters and digits. The following special characters are also allowed: + +$ % ' - _ @ ~ ` ! ( ) { } ^ # & + +Short names are always converted to upper case and their original case +value is lost. + +\par +An application which writes to a file using print(), println() or +\link SdFile::write write() \endlink must call \link SdFile::sync() sync() \endlink +at the appropriate time to force data and directory information to be written +to the SD Card. Data and directory information are also written to the SD card +when \link SdFile::close() close() \endlink is called. + +\par +Applications must use care calling \link SdFile::sync() sync() \endlink +since 2048 bytes of I/O is required to update file and +directory information. This includes writing the current data block, reading +the block that contains the directory entry for update, writing the directory +block back and reading back the current data block. + +It is possible to open a file with two or more instances of SdFile. A file may +be corrupted if data is written to the file by more than one instance of SdFile. + +\section HowTo How to format SD Cards as FAT Volumes + +You should use a freshly formatted SD card for best performance. FAT +file systems become slower if many files have been created and deleted. +This is because the directory entry for a deleted file is marked as deleted, +but is not deleted. When a new file is created, these entries must be scanned +before creating the file, a flaw in the FAT design. Also files can become +fragmented which causes reads and writes to be slower. + +A formatter sketch, SdFormatter.pde, is included in the +%SdFat/examples/SdFormatter directory. This sketch attempts to +emulate SD Association's SDFormatter. + +The best way to restore an SD card's format on a PC is to use SDFormatter +which can be downloaded from: + +http://www.sdcard.org/consumers/formatter/ + +SDFormatter aligns flash erase boundaries with file +system structures which reduces write latency and file system overhead. + +SDFormatter does not have an option for FAT type so it may format +small cards as FAT12. + +After the MBR is restored by SDFormatter you may need to reformat small +cards that have been formatted FAT12 to force the volume type to be FAT16. + +If you reformat the SD card with an OS utility, choose a cluster size that +will result in: + +4084 < CountOfClusters && CountOfClusters < 65525 + +The volume will then be FAT16. + +If you are formatting an SD card on OS X or Linux, be sure to use the first +partition. Format this partition with a cluster count in above range for FAT16. +SDHC cards should be formatted FAT32 with a cluster size of 32 KB. + +Microsoft operating systems support removable media formatted with a +Master Boot Record, MBR, or formatted as a super floppy with a FAT Boot Sector +in block zero. + +Microsoft operating systems expect MBR formatted removable media +to have only one partition. The first partition should be used. + +Microsoft operating systems do not support partitioning SD flash cards. +If you erase an SD card with a program like KillDisk, Most versions of +Windows will format the card as a super floppy. + +\section References References + +The Arduino site: + +http://www.arduino.cc/ + +For more information about FAT file systems see: + +http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx + +For information about using SD cards as SPI devices see: + +http://www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf + +The ATmega328 datasheet: + +http://www.atmel.com/dyn/resources/prod_documents/doc8161.pdf + + + */ diff --git a/SdFat/SdFile.cpp b/SdFat/SdFile.cpp new file mode 100644 index 0000000..3ad7b65 --- /dev/null +++ b/SdFat/SdFile.cpp @@ -0,0 +1,83 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#include +/** Create a file object and open it in the current working directory. + * + * \param[in] path A path with a valid 8.3 DOS name for a file to be opened. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of open flags. see SdBaseFile::open(SdBaseFile*, const char*, uint8_t). + */ +SdFile::SdFile(const char* path, uint8_t oflag) : SdBaseFile(path, oflag) { +} +//------------------------------------------------------------------------------ +/** Write data to an open file. + * + * \note Data is moved to the cache but may not be written to the + * storage device until sync() is called. + * + * \param[in] buf Pointer to the location of the data to be written. + * + * \param[in] nbyte Number of bytes to write. + * + * \return For success write() returns the number of bytes written, always + * \a nbyte. If an error occurs, write() returns -1. Possible errors + * include write() is called before a file has been opened, write is called + * for a read-only file, device is full, a corrupt file system or an I/O error. + * + */ +int SdFile::write(const void* buf, size_t nbyte) { + return SdBaseFile::write(buf, nbyte); +} +//------------------------------------------------------------------------------ +/** Write a byte to a file. Required by the Arduino Print class. + * \param[in] b the byte to be written. + * Use getWriteError to check for errors. + * \return 1 for success and 0 for failure. + */ +size_t SdFile::write(uint8_t b) { + return SdBaseFile::write(&b, 1) == 1 ? 1 : 0; +} +//------------------------------------------------------------------------------ +/** Write a string to a file. Used by the Arduino Print class. + * \param[in] str Pointer to the string. + * Use getWriteError to check for errors. + * \return count of characters written for success or -1 for failure. + */ +int SdFile::write(const char* str) { + return SdBaseFile::write(str, strlen(str)); +} +//------------------------------------------------------------------------------ +/** Write a PROGMEM string to a file. + * \param[in] str Pointer to the PROGMEM string. + * Use getWriteError to check for errors. + */ +void SdFile::write_P(PGM_P str) { + for (uint8_t c; (c = pgm_read_byte(str)); str++) write(c); +} +//------------------------------------------------------------------------------ +/** Write a PROGMEM string followed by CR/LF to a file. + * \param[in] str Pointer to the PROGMEM string. + * Use getWriteError to check for errors. + */ +void SdFile::writeln_P(PGM_P str) { + write_P(str); + write_P(PSTR("\r\n")); +} diff --git a/SdFat/SdFile.h b/SdFat/SdFile.h new file mode 100644 index 0000000..954686a --- /dev/null +++ b/SdFat/SdFile.h @@ -0,0 +1,51 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +/** + * \file + * \brief SdFile class + */ +#include +#ifndef SdFile_h +#define SdFile_h +//------------------------------------------------------------------------------ +/** + * \class SdFile + * \brief SdBaseFile with Print. + */ +class SdFile : public SdBaseFile, public Print { + public: + SdFile() {} + SdFile(const char* name, uint8_t oflag); +#if DESTRUCTOR_CLOSES_FILE + ~SdFile() {} +#endif // DESTRUCTOR_CLOSES_FILE + /** \return value of writeError */ + bool getWriteError() {return SdBaseFile::getWriteError();} + /** Set writeError to zero */ + void clearWriteError() {SdBaseFile::clearWriteError();} + size_t write(uint8_t b); + int write(const char* str); + int write(const void* buf, size_t nbyte); + size_t write(const uint8_t *buf, size_t size) { + return SdBaseFile::write(buf, size);} + void write_P(PGM_P str); + void writeln_P(PGM_P str); +}; +#endif // SdFile_h diff --git a/SdFat/SdInfo.h b/SdFat/SdInfo.h new file mode 100644 index 0000000..7c518da --- /dev/null +++ b/SdFat/SdInfo.h @@ -0,0 +1,303 @@ +/* Arduino Sd2Card Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino Sd2Card Library. If not, see + * . + */ +#ifndef SdInfo_h +#define SdInfo_h +#include +// Based on the document: +// +// SD Specifications +// Part 1 +// Physical Layer +// Simplified Specification +// Version 3.01 +// May 18, 2010 +// +// http://www.sdcard.org/developers/tech/sdcard/pls/simplified_specs +//------------------------------------------------------------------------------ +// SPI divisor constants +/** Set SCK to max rate of F_CPU/2. */ +uint8_t const SPI_FULL_SPEED = 2; +/** Set SCK rate to F_CPU/3 for Due */ +uint8_t const SPI_DIV3_SPEED = 3; +/** Set SCK rate to F_CPU/4. */ +uint8_t const SPI_HALF_SPEED = 4; +/** Set SCK rate to F_CPU/6 for Due */ +uint8_t const SPI_DIV6_SPEED = 6; +/** Set SCK rate to F_CPU/8. */ +uint8_t const SPI_QUARTER_SPEED = 8; +/** Set SCK rate to F_CPU/16. */ +uint8_t const SPI_EIGHTH_SPEED = 16; +/** Set SCK rate to F_CPU/32. */ +uint8_t const SPI_SIXTEENTH_SPEED = 32; +//------------------------------------------------------------------------------ +// SD operation timeouts +/** init timeout ms */ +uint16_t const SD_INIT_TIMEOUT = 2000; +/** erase timeout ms */ +uint16_t const SD_ERASE_TIMEOUT = 10000; +/** read timeout ms */ +uint16_t const SD_READ_TIMEOUT = 300; +/** write time out ms */ +uint16_t const SD_WRITE_TIMEOUT = 600; +//------------------------------------------------------------------------------ +// SD card commands +/** GO_IDLE_STATE - init card in spi mode if CS low */ +uint8_t const CMD0 = 0X00; +/** SEND_IF_COND - verify SD Memory Card interface operating condition.*/ +uint8_t const CMD8 = 0X08; +/** SEND_CSD - read the Card Specific Data (CSD register) */ +uint8_t const CMD9 = 0X09; +/** SEND_CID - read the card identification information (CID register) */ +uint8_t const CMD10 = 0X0A; +/** STOP_TRANSMISSION - end multiple block read sequence */ +uint8_t const CMD12 = 0X0C; +/** SEND_STATUS - read the card status register */ +uint8_t const CMD13 = 0X0D; +/** READ_SINGLE_BLOCK - read a single data block from the card */ +uint8_t const CMD17 = 0X11; +/** READ_MULTIPLE_BLOCK - read a multiple data blocks from the card */ +uint8_t const CMD18 = 0X12; +/** WRITE_BLOCK - write a single data block to the card */ +uint8_t const CMD24 = 0X18; +/** WRITE_MULTIPLE_BLOCK - write blocks of data until a STOP_TRANSMISSION */ +uint8_t const CMD25 = 0X19; +/** ERASE_WR_BLK_START - sets the address of the first block to be erased */ +uint8_t const CMD32 = 0X20; +/** ERASE_WR_BLK_END - sets the address of the last block of the continuous + range to be erased*/ +uint8_t const CMD33 = 0X21; +/** ERASE - erase all previously selected blocks */ +uint8_t const CMD38 = 0X26; +/** APP_CMD - escape for application specific command */ +uint8_t const CMD55 = 0X37; +/** READ_OCR - read the OCR register of a card */ +uint8_t const CMD58 = 0X3A; +/** CRC_ON_OFF - enable or disable CRC checking */ +uint8_t const CMD59 = 0X3B; +/** SET_WR_BLK_ERASE_COUNT - Set the number of write blocks to be + pre-erased before writing */ +uint8_t const ACMD23 = 0X17; +/** SD_SEND_OP_COMD - Sends host capacity support information and + activates the card's initialization process */ +uint8_t const ACMD41 = 0X29; +//------------------------------------------------------------------------------ +/** status for card in the ready state */ +uint8_t const R1_READY_STATE = 0X00; +/** status for card in the idle state */ +uint8_t const R1_IDLE_STATE = 0X01; +/** status bit for illegal command */ +uint8_t const R1_ILLEGAL_COMMAND = 0X04; +/** start data token for read or write single block*/ +uint8_t const DATA_START_BLOCK = 0XFE; +/** stop token for write multiple blocks*/ +uint8_t const STOP_TRAN_TOKEN = 0XFD; +/** start data token for write multiple blocks*/ +uint8_t const WRITE_MULTIPLE_TOKEN = 0XFC; +/** mask for data response tokens after a write block operation */ +uint8_t const DATA_RES_MASK = 0X1F; +/** write data accepted token */ +uint8_t const DATA_RES_ACCEPTED = 0X05; +//------------------------------------------------------------------------------ +/** Card IDentification (CID) register */ +typedef struct CID { + // byte 0 + /** Manufacturer ID */ + unsigned char mid; + // byte 1-2 + /** OEM/Application ID */ + char oid[2]; + // byte 3-7 + /** Product name */ + char pnm[5]; + // byte 8 + /** Product revision least significant digit */ + unsigned char prv_m : 4; + /** Product revision most significant digit */ + unsigned char prv_n : 4; + // byte 9-12 + /** Product serial number */ + uint32_t psn; + // byte 13 + /** Manufacturing date year low digit */ + unsigned char mdt_year_high : 4; + /** not used */ + unsigned char reserved : 4; + // byte 14 + /** Manufacturing date month */ + unsigned char mdt_month : 4; + /** Manufacturing date year low digit */ + unsigned char mdt_year_low :4; + // byte 15 + /** not used always 1 */ + unsigned char always1 : 1; + /** CRC7 checksum */ + unsigned char crc : 7; +}__attribute__((packed)) cid_t; +//------------------------------------------------------------------------------ +/** CSD for version 1.00 cards */ +typedef struct CSDV1 { + // byte 0 + unsigned char reserved1 : 6; + unsigned char csd_ver : 2; + // byte 1 + unsigned char taac; + // byte 2 + unsigned char nsac; + // byte 3 + unsigned char tran_speed; + // byte 4 + unsigned char ccc_high; + // byte 5 + unsigned char read_bl_len : 4; + unsigned char ccc_low : 4; + // byte 6 + unsigned char c_size_high : 2; + unsigned char reserved2 : 2; + unsigned char dsr_imp : 1; + unsigned char read_blk_misalign :1; + unsigned char write_blk_misalign : 1; + unsigned char read_bl_partial : 1; + // byte 7 + unsigned char c_size_mid; + // byte 8 + unsigned char vdd_r_curr_max : 3; + unsigned char vdd_r_curr_min : 3; + unsigned char c_size_low :2; + // byte 9 + unsigned char c_size_mult_high : 2; + unsigned char vdd_w_cur_max : 3; + unsigned char vdd_w_curr_min : 3; + // byte 10 + unsigned char sector_size_high : 6; + unsigned char erase_blk_en : 1; + unsigned char c_size_mult_low : 1; + // byte 11 + unsigned char wp_grp_size : 7; + unsigned char sector_size_low : 1; + // byte 12 + unsigned char write_bl_len_high : 2; + unsigned char r2w_factor : 3; + unsigned char reserved3 : 2; + unsigned char wp_grp_enable : 1; + // byte 13 + unsigned char reserved4 : 5; + unsigned char write_partial : 1; + unsigned char write_bl_len_low : 2; + // byte 14 + unsigned char reserved5: 2; + unsigned char file_format : 2; + unsigned char tmp_write_protect : 1; + unsigned char perm_write_protect : 1; + unsigned char copy : 1; + /** Indicates the file format on the card */ + unsigned char file_format_grp : 1; + // byte 15 + unsigned char always1 : 1; + unsigned char crc : 7; +}__attribute__((packed)) csd1_t; +//------------------------------------------------------------------------------ +/** CSD for version 2.00 cards */ +typedef struct CSDV2 { + // byte 0 + unsigned char reserved1 : 6; + unsigned char csd_ver : 2; + // byte 1 + /** fixed to 0X0E */ + unsigned char taac; + // byte 2 + /** fixed to 0 */ + unsigned char nsac; + // byte 3 + unsigned char tran_speed; + // byte 4 + unsigned char ccc_high; + // byte 5 + /** This field is fixed to 9h, which indicates READ_BL_LEN=512 Byte */ + unsigned char read_bl_len : 4; + unsigned char ccc_low : 4; + // byte 6 + /** not used */ + unsigned char reserved2 : 4; + unsigned char dsr_imp : 1; + /** fixed to 0 */ + unsigned char read_blk_misalign :1; + /** fixed to 0 */ + unsigned char write_blk_misalign : 1; + /** fixed to 0 - no partial read */ + unsigned char read_bl_partial : 1; + // byte 7 + /** high part of card size */ + unsigned char c_size_high : 6; + /** not used */ + unsigned char reserved3 : 2; + // byte 8 + /** middle part of card size */ + unsigned char c_size_mid; + // byte 9 + /** low part of card size */ + unsigned char c_size_low; + // byte 10 + /** sector size is fixed at 64 KB */ + unsigned char sector_size_high : 6; + /** fixed to 1 - erase single is supported */ + unsigned char erase_blk_en : 1; + /** not used */ + unsigned char reserved4 : 1; + // byte 11 + unsigned char wp_grp_size : 7; + /** sector size is fixed at 64 KB */ + unsigned char sector_size_low : 1; + // byte 12 + /** write_bl_len fixed for 512 byte blocks */ + unsigned char write_bl_len_high : 2; + /** fixed value of 2 */ + unsigned char r2w_factor : 3; + /** not used */ + unsigned char reserved5 : 2; + /** fixed value of 0 - no write protect groups */ + unsigned char wp_grp_enable : 1; + // byte 13 + unsigned char reserved6 : 5; + /** always zero - no partial block read*/ + unsigned char write_partial : 1; + /** write_bl_len fixed for 512 byte blocks */ + unsigned char write_bl_len_low : 2; + // byte 14 + unsigned char reserved7: 2; + /** Do not use always 0 */ + unsigned char file_format : 2; + unsigned char tmp_write_protect : 1; + unsigned char perm_write_protect : 1; + unsigned char copy : 1; + /** Do not use always 0 */ + unsigned char file_format_grp : 1; + // byte 15 + /** not used always 1 */ + unsigned char always1 : 1; + /** checksum */ + unsigned char crc : 7; +}__attribute__((packed)) csd2_t; +//------------------------------------------------------------------------------ +/** union of old and new style CSD register */ +union csd_t { + csd1_t v1; + csd2_t v2; +}; +#endif // SdInfo_h diff --git a/SdFat/SdSpi.h b/SdFat/SdSpi.h new file mode 100644 index 0000000..b34611c --- /dev/null +++ b/SdFat/SdSpi.h @@ -0,0 +1,155 @@ +/* Arduino SdSpi Library + * Copyright (C) 2013 by William Greiman + * + * This file is part of the Arduino SdSpi Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdSpi Library. If not, see + * . + */ + /** + * \file + * \brief SdSpi class for V2 SD/SDHC cards + */ +#ifndef SdSpi_h +#define SdSpi_h +#include +#include + +#if !USE_ARDUINO_SPI_LIBRARY +// AVR Arduinos +#ifdef __AVR__ +#if USE_SOFTWARE_SPI +#define USE_AVR_SOFTWARE_SPI 1 +#elif LEONARDO_SOFT_SPI && defined(__AVR_ATmega32U4__) && !defined(CORE_TEENSY) +#define USE_AVR_SOFTWARE_SPI 1 +#elif MEGA_SOFT_SPI&&(defined(__AVR_ATmega1280__)||defined(__AVR_ATmega2560__)) +#define USE_AVR_SOFTWARE_SPI 1 +#else // USE_SOFTWARE_SPI +#define USE_AVR_S0FTWARE_SPI 0 +#define USE_NATIVE_AVR_SPI 1 +#endif // USE_SOFTWARE_SPI +#endif // __AVR__ +// Due +#if defined(__arm__) && !defined(CORE_TEENSY) +/** Nonzero - use native SAM3X SPI */ +#define USE_NATIVE_SAM3X_SPI 1 +#else // USE_NATIVE_SAM3X_SPI +/** Zero - don't use native SAM3X SPI */ +#define USE_NATIVE_SAM3X_SPI 0 +#endif // USE_NATIVE_SAM3X_SPI +// Teensy 3.0 +#if defined(__arm__) && defined(CORE_TEENSY) +/** Nonzero - use native MK20DX128 SPI */ +#define USE_NATIVE_MK20DX128_SPI 1 +#else // USE_NATIVE_MK20DX128_SPI +/** Zero - don't use native MK20DX128 SPI */ +#define USE_NATIVE_MK20DX128_SPI 0 +#endif // USE_NATIVE_MK20DX128_SPI +#endif // USE_ARDUINO_SPI_LIBRARY +//------------------------------------------------------------------------------ +// define default chip select pin +// +#if !USE_AVR_SOFTWARE_SPI +/** The default chip select pin for the SD card is SS. */ +uint8_t const SD_CHIP_SELECT_PIN = SS; +#else // USE_AVR_SOFTWARE_SPI +/** SPI chip select pin for software SPI. */ +uint8_t const SD_CHIP_SELECT_PIN = SOFT_SPI_CS_PIN; +#endif // USE_AVR_SOFTWARE_SPI + +//------------------------------------------------------------------------------ +/** + * \class SdSpi + * \brief SPI class for access to SD and SDHC flash memory cards. + */ +class SdSpi { + public: + /** Initialize the SPI bus */ + void begin(); + /** Set SPI options for access to SD/SDHC cards. + * + * \param[in] spiDivisor SCK clock divider relative to the system clock. + */ + void init(uint8_t spiDivisor); + /** Receive a byte. + * + * \return The byte. + */ + uint8_t receive(); + /** Receive multiple bytes. + * + * \param[out] buf Buffer to receive the data. + * \param[in] n Number of bytes to receive. + * + * \return Zero for no error or nonzero error code. + */ + uint8_t receive(uint8_t* buf, size_t n); + /** Send a byte. + * + * \param[in] data Byte to send + */ + void send(uint8_t data); + /** Send multiple bytes. + * + * \param[in] buf Buffer for data to be sent. + * \param[in] n Number of bytes to send. + */ + void send(const uint8_t* buf, size_t n); +}; +//------------------------------------------------------------------------------ +// Use of inline for AVR results in up to 10% better write performance. +// Inline also save a little flash memory. +/** inline avr native functions if nonzero. */ +#define USE_AVR_NATIVE_SPI_INLINE 1 +#if USE_NATIVE_AVR_SPI && USE_AVR_NATIVE_SPI_INLINE +inline uint8_t SdSpi::receive() { + SPDR = 0XFF; + while (!(SPSR & (1 << SPIF))) {} + return SPDR; +} +inline uint8_t SdSpi::receive(uint8_t* buf, size_t n) { + if (n-- == 0) return 0; + SPDR = 0XFF; + for (size_t i = 0; i < n; i++) { + while (!(SPSR & (1 << SPIF))) {} + uint8_t b = SPDR; + SPDR = 0XFF; + buf[i] = b; + } + while (!(SPSR & (1 << SPIF))) {} + buf[n] = SPDR; + return 0; +} +inline void SdSpi::send(uint8_t data) { + SPDR = data; + while (!(SPSR & (1 << SPIF))) {} +} +inline void SdSpi::send(const uint8_t* buf , size_t n) { + if (n == 0) return; + SPDR = buf[0]; + if (n > 1) { + uint8_t b = buf[1]; + size_t i = 2; + while (1) { + while (!(SPSR & (1 << SPIF))) {} + SPDR = b; + if (i == n) break; + b = buf[i++]; + } + } + while (!(SPSR & (1 << SPIF))) {} +} +#endif // USE_NATIVE_AVR_SPI && USE_AVR_NATIVE_SPI_INLINE +#endif // SdSpi_h + diff --git a/SdFat/SdSpiAVR.cpp b/SdFat/SdSpiAVR.cpp new file mode 100644 index 0000000..893b928 --- /dev/null +++ b/SdFat/SdSpiAVR.cpp @@ -0,0 +1,126 @@ +/* Arduino SdSpi Library + * Copyright (C) 2013 by William Greiman + * + * This file is part of the Arduino SdSpi Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdSpi Library. If not, see + * . + */#include +#if USE_NATIVE_AVR_SPI +//------------------------------------------------------------------------------ +void SdSpi::begin() { + // set SS high - may be chip select for another SPI device + digitalWrite(SS, HIGH); + + // SS must be in output mode even it is not chip select + pinMode(SS, OUTPUT); + pinMode(MISO, INPUT); + pinMode(MOSI, OUTPUT); + pinMode(SCK, OUTPUT); +} +//------------------------------------------------------------------------------ +void SdSpi::init(uint8_t sckDivisor) { + uint8_t r = 0; + + for (uint8_t b = 2; sckDivisor > b && r < 6; b <<= 1, r++); + // See avr processor documentation + SPCR = (1 << SPE) | (1 << MSTR) | (r >> 1); + SPSR = r & 1 || r == 6 ? 0 : 1 << SPI2X; +} +#if !USE_AVR_NATIVE_SPI_INLINE +//------------------------------------------------------------------------------ +uint8_t SdSpi::receive() { + SPDR = 0XFF; + while (!(SPSR & (1 << SPIF))); + return SPDR; +} +//------------------------------------------------------------------------------ +uint8_t SdSpi::receive(uint8_t* buf, size_t n) { + if (n-- == 0) return 0; + SPDR = 0XFF; + for (size_t i = 0; i < n; i++) { + while (!(SPSR & (1 << SPIF))); + uint8_t b = SPDR; + SPDR = 0XFF; + buf[i] = b; + } + while (!(SPSR & (1 << SPIF))); + buf[n] = SPDR; + return 0; +} +//------------------------------------------------------------------------------ +void SdSpi::send(uint8_t data) { + SPDR = data; + while (!(SPSR & (1 << SPIF))); +} +//------------------------------------------------------------------------------ +void SdSpi::send(const uint8_t* buf , size_t n) { + if (n == 0) return; + SPDR = buf[0]; + if (n > 1) { + uint8_t b = buf[1]; + size_t i = 2; + while (1) { + while (!(SPSR & (1 << SPIF))); + SPDR = b; + if (i == n) break; + b = buf[i++]; + } + } + while (!(SPSR & (1 << SPIF))); +} +#endif // !USE_AVR_NATIVE_SPI_INLINE +#endif // USE_NATIVE_AVR_SPI +//============================================================================== +#if USE_AVR_SOFTWARE_SPI +#include +static +SoftSPI softSpiBus; +//------------------------------------------------------------------------------ +/** + * initialize SPI pins + */ +void SdSpi::begin() { + softSpiBus.begin(); +} +//------------------------------------------------------------------------------ +/** + * Initialize hardware SPI - dummy for soft SPI + */ +void SdSpi::init(uint8_t sckDivisor) {} +//------------------------------------------------------------------------------ +/** Soft SPI receive byte */ +uint8_t SdSpi::receive() { + return softSpiBus.receive(); +} +//------------------------------------------------------------------------------ +/** Soft SPI read data */ +uint8_t SdSpi::receive(uint8_t* buf, size_t n) { + for (size_t i = 0; i < n; i++) { + buf[i] = receive(); + } + return 0; +} +//------------------------------------------------------------------------------ +/** Soft SPI send byte */ +void SdSpi::send(uint8_t data) { + softSpiBus.send(data); +} +//------------------------------------------------------------------------------ +void SdSpi::send(const uint8_t* buf , size_t n) { + for (size_t i = 0; i < n; i++) { + send(buf[i]); + } +} +#endif // USE_AVR_SOFTWARE_SPI diff --git a/SdFat/SdSpiArduino.cpp b/SdFat/SdSpiArduino.cpp new file mode 100644 index 0000000..be5e3d8 --- /dev/null +++ b/SdFat/SdSpiArduino.cpp @@ -0,0 +1,70 @@ +/* Arduino SdSpi Library + * Copyright (C) 2013 by William Greiman + * + * This file is part of the Arduino SdSpi Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdSpi Library. If not, see + * . + */ +#include +#if USE_ARDUINO_SPI_LIBRARY +#include +//------------------------------------------------------------------------------ +void SdSpi::begin() { + SPI.begin(); +} +//------------------------------------------------------------------------------ +void SdSpi::init(uint8_t sckDivisor) { + SPI.setBitOrder(MSBFIRST); + SPI.setDataMode(SPI_MODE0); +#ifndef SPI_CLOCK_DIV128 + SPI.setClockDivider(sckDivisor); +#else // SPI_CLOCK_DIV128 + int v; + if (sckDivisor <= 2) v = SPI_CLOCK_DIV2; + else if (sckDivisor <= 4) v = SPI_CLOCK_DIV4; + else if (sckDivisor <= 8) v = SPI_CLOCK_DIV8; + else if (sckDivisor <= 16) v = SPI_CLOCK_DIV16; + else if (sckDivisor <= 32) v = SPI_CLOCK_DIV32; + else if (sckDivisor <= 64) v = SPI_CLOCK_DIV64; + else v = SPI_CLOCK_DIV128; + SPI.setClockDivider(v); +#endif // SPI_CLOCK_DIV128 +} +//------------------------------------------------------------------------------ +/** SPI receive a byte */ +uint8_t SdSpi::receive() { + return SPI.transfer(0XFF); +} +//------------------------------------------------------------------------------ +/** SPI receive multiple bytes */ +uint8_t SdSpi::receive(uint8_t* buf, size_t n) { + for (size_t i = 0; i < n; i++) { + buf[i] = SPI.transfer(0XFF); + } + return 0; +} +//------------------------------------------------------------------------------ +/** SPI send a byte */ +void SdSpi::send(uint8_t b) { + SPI.transfer(b); +} +//------------------------------------------------------------------------------ +/** SPI send multiple bytes */ +void SdSpi::send(const uint8_t* buf , size_t n) { + for (size_t i = 0; i < n; i++) { + SPI.transfer(buf[i]); + } +} +#endif // USE_ARDUINO_SPI_LIBRARY diff --git a/SdFat/SdSpiMK20DX128.cpp b/SdFat/SdSpiMK20DX128.cpp new file mode 100644 index 0000000..006ccd3 --- /dev/null +++ b/SdFat/SdSpiMK20DX128.cpp @@ -0,0 +1,223 @@ +/* Arduino SdSpi Library + * Copyright (C) 2013 by William Greiman + * + * This file is part of the Arduino SdSpi Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdSpi Library. If not, see + * . + */ +#include +#if USE_NATIVE_MK20DX128_SPI +// Teensy 3.0 functions +#include +// use 16-bit frame if SPI_USE_8BIT_FRAME is zero +#define SPI_USE_8BIT_FRAME 0 +// Limit initial fifo to three entries to avoid fifo overrun +#define SPI_INITIAL_FIFO_DEPTH 3 +// define some symbols that are not in mk20dx128.h +#ifndef SPI_SR_RXCTR +#define SPI_SR_RXCTR 0XF0 +#endif // SPI_SR_RXCTR +#ifndef SPI_PUSHR_CONT +#define SPI_PUSHR_CONT 0X80000000 +#endif // SPI_PUSHR_CONT +#ifndef SPI_PUSHR_CTAS +#define SPI_PUSHR_CTAS(n) (((n) & 7) << 28) +#endif // SPI_PUSHR_CTAS +//------------------------------------------------------------------------------ +/** + * initialize SPI pins + */ +void SdSpi::begin() { + SIM_SCGC6 |= SIM_SCGC6_SPI0; +} +//------------------------------------------------------------------------------ +/** + * Initialize hardware SPI + * + */ +void SdSpi::init(uint8_t sckDivisor) { + uint32_t ctar, ctar0, ctar1; + + if (sckDivisor <= 2) { + // 1/2 speed + ctar = SPI_CTAR_DBR | SPI_CTAR_BR(0) | SPI_CTAR_CSSCK(0); + } else if (sckDivisor <= 4) { + // 1/4 speed + ctar = SPI_CTAR_BR(0) | SPI_CTAR_CSSCK(0); + } else if (sckDivisor <= 8) { + // 1/8 speed + ctar = SPI_CTAR_BR(1) | SPI_CTAR_CSSCK(1); + } else if (sckDivisor <= 12) { + // 1/12 speed + ctar = SPI_CTAR_BR(2) | SPI_CTAR_CSSCK(2); + } else if (sckDivisor <= 16) { + // 1/16 speed + ctar = SPI_CTAR_BR(3) | SPI_CTAR_CSSCK(3); + } else if (sckDivisor <= 32) { + // 1/32 speed + ctar = SPI_CTAR_PBR(1) | SPI_CTAR_BR(4) | SPI_CTAR_CSSCK(4); + } else if (sckDivisor <= 64) { + // 1/64 speed + ctar = SPI_CTAR_PBR(1) | SPI_CTAR_BR(5) | SPI_CTAR_CSSCK(5); + } else { + // 1/128 speed + ctar = SPI_CTAR_PBR(1) | SPI_CTAR_BR(6) | SPI_CTAR_CSSCK(6); + } + // CTAR0 - 8 bit transfer + ctar0 = ctar | SPI_CTAR_FMSZ(7); + + // CTAR1 - 16 bit transfer + ctar1 = ctar | SPI_CTAR_FMSZ(15); + + if (SPI0_CTAR0 != ctar0 || SPI0_CTAR1 != ctar1) { + SPI0_MCR = SPI_MCR_MSTR | SPI_MCR_MDIS | SPI_MCR_HALT | SPI_MCR_PCSIS(0x1F); + SPI0_CTAR0 = ctar0; + SPI0_CTAR1 = ctar1; + } + SPI0_MCR = SPI_MCR_MSTR | SPI_MCR_PCSIS(0x1F); + CORE_PIN11_CONFIG = PORT_PCR_DSE | PORT_PCR_MUX(2); + CORE_PIN12_CONFIG = PORT_PCR_MUX(2); + CORE_PIN13_CONFIG = PORT_PCR_DSE | PORT_PCR_MUX(2); +} +//------------------------------------------------------------------------------ +/** SPI receive a byte */ +uint8_t SdSpi::receive() { + SPI0_MCR |= SPI_MCR_CLR_RXF; + SPI0_SR = SPI_SR_TCF; + SPI0_PUSHR = 0xFF; + while (!(SPI0_SR & SPI_SR_TCF)) {} + return SPI0_POPR; +} +//------------------------------------------------------------------------------ +/** SPI receive multiple bytes */ +uint8_t SdSpi::receive(uint8_t* buf, size_t n) { + // clear any data in RX FIFO + SPI0_MCR = SPI_MCR_MSTR | SPI_MCR_CLR_RXF | SPI_MCR_PCSIS(0x1F); +#if SPI_USE_8BIT_FRAME + // initial number of bytes to push into TX FIFO + int nf = n < SPI_INITIAL_FIFO_DEPTH ? n : SPI_INITIAL_FIFO_DEPTH; + for (int i = 0; i < nf; i++) { + SPI0_PUSHR = 0XFF; + } + // limit for pushing dummy data into TX FIFO + uint8_t* limit = buf + n - nf; + while (buf < limit) { + while (!(SPI0_SR & SPI_SR_RXCTR)) {} + SPI0_PUSHR = 0XFF; + *buf++ = SPI0_POPR; + } + // limit for rest of RX data + limit += nf; + while (buf < limit) { + while (!(SPI0_SR & SPI_SR_RXCTR)) {} + *buf++ = SPI0_POPR; + } +#else // SPI_USE_8BIT_FRAME + // use 16 bit frame to avoid TD delay between frames + // get one byte if n is odd + if (n & 1) { + *buf++ = receive(); + n--; + } + // initial number of words to push into TX FIFO + int nf = n/2 < SPI_INITIAL_FIFO_DEPTH ? n/2 : SPI_INITIAL_FIFO_DEPTH; + for (int i = 0; i < nf; i++) { + SPI0_PUSHR = SPI_PUSHR_CONT | SPI_PUSHR_CTAS(1) | 0XFFFF; + } + uint8_t* limit = buf + n - 2*nf; + while (buf < limit) { + while (!(SPI0_SR & SPI_SR_RXCTR)) {} + SPI0_PUSHR = SPI_PUSHR_CONT | SPI_PUSHR_CTAS(1) | 0XFFFF; + uint16_t w = SPI0_POPR; + *buf++ = w >> 8; + *buf++ = w & 0XFF; + } + // limit for rest of RX data + limit += 2*nf; + while (buf < limit) { + while (!(SPI0_SR & SPI_SR_RXCTR)) {} + uint16_t w = SPI0_POPR; + *buf++ = w >> 8; + *buf++ = w & 0XFF; + } +#endif // SPI_USE_8BIT_FRAME + return 0; +} +//------------------------------------------------------------------------------ +/** SPI send a byte */ +void SdSpi::send(uint8_t b) { + SPI0_MCR |= SPI_MCR_CLR_RXF; + SPI0_SR = SPI_SR_TCF; + SPI0_PUSHR = b; + while (!(SPI0_SR & SPI_SR_TCF)) {} +} +//------------------------------------------------------------------------------ +/** SPI send multiple bytes */ +void SdSpi::send(const uint8_t* buf , size_t n) { + // clear any data in RX FIFO + SPI0_MCR = SPI_MCR_MSTR | SPI_MCR_CLR_RXF | SPI_MCR_PCSIS(0x1F); +#if SPI_USE_8BIT_FRAME + // initial number of bytes to push into TX FIFO + int nf = n < SPI_INITIAL_FIFO_DEPTH ? n : SPI_INITIAL_FIFO_DEPTH; + // limit for pushing data into TX fifo + const uint8_t* limit = buf + n; + for (int i = 0; i < nf; i++) { + SPI0_PUSHR = *buf++; + } + // write data to TX FIFO + while (buf < limit) { + while (!(SPI0_SR & SPI_SR_RXCTR)) {} + SPI0_PUSHR = *buf++; + SPI0_POPR; + } + // wait for data to be sent + while (nf) { + while (!(SPI0_SR & SPI_SR_RXCTR)) {} + SPI0_POPR; + nf--; + } +#else // SPI_USE_8BIT_FRAME + // use 16 bit frame to avoid TD delay between frames + // send one byte if n is odd + if (n & 1) { + send(*buf++); + n--; + } + // initial number of words to push into TX FIFO + int nf = n/2 < SPI_INITIAL_FIFO_DEPTH ? n/2 : SPI_INITIAL_FIFO_DEPTH; + // limit for pushing data into TX fifo + const uint8_t* limit = buf + n; + for (int i = 0; i < nf; i++) { + uint16_t w = (*buf++) << 8; + w |= *buf++; + SPI0_PUSHR = SPI_PUSHR_CONT | SPI_PUSHR_CTAS(1) | w; + } + // write data to TX FIFO + while (buf < limit) { + uint16_t w = *buf++ << 8; + w |= *buf++; + while (!(SPI0_SR & SPI_SR_RXCTR)) {} + SPI0_PUSHR = SPI_PUSHR_CONT | SPI_PUSHR_CTAS(1) | w; + SPI0_POPR; + } + // wait for data to be sent + while (nf) { + while (!(SPI0_SR & SPI_SR_RXCTR)) {} + SPI0_POPR; + nf--; + } +#endif // SPI_USE_8BIT_FRAME +} +#endif // USE_NATIVE_MK20DX128_SPI diff --git a/SdFat/SdSpiSAM3X.cpp b/SdFat/SdSpiSAM3X.cpp new file mode 100644 index 0000000..d8f38c4 --- /dev/null +++ b/SdFat/SdSpiSAM3X.cpp @@ -0,0 +1,216 @@ +/* Arduino SdSpi Library + * Copyright (C) 2013 by William Greiman + * + * This file is part of the Arduino SdSpi Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdSpi Library. If not, see + * . + */ +#include +#if USE_NATIVE_SAM3X_SPI +/** Use SAM3X DMAC if nonzero */ +#define USE_SAM3X_DMAC 1 +/** Use extra Bus Matrix arbitration fix if nonzero */ +#define USE_SAM3X_BUS_MATRIX_FIX 0 +/** Time in ms for DMA receive timeout */ +#define SAM3X_DMA_TIMEOUT 100 +/** chip select register number */ +#define SPI_CHIP_SEL 3 +/** DMAC receive channel */ +#define SPI_DMAC_RX_CH 1 +/** DMAC transmit channel */ +#define SPI_DMAC_TX_CH 0 +/** DMAC Channel HW Interface Number for SPI TX. */ +#define SPI_TX_IDX 1 +/** DMAC Channel HW Interface Number for SPI RX. */ +#define SPI_RX_IDX 2 +//------------------------------------------------------------------------------ +/** Disable DMA Controller. */ +static void dmac_disable() { + DMAC->DMAC_EN &= (~DMAC_EN_ENABLE); +} +/** Enable DMA Controller. */ +static void dmac_enable() { + DMAC->DMAC_EN = DMAC_EN_ENABLE; +} +/** Disable DMA Channel. */ +static void dmac_channel_disable(uint32_t ul_num) { + DMAC->DMAC_CHDR = DMAC_CHDR_DIS0 << ul_num; +} +/** Enable DMA Channel. */ +static void dmac_channel_enable(uint32_t ul_num) { + DMAC->DMAC_CHER = DMAC_CHER_ENA0 << ul_num; +} +/** Poll for transfer complete. */ +static bool dmac_channel_transfer_done(uint32_t ul_num) { + return (DMAC->DMAC_CHSR & (DMAC_CHSR_ENA0 << ul_num)) ? false : true; +} +//------------------------------------------------------------------------------ +void SdSpi::begin() { + PIO_Configure( + g_APinDescription[PIN_SPI_MOSI].pPort, + g_APinDescription[PIN_SPI_MOSI].ulPinType, + g_APinDescription[PIN_SPI_MOSI].ulPin, + g_APinDescription[PIN_SPI_MOSI].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PIN_SPI_MISO].pPort, + g_APinDescription[PIN_SPI_MISO].ulPinType, + g_APinDescription[PIN_SPI_MISO].ulPin, + g_APinDescription[PIN_SPI_MISO].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PIN_SPI_SCK].pPort, + g_APinDescription[PIN_SPI_SCK].ulPinType, + g_APinDescription[PIN_SPI_SCK].ulPin, + g_APinDescription[PIN_SPI_SCK].ulPinConfiguration); + pmc_enable_periph_clk(ID_SPI0); +#if USE_SAM3X_DMAC + pmc_enable_periph_clk(ID_DMAC); + dmac_disable(); + DMAC->DMAC_GCFG = DMAC_GCFG_ARB_CFG_FIXED; + dmac_enable(); +#if USE_SAM3X_BUS_MATRIX_FIX + MATRIX->MATRIX_WPMR = 0x4d415400; + MATRIX->MATRIX_MCFG[1] = 1; + MATRIX->MATRIX_MCFG[2] = 1; + MATRIX->MATRIX_SCFG[0] = 0x01000010; + MATRIX->MATRIX_SCFG[1] = 0x01000010; + MATRIX->MATRIX_SCFG[7] = 0x01000010; +#endif // USE_SAM3X_BUS_MATRIX_FIX +#endif // USE_SAM3X_DMAC +} +//------------------------------------------------------------------------------ +// start RX DMA +static void spiDmaRX(uint8_t* dst, uint16_t count) { + dmac_channel_disable(SPI_DMAC_RX_CH); + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_SADDR = (uint32_t)&SPI0->SPI_RDR; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_DADDR = (uint32_t)dst; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_DSCR = 0; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CTRLA = count | + DMAC_CTRLA_SRC_WIDTH_BYTE | DMAC_CTRLA_DST_WIDTH_BYTE; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CTRLB = DMAC_CTRLB_SRC_DSCR | + DMAC_CTRLB_DST_DSCR | DMAC_CTRLB_FC_PER2MEM_DMA_FC | + DMAC_CTRLB_SRC_INCR_FIXED | DMAC_CTRLB_DST_INCR_INCREMENTING; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CFG = DMAC_CFG_SRC_PER(SPI_RX_IDX) | + DMAC_CFG_SRC_H2SEL | DMAC_CFG_SOD | DMAC_CFG_FIFOCFG_ASAP_CFG; + dmac_channel_enable(SPI_DMAC_RX_CH); +} +//------------------------------------------------------------------------------ +// start TX DMA +static void spiDmaTX(const uint8_t* src, uint16_t count) { + static uint8_t ff = 0XFF; + uint32_t src_incr = DMAC_CTRLB_SRC_INCR_INCREMENTING; + if (!src) { + src = &ff; + src_incr = DMAC_CTRLB_SRC_INCR_FIXED; + } + dmac_channel_disable(SPI_DMAC_TX_CH); + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_SADDR = (uint32_t)src; + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_DADDR = (uint32_t)&SPI0->SPI_TDR; + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_DSCR = 0; + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CTRLA = count | + DMAC_CTRLA_SRC_WIDTH_BYTE | DMAC_CTRLA_DST_WIDTH_BYTE; + + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CTRLB = DMAC_CTRLB_SRC_DSCR | + DMAC_CTRLB_DST_DSCR | DMAC_CTRLB_FC_MEM2PER_DMA_FC | + src_incr | DMAC_CTRLB_DST_INCR_FIXED; + + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CFG = DMAC_CFG_DST_PER(SPI_TX_IDX) | + DMAC_CFG_DST_H2SEL | DMAC_CFG_SOD | DMAC_CFG_FIFOCFG_ALAP_CFG; + + dmac_channel_enable(SPI_DMAC_TX_CH); +} +//------------------------------------------------------------------------------ +// initialize SPI controller +void SdSpi::init(uint8_t sckDivisor) { + uint8_t scbr = sckDivisor; + Spi* pSpi = SPI0; + // disable SPI + pSpi->SPI_CR = SPI_CR_SPIDIS; + // reset SPI + pSpi->SPI_CR = SPI_CR_SWRST; + // no mode fault detection, set master mode + pSpi->SPI_MR = SPI_PCS(SPI_CHIP_SEL) | SPI_MR_MODFDIS | SPI_MR_MSTR; + // mode 0, 8-bit, + pSpi->SPI_CSR[SPI_CHIP_SEL] = SPI_CSR_SCBR(scbr) | SPI_CSR_NCPHA; + // enable SPI + pSpi->SPI_CR |= SPI_CR_SPIEN; +} +//------------------------------------------------------------------------------ +static inline uint8_t spiTransfer(uint8_t b) { + Spi* pSpi = SPI0; + + pSpi->SPI_TDR = b; + while ((pSpi->SPI_SR & SPI_SR_RDRF) == 0) {} + b = pSpi->SPI_RDR; + return b; +} +//------------------------------------------------------------------------------ +/** SPI receive a byte */ +uint8_t SdSpi::receive() { + return spiTransfer(0XFF); +} +//------------------------------------------------------------------------------ +/** SPI receive multiple bytes */ +uint8_t SdSpi::receive(uint8_t* buf, size_t n) { + Spi* pSpi = SPI0; + int rtn = 0; +#if USE_SAM3X_DMAC + // clear overrun error + uint32_t s = pSpi->SPI_SR; + + spiDmaRX(buf, n); + spiDmaTX(0, n); + + uint32_t m = millis(); + while (!dmac_channel_transfer_done(SPI_DMAC_RX_CH)) { + if ((millis() - m) > SAM3X_DMA_TIMEOUT) { + dmac_channel_disable(SPI_DMAC_RX_CH); + dmac_channel_disable(SPI_DMAC_TX_CH); + rtn = 2; + break; + } + } + if (pSpi->SPI_SR & SPI_SR_OVRES) rtn |= 1; +#else // USE_SAM3X_DMAC + for (size_t i = 0; i < n; i++) { + pSpi->SPI_TDR = 0XFF; + while ((pSpi->SPI_SR & SPI_SR_RDRF) == 0) {} + buf[i] = pSpi->SPI_RDR; + } +#endif // USE_SAM3X_DMAC + return rtn; +} +//------------------------------------------------------------------------------ +/** SPI send a byte */ +void SdSpi::send(uint8_t b) { + spiTransfer(b); +} +//------------------------------------------------------------------------------ +void SdSpi::send(const uint8_t* buf , size_t n) { + Spi* pSpi = SPI0; +#if USE_SAM3X_DMAC + spiDmaTX(buf, n); + while (!dmac_channel_transfer_done(SPI_DMAC_TX_CH)) {} +#else // #if USE_SAM3X_DMAC + while ((pSpi->SPI_SR & SPI_SR_TXEMPTY) == 0) {} + for (size_t i = 0; i < n; i++) { + pSpi->SPI_TDR = buf[i]; + while ((pSpi->SPI_SR & SPI_SR_TDRE) == 0) {} + } +#endif // #if USE_SAM3X_DMAC + while ((pSpi->SPI_SR & SPI_SR_TXEMPTY) == 0) {} + // leave RDR empty + uint8_t b = pSpi->SPI_RDR; +} +#endif // USE_NATIVE_SAM3X_SPI diff --git a/SdFat/SdStream.cpp b/SdFat/SdStream.cpp new file mode 100644 index 0000000..b72ca44 --- /dev/null +++ b/SdFat/SdStream.cpp @@ -0,0 +1,151 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ + +#include + +//============================================================================== + /// @cond SHOW_PROTECTED +int16_t SdStreamBase::getch() { + uint8_t c; + int8_t s = read(&c, 1); + if (s != 1) { + if (s < 0) { + setstate(badbit); + } else { + setstate(eofbit); + } + return -1; + } + if (c != '\r' || (getmode() & ios::binary)) return c; + s = read(&c, 1); + if (s == 1 && c == '\n') return c; + if (s == 1) seekCur(-1); + return '\r'; +} +//------------------------------------------------------------------------------ +void SdStreamBase::open(const char* path, ios::openmode mode) { +uint8_t flags; + switch (mode & (app | in | out | trunc)) { + case app | in: + case app | in | out: + flags = O_RDWR | O_APPEND | O_CREAT; + break; + + case app: + case app | out: + flags = O_WRITE | O_APPEND | O_CREAT; + break; + + case in: + flags = O_READ; + break; + + case in | out: + flags = O_RDWR; + break; + + case in | out | trunc: + flags = O_RDWR | O_TRUNC | O_CREAT; + break; + + case out: + case out | trunc: + flags = O_WRITE | O_TRUNC | O_CREAT; + break; + + default: + goto fail; + } + if (mode & ios::ate) flags |= O_AT_END; + if (!SdBaseFile::open(path, flags)) goto fail; + setmode(mode); + clear(); + return; + + fail: + SdBaseFile::close(); + setstate(failbit); + return; +} +//------------------------------------------------------------------------------ +void SdStreamBase::putch(char c) { + if (c == '\n' && !(getmode() & ios::binary)) { + write('\r'); + } + write(c); + if (writeError) setstate(badbit); +} +//------------------------------------------------------------------------------ +void SdStreamBase::putstr(const char* str) { + size_t n = 0; + while (1) { + char c = str[n]; + if (c == '\0' || (c == '\n' && !(getmode() & ios::binary))) { + if (n > 0) write(str, n); + if (c == '\0') break; + write('\r'); + str += n; + n = 0; + } + n++; + } + if (writeError) setstate(badbit); +} +//------------------------------------------------------------------------------ +/** Internal do not use + * \param[in] off + * \param[in] way + */ +bool SdStreamBase::seekoff(off_type off, seekdir way) { + pos_type pos; + switch (way) { + case beg: + pos = off; + break; + + case cur: + pos = curPosition() + off; + break; + + case end: + pos = fileSize() + off; + break; + + default: + return false; + } + return seekpos(pos); +} +//------------------------------------------------------------------------------ +/** Internal do not use + * \param[in] pos + */ +bool SdStreamBase::seekpos(pos_type pos) { + return seekSet(pos); +} +//------------------------------------------------------------------------------ +int SdStreamBase::write(const void* buf, size_t n) { + return SdBaseFile::write(buf, n); +} +//------------------------------------------------------------------------------ +void SdStreamBase::write(char c) { + write(&c, 1); +} +/// @endcond diff --git a/SdFat/SdStream.h b/SdFat/SdStream.h new file mode 100644 index 0000000..191e537 --- /dev/null +++ b/SdFat/SdStream.h @@ -0,0 +1,263 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef SdStream_h +#define SdStream_h +/** + * \file + * \brief \ref fstream, \ref ifstream, and \ref ofstream classes + */ +#include +#include +//============================================================================== +/** + * \class SdStreamBase + * \brief Base class for SD streams + */ +class SdStreamBase : protected SdBaseFile, virtual public ios { + protected: + /// @cond SHOW_PROTECTED + int16_t getch(); + void putch(char c); + void putstr(const char *str); + void open(const char* path, ios::openmode mode); + /** Internal do not use + * \return mode + */ + ios::openmode getmode() {return m_mode;} + /** Internal do not use + * \param[in] mode + */ + void setmode(ios::openmode mode) {m_mode = mode;} + bool seekoff(off_type off, seekdir way); + bool seekpos(pos_type pos); + int write(const void* buf, size_t n); + void write(char c); + /// @endcond + private: + ios::openmode m_mode; +}; +//============================================================================== +/** + * \class fstream + * \brief SD file input/output stream. + */ +class fstream : public iostream, SdStreamBase { + public: + using iostream::peek; + fstream() {} + /** Constructor with open + * + * \param[in] path path to open + * \param[in] mode open mode + */ + explicit fstream(const char* path, openmode mode = in | out) { + open(path, mode); + } +#if DESTRUCTOR_CLOSES_FILE + ~fstream() {} +#endif // DESTRUCTOR_CLOSES_FILE + /** Clear state and writeError + * \param[in] state new state for stream + */ + void clear(iostate state = goodbit) { + ios::clear(state); + SdBaseFile::writeError = false; + } + /** Close a file and force cached data and directory information + * to be written to the storage device. + */ + void close() {SdBaseFile::close();} + /** Open a fstream + * \param[in] path file to open + * \param[in] mode open mode + * + * Valid open modes are (at end, ios::ate, and/or ios::binary may be added): + * + * ios::in - Open file for reading. + * + * ios::out or ios::out | ios::trunc - Truncate to 0 length, if existent, + * or create a file for writing only. + * + * ios::app or ios::out | ios::app - Append; open or create file for + * writing at end-of-file. + * + * ios::in | ios::out - Open file for update (reading and writing). + * + * ios::in | ios::out | ios::trunc - Truncate to zero length, if existent, + * or create file for update. + * + * ios::in | ios::app or ios::in | ios::out | ios::app - Append; open or + * create text file for update, writing at end of file. + */ + void open(const char* path, openmode mode = in | out) { + SdStreamBase::open(path, mode); + } + /** \return True if stream is open else false. */ + bool is_open () {return SdBaseFile::isOpen();} + + protected: + /// @cond SHOW_PROTECTED + /** Internal - do not use + * \return + */ + int16_t getch() {return SdStreamBase::getch();} + /** Internal - do not use + * \param[out] pos + */ + void getpos(FatPos_t* pos) {SdBaseFile::getpos(pos);} + /** Internal - do not use + * \param[in] c + */ + void putch(char c) {SdStreamBase::putch(c);} + /** Internal - do not use + * \param[in] str + */ + void putstr(const char *str) {SdStreamBase::putstr(str);} + /** Internal - do not use + * \param[in] pos + */ + bool seekoff(off_type off, seekdir way) { + return SdStreamBase::seekoff(off, way); + } + bool seekpos(pos_type pos) {return SdStreamBase::seekpos(pos);} + void setpos(FatPos_t* pos) {SdBaseFile::setpos(pos);} + bool sync() {return SdStreamBase::sync();} + pos_type tellpos() {return SdStreamBase::curPosition();} + /// @endcond +}; +//============================================================================== +/** + * \class ifstream + * \brief SD file input stream. + */ +class ifstream : public istream, SdStreamBase { + public: + using istream::peek; + ifstream() {} + /** Constructor with open + * \param[in] path file to open + * \param[in] mode open mode + */ + explicit ifstream(const char* path, openmode mode = in) { + open(path, mode); + } +#if DESTRUCTOR_CLOSES_FILE + ~ifstream() {} +#endif // DESTRUCTOR_CLOSES_FILE + /** Close a file and force cached data and directory information + * to be written to the storage device. + */ + void close() {SdBaseFile::close();} + /** \return True if stream is open else false. */ + bool is_open() {return SdBaseFile::isOpen();} + /** Open an ifstream + * \param[in] path file to open + * \param[in] mode open mode + * + * \a mode See fstream::open() for valid modes. + */ + void open(const char* path, openmode mode = in) { + SdStreamBase::open(path, mode | in); + } + + protected: + /// @cond SHOW_PROTECTED + /** Internal - do not use + * \return + */ + int16_t getch() {return SdStreamBase::getch();} + /** Internal - do not use + * \param[out] pos + */ + void getpos(FatPos_t* pos) {SdBaseFile::getpos(pos);} + /** Internal - do not use + * \param[in] pos + */ + bool seekoff(off_type off, seekdir way) { + return SdStreamBase::seekoff(off, way); + } + bool seekpos(pos_type pos) {return SdStreamBase::seekpos(pos);} + void setpos(FatPos_t* pos) {SdBaseFile::setpos(pos);} + pos_type tellpos() {return SdStreamBase::curPosition();} + /// @endcond +}; +//============================================================================== +/** + * \class ofstream + * \brief SD card output stream. + */ +class ofstream : public ostream, SdStreamBase { + public: + ofstream() {} + /** Constructor with open + * \param[in] path file to open + * \param[in] mode open mode + */ + explicit ofstream(const char* path, ios::openmode mode = out) { + open(path, mode); + } +#if DESTRUCTOR_CLOSES_FILE + ~ofstream() {} +#endif // DESTRUCTOR_CLOSES_FILE + /** Clear state and writeError + * \param[in] state new state for stream + */ + void clear(iostate state = goodbit) { + ios::clear(state); + SdBaseFile::writeError = false; + } + /** Close a file and force cached data and directory information + * to be written to the storage device. + */ + void close() {SdBaseFile::close();} + /** Open an ofstream + * \param[in] path file to open + * \param[in] mode open mode + * + * \a mode See fstream::open() for valid modes. + */ + void open(const char* path, openmode mode = out) { + SdStreamBase::open(path, mode | out); + } + /** \return True if stream is open else false. */ + bool is_open() {return SdBaseFile::isOpen();} + + protected: + /// @cond SHOW_PROTECTED + /** + * Internal do not use + * \param[in] c + */ + void putch(char c) {SdStreamBase::putch(c);} + void putstr(const char* str) {SdStreamBase::putstr(str);} + bool seekoff(off_type off, seekdir way) { + return SdStreamBase::seekoff(off, way); + } + bool seekpos(pos_type pos) {return SdStreamBase::seekpos(pos);} + /** + * Internal do not use + * \param[in] b + */ + bool sync() {return SdStreamBase::sync();} + pos_type tellpos() {return SdStreamBase::curPosition();} + /// @endcond +}; +//------------------------------------------------------------------------------ +#endif // SdStream_h diff --git a/SdFat/SdVolume.cpp b/SdFat/SdVolume.cpp new file mode 100644 index 0000000..61f8381 --- /dev/null +++ b/SdFat/SdVolume.cpp @@ -0,0 +1,595 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#include +//------------------------------------------------------------------------------ +#if !USE_MULTIPLE_CARDS +// raw block cache +uint8_t SdVolume::m_fatCount; // number of FATs on volume +uint32_t SdVolume::m_blocksPerFat; // FAT size in blocks +cache_t SdVolume::m_cacheBuffer; // 512 byte cache for Sd2Card +uint32_t SdVolume::m_cacheBlockNumber; // current block number +uint8_t SdVolume::m_cacheStatus; // status of cache block +#if USE_SEPARATE_FAT_CACHE +cache_t SdVolume::m_cacheFatBuffer; // 512 byte cache for FAT +uint32_t SdVolume::m_cacheFatBlockNumber; // current Fat block number +uint8_t SdVolume::m_cacheFatStatus; // status of cache Fatblock +#endif // USE_SEPARATE_FAT_CACHE +Sd2Card* SdVolume::m_sdCard; // pointer to SD card object +#endif // USE_MULTIPLE_CARDS +//------------------------------------------------------------------------------ +// find a contiguous group of clusters +bool SdVolume::allocContiguous(uint32_t count, uint32_t* curCluster) { + // start of group + uint32_t bgnCluster; + // end of group + uint32_t endCluster; + // last cluster of FAT + uint32_t fatEnd = m_clusterCount + 1; + + // flag to save place to start next search + bool setStart; + + // set search start cluster + if (*curCluster) { + // try to make file contiguous + bgnCluster = *curCluster + 1; + + // don't save new start location + setStart = false; + } else { + // start at likely place for free cluster + bgnCluster = m_allocSearchStart; + + // save next search start if no holes. + setStart = true; + } + // end of group + endCluster = bgnCluster; + + // search the FAT for free clusters + for (uint32_t n = 0;; n++, endCluster++) { + // can't find space checked all clusters + if (n >= m_clusterCount) { + DBG_FAIL_MACRO; + goto fail; + } + // past end - start from beginning of FAT + if (endCluster > fatEnd) { + bgnCluster = endCluster = 2; + } + uint32_t f; + if (!fatGet(endCluster, &f)) { + DBG_FAIL_MACRO; + goto fail; + } + + if (f != 0) { + // don't update search start if unallocated clusters before endCluster. + if (bgnCluster != endCluster) setStart = false; + // cluster in use try next cluster as bgnCluster + bgnCluster = endCluster + 1; + } else if ((endCluster - bgnCluster + 1) == count) { + // done - found space + break; + } + } + // remember possible next free cluster + if (setStart) m_allocSearchStart = endCluster + 1; + + // mark end of chain + if (!fatPutEOC(endCluster)) { + DBG_FAIL_MACRO; + goto fail; + } + // link clusters + while (endCluster > bgnCluster) { + if (!fatPut(endCluster - 1, endCluster)) { + DBG_FAIL_MACRO; + goto fail; + } + endCluster--; + } + if (*curCluster != 0) { + // connect chains + if (!fatPut(*curCluster, bgnCluster)) { + DBG_FAIL_MACRO; + goto fail; + } + } + // return first cluster number to caller + *curCluster = bgnCluster; + return true; + + fail: + return false; +} +//============================================================================== +// cache functions +#if USE_SEPARATE_FAT_CACHE +//------------------------------------------------------------------------------ +cache_t* SdVolume::cacheFetch(uint32_t blockNumber, uint8_t options) { + return cacheFetchData(blockNumber, options); +} +//------------------------------------------------------------------------------ +cache_t* SdVolume::cacheFetchData(uint32_t blockNumber, uint8_t options) { + if (m_cacheBlockNumber != blockNumber) { + if (!cacheWriteData()) { + DBG_FAIL_MACRO; + goto fail; + } + if (!(options & CACHE_OPTION_NO_READ)) { + if (!m_sdCard->readBlock(blockNumber, m_cacheBuffer.data)) { + DBG_FAIL_MACRO; + goto fail; + } + } + m_cacheStatus = 0; + m_cacheBlockNumber = blockNumber; + } + m_cacheStatus |= options & CACHE_STATUS_MASK; + return &m_cacheBuffer; + + fail: + return 0; +} +//------------------------------------------------------------------------------ +cache_t* SdVolume::cacheFetchFat(uint32_t blockNumber, uint8_t options) { + if (m_cacheFatBlockNumber != blockNumber) { + if (!cacheWriteFat()) { + DBG_FAIL_MACRO; + goto fail; + } + if (!(options & CACHE_OPTION_NO_READ)) { + if (!m_sdCard->readBlock(blockNumber, m_cacheFatBuffer.data)) { + DBG_FAIL_MACRO; + goto fail; + } + } + m_cacheFatStatus = 0; + m_cacheFatBlockNumber = blockNumber; + } + m_cacheFatStatus |= options & CACHE_STATUS_MASK; + return &m_cacheFatBuffer; + + fail: + return 0; +} +//------------------------------------------------------------------------------ +bool SdVolume::cacheSync() { + return cacheWriteData() && cacheWriteFat(); +} +//------------------------------------------------------------------------------ +bool SdVolume::cacheWriteData() { + if (m_cacheStatus & CACHE_STATUS_DIRTY) { + if (!m_sdCard->writeBlock(m_cacheBlockNumber, m_cacheBuffer.data)) { + DBG_FAIL_MACRO; + goto fail; + } + m_cacheStatus &= ~CACHE_STATUS_DIRTY; + } + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +bool SdVolume::cacheWriteFat() { + if (m_cacheFatStatus & CACHE_STATUS_DIRTY) { + if (!m_sdCard->writeBlock(m_cacheFatBlockNumber, m_cacheFatBuffer.data)) { + DBG_FAIL_MACRO; + goto fail; + } + // mirror second FAT + if (m_fatCount > 1) { + uint32_t lbn = m_cacheFatBlockNumber + m_blocksPerFat; + if (!m_sdCard->writeBlock(lbn, m_cacheFatBuffer.data)) { + DBG_FAIL_MACRO; + goto fail; + } + } + m_cacheFatStatus &= ~CACHE_STATUS_DIRTY; + } + return true; + + fail: + return false; +} +#else // USE_SEPARATE_FAT_CACHE +//------------------------------------------------------------------------------ +cache_t* SdVolume::cacheFetch(uint32_t blockNumber, uint8_t options) { + if (m_cacheBlockNumber != blockNumber) { + if (!cacheSync()) { + DBG_FAIL_MACRO; + goto fail; + } + if (!(options & CACHE_OPTION_NO_READ)) { + if (!m_sdCard->readBlock(blockNumber, m_cacheBuffer.data)) { + DBG_FAIL_MACRO; + goto fail; + } + } + m_cacheStatus = 0; + m_cacheBlockNumber = blockNumber; + } + m_cacheStatus |= options & CACHE_STATUS_MASK; + return &m_cacheBuffer; + + fail: + return 0; +} +//------------------------------------------------------------------------------ +cache_t* SdVolume::cacheFetchFat(uint32_t blockNumber, uint8_t options) { + return cacheFetch(blockNumber, options | CACHE_STATUS_FAT_BLOCK); +} +//------------------------------------------------------------------------------ +bool SdVolume::cacheSync() { + if (m_cacheStatus & CACHE_STATUS_DIRTY) { + if (!m_sdCard->writeBlock(m_cacheBlockNumber, m_cacheBuffer.data)) { + DBG_FAIL_MACRO; + goto fail; + } + // mirror second FAT + if ((m_cacheStatus & CACHE_STATUS_FAT_BLOCK) && m_fatCount > 1) { + uint32_t lbn = m_cacheBlockNumber + m_blocksPerFat; + if (!m_sdCard->writeBlock(lbn, m_cacheBuffer.data)) { + DBG_FAIL_MACRO; + goto fail; + } + } + m_cacheStatus &= ~CACHE_STATUS_DIRTY; + } + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +bool SdVolume::cacheWriteData() { + return cacheSync(); +} +#endif // USE_SEPARATE_FAT_CACHE +//------------------------------------------------------------------------------ +void SdVolume::cacheInvalidate() { + m_cacheBlockNumber = 0XFFFFFFFF; + m_cacheStatus = 0; +} +//============================================================================== +//------------------------------------------------------------------------------ +uint32_t SdVolume::clusterStartBlock(uint32_t cluster) const { + return m_dataStartBlock + ((cluster - 2) << m_clusterSizeShift); +} +//------------------------------------------------------------------------------ +// Fetch a FAT entry +bool SdVolume::fatGet(uint32_t cluster, uint32_t* value) { + uint32_t lba; + cache_t* pc; + // error if reserved cluster of beyond FAT + if (cluster < 2 || cluster > (m_clusterCount + 1)) { + DBG_FAIL_MACRO; + goto fail; + } + if (FAT12_SUPPORT && m_fatType == 12) { + uint16_t index = cluster; + index += index >> 1; + lba = m_fatStartBlock + (index >> 9); + pc = cacheFetchFat(lba, CACHE_FOR_READ); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + index &= 0X1FF; + uint16_t tmp = pc->data[index]; + index++; + if (index == 512) { + pc = cacheFetchFat(lba + 1, CACHE_FOR_READ); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + index = 0; + } + tmp |= pc->data[index] << 8; + *value = cluster & 1 ? tmp >> 4 : tmp & 0XFFF; + return true; + } + if (m_fatType == 16) { + lba = m_fatStartBlock + (cluster >> 8); + } else if (m_fatType == 32) { + lba = m_fatStartBlock + (cluster >> 7); + } else { + DBG_FAIL_MACRO; + goto fail; + } + pc = cacheFetchFat(lba, CACHE_FOR_READ); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + if (m_fatType == 16) { + *value = pc->fat16[cluster & 0XFF]; + } else { + *value = pc->fat32[cluster & 0X7F] & FAT32MASK; + } + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +// Store a FAT entry +bool SdVolume::fatPut(uint32_t cluster, uint32_t value) { + uint32_t lba; + cache_t* pc; + // error if reserved cluster of beyond FAT + if (cluster < 2 || cluster > (m_clusterCount + 1)) { + DBG_FAIL_MACRO; + goto fail; + } + if (FAT12_SUPPORT && m_fatType == 12) { + uint16_t index = cluster; + index += index >> 1; + lba = m_fatStartBlock + (index >> 9); + pc = cacheFetchFat(lba, CACHE_FOR_WRITE); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + index &= 0X1FF; + uint8_t tmp = value; + if (cluster & 1) { + tmp = (pc->data[index] & 0XF) | tmp << 4; + } + pc->data[index] = tmp; + + index++; + if (index == 512) { + lba++; + index = 0; + pc = cacheFetchFat(lba, CACHE_FOR_WRITE); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + } + tmp = value >> 4; + if (!(cluster & 1)) { + tmp = ((pc->data[index] & 0XF0)) | tmp >> 4; + } + pc->data[index] = tmp; + return true; + } + if (m_fatType == 16) { + lba = m_fatStartBlock + (cluster >> 8); + } else if (m_fatType == 32) { + lba = m_fatStartBlock + (cluster >> 7); + } else { + DBG_FAIL_MACRO; + goto fail; + } + pc = cacheFetchFat(lba, CACHE_FOR_WRITE); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + // store entry + if (m_fatType == 16) { + pc->fat16[cluster & 0XFF] = value; + } else { + pc->fat32[cluster & 0X7F] = value; + } + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +// free a cluster chain +bool SdVolume::freeChain(uint32_t cluster) { + uint32_t next; + + do { + if (!fatGet(cluster, &next)) { + DBG_FAIL_MACRO; + goto fail; + } + // free cluster + if (!fatPut(cluster, 0)) { + DBG_FAIL_MACRO; + goto fail; + } + if (cluster < m_allocSearchStart) m_allocSearchStart = cluster; + cluster = next; + } while (!isEOC(cluster)); + + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +/** Volume free space in clusters. + * + * \return Count of free clusters for success or -1 if an error occurs. + */ +int32_t SdVolume::freeClusterCount() { + uint32_t free = 0; + uint32_t lba; + uint32_t todo = m_clusterCount + 2; + uint16_t n; + + if (FAT12_SUPPORT && m_fatType == 12) { + for (unsigned i = 2; i < todo; i++) { + uint32_t c; + if (!fatGet(i, &c)) { + DBG_FAIL_MACRO; + goto fail; + } + if (c == 0) free++; + } + } else if (m_fatType == 16 || m_fatType == 32) { + lba = m_fatStartBlock; + while (todo) { + cache_t* pc = cacheFetchFat(lba++, CACHE_FOR_READ); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + n = m_fatType == 16 ? 256 : 128; + if (todo < n) n = todo; + if (m_fatType == 16) { + for (uint16_t i = 0; i < n; i++) { + if (pc->fat16[i] == 0) free++; + } + } else { + for (uint16_t i = 0; i < n; i++) { + if (pc->fat32[i] == 0) free++; + } + } + todo -= n; + } + } else { + // invalid FAT type + DBG_FAIL_MACRO; + goto fail; + } + return free; + + fail: + return -1; +} +//------------------------------------------------------------------------------ +/** Initialize a FAT volume. + * + * \param[in] dev The SD card where the volume is located. + * + * \param[in] part The partition to be used. Legal values for \a part are + * 1-4 to use the corresponding partition on a device formatted with + * a MBR, Master Boot Record, or zero if the device is formatted as + * a super floppy with the FAT boot sector in block zero. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. Reasons for + * failure include not finding a valid partition, not finding a valid + * FAT file system in the specified partition or an I/O error. + */ +bool SdVolume::init(Sd2Card* dev, uint8_t part) { + uint8_t tmp; + uint32_t totalBlocks; + uint32_t volumeStartBlock = 0; + fat32_boot_t* fbs; + cache_t* pc; + m_sdCard = dev; + m_fatType = 0; + m_allocSearchStart = 2; + m_cacheStatus = 0; // cacheSync() will write block if true + m_cacheBlockNumber = 0XFFFFFFFF; +#if USE_SEPARATE_FAT_CACHE + m_cacheFatStatus = 0; // cacheSync() will write block if true + m_cacheFatBlockNumber = 0XFFFFFFFF; +#endif // USE_SEPARATE_FAT_CACHE + // if part == 0 assume super floppy with FAT boot sector in block zero + // if part > 0 assume mbr volume with partition table + if (part) { + if (part > 4) { + DBG_FAIL_MACRO; + goto fail; + } + pc = cacheFetch(volumeStartBlock, CACHE_FOR_READ); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + part_t* p = &pc->mbr.part[part-1]; + if ((p->boot & 0X7F) != 0 || p->firstSector == 0) { + // not a valid partition + DBG_FAIL_MACRO; + goto fail; + } + volumeStartBlock = p->firstSector; + } + pc = cacheFetch(volumeStartBlock, CACHE_FOR_READ); + if (!pc) { + DBG_FAIL_MACRO; + goto fail; + } + fbs = &(pc->fbs32); + if (fbs->bytesPerSector != 512 || + fbs->fatCount == 0 || + fbs->reservedSectorCount == 0) { + // not valid FAT volume + DBG_FAIL_MACRO; + goto fail; + } + m_fatCount = fbs->fatCount; + m_blocksPerCluster = fbs->sectorsPerCluster; + + m_clusterBlockMask = m_blocksPerCluster - 1; + + // determine shift that is same as multiply by m_blocksPerCluster + m_clusterSizeShift = 0; + for (tmp = 1; m_blocksPerCluster != tmp; m_clusterSizeShift++) { + tmp <<= 1; + if (tmp == 0) { + DBG_FAIL_MACRO; + goto fail; + } + } + + m_blocksPerFat = fbs->sectorsPerFat16 ? + fbs->sectorsPerFat16 : fbs->sectorsPerFat32; + + m_fatStartBlock = volumeStartBlock + fbs->reservedSectorCount; + + // count for FAT16 zero for FAT32 + m_rootDirEntryCount = fbs->rootDirEntryCount; + + // directory start for FAT16 dataStart for FAT32 + m_rootDirStart = m_fatStartBlock + fbs->fatCount * m_blocksPerFat; + + // data start for FAT16 and FAT32 + m_dataStartBlock = m_rootDirStart + ((32 * fbs->rootDirEntryCount + 511)/512); + + // total blocks for FAT16 or FAT32 + totalBlocks = fbs->totalSectors16 ? + fbs->totalSectors16 : fbs->totalSectors32; + // total data blocks + m_clusterCount = totalBlocks - (m_dataStartBlock - volumeStartBlock); + + // divide by cluster size to get cluster count + m_clusterCount >>= m_clusterSizeShift; + + // FAT type is determined by cluster count + if (m_clusterCount < 4085) { + m_fatType = 12; + if (!FAT12_SUPPORT) { + DBG_FAIL_MACRO; + goto fail; + } + } else if (m_clusterCount < 65525) { + m_fatType = 16; + } else { + m_rootDirStart = fbs->fat32RootCluster; + m_fatType = 32; + } + return true; + + fail: + return false; +} diff --git a/SdFat/SdVolume.h b/SdFat/SdVolume.h new file mode 100644 index 0000000..d9d4dc2 --- /dev/null +++ b/SdFat/SdVolume.h @@ -0,0 +1,216 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef SdVolume_h +#define SdVolume_h +/** + * \file + * \brief SdVolume class + */ +#include +#include +#include +//============================================================================== +// SdVolume class +/** + * \brief Cache for an SD data block + */ +union cache_t { + /** Used to access cached file data blocks. */ + uint8_t data[512]; + /** Used to access cached FAT16 entries. */ + uint16_t fat16[256]; + /** Used to access cached FAT32 entries. */ + uint32_t fat32[128]; + /** Used to access cached directory entries. */ + dir_t dir[16]; + /** Used to access a cached Master Boot Record. */ + mbr_t mbr; + /** Used to access to a cached FAT boot sector. */ + fat_boot_t fbs; + /** Used to access to a cached FAT32 boot sector. */ + fat32_boot_t fbs32; + /** Used to access to a cached FAT32 FSINFO sector. */ + fat32_fsinfo_t fsinfo; +}; +//------------------------------------------------------------------------------ +/** + * \class SdVolume + * \brief Access FAT16 and FAT32 volumes on SD and SDHC cards. + */ +class SdVolume { + public: + /** Create an instance of SdVolume */ + SdVolume() : m_fatType(0) {} + /** Clear the cache and returns a pointer to the cache. Used by the WaveRP + * recorder to do raw write to the SD card. Not for normal apps. + * \return A pointer to the cache buffer or zero if an error occurs. + */ + cache_t* cacheClear() { + if (!cacheSync()) return 0; + m_cacheBlockNumber = 0XFFFFFFFF; + return &m_cacheBuffer; + } + /** Initialize a FAT volume. Try partition one first then try super + * floppy format. + * + * \param[in] dev The Sd2Card where the volume is located. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. Reasons for + * failure include not finding a valid partition, not finding a valid + * FAT file system or an I/O error. + */ + bool init(Sd2Card* dev) { return init(dev, 1) ? true : init(dev, 0);} + bool init(Sd2Card* dev, uint8_t part); + + // inline functions that return volume info + /** \return The volume's cluster size in blocks. */ + uint8_t blocksPerCluster() const {return m_blocksPerCluster;} + /** \return The number of blocks in one FAT. */ + uint32_t blocksPerFat() const {return m_blocksPerFat;} + /** \return The total number of clusters in the volume. */ + uint32_t clusterCount() const {return m_clusterCount;} + /** \return The shift count required to multiply by blocksPerCluster. */ + uint8_t clusterSizeShift() const {return m_clusterSizeShift;} + /** \return The logical block number for the start of file data. */ + uint32_t dataStartBlock() const {return clusterStartBlock(2);} + /** \return The number of FAT structures on the volume. */ + uint8_t fatCount() const {return m_fatCount;} + /** \return The logical block number for the start of the first FAT. */ + uint32_t fatStartBlock() const {return m_fatStartBlock;} + /** \return The FAT type of the volume. Values are 12, 16 or 32. */ + uint8_t fatType() const {return m_fatType;} + int32_t freeClusterCount(); + /** \return The number of entries in the root directory for FAT16 volumes. */ + uint32_t rootDirEntryCount() const {return m_rootDirEntryCount;} + /** \return The logical block number for the start of the root directory + on FAT16 volumes or the first cluster number on FAT32 volumes. */ + uint32_t rootDirStart() const {return m_rootDirStart;} + /** Sd2Card object for this volume + * \return pointer to Sd2Card object. + */ + Sd2Card* sdCard() {return m_sdCard;} + + /** Debug access to FAT table + * + * \param[in] n cluster number. + * \param[out] v value of entry + * \return true for success or false for failure + */ + bool dbgFat(uint32_t n, uint32_t* v) {return fatGet(n, v);} +//------------------------------------------------------------------------------ + private: + // Allow SdBaseFile access to SdVolume private data. + friend class SdBaseFile; +//------------------------------------------------------------------------------ + uint32_t m_allocSearchStart; // Start cluster for alloc search. + uint8_t m_blocksPerCluster; // Cluster size in blocks. + uint8_t m_clusterBlockMask; // Mask to extract block of cluster. + uint32_t m_clusterCount; // Clusters in one FAT. + uint8_t m_clusterSizeShift; // Cluster count to block count shift. + uint32_t m_dataStartBlock; // First data block number. + uint32_t m_fatStartBlock; // Start block for first FAT. + uint8_t m_fatType; // Volume type (12, 16, OR 32). + uint16_t m_rootDirEntryCount; // Number of entries in FAT16 root dir. + uint32_t m_rootDirStart; // Start block for FAT16, cluster for FAT32. +//------------------------------------------------------------------------------ +// block caches +// use of static functions save a bit of flash - maybe not worth complexity +// + static const uint8_t CACHE_STATUS_DIRTY = 1; + static const uint8_t CACHE_STATUS_FAT_BLOCK = 2; + static const uint8_t CACHE_STATUS_MASK + = CACHE_STATUS_DIRTY | CACHE_STATUS_FAT_BLOCK; + static const uint8_t CACHE_OPTION_NO_READ = 4; + // value for option argument in cacheFetch to indicate read from cache + static uint8_t const CACHE_FOR_READ = 0; + // value for option argument in cacheFetch to indicate write to cache + static uint8_t const CACHE_FOR_WRITE = CACHE_STATUS_DIRTY; + // reserve cache block with no read + static uint8_t const CACHE_RESERVE_FOR_WRITE + = CACHE_STATUS_DIRTY | CACHE_OPTION_NO_READ; +#if USE_MULTIPLE_CARDS + uint8_t m_fatCount; // number of FATs on volume + uint32_t m_blocksPerFat; // FAT size in blocks + cache_t m_cacheBuffer; // 512 byte cache for device blocks + uint32_t m_cacheBlockNumber; // Logical number of block in the cache + Sd2Card* m_sdCard; // Sd2Card object for cache + uint8_t m_cacheStatus; // status of cache block +#if USE_SEPARATE_FAT_CACHE + cache_t m_cacheFatBuffer; // 512 byte cache for FAT + uint32_t m_cacheFatBlockNumber; // current Fat block number + uint8_t m_cacheFatStatus; // status of cache Fatblock +#endif // USE_SEPARATE_FAT_CACHE +#else // USE_MULTIPLE_CARDS + static uint8_t m_fatCount; // number of FATs on volume + static uint32_t m_blocksPerFat; // FAT size in blocks + static cache_t m_cacheBuffer; // 512 byte cache for device blocks + static uint32_t m_cacheBlockNumber; // Logical number of block in the cache + static uint8_t m_cacheStatus; // status of cache block +#if USE_SEPARATE_FAT_CACHE + static cache_t m_cacheFatBuffer; // 512 byte cache for FAT + static uint32_t m_cacheFatBlockNumber; // current Fat block number + static uint8_t m_cacheFatStatus; // status of cache Fatblock +#endif // USE_SEPARATE_FAT_CACHE + static Sd2Card* m_sdCard; // Sd2Card object for cache +#endif // USE_MULTIPLE_CARDS + + cache_t *cacheAddress() {return &m_cacheBuffer;} + uint32_t cacheBlockNumber() {return m_cacheBlockNumber;} +#if USE_MULTIPLE_CARDS + cache_t* cacheFetch(uint32_t blockNumber, uint8_t options); + cache_t* cacheFetchData(uint32_t blockNumber, uint8_t options); + cache_t* cacheFetchFat(uint32_t blockNumber, uint8_t options); + void cacheInvalidate(); + bool cacheSync(); + bool cacheWriteData(); + bool cacheWriteFat(); +#else // USE_MULTIPLE_CARDS + static cache_t* cacheFetch(uint32_t blockNumber, uint8_t options); + static cache_t* cacheFetchData(uint32_t blockNumber, uint8_t options); + static cache_t* cacheFetchFat(uint32_t blockNumber, uint8_t options); + static void cacheInvalidate(); + static bool cacheSync(); + static bool cacheWriteData(); + static bool cacheWriteFat(); +#endif // USE_MULTIPLE_CARDS +//------------------------------------------------------------------------------ + bool allocContiguous(uint32_t count, uint32_t* curCluster); + uint8_t blockOfCluster(uint32_t position) const { + return (position >> 9) & m_clusterBlockMask;} + uint32_t clusterStartBlock(uint32_t cluster) const; + bool fatGet(uint32_t cluster, uint32_t* value); + bool fatPut(uint32_t cluster, uint32_t value); + bool fatPutEOC(uint32_t cluster) { + return fatPut(cluster, 0x0FFFFFFF); + } + bool freeChain(uint32_t cluster); + bool isEOC(uint32_t cluster) const { + if (FAT12_SUPPORT && m_fatType == 12) return cluster >= FAT12EOC_MIN; + if (m_fatType == 16) return cluster >= FAT16EOC_MIN; + return cluster >= FAT32EOC_MIN; + } + bool readBlock(uint32_t block, uint8_t* dst) { + return m_sdCard->readBlock(block, dst);} + bool writeBlock(uint32_t block, const uint8_t* dst) { + return m_sdCard->writeBlock(block, dst); + } +}; +#endif // SdVolume diff --git a/SdFat/StdioStream.cpp b/SdFat/StdioStream.cpp new file mode 100644 index 0000000..c80500c --- /dev/null +++ b/SdFat/StdioStream.cpp @@ -0,0 +1,535 @@ +/* Arduino RamDisk Library + * Copyright (C) 2014 by William Greiman + * + * This file is part of the Arduino RamDisk Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino RamDisk Library. If not, see + * . + */ + /** + * \file + * StdioStream implementation + */ +#include +#include +#include +//------------------------------------------------------------------------------ +int StdioStream::fclose() { + int rtn = 0; + if (!m_flags) { + return EOF; + } + if (m_flags & F_SWR) { + if (!flushBuf()) rtn = EOF; + } + if (!SdBaseFile::close()) rtn = EOF; + m_r = 0; + m_w = 0; + m_flags = 0; + return rtn; +} +//------------------------------------------------------------------------------ +int StdioStream::fflush() { + if ((m_flags & (F_SWR | F_SRW)) && !(m_flags & F_SRD)) { + if (flushBuf() && SdBaseFile::sync()) return 0; + } + return EOF; +} +//------------------------------------------------------------------------------ +char* StdioStream::fgets(char* str, int num, size_t* len) { + char* s = str; + size_t n; + if (num-- <= 0) return 0; + while (num) { + if ((n = m_r) == 0) { + if (!fillBuf()) { + if (s == str) return 0; + break; + } + n = m_r; + } + if (n > num) n = num; + uint8_t* end = reinterpret_cast(memchr(m_p, '\n', n)); + if (end != 0) { + n = ++end - m_p; + memcpy(s, m_p, n); + m_r -= n; + m_p = end; + s += n; + break; + } + memcpy(s, m_p, n); + m_r -= n; + m_p += n; + s += n; + num -= n; + } + *s = 0; + if (len) *len = s - str; + return str; +} +//------------------------------------------------------------------------------ +bool StdioStream::fopen(const char* filename, const char* mode) { + uint8_t oflags; + switch (*mode++) { + case 'a': + m_flags = F_SWR; + oflags = O_WRITE | O_CREAT | O_APPEND | O_AT_END; + break; + + case 'r': + m_flags = F_SRD; + oflags = O_READ; + break; + + case 'w': + m_flags = F_SWR; + oflags = O_WRITE | O_CREAT | O_TRUNC; + break; + + default: + goto fail; + } + while (*mode) { + switch (*mode++) { + case '+': + m_flags |= F_SRW; + oflags |= O_RDWR; + break; + + case 'b': + break; + + case 'x': + oflags |= O_EXCL; + break; + + default: + goto fail; + } + } + if ((oflags & O_EXCL) && !(oflags & O_WRITE)) goto fail; + if (!SdBaseFile::open(filename, oflags)) goto fail; + m_r = 0; + m_w = 0; + m_p = m_buf; + return true; + + fail: + m_flags = 0; + return false; +} +//------------------------------------------------------------------------------ +int StdioStream::fputs(const char* str) { + size_t len = strlen(str); + return fwrite(str, 1, len) == len ? len : EOF; +} +//------------------------------------------------------------------------------ +int StdioStream::fputs_P(PGM_P str) { + PGM_P bgn = str; + for (char c; (c = pgm_read_byte(str)); str++) { + if (putc(c) < 0) return EOF; + } + return str - bgn; +} +//------------------------------------------------------------------------------ +size_t StdioStream::fread(void* ptr, size_t size, size_t count) { + uint8_t* dst = reinterpret_cast(ptr); + size_t total = size*count; + if (total == 0) return 0; + size_t need = total; + while (need > m_r) { + memcpy(dst, m_p, m_r); + dst += m_r; + m_p += m_r; + need -= m_r; + if (!fillBuf()) { + return (total - need)/size; + } + } + memcpy(dst, m_p, need); + m_r -= need; + m_p += need; + return count; +} +//------------------------------------------------------------------------------ +int StdioStream::fseek(int32_t offset, int origin) { + int32_t pos; + if (m_flags & F_SWR) { + if (!flushBuf()) { + goto fail; + } + } + switch (origin) { + case SEEK_CUR: + pos = ftell(); + if (pos < 0) { + goto fail; + } + pos += offset; + if (!SdBaseFile::seekCur(pos)) { + goto fail; + } + break; + + case SEEK_SET: + if (!SdBaseFile::seekSet(offset)) { + goto fail; + } + break; + + case SEEK_END: + if (!SdBaseFile::seekEnd(offset)) { + goto fail; + } + break; + + default: + goto fail; + } + m_r = 0; + m_p = m_buf; + return 0; + + fail: + return EOF; +} +//------------------------------------------------------------------------------ +int32_t StdioStream::ftell() { + uint32_t pos = SdBaseFile::curPosition(); + if (m_flags & F_SRD) { + if (m_r > pos) return -1L; + pos -= m_r; + } else if (m_flags & F_SWR) { + pos += m_p - m_buf; + } + return pos; +} +//------------------------------------------------------------------------------ +size_t StdioStream::fwrite(const void* ptr, size_t size, size_t count) { + return write(ptr, count*size) < 0 ? EOF : count; +#if 0 //////////////////////////////////////////////////////////////////////////////////// + const uint8_t* src = static_cast(ptr); + size_t total = count*size; + if (total == 0) return 0; + size_t todo = total; + + while (todo > m_w) { + memcpy(m_p, src, m_w); + m_p += m_w; + src += m_w; + todo -= m_w; + if (!flushBuf()) { + return (total - todo)/size; + } + } + memcpy(m_p, src, todo); + m_p += todo; + m_w -= todo; + return count; +#endif ////////////////////////////////////////////////////////////////////////////////// +} +//------------------------------------------------------------------------------ + int StdioStream::write(const void* buf, size_t count) { + const uint8_t* src = static_cast(buf); + size_t todo = count; + + while (todo > m_w) { + memcpy(m_p, src, m_w); + m_p += m_w; + src += m_w; + todo -= m_w; + if (!flushBuf()) return EOF; + } + memcpy(m_p, src, todo); + m_p += todo; + m_w -= todo; + return count; +} +//------------------------------------------------------------------------------ +size_t StdioStream::print(const __FlashStringHelper *str) { + const char PROGMEM *p = (const char PROGMEM *)str; + uint8_t c; + while (c = pgm_read_byte(p)) { + if (putc(c) < 0) return 0; + p++; + } + return p - (const char PROGMEM *)str; +} +//------------------------------------------------------------------------------ +int StdioStream::printDec(float value, uint8_t prec) { +#define FLOAT_NEW_WAY +#ifdef FLOAT_NEW_WAY + char buf[24]; + char *ptr = fmtFloat(value, buf + sizeof(buf), prec); + // return fputs(ptr); + // uint8_t len = buf + sizeof(buf) - ptr; + return write(ptr, buf + sizeof(buf) - ptr); +#else + char* ptr; + uint8_t rtn = 0; + uint8_t sign = 0; + if (value < 0) { + value = -value; + sign = '-'; + } + // check for NaN INF OVF + if (isnan(value)) { + if (fputs_P(PSTR("nan")) < 0) return -1; + rtn += 3; + } else if (isinf(value)) { + if (fputs_P(PSTR("inf")) < 0) return -1; + rtn += 3; + } else if (value > 4294967040.0) { + if (fputs_P(PSTR("ovf")) < 0) return -1;; + rtn += 3; + } else { + if (sign) { + if (putc(sign) < 0) return -1; + rtn++; + } + if (prec > 9) prec = 9; + + /* + uint32_t s = 1; + for (uint8_t i = 0; i < prec; i++) { + // s *= 10; + s = ((s << 2) + s) << 1; + } + // round value + value += 0.5/s; + */ + value += scale10(0.5, -prec); + uint32_t whole = value; + int np; + if ((np = printDec(whole)) < 0) return -1; + rtn += np; + if (prec) { + if (putc('.') < 0) return -1; + char* str = fmtSpace(prec); + if (!str) return -1; + char* tmp = str - prec; + + // uint32_t fraction = s*(value - whole); + uint32_t fraction = scale10(value - whole, prec); + ptr = fmtDec(fraction, str); + while (ptr > tmp) *--ptr = '0'; + rtn += prec + 1; + } + } + return rtn; + #endif +} +//------------------------------------------------------------------------------ +int StdioStream::printDec(signed char n) { + uint8_t s = 0; + if (n < 0) { + if (fputc('-') < 0) return -1; + n = -n; + s = 1; + } + printDec((unsigned char)n); +} +//------------------------------------------------------------------------------ +int StdioStream::printDec(int16_t n) { + int s; + uint8_t rtn = 0; + if (n < 0) { + if (fputc('-') < 0) return -1; + n = -n; + rtn++; + } + if ((s = printDec((uint16_t)n)) < 0) return s; + return rtn; +} +//------------------------------------------------------------------------------ +int StdioStream::printDec(uint16_t n) { +#define NEW_WAY +#ifdef NEW_WAY + char buf[5]; + char *ptr = fmtDec(n, buf + sizeof(buf)); + uint8_t len = buf + sizeof(buf) - ptr; + return write(ptr, len); +#else + uint8_t len; + if (n < 100) { + len = n < 10 ? 1 : 2; + } else { + len = n < 1000 ? 3 : n < 10000 ? 4 : 5; + } + char* str = fmtSpace(len); + if (!str) return -1; + fmtDec(n, str); + return len; +#endif +} +//------------------------------------------------------------------------------ +int StdioStream::printDec(int32_t n) { + uint8_t s = 0; + if (n < 0) { + if (fputc('-') < 0) return -1; + n = -n; + s = 1; + } + int rtn = printDec((uint32_t)n); + return rtn > 0 ? rtn + s : -1; +} +//------------------------------------------------------------------------------ +int StdioStream::printDec(uint32_t n) { +#ifdef NEW_WAY + char buf[10]; + char *ptr = fmtDec(n, buf + sizeof(buf)); + uint8_t len = buf + sizeof(buf) - ptr; + return write(ptr, len); +#else + uint8_t len; + if (n < 0X10000) { + return printDec((uint16_t)n); + } + if (n < 10000000) { + len = n < 100000 ? 5 : n < 1000000 ? 6 : 7; + } else { + len = n < 100000000 ? 8 : n < 1000000000 ? 9 : 10; + } + + char* str = fmtSpace(len); + if (!str) return -1; + fmtDec(n, str); + return len; +#endif +} +//------------------------------------------------------------------------------ +int StdioStream::printHex(uint32_t n) { +#ifdef NEW_WAY + char buf[8]; + char *ptr = fmtHex(n, buf + sizeof(buf)); + uint8_t len = buf + sizeof(buf) - ptr; + return write(ptr, len); +#else + size_t len; + if (n < 0X10000) { + len = n < 0X10 ? 1 : n < 0X100 ? 2 : n < 0X1000 ? 3 : 4; + } else { + len = n < 0X100000 ? 5 : n < 0X1000000 ? 6 : n < 0X10000000 ? 7 : 8; + } + char* str = fmtSpace(len); + if (!str) return -1; + + do { + uint8_t h = n & 0XF; + *str-- = h + (h < 10 ? '0' : 'A' - 10); + n >>= 4; + } while (n); + return len; +#endif +} +//------------------------------------------------------------------------------ +bool StdioStream::rewind() { + if (m_flags & F_SWR) { + if (!flushBuf()) return false; + } + SdBaseFile::seekSet(0); + m_r = 0; + return true; +} +//------------------------------------------------------------------------------ +int StdioStream::ungetc(int c) { + // error if EOF. + if (c == EOF) return EOF; + // error if not reading. + if ((m_flags & F_SRD) == 0) return EOF; + // error if no space. + if (m_p == m_buf) return EOF; + m_r++; + m_flags &= ~F_EOF; + return *--m_p = (uint8_t)c; +} +//============================================================================== +// private +//------------------------------------------------------------------------------ +int StdioStream::fillGet() { + if (!fillBuf()) { + return EOF; + } + m_r--; + return *m_p++; +} +//------------------------------------------------------------------------------ +// private +bool StdioStream::fillBuf() { + if (!(m_flags & F_SRD)) { /////////////check for F_ERR and F_EOF ??///////////////// + if (!(m_flags & F_SRW)) { + m_flags |= F_ERR; + return false; + } + if (m_flags & F_SWR) { + if (!flushBuf()) { + return false; + } + m_flags &= ~F_SWR; + m_flags |= F_SRD; + m_w = 0; + } + } + m_p = m_buf + UNGETC_BUF_SIZE; + int nr = SdBaseFile::read(m_p, sizeof(m_buf) - UNGETC_BUF_SIZE); + if (nr <= 0) { + m_flags |= nr < 0 ? F_ERR : F_EOF; + m_r = 0; + return false; + } + m_r = nr; + return true; +} +//------------------------------------------------------------------------------ +// private +bool StdioStream::flushBuf() { + if (!(m_flags & F_SWR)) { /////////////////check for F_ERR ??//////////////////////// + if (!(m_flags & F_SRW)) { + m_flags |= F_ERR; + return false; + } + m_flags &= ~F_SRD; + m_flags |= F_SWR; + m_r = 0; + m_w = sizeof(m_buf); + m_p = m_buf; + return true; + } + uint8_t n = m_p - m_buf; + m_p = m_buf; + m_w = sizeof(m_buf); + if (SdBaseFile::write(m_buf, n) == n) return true; + m_flags |= F_ERR; + return false; +} +//------------------------------------------------------------------------------ +int StdioStream::flushPut(uint8_t c) { + if (!flushBuf()) return EOF; + m_w--; + return *m_p++ = c; +} +//------------------------------------------------------------------------------ +char* StdioStream::fmtSpace(uint8_t len) { + if (m_w < len) { + if (!flushBuf() || m_w < len) { + return 0; + } + } + if (len > m_w) return 0; + m_p += len; + m_w -= len; + return reinterpret_cast(m_p); +} + diff --git a/SdFat/StdioStream.h b/SdFat/StdioStream.h new file mode 100644 index 0000000..c6a81df --- /dev/null +++ b/SdFat/StdioStream.h @@ -0,0 +1,656 @@ +/* Arduino RamDisk Library + * Copyright (C) 2014 by William Greiman + * + * This file is part of the Arduino RamDisk Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino RamDisk Library. If not, see + * . + */ +#ifndef StdioStream_h +#define StdioStream_h +/** + * \file + * StdioStream class + */ +#include +#include +#include +#include +//------------------------------------------------------------------------------ +/** Total size of stream buffer. The entire buffer is used for output. + * During input UNGETC_BUF_SIZE of this space is reserved for ungetc. + */ +const uint8_t STREAM_BUF_SIZE = 64; +/** Amount of buffer allocated for ungetc during input. */ +const uint8_t UNGETC_BUF_SIZE = 2; +//------------------------------------------------------------------------------ +// Get rid of any macros defined in . +#include +#undef clearerr +#undef fclose +#undef feof +#undef ferror +#undef fflush +#undef fgetc +#undef fgetpos +#undef fgets +#undef fopen +#undef fprintf +#undef fputc +#undef fputs +#undef fread +#undef freopen +#undef fscanf +#undef fseek +#undef fsetpos +#undef ftell +#undef fwrite +#undef getc +#undef getchar +#undef gets +#undef perror +#undef printf +#undef putc +#undef putchar +#undef puts +#undef remove +#undef rename +#undef rewind +#undef scanf +#undef setbuf +#undef setvbuf +#undef sprintf // NOLINT +#undef sscanf +#undef tmpfile +#undef tmpnam +#undef ungetc +#undef vfprintf +#undef vprintf +#undef vsprintf + +// make sure needed macros are defined +#ifndef EOF +/** End-of-file return value. */ +#define EOF (-1) +#endif // EOF +#ifndef NULL +/** Null pointer */ +#define NULL 0 +#endif // NULL +#ifndef SEEK_CUR +/** Seek relative to current position. */ +#define SEEK_CUR 1 +#endif // SEEK_CUR +#ifndef SEEK_END +/** Seek relative to end-of-file. */ +#define SEEK_END 2 +#endif // SEEK_END +#ifndef SEEK_SET +/** Seek relative to start-of-file. */ +#define SEEK_SET 0 +#endif // SEEK_SET +//------------------------------------------------------------------------------ +/** \class StdioStream + * \brief StdioStream implements a minimal stdio stream. + * + * StdioStream does not support subdirectories or long file names. + */ +class StdioStream : private SdBaseFile { + public: + /** Constructor + * + */ + StdioStream() { + m_w = m_r = 0; + m_p = m_buf; + m_flags = 0; + } + //---------------------------------------------------------------------------- + /** Clear the stream's end-of-file and error indicators. */ + void clearerr() {m_flags &= ~(F_ERR | F_EOF);} + //---------------------------------------------------------------------------- + /** Close a stream. + * + * A successful call to the fclose function causes the stream to be + * flushed and the associated file to be closed. Any unwritten buffered + * data is written to the file; any unread buffered data is discarded. + * Whether or not the call succeeds, the stream is disassociated from + * the file. + * + * \return zero if the stream was successfully closed, or EOF if any any + * errors are detected. + */ + int fclose(); + //---------------------------------------------------------------------------- + /** Test the stream's end-of-file indicator. + * \return non-zero if and only if the end-of-file indicator is set. + */ + int feof() {return (m_flags & F_EOF) != 0;} + //---------------------------------------------------------------------------- + /** Test the stream's error indicator. + * \return return non-zero if and only if the error indicator is set. + */ + int ferror() {return (m_flags & F_ERR) != 0;} + //---------------------------------------------------------------------------- + /** Flush the stream. + * + * If stream is an output stream or an update stream in which the most + * recent operation was not input, any unwritten data is written to the + * file; otherwise the call is an error since any buffered input data + * would be lost. + * + * \return sets the error indicator for the stream and returns EOF if an + * error occurs, otherwise it returns zero. + */ + int fflush(); + //---------------------------------------------------------------------------- + /** Get a byte from the stream. + * + * \return If the end-of-file indicator for the stream is set, or if the + * stream is at end-of-file, the end-of-file indicator for the stream is + * set and the fgetc function returns EOF. Otherwise, the fgetc function + * returns the next character from the input stream. + */ + int fgetc() {return m_r-- == 0 ? fillGet() : *m_p++;} + //---------------------------------------------------------------------------- + /** Get a string from a stream. + * + * The fgets function reads at most one less than the number of + * characters specified by num from the stream into the array pointed + * to by str. No additional characters are read after a new-line + * character (which is retained) or after end-of-file. A null character + * is written immediately after the last character read into the array. + * + * \param[out] str Pointer to an array of where the string is copied. + * + * \param[in] num Maximum number of characters including the null + * character. + * + * \param[out] len If len is not null and fgets is successful, the + * length of the string is returned. + * + * \return str if successful. If end-of-file is encountered and no + * characters have been read into the array, the contents of the array + * remain unchanged and a null pointer is returned. If a read error + * occurs during the operation, the array contents are indeterminate + * and a null pointer is returned. + */ + char* fgets(char* str, int num, size_t* len = 0); + //---------------------------------------------------------------------------- + /** Open a stream. + * + * Open a file and associates the stream with it. + * + * \param[in] filename name of the file to be opened. + * + * \param[in] mode a string that indicates the open mode. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
"r" or "rb"Open a file for reading. The file must exist.
"w" or "wb"Truncate an existing to zero length or create an empty file + * for writing.
"wx" or "wbx"Create a file for writing. Fails if the file already exists.
"a" or "ab"Append; open or create file for writing at end-of-file.
"r+" or "rb+" or "r+b"Open a file for update (reading and writing).
"w+" or "w+b" or "wb+"Truncate an existing to zero length or create a file for update.
"w+x" or "w+bx" or "wb+x"Create a file for update. Fails if the file already exists.
"a+" or "a+b" or "ab+"Append; open or create a file for update, writing at end-of-file.
+ * The character 'b' shall have no effect, but is allowed for ISO C + * standard conformance. + * + * Opening a file with append mode causes all subsequent writes to the + * file to be forced to the then current end-of-file, regardless of + * intervening calls to the fseek function. + * + * When a file is opened with update mode, both input and output may be + * performed on the associated stream. However, output shall not be + * directly followed by input without an intervening call to the fflush + * function or to a file positioning function (fseek, or rewind), and + * input shall not be directly followed by output without an intervening + * call to a file positioning function, unless the input operation + * encounters endof-file. + * + * \return true for success or false for failure. + */ + bool fopen(const char* filename, const char * mode); + //---------------------------------------------------------------------------- + /** Write a byte to a stream. + * + * \param[in] c the byte to be written (converted to an unsigned char). + * + * \return Upon successful completion, fputc() returns the value it + * has written. Otherwise, it returns EOF and sets the error indicator for + * the stream. + */ + int fputc(int c) {return m_w-- == 0 ? flushPut(c) : *m_p++ = c;} + //---------------------------------------------------------------------------- + /** Write a string to a stream. + * + * \param[in] str a pointer to the string to be written. + * + * \return for success, fputs() returns a non-negative + * number. Otherwise, it returns EOF and sets the error indicator for + * the stream. + */ + int fputs(const char* str); + //---------------------------------------------------------------------------- + /** Write a string stored in flash. + * + * \param[in] str string to be written. + * + * \return for success, fputs() returns a non-negative + * number. Otherwise, it returns EOF and sets the error indicator for + * the stream. + */ + int fputs_P(PGM_P str); + //---------------------------------------------------------------------------- + /** Binary input. + * + * Reads an array of up to count elements, each one with a size of size + * bytes. + * \param[out] ptr pointer to area of at least (size*count) bytes where + * the data will be stored. + * + * \param[in] size the size, in bytes, of each element to be read. + * + * \param[in] count the number of elements to be read. + * + * \return number of elements successfully read, which may be less than + * count if a read error or end-of-file is encountered. If size or count + * is zero, fread returns zero and the contents of the array and the + * state of the stream remain unchanged. + */ + size_t fread(void* ptr, size_t size, size_t count); + //---------------------------------------------------------------------------- + /** Set the file position for the stream. + * + * \param[in] offset number of offset from the origin. + * + * \param[in] origin position used as reference for the offset. It is + * specified by one of the following constants. + * + * SEEK_SET - Beginning of file. + * + * SEEK_CUR - Current position of the file pointer. + * + * SEEK_END - End of file. + * + * \return zero for success. Otherwise, it returns non-zero and sets the + * error indicator for the stream. + */ + int fseek(int32_t offset, int origin); + //---------------------------------------------------------------------------- + /** Get the current position in a stream. + * + * \return If successful, ftell return the current value of the position + * indicator. On failure, ftell returns −1L. + */ + int32_t ftell(); + //---------------------------------------------------------------------------- + /** Binary output. + * + * Writes an array of up to count elements, each one with a size of size + * bytes. + * \param[in] ptr pointer to (size*count) bytes of data to be written. + * + * \param[in] size the size, in bytes, of each element to be written. + * + * \param[in] count the number of elements to be written. + * + * \return number of elements successfully written. if this number is + * less than count, an error has occured. If size or count is zero, + * fwrite returns zero. + */ + size_t fwrite(const void * ptr, size_t size, size_t count); + //---------------------------------------------------------------------------- + /** Get a byte from the stream. + * + * getc and fgetc are equivalent but getc is inline so it is faster but + * require more flash memory. + * + * \return If the end-of-file indicator for the stream is set, or if the + * stream is at end-of-file, the end-of-file indicator for the stream is + * set and the fgetc function returns EOF. Otherwise, the fgetc function + * returns the next character from the input stream. + */ + inline __attribute__((always_inline)) + int getc() {return m_r-- == 0 ? fillGet() : *m_p++;} + //---------------------------------------------------------------------------- + /** Write a byte to a stream. + * + * putc and fputc are equivalent but putc is inline so it is faster but + * require more flash memory. + * + * \param[in] c the byte to be written (converted to an unsigned char). + * + * \return Upon successful completion, fputc() returns the value it + * has written. Otherwise, it returns EOF and sets the error indicator for + * the stream. + */ + inline __attribute__((always_inline)) + int putc(int c) {return m_w-- == 0 ? flushPut(c) : *m_p++ = c;} + //---------------------------------------------------------------------------- + /** Write a CR/LF. + * + * \return two, the number of bytes written, for success or -1 for failure. + */ + inline __attribute__((always_inline)) + int putCRLF() { + if (m_w < 2) { + if (!flushBuf()) return -1; + } + *m_p++ = '\r'; + *m_p++ = '\n'; + m_w -= 2; + return 2; + } + //---------------------------------------------------------------------------- + /** Write a character. + * \param[in] c the character to write. + * \return the number of bytes written. + */ + size_t print(char c) { + return putc(c) < 0 ? 0 : 1; + } + //---------------------------------------------------------------------------- + /** Write a string. + * + * \param[in] str the string to be written. + * + * \return the number of bytes written. + */ + size_t print(const char* str) { + int n = fputs(str); + return n < 0 ? 0 : n; + } + //---------------------------------------------------------------------------- + /** Print a string stored in flash memory. + * + * \param[in] str the string to print. + * + * \return the number of bytes written. + */ + size_t print(const __FlashStringHelper *str); + //---------------------------------------------------------------------------- + /** Print a floating point number. + * + * \param[in] prec Number of digits after decimal point. + * + * \param[in] val the number to be printed. + * + * \return the number of bytes written. + */ + size_t print(double val, uint8_t prec = 2) { + return print(static_cast(val), prec); + } + //---------------------------------------------------------------------------- + /** Print a floating point number. + * + * \param[in] prec Number of digits after decimal point. + * + * \param[in] val the number to be printed. + * + * \return the number of bytes written. + */ + size_t print(float val, uint8_t prec = 2) { + int n = printDec(val, prec); + return n > 0 ? n : 0; + } + //---------------------------------------------------------------------------- + /** Print a number. + * + * \param[in] val the number to be printed. + * + * \return the number of bytes written. + */ + template + size_t print(T val) { + int n = printDec(val); + return n > 0 ? n : 0; + } + //---------------------------------------------------------------------------- + /** Write a CR/LF. + * + * \return two, the number of bytes written, for success or zero for failure. + */ + size_t println() { + return putCRLF() > 0 ? 2 : 0; + } + //---------------------------------------------------------------------------- + /** Print a floating point number followed by CR/LF. + * + * \param[in] val the number to be printed. + * + * \param[in] prec Number of digits after decimal point. + * + * \return the number of bytes written. + */ + size_t println(double val, uint8_t prec = 2) { + return println(static_cast(val), prec); + } + //---------------------------------------------------------------------------- + /** Print a floating point number followed by CR/LF. + * + * \param[in] val the number to be printed. + * + * \param[in] prec Number of digits after decimal point. + * + * \return the number of bytes written. + */ + size_t println(float val, uint8_t prec = 2) { + int n = printDec(val, prec); + return n > 0 && putCRLF() > 0 ? n + 2 : 0; + } + //---------------------------------------------------------------------------- + /** Print an item followed by CR/LF + * + * \param[in] val the item to be printed. + * + * \return the number of bytes written. + */ + template + size_t println(T val) { + int n = print(val); + return putCRLF() > 0 ? n + 2 : 0; + } + //---------------------------------------------------------------------------- + /** Print a char as a number. + * \param[in] n number to be printed. + * \return The number of bytes written or -1 if an error occurs. + */ + int printDec(char n) { + if (CHAR_MIN == 0) { + return printDec((unsigned char)n); + } else { + return printDec((signed char)n); + } + } + //---------------------------------------------------------------------------- + /** print a signed 8-bit integer + * \param[in] n number to be printed. + * \return The number of bytes written or -1 if an error occurs. + */ + int printDec(signed char n); + //---------------------------------------------------------------------------- + /** Print an unsigned 8-bit number. + * \param[in] n number to be print. + * \return The number of bytes written or -1 if an error occurs. + */ + int printDec(unsigned char n) { + return printDec((uint16_t)n); + } + //---------------------------------------------------------------------------- + /** Print a int16_t + * \param[in] n number to be printed. + * \return The number of bytes written or -1 if an error occurs. + */ + int printDec(int16_t n); + //---------------------------------------------------------------------------- + /** print a uint16_t. + * \param[in] n number to be printed. + * \return The number of bytes written or -1 if an error occurs. + */ + int printDec(uint16_t n); + //---------------------------------------------------------------------------- + /** Print a signed 32-bit integer. + * \param[in] n number to be printed. + * \return The number of bytes written or -1 if an error occurs. + */ + int printDec(int32_t n); + //---------------------------------------------------------------------------- + /** Write an unsigned 32-bit number. + * \param[in] n number to be printed. + * \return The number of bytes written or -1 if an error occurs. + */ + int printDec(uint32_t n); + //---------------------------------------------------------------------------- + /** Print a double. + * \param[in] value The number to be printed. + * \param[in] prec Number of digits after decimal point. + * \return The number of bytes written or -1 if an error occurs. + */ + int printDec(double value, uint8_t prec) { + return printDec(static_cast(value), prec); + } + //---------------------------------------------------------------------------- + /** Print a float. + * \param[in] value The number to be printed. + * \param[in] prec Number of digits after decimal point. + * \return The number of bytes written or -1 if an error occurs. + */ + int printDec(float value, uint8_t prec); + //---------------------------------------------------------------------------- +/** Print a number followed by a field terminator. + * \param[in] value The number to be printed. + * \param[in] term The field terminator. + * \param[in] prec Number of digits after decimal point. + * \return The number of bytes written or -1 if an error occurs. + */ + int printField(double value, char term, uint8_t prec = 2) { + return printField(static_cast(value), term, prec) > 0; + } + //---------------------------------------------------------------------------- +/** Print a number followed by a field terminator. + * \param[in] value The number to be printed. + * \param[in] term The field terminator. + * \param[in] prec Number of digits after decimal point. + * \return The number of bytes written or -1 if an error occurs. + */ + int printField(float value, char term, uint8_t prec = 2) { + int rtn = printDec(value, prec); + return rtn < 0 || putc(term) < 0 ? -1 : rtn + 1; + } + //---------------------------------------------------------------------------- +/** Print a number followed by a field terminator. + * \param[in] value The number to be printed. + * \param[in] term The field terminator. + * \return The number of bytes written or -1 if an error occurs. + */ + template + int printField(T value, char term) { + int rtn = printDec(value); + return rtn < 0 || putc(term) < 0 ? -1 : rtn + 1; + } + //---------------------------------------------------------------------------- + /** Print HEX + * \param[in] n number to be printed as HEX. + * + * \return The number of bytes written or -1 if an error occurs. + */ + int printHex(uint32_t n); + //---------------------------------------------------------------------------- + /** Print HEX with CRLF + * \param[in] n number to be printed as HEX. + * + * \return The number of bytes written or -1 if an error occurs. + */ + int printHexln(uint32_t n) { + int rtn = printHex(n); + return rtn < 0 || putCRLF() != 2 ? -1 : rtn + 2; + } + //---------------------------------------------------------------------------- + /** Set position of a stream to the beginning. + * + * The rewind function sets the file position to the beginning of the + * file. It is equivalent to fseek(0L, SEEK_SET) except that the error + * indicator for the stream is also cleared. + * + * \return true for success or false for failure. + */ + bool rewind(); + //---------------------------------------------------------------------------- + /** Push a byte back into an input stream. + * + * \param[in] c the byte (converted to an unsigned char) to be pushed back. + * + * One character of pushback is guaranteed. If the ungetc function is + * called too many times without an intervening read or file positioning + * operation on that stream, the operation may fail. + * + * A successful intervening call to a file positioning function (fseek, + * fsetpos, or rewind) discards any pushed-back characters for the stream. + * + * \return Upon successful completion, ungetc() returns the byte pushed + * back after conversion. Otherwise it returns EOF. + */ + int ungetc(int c); + //============================================================================ + private: + bool fillBuf(); + int fillGet(); + bool flushBuf(); + int flushPut(uint8_t c); + char* fmtSpace(uint8_t len); + int write(const void* buf, size_t count); + //---------------------------------------------------------------------------- + // F_SRD and F_WR are never simultaneously asserted + static const uint8_t F_SRD = 0x01; // OK to read + static const uint8_t F_SWR = 0x02; // OK to write + static const uint8_t F_SRW = 0x04; // open for reading & writing + static const uint8_t F_EOF = 0x10; // found EOF + static const uint8_t F_ERR = 0x20; // found error + //---------------------------------------------------------------------------- + uint8_t m_flags; + uint8_t* m_p; + uint8_t m_r; + uint8_t m_w; + uint8_t m_buf[STREAM_BUF_SIZE]; +}; +//------------------------------------------------------------------------------ +#endif // StdioStream_h diff --git a/SdFat/bufstream.h b/SdFat/bufstream.h new file mode 100644 index 0000000..2c288c7 --- /dev/null +++ b/SdFat/bufstream.h @@ -0,0 +1,146 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef bufstream_h +#define bufstream_h +/** + * \file + * \brief \ref ibufstream and \ref obufstream classes + */ +#include +//============================================================================== +/** + * \class ibufstream + * \brief parse a char string + */ +class ibufstream : public istream { + public: + /** Constructor */ + ibufstream() : m_buf(0), m_len(0) {} + /** Constructor + * \param[in] str pointer to string to be parsed + * Warning: The string will not be copied so must stay in scope. + */ + explicit ibufstream(const char* str) { + init(str); + } + /** Initialize an ibufstream + * \param[in] str pointer to string to be parsed + * Warning: The string will not be copied so must stay in scope. + */ + void init(const char* str) { + m_buf = str; + m_len = strlen(m_buf); + m_pos = 0; + clear(); + } + + protected: + /// @cond SHOW_PROTECTED + int16_t getch() { + if (m_pos < m_len) return m_buf[m_pos++]; + setstate(eofbit); + return -1; + } + void getpos(FatPos_t *pos) { + pos->position = m_pos; + } + bool seekoff(off_type off, seekdir way) {return false;} + bool seekpos(pos_type pos) { + if (pos < m_len) { + m_pos = pos; + return true; + } + return false; + } + void setpos(FatPos_t *pos) { + m_pos = pos->position; + } + pos_type tellpos() { + return m_pos; + } + /// @endcond + private: + const char* m_buf; + size_t m_len; + size_t m_pos; +}; +//============================================================================== +/** + * \class obufstream + * \brief format a char string + */ +class obufstream : public ostream { + public: + /** constructor */ + obufstream() : m_in(0) {} + /** Constructor + * \param[in] buf buffer for formatted string + * \param[in] size buffer size + */ + obufstream(char *buf, size_t size) { + init(buf, size); + } + /** Initialize an obufstream + * \param[in] buf buffer for formatted string + * \param[in] size buffer size + */ + void init(char *buf, size_t size) { + m_buf = buf; + buf[0] = '\0'; + m_size = size; + m_in = 0; + } + /** \return a pointer to the buffer */ + char* buf() {return m_buf;} + /** \return the length of the formatted string */ + size_t length() {return m_in;} + + protected: + /// @cond SHOW_PROTECTED + void putch(char c) { + if (m_in >= (m_size - 1)) { + setstate(badbit); + return; + } + m_buf[m_in++] = c; + m_buf[m_in]= '\0'; + } + void putstr(const char *str) { + while (*str) putch(*str++); + } + bool seekoff(off_type off, seekdir way) {return false;} + bool seekpos(pos_type pos) { + if (pos > m_in) return false; + m_in = pos; + m_buf[m_in] = '\0'; + return true; + } + bool sync() {return true;} + + pos_type tellpos() { + return m_in; + } + /// @endcond + private: + char *m_buf; + size_t m_size; + size_t m_in; +}; +#endif // bufstream_h diff --git a/SdFat/examples/#attic/AnalogLogger/AnalogLogger.ino b/SdFat/examples/#attic/AnalogLogger/AnalogLogger.ino new file mode 100644 index 0000000..ae25f84 --- /dev/null +++ b/SdFat/examples/#attic/AnalogLogger/AnalogLogger.ino @@ -0,0 +1,172 @@ +// A simple data logger for the Arduino analog pins with optional DS1307 +// uses RTClib from https://github.com/adafruit/RTClib +#include +#include // define FreeRam() + +#define SD_CHIP_SELECT SS // SD chip select pin +#define USE_DS1307 0 // set nonzero to use DS1307 RTC +#define LOG_INTERVAL 1000 // mills between entries +#define SENSOR_COUNT 3 // number of analog pins to log +#define ECHO_TO_SERIAL 1 // echo data to serial port if nonzero +#define WAIT_TO_START 1 // Wait for serial input in setup() +#define ADC_DELAY 10 // ADC delay for high impedence sensors + +// file system object +SdFat sd; + +// text file for logging +ofstream logfile; + +// Serial print stream +ArduinoOutStream cout(Serial); + +// buffer to format data - makes it eaiser to echo to Serial +char buf[80]; +//------------------------------------------------------------------------------ +#if SENSOR_COUNT > 6 +#error SENSOR_COUNT too large +#endif // SENSOR_COUNT +//------------------------------------------------------------------------------ +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) +//------------------------------------------------------------------------------ +#if USE_DS1307 +// use RTClib from Adafruit +// https://github.com/adafruit/RTClib + +// The Arduino IDE has a bug that causes Wire and RTClib to be loaded even +// if USE_DS1307 is false. + +#error remove this line and uncomment the next two lines. +//#include +//#include +RTC_DS1307 RTC; // define the Real Time Clock object +//------------------------------------------------------------------------------ +// call back for file timestamps +void dateTime(uint16_t* date, uint16_t* time) { + DateTime now = RTC.now(); + + // return date using FAT_DATE macro to format fields + *date = FAT_DATE(now.year(), now.month(), now.day()); + + // return time using FAT_TIME macro to format fields + *time = FAT_TIME(now.hour(), now.minute(), now.second()); +} +//------------------------------------------------------------------------------ +// format date/time +ostream& operator << (ostream& os, DateTime& dt) { + os << dt.year() << '/' << int(dt.month()) << '/' << int(dt.day()) << ','; + os << int(dt.hour()) << ':' << setfill('0') << setw(2) << int(dt.minute()); + os << ':' << setw(2) << int(dt.second()) << setfill(' '); + return os; +} +#endif // USE_DS1307 +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + while (!Serial){} // wait for Leonardo + + // pstr stores strings in flash to save RAM + cout << endl << pstr("FreeRam: ") << FreeRam() << endl; + +#if WAIT_TO_START + cout << pstr("Type any character to start\n"); + while (Serial.read() <= 0) {} + delay(400); // catch Due reset problem +#endif // WAIT_TO_START + +#if USE_DS1307 + // connect to RTC + Wire.begin(); + if (!RTC.begin()) error("RTC failed"); + + // set date time callback function + SdFile::dateTimeCallback(dateTime); + DateTime now = RTC.now(); + cout << now << endl; +#endif // USE_DS1307 + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + if (!sd.begin(SD_CHIP_SELECT, SPI_HALF_SPEED)) sd.initErrorHalt(); + + // create a new file in root, the current working directory + char name[] = "LOGGER00.CSV"; + + for (uint8_t i = 0; i < 100; i++) { + name[6] = i/10 + '0'; + name[7] = i%10 + '0'; + if (sd.exists(name)) continue; + logfile.open(name); + break; + } + if (!logfile.is_open()) error("file.open"); + + cout << pstr("Logging to: ") << name << endl; + cout << pstr("Type any character to stop\n\n"); + + // format header in buffer + obufstream bout(buf, sizeof(buf)); + + bout << pstr("millis"); + +#if USE_DS1307 + bout << pstr(",date,time"); +#endif // USE_DS1307 + + for (uint8_t i = 0; i < SENSOR_COUNT; i++) { + bout << pstr(",sens") << int(i); + } + logfile << buf << endl; + +#if ECHO_TO_SERIAL + cout << buf << endl; +#endif // ECHO_TO_SERIAL +} +//------------------------------------------------------------------------------ +void loop() { + uint32_t m; + + // wait for time to be a multiple of interval + do { + m = millis(); + } while (m % LOG_INTERVAL); + + // use buffer stream to format line + obufstream bout(buf, sizeof(buf)); + + // start with time in millis + bout << m; + +#if USE_DS1307 + DateTime now = RTC.now(); + bout << ',' << now; +#endif // USE_DS1307 + + // read analog pins and format data + for (uint8_t ia = 0; ia < SENSOR_COUNT; ia++) { +#if ADC_DELAY + analogRead(ia); + delay(ADC_DELAY); +#endif // ADC_DELAY + bout << ',' << analogRead(ia); + } + bout << endl; + + // log data and flush to SD + logfile << buf << flush; + + // check for error + if (!logfile) error("write data failed"); + +#if ECHO_TO_SERIAL + cout << buf; +#endif // ECHO_TO_SERIAL + + // don't log two points in the same millis + if (m == millis()) delay(1); + + if (!Serial.available()) return; + logfile.close(); + cout << pstr("Done!"); + while (1); +} diff --git a/SdFat/examples/#attic/HelloWorld/HelloWorld.ino b/SdFat/examples/#attic/HelloWorld/HelloWorld.ino new file mode 100644 index 0000000..50b3368 --- /dev/null +++ b/SdFat/examples/#attic/HelloWorld/HelloWorld.ino @@ -0,0 +1,15 @@ +#include + +// create a serial output stream +ArduinoOutStream cout(Serial); + +void setup() { + Serial.begin(9600); + + while (!Serial) {} // wait for Leonardo + delay(2000); + + cout << "Hello, World!\n"; +} + +void loop() {} diff --git a/SdFat/examples/#attic/MiniSerial/MiniSerial.ino b/SdFat/examples/#attic/MiniSerial/MiniSerial.ino new file mode 100644 index 0000000..378e937 --- /dev/null +++ b/SdFat/examples/#attic/MiniSerial/MiniSerial.ino @@ -0,0 +1,18 @@ +// This example illustrates use of SdFat's +// minimal unbuffered AVR Serial support. +// +// This is useful for debug and saves RAM +// Will not work on Due, Leonardo, or Teensy +#include +#include +#ifndef UDR0 +#error no AVR serial port0 +#endif +void setup() { + MiniSerial.begin(9600); + MiniSerial.println(FreeRam()); + MiniSerial.println(F("Type any Character")); + while(MiniSerial.read() < 0) {} + MiniSerial.println(F("Done")); +} +void loop() {} diff --git a/SdFat/examples/#attic/PrintBenchmarkSD/PrintBenchmarkSD.ino b/SdFat/examples/#attic/PrintBenchmarkSD/PrintBenchmarkSD.ino new file mode 100644 index 0000000..a50f7a3 --- /dev/null +++ b/SdFat/examples/#attic/PrintBenchmarkSD/PrintBenchmarkSD.ino @@ -0,0 +1,113 @@ +/* + * This sketch is a simple Print benchmark. + */ +#include +#include + +// SD chip select pin +const uint8_t chipSelect = SS; + +// number of lines to print +const uint16_t N_PRINT = 20000; + + +// test file +File file; + +//------------------------------------------------------------------------------ +void error(char* s) { + Serial.println(s); + while(1); +} +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + while (!Serial) { + // wait for Leonardo + } +} +//------------------------------------------------------------------------------ +void loop() { + uint32_t maxLatency; + uint32_t minLatency; + uint32_t totalLatency; + + while (Serial.read() >= 0) { + } + // pstr stores strings in flash to save RAM + Serial.println(F("Type any character to start")); + while (Serial.read() <= 0) { + } + delay(400); // catch Due reset problem + + + // initialize the SD card + + if (!SD.begin(chipSelect)) error("begin"); + + + Serial.println(F("Starting print test. Please wait.\n")); + + // do write test + for (int test = 0; test < 2; test++) { + file = SD.open("BENCH.TXT", FILE_WRITE); + + if (!file) error("open failed"); + switch(test) { + case 0: + Serial.println(F("Test of println(uint16_t)")); + break; + + case 1: + Serial.println(F("Test of println(double)")); + break; + } + maxLatency = 0; + minLatency = 999999; + totalLatency = 0; + uint32_t t = millis(); + for (uint16_t i = 0; i < N_PRINT; i++) { + uint32_t m = micros(); + + switch(test) { + case 0: + file.println(i); + break; + + case 1: + file.println((double)0.01*i); + break; + } + +// if (file.writeError) { +// error("write failed"); +// } + m = micros() - m; + if (maxLatency < m) maxLatency = m; + if (minLatency > m) minLatency = m; + totalLatency += m; + } + file.flush(); + t = millis() - t; + double s = file.size(); + Serial.print(F("Time ")); + Serial.print(0.001*t); + Serial.println(F(" sec")); + Serial.print(F("File size ")); + Serial.print(0.001*s); + Serial.print(F(" KB\n")); + Serial.print(F("Write ")); + Serial.print(s/t); + Serial.print(F(" KB/sec\n")); + Serial.print(F("Maximum latency: ")); + Serial.print(maxLatency); + Serial.print(F(" usec, Minimum Latency: ")); + Serial.print(minLatency); + Serial.print(F(" usec, Avg Latency: ")); + Serial.print(totalLatency/N_PRINT); + Serial.println(F(" usec\n")); + SD.remove("BENCH.TXT"); + } + file.close(); + Serial.println(F("Done!\n")); +} \ No newline at end of file diff --git a/SdFat/examples/#attic/SD_Size/SD_Size.ino b/SdFat/examples/#attic/SD_Size/SD_Size.ino new file mode 100644 index 0000000..6d33a7a --- /dev/null +++ b/SdFat/examples/#attic/SD_Size/SD_Size.ino @@ -0,0 +1,26 @@ +/* + * Sketch to compare size of Arduino SD library with SdFat V2. + * See SdFatSize.pde for SdFat sketch. + */ +#include +#include + +File file; +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + + if (!SD.begin()) { + Serial.println("begin failed"); + return; + } + file = SD.open("TEST_SD.TXT", FILE_WRITE); + + file.println("Hello"); + + file.close(); + Serial.println("Done"); +} +//------------------------------------------------------------------------------ +void loop() {} diff --git a/SdFat/examples/#attic/SdFatSize/SdFatSize.ino b/SdFat/examples/#attic/SdFatSize/SdFatSize.ino new file mode 100644 index 0000000..da73d63 --- /dev/null +++ b/SdFat/examples/#attic/SdFatSize/SdFatSize.ino @@ -0,0 +1,28 @@ +/* + * Sketch to compare size of SdFat V2 with Arduino SD library. + * See SD_Size.pde for Arduino SD sketch. + * + */ +#include + +SdFat sd; + +SdFile file; +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + + if (!sd.begin()) { + Serial.println("begin failed"); + return; + } + file.open("SIZE_TST.TXT", O_RDWR | O_CREAT | O_AT_END); + + file.println("Hello"); + + file.close(); + Serial.println("Done"); +} +//------------------------------------------------------------------------------ +void loop() {} diff --git a/SdFat/examples/#attic/TestMkdirRmdir/TestMkdirRmdir.ino b/SdFat/examples/#attic/TestMkdirRmdir/TestMkdirRmdir.ino new file mode 100644 index 0000000..f5e57d5 --- /dev/null +++ b/SdFat/examples/#attic/TestMkdirRmdir/TestMkdirRmdir.ino @@ -0,0 +1,135 @@ +/* + * This sketch is a test of subdirectory and file creation. + * It also tests allocation of clusters to directories. + * + * It will create two subdirectories and create enough files + * to force the allocation of a cluster to each directory. + * + * More than 3000 files may be created on a FAT32 volume. + * + * Note: Some cards may 'stutter' others just get slow due + * to the number of flash erases this program causes. + */ +#include +#include + +const uint8_t SD_CHIP_SELECT = SS; + +SdFat sd; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) + +/* + * create enough files to force a cluster to be allocated to dir. + */ +void dirAllocTest(SdBaseFile* dir) { + char buf[13], name[13]; + SdFile file; + uint16_t n; + uint32_t size = dir->fileSize(); + + // create files and write name to file + for (n = 0; ; n++){ + // make file name + sprintf(name, "%u.TXT", n); + + // open start time + uint32_t t0 = millis(); + if (!file.open(dir, name, O_WRITE | O_CREAT | O_EXCL)) { + error("open for write failed"); + } + + // open end time and write start time + uint32_t t1 = millis(); + // write file name to file + file.print(name); + if (!file.close()) error("close write"); + + // write end time + uint32_t t2 = millis(); + PgmPrint("WR "); + Serial.print(n); + Serial.write(' '); + + // print time to create file + Serial.print(t1 - t0); + Serial.write(' '); + + // print time to write file + Serial.println(t2 - t1); + + // directory size will change when a cluster is added + if (dir->fileSize() != size) break; + } + + // read files and check content + for (uint16_t i = 0; i <= n; i++) { + sprintf(name, "%u.TXT", i); + + // open start time + uint32_t t0 = millis(); + if (!file.open(dir, name, O_READ)) { + error("open for read failed"); + } + + // open end time and read start time + uint32_t t1 = millis(); + int16_t nr = file.read(buf, 13); + if (nr < 5) error("file.read failed"); + + // read end time + uint32_t t2 = millis(); + + // check file content + if (strlen(name) != nr || strncmp(name, buf, nr)) { + error("content compare failed"); + } + if (!file.close()) error("close read failed"); + + PgmPrint("RD "); + Serial.print(i); + Serial.write(' '); + + // print open time + Serial.print(t1 - t0); + Serial.write(' '); + + // print read time + Serial.println(t2 - t1); + } +} + +void setup() { + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + PgmPrintln("Type any character to start"); + while (Serial.read() <= 0) {} + delay(200); // Catch Due reset problem + + // initialize the SD card at SPI_FULL_SPEED for best performance. + // try SPI_HALF_SPEED if bus errors occur. + if (!sd.begin(SD_CHIP_SELECT, SPI_FULL_SPEED)) sd.initErrorHalt(); + + // write files to root if FAT32 + if (sd.vol()->fatType() == 32) { + PgmPrintln("Writing files to root"); + dirAllocTest(sd.vwd()); + } + + // create sub1 and write files + SdFile sub1; + if (!sub1.makeDir(sd.vwd(), "SUB1")) error("makdeDir SUB1 failed"); + PgmPrintln("Writing files to SUB1"); + dirAllocTest(&sub1); + + // create sub2 and write files + SdFile sub2; + if (!sub2.makeDir(&sub1, "SUB2")) error("makeDir SUB2 failed"); + PgmPrintln("Writing files to SUB2"); + dirAllocTest(&sub2); + + PgmPrintln("Done"); +} + +void loop() { } diff --git a/SdFat/examples/#attic/append/append.ino b/SdFat/examples/#attic/append/append.ino new file mode 100644 index 0000000..d97d010 --- /dev/null +++ b/SdFat/examples/#attic/append/append.ino @@ -0,0 +1,63 @@ +/* + * Append Example + * + * This sketch shows how to use open for append. + * The sketch will append 100 line each time it opens the file. + * The sketch will open and close the file 100 times. + */ +#include + +// SD chip select pin +const uint8_t chipSelect = SS; + +// file system object +SdFat sd; + +// create Serial stream +ArduinoOutStream cout(Serial); + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) +//------------------------------------------------------------------------------ +void setup() { + // filename for this example + char name[] = "APPEND.TXT"; + + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + + // pstr() stores strings in flash to save RAM + cout << endl << pstr("Type any character to start\n"); + while (Serial.read() <= 0) {} + delay(400); // Catch Due reset problem + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt(); + + cout << pstr("Appending to: ") << name; + + for (uint8_t i = 0; i < 100; i++) { + // open stream for append + ofstream sdout(name, ios::out | ios::app); + if (!sdout) error("open failed"); + + // append 100 lines to the file + for (uint8_t j = 0; j < 100; j++) { + // use int() so byte will print as decimal number + sdout << "line " << int(j) << " of pass " << int(i); + sdout << " millis = " << millis() << endl; + } + // close the stream + sdout.close(); + + if (!sdout) error("append data failed"); + + // output progress indicator + if (i % 25 == 0) cout << endl; + cout << '.'; + } + cout << endl << "Done" << endl; +} +//------------------------------------------------------------------------------ +void loop() {} diff --git a/SdFat/examples/#attic/average/average.ino b/SdFat/examples/#attic/average/average.ino new file mode 100644 index 0000000..64a0efe --- /dev/null +++ b/SdFat/examples/#attic/average/average.ino @@ -0,0 +1,70 @@ +/* + * Calculate the sum and average of a list of floating point numbers + */ +#include + +// SD chip select pin +const uint8_t chipSelect = SS; + +// object for the SD file system +SdFat sd; + +// define a serial output stream +ArduinoOutStream cout(Serial); +//------------------------------------------------------------------------------ +void writeTestFile() { + // open the output file + ofstream sdout("AVG_TEST.TXT"); + + // write a series of float numbers + for (int16_t i = -1001; i < 2000; i += 13) { + sdout << 0.1 * i << endl; + } + if (!sdout) sd.errorHalt("sdout failed"); + + sdout.close(); +} +//------------------------------------------------------------------------------ +void calcAverage() { + uint16_t n = 0; // count of input numbers + double num; // current input number + double sum = 0; // sum of input numbers + + // open the input file + ifstream sdin("AVG_TEST.TXT"); + + // check for an open failure + if (!sdin) sd.errorHalt("sdin failed"); + + // read and sum the numbers + while (sdin >> num) { + n++; + sum += num; + } + + // print the results + cout << "sum of " << n << " numbers = " << sum << endl; + cout << "average = " << sum/n << endl; +} +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + + // pstr stores strings in flash to save RAM + cout << pstr("Type any character to start\n"); + while (Serial.read() <= 0) {} + delay(400); // Catch Due reset problem + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt(); + + // write the test file + writeTestFile(); + + // read the test file and calculate the average + calcAverage(); +} +//------------------------------------------------------------------------------ +void loop() {} diff --git a/SdFat/examples/#attic/benchSD/benchSD.ino b/SdFat/examples/#attic/benchSD/benchSD.ino new file mode 100644 index 0000000..88a3dfa --- /dev/null +++ b/SdFat/examples/#attic/benchSD/benchSD.ino @@ -0,0 +1,133 @@ +/* + * This sketch is a simple binary write/read benchmark + * for the standard Arduino SD.h library. + */ +#include +#include + + +// SD chip select pin +const uint8_t chipSelect = SS; + +#define FILE_SIZE_MB 5 +#define FILE_SIZE (1000000UL*FILE_SIZE_MB) +#define BUF_SIZE 100 + +uint8_t buf[BUF_SIZE]; + + +// test file +File file; + +//------------------------------------------------------------------------------ +void error(char* s) { + Serial.println(s); + while(1); +} +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + while (!Serial){} // wait for Leonardo +} +//------------------------------------------------------------------------------ +void loop() { + uint32_t maxLatency; + uint32_t minLatency; + uint32_t totalLatency; + + // discard any input + while (Serial.read() >= 0) {} + + // pstr stores strings in flash to save RAM + Serial.println(F("Type any character to start")); + while (Serial.read() <= 0) {} + delay(400); // catch Due reset problem + + if (!SD.begin(chipSelect)) error("begin"); + + // open or create file - truncate existing file. + file = SD.open("BENCH.DAT", FILE_WRITE | O_TRUNC); +// file = SD.open("BENCH.DAT", O_CREAT | O_TRUNC | O_CREAT); + if (!file) { + error("open failed"); + } + + // fill buf with known data + for (uint16_t i = 0; i < (BUF_SIZE-2); i++) { + buf[i] = 'A' + (i % 26); + } + buf[BUF_SIZE-2] = '\r'; + buf[BUF_SIZE-1] = '\n'; + + Serial.print(F("File size ")); + Serial.print(FILE_SIZE_MB); + Serial.println(F("MB")); + Serial.print(F("Buffer size ")); + Serial.print(BUF_SIZE); + Serial.println(F(" bytes")); + Serial.println(F("Starting write test. Please wait up to a minute")); + + // do write test + uint32_t n = FILE_SIZE/sizeof(buf); + maxLatency = 0; + minLatency = 999999; + totalLatency = 0; + uint32_t t = millis(); + for (uint32_t i = 0; i < n; i++) { + uint32_t m = micros(); + if (file.write(buf, sizeof(buf)) != sizeof(buf)) { + error("write failed"); + } + m = micros() - m; + if (maxLatency < m) maxLatency = m; + if (minLatency > m) minLatency = m; + totalLatency += m; + } + file.flush(); + t = millis() - t; + double s = file.size(); + Serial.print(F("Write ")); + Serial.print(s/t); + Serial.print(F(" KB/sec\n")); + Serial.print(F("Maximum latency: ")); + Serial.print(maxLatency); + Serial.print(F(" usec, Minimum Latency: ")); + Serial.print(minLatency); + Serial.print(F(" usec, Avg Latency: ")); + Serial.print(totalLatency/n); + Serial.print(F(" usec\n\n")); + Serial.println(F("Starting read test. Please wait up to a minute")); + // do read test + file.seek(0); + maxLatency = 0; + minLatency = 99999; + totalLatency = 0; + t = millis(); + for (uint32_t i = 0; i < n; i++) { + buf[BUF_SIZE-1] = 0; + uint32_t m = micros(); + if (file.read(buf, sizeof(buf)) != sizeof(buf)) { + error("read failed"); + } + m = micros() - m; + if (maxLatency < m) maxLatency = m; + if (minLatency > m) minLatency = m; + totalLatency += m; + if (buf[BUF_SIZE-1] != '\n') { + error("data check"); + } + } + t = millis() - t; + Serial.print(F("Read ")); + Serial.print(s/t); + Serial.print(F(" KB/sec\n")); + Serial.print(F("Maximum latency: ")); + Serial.print(maxLatency); + Serial.print(F(" usec, Minimum Latency: ")); + Serial.print(minLatency); + Serial.print(F(" usec, Avg Latency: ")); + Serial.print(totalLatency/n); + Serial.print(F(" usec\n\n")); + Serial.print(F("Done\n\n")); + file.close(); +} \ No newline at end of file diff --git a/SdFat/examples/#attic/bufstream/bufstream.ino b/SdFat/examples/#attic/bufstream/bufstream.ino new file mode 100644 index 0000000..5eb28c1 --- /dev/null +++ b/SdFat/examples/#attic/bufstream/bufstream.ino @@ -0,0 +1,33 @@ +/* + * Use of ibufsteam to parse a line and obufstream to format a line + */ +#include + +// create a serial output stream +ArduinoOutStream cout(Serial); +//------------------------------------------------------------------------------ +void setup() { + char buf[20]; // buffer for formatted line + int i, j, k; // values from parsed line + + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + delay(2000); + + // initialize input string + ibufstream bin("123 456 789"); + + // parse the string "123 456 789" + bin >> i >> j >> k; + + // initialize output buffer + obufstream bout(buf, sizeof(buf)); + + // format the output string + bout << k << ',' << j << ',' << i << endl; + + // write the string to serial + cout << buf; +} + +void loop() {} diff --git a/SdFat/examples/#attic/eventlog/eventlog.ino b/SdFat/examples/#attic/eventlog/eventlog.ino new file mode 100644 index 0000000..4c3262f --- /dev/null +++ b/SdFat/examples/#attic/eventlog/eventlog.ino @@ -0,0 +1,53 @@ +/* + * Append a line to a file - demo of pathnames and streams + */ +#include + +// SD chip select pin +const uint8_t chipSelect = SS; + +// file system object +SdFat sd; + +// define a serial output stream +ArduinoOutStream cout(Serial); +//------------------------------------------------------------------------------ +/* + * Append a line to LOGFILE.TXT + */ +void logEvent(const char *msg) { + // create dir if needed + sd.mkdir("LOGS/2011/JAN"); + + // create or open a file for append + ofstream sdlog("LOGS/2011/JAN/LOGFILE.TXT", ios::out | ios::app); + + // append a line to the file + sdlog << msg << endl; + + // check for errors + if (!sdlog) sd.errorHalt("append failed"); + + sdlog.close(); +} +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + + // pstr stores strings in flash to save RAM + cout << pstr("Type any character to start\n"); + while (Serial.read() <= 0) {} + delay(400); // catch Due reset problem + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt(); + + // append a line to the logfile + logEvent("Another line for the logfile"); + + cout << "Done - check /LOGS/2011/JAN/LOGFILE.TXT on the SD" << endl; +} +//------------------------------------------------------------------------------ +void loop() {} diff --git a/SdFat/examples/#attic/fgetsRewrite/fgetsRewrite.ino b/SdFat/examples/#attic/fgetsRewrite/fgetsRewrite.ino new file mode 100644 index 0000000..57760b9 --- /dev/null +++ b/SdFat/examples/#attic/fgetsRewrite/fgetsRewrite.ino @@ -0,0 +1,91 @@ +// Demo of rewriting a line read by fgets +#include + +// SD card chip select pin +const uint8_t chipSelect = SS; + +// file system +SdFat sd; + +// print stream +ArduinoOutStream cout(Serial); +//------------------------------------------------------------------------------ +// store error strings in flash memory +#define error(s) sd.errorHalt_P(PSTR(s)) +//------------------------------------------------------------------------------ +void demoFgets() { + char line[25]; + int c; + uint32_t pos; + + // open test file + SdFile rdfile("FGETS.TXT", O_RDWR); + + // check for open error + if (!rdfile.isOpen()) error("demoFgets"); + + // list file + cout << pstr("-----Before Rewrite\r\n"); + while ((c = rdfile.read()) >= 0) Serial.write(c); + + rdfile.rewind(); + // read lines from the file to get position + while (1) { + pos = rdfile.curPosition(); + if (rdfile.fgets(line, sizeof(line)) < 0) { + error("Line not found"); + } + // find line that contains "Line C" + if (strstr(line, "Line C"))break; + } + + // rewrite line with 'C' + if (!rdfile.seekSet(pos))error("seekSet"); + rdfile.println("Line R"); + rdfile.rewind(); + + // list file + cout << pstr("\r\n-----After Rewrite\r\n"); + while ((c = rdfile.read()) >= 0) Serial.write(c); + + // close so rewrite is not lost + rdfile.close(); +} +//------------------------------------------------------------------------------ +void makeTestFile() { + // create or open test file + SdFile wrfile("FGETS.TXT", O_WRITE | O_CREAT | O_TRUNC); + + // check for open error + if (!wrfile.isOpen()) error("MakeTestFile"); + + // write test file + wrfile.write_P(PSTR( + "Line A\r\n" + "Line B\r\n" + "Line C\r\n" + "Line D\r\n" + "Line E\r\n" + )); + wrfile.close(); +} +//------------------------------------------------------------------------------ +void setup(void) { + Serial.begin(9600); + while (!Serial){} // wait for Leonardo + + cout << pstr("Type any character to start\n"); + while (Serial.read() <= 0) {} + delay(400); // catch Due reset problem + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt(); + + makeTestFile(); + + demoFgets(); + + cout << pstr("\nDone\n"); +} +void loop(void) {} diff --git a/SdFat/examples/#attic/readlog/readlog.ino b/SdFat/examples/#attic/readlog/readlog.ino new file mode 100644 index 0000000..fcdbde9 --- /dev/null +++ b/SdFat/examples/#attic/readlog/readlog.ino @@ -0,0 +1,40 @@ +/* + * Read the logfile created by the eventlog.pde example. + * Demo of pathnames and working directories + */ +#include + +// SD chip select pin +const uint8_t chipSelect = SS; + +// file system object +SdFat sd; + +// define a serial output stream +ArduinoOutStream cout(Serial); +//------------------------------------------------------------------------------ +void setup() { + int c; + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt(); + + // set current working directory + if (!sd.chdir("LOGS/2011/JAN/")) { + sd.errorHalt("chdir failed. Did you run eventlog.pde?"); + } + // open file in current working directory + ifstream file("LOGFILE.TXT"); + + if (!file.is_open()) sd.errorHalt("open failed"); + + // copy the file to Serial + while ((c = file.get()) >= 0) cout << (char)c; + + cout << "Done" << endl; +} +//------------------------------------------------------------------------------ +void loop() {} \ No newline at end of file diff --git a/SdFat/examples/#attic/readme.txt b/SdFat/examples/#attic/readme.txt new file mode 100644 index 0000000..ec49791 --- /dev/null +++ b/SdFat/examples/#attic/readme.txt @@ -0,0 +1,30 @@ +Old and debug examples. + +AnalogLogger - A simple data logger for one or more analog pins. + +append - This sketch creates a large file by successive + open/write/close operations. + +average - A demonstration of parsing floating point numbers. + +benchSD - A read/write benchmark for the standard Arduino SD.h library. + +bufstream - ibufsteam to parse a line and obufstream to format a line. + +eventlog - Append a line to a file - demo of pathnames and streams. + +fgetsRewrite - Demo of rewriting a line read by fgets. + +HelloWorld - Create a serial output stream. + +MiniSerial - SdFat minimal serial support for debug. + +PrintBenchmarkSD - Bench mark SD.h print. + +readlog - Read file. Demo of pathnames and current working directory. + +SD_Size - Determine flash used by SD.h example. + +SdFatSize - Determine flash used by SdFat. + +TestMkdirRmdir - Test mkdir, rmdir, and directory management. \ No newline at end of file diff --git a/SdFat/examples/AnalogBinLogger/AnalogBinLogger.h b/SdFat/examples/AnalogBinLogger/AnalogBinLogger.h new file mode 100644 index 0000000..da4d448 --- /dev/null +++ b/SdFat/examples/AnalogBinLogger/AnalogBinLogger.h @@ -0,0 +1,39 @@ +#ifndef AnalogBinLogger_h +#define AnalogBinLogger_h +//------------------------------------------------------------------------------ +// First block of file. +struct metadata_t { + unsigned long adcFrequency; // ADC clock frequency + unsigned long cpuFrequency; // CPU clock frequency + unsigned long sampleInterval; // Sample interval in CPU cycles. + unsigned long recordEightBits; // Size of ADC values, nonzero for 8-bits. + unsigned long pinCount; // Number of analog pins in a sample. + unsigned long pinNumber[123]; // List of pin numbers in a sample. +}; +//------------------------------------------------------------------------------ +// Data block for 8-bit ADC mode. +const size_t DATA_DIM8 = 508; +struct block8_t { + unsigned short count; // count of data bytes + unsigned short overrun; // count of overruns since last block + unsigned char data[DATA_DIM8]; +}; +//------------------------------------------------------------------------------ +// Data block for 10-bit ADC mode. +const size_t DATA_DIM16 = 254; +struct block16_t { + unsigned short count; // count of data bytes + unsigned short overrun; // count of overruns since last block + unsigned short data[DATA_DIM16]; +}; +//------------------------------------------------------------------------------ +// Data block for PC use +struct adcdata_t { + unsigned short count; // count of data bytes + unsigned short overrun; // count of overruns since last block + union { + unsigned char u8[DATA_DIM8]; + unsigned short u16[DATA_DIM16]; + } data; +}; +#endif // AnalogBinLogger_h \ No newline at end of file diff --git a/SdFat/examples/AnalogBinLogger/AnalogBinLogger.ino b/SdFat/examples/AnalogBinLogger/AnalogBinLogger.ino new file mode 100644 index 0000000..b3b3fe9 --- /dev/null +++ b/SdFat/examples/AnalogBinLogger/AnalogBinLogger.ino @@ -0,0 +1,787 @@ +/** + * This program logs data from the Arduino ADC to a binary file. + * + * Samples are logged at regular intervals. Each Sample consists of the ADC + * values for the analog pins defined in the PIN_LIST array. The pins numbers + * may be in any order. + * + * Edit the configuration constants below to set the sample pins, sample rate, + * and other configuration values. + * + * If your SD card has a long write latency, it may be necessary to use + * slower sample rates. Using a Mega Arduino helps overcome latency + * problems since 13 512 byte buffers will be used. + * + * Each 512 byte data block in the file has a four byte header followed by up + * to 508 bytes of data. (508 values in 8-bit mode or 254 values in 10-bit mode) + * Each block contains an integral number of samples with unused space at the + * end of the block. + * + * Data is written to the file using a SD multiple block write command. + */ +#include +#include +#include +#include "AnalogBinLogger.h" +//------------------------------------------------------------------------------ +// Analog pin number list for a sample. Pins may be in any order and pin +// numbers may be repeated. +const uint8_t PIN_LIST[] = {0, 1, 2, 3, 4}; +//------------------------------------------------------------------------------ +// Sample rate in samples per second. +const float SAMPLE_RATE = 5000; // Must be 0.25 or greater. + +// The interval between samples in seconds, SAMPLE_INTERVAL, may be set to a +// constant instead of being calculated from SAMPLE_RATE. SAMPLE_RATE is not +// used in the code below. For example, setting SAMPLE_INTERVAL = 2.0e-4 +// will result in a 200 microsecond sample interval. +const float SAMPLE_INTERVAL = 1.0/SAMPLE_RATE; + +// Setting ROUND_SAMPLE_INTERVAL non-zero will cause the sample interval to +// be rounded to a a multiple of the ADC clock period and will reduce sample +// time jitter. +#define ROUND_SAMPLE_INTERVAL 1 +//------------------------------------------------------------------------------ +// ADC clock rate. +// The ADC clock rate is normally calculated from the pin count and sample +// interval. The calculation attempts to use the lowest possible ADC clock +// rate. +// +// You can select an ADC clock rate by defining the symbol ADC_PRESCALER to +// one of these values. You must choose an appropriate ADC clock rate for +// your sample interval. +// #define ADC_PRESCALER 7 // F_CPU/128 125 kHz on an Uno +// #define ADC_PRESCALER 6 // F_CPU/64 250 kHz on an Uno +// #define ADC_PRESCALER 5 // F_CPU/32 500 kHz on an Uno +// #define ADC_PRESCALER 4 // F_CPU/16 1000 kHz on an Uno +// #define ADC_PRESCALER 3 // F_CPU/8 2000 kHz on an Uno (8-bit mode only) +//------------------------------------------------------------------------------ +// Reference voltage. See the processor data-sheet for reference details. +// uint8_t const ADC_REF = 0; // External Reference AREF pin. +uint8_t const ADC_REF = (1 << REFS0); // Vcc Reference. +// uint8_t const ADC_REF = (1 << REFS1); // Internal 1.1 (only 644 1284P Mega) +// uint8_t const ADC_REF = (1 << REFS1) | (1 << REFS0); // Internal 1.1 or 2.56 +//------------------------------------------------------------------------------ +// File definitions. +// +// Maximum file size in blocks. +// The program creates a contiguous file with FILE_BLOCK_COUNT 512 byte blocks. +// This file is flash erased using special SD commands. The file will be +// truncated if logging is stopped early. +const uint32_t FILE_BLOCK_COUNT = 256000; + +// log file base name. Must be six characters or less. +#define FILE_BASE_NAME "ANALOG" + +// Set RECORD_EIGHT_BITS non-zero to record only the high 8-bits of the ADC. +#define RECORD_EIGHT_BITS 0 +//------------------------------------------------------------------------------ +// Pin definitions. +// +// Digital pin to indicate an error, set to -1 if not used. +// The led blinks for fatal errors. The led goes on solid for SD write +// overrun errors and logging continues. +const int8_t ERROR_LED_PIN = 3; + +// SD chip select pin. +const uint8_t SD_CS_PIN = SS; +//------------------------------------------------------------------------------ +// Buffer definitions. +// +// The logger will use SdFat's buffer plus BUFFER_BLOCK_COUNT additional +// buffers. QUEUE_DIM must be a power of two larger than +//(BUFFER_BLOCK_COUNT + 1). +// +#if RAMEND < 0X8FF +#error Too little SRAM +// +#elif RAMEND < 0X10FF +// Use total of two 512 byte buffers. +const uint8_t BUFFER_BLOCK_COUNT = 1; +// Dimension for queues of 512 byte SD blocks. +const uint8_t QUEUE_DIM = 4; // Must be a power of two! +// +#elif RAMEND < 0X20FF +// Use total of five 512 byte buffers. +const uint8_t BUFFER_BLOCK_COUNT = 4; +// Dimension for queues of 512 byte SD blocks. +const uint8_t QUEUE_DIM = 8; // Must be a power of two! +// +#elif RAMEND < 0X40FF +// Use total of 13 512 byte buffers. +const uint8_t BUFFER_BLOCK_COUNT = 12; +// Dimension for queues of 512 byte SD blocks. +const uint8_t QUEUE_DIM = 16; // Must be a power of two! +// +#else // RAMEND +// Use total of 29 512 byte buffers. +const uint8_t BUFFER_BLOCK_COUNT = 28; +// Dimension for queues of 512 byte SD blocks. +const uint8_t QUEUE_DIM = 32; // Must be a power of two! +#endif // RAMEND +//============================================================================== +// End of configuration constants. +//============================================================================== +// Temporary log file. Will be deleted if a reset or power failure occurs. +#define TMP_FILE_NAME "TMP_LOG.BIN" + +// Size of file base name. Must not be larger than six. +const uint8_t BASE_NAME_SIZE = sizeof(FILE_BASE_NAME) - 1; + +// Number of analog pins to log. +const uint8_t PIN_COUNT = sizeof(PIN_LIST)/sizeof(PIN_LIST[0]); + +// Minimum ADC clock cycles per sample interval +const uint16_t MIN_ADC_CYCLES = 15; + +// Extra cpu cycles to setup ADC with more than one pin per sample. +const uint16_t ISR_SETUP_ADC = 100; + +// Maximum cycles for timer0 system interrupt, millis, micros. +const uint16_t ISR_TIMER0 = 160; +//============================================================================== +SdFat sd; + +SdBaseFile binFile; + +char binName[13] = FILE_BASE_NAME "00.BIN"; + +#if RECORD_EIGHT_BITS +const size_t SAMPLES_PER_BLOCK = DATA_DIM8/PIN_COUNT; +typedef block8_t block_t; +#else // RECORD_EIGHT_BITS +const size_t SAMPLES_PER_BLOCK = DATA_DIM16/PIN_COUNT; +typedef block16_t block_t; +#endif // RECORD_EIGHT_BITS + +block_t* emptyQueue[QUEUE_DIM]; +uint8_t emptyHead; +uint8_t emptyTail; + +block_t* fullQueue[QUEUE_DIM]; +volatile uint8_t fullHead; // volatile insures non-interrupt code sees changes. +uint8_t fullTail; + +// queueNext assumes QUEUE_DIM is a power of two +inline uint8_t queueNext(uint8_t ht) {return (ht + 1) & (QUEUE_DIM -1);} +//============================================================================== +// Interrupt Service Routines + +// Pointer to current buffer. +block_t* isrBuf; + +// Need new buffer if true. +bool isrBufNeeded = true; + +// overrun count +uint16_t isrOver = 0; + +// ADC configuration for each pin. +uint8_t adcmux[PIN_COUNT]; +uint8_t adcsra[PIN_COUNT]; +uint8_t adcsrb[PIN_COUNT]; +uint8_t adcindex = 1; + +// Insure no timer events are missed. +volatile bool timerError = false; +volatile bool timerFlag = false; +//------------------------------------------------------------------------------ +// ADC done interrupt. +ISR(ADC_vect) { + // Read ADC data. +#if RECORD_EIGHT_BITS + uint8_t d = ADCH; +#else // RECORD_EIGHT_BITS + // This will access ADCL first. + uint16_t d = ADC; +#endif // RECORD_EIGHT_BITS + + if (isrBufNeeded && emptyHead == emptyTail) { + // no buffers - count overrun + if (isrOver < 0XFFFF) isrOver++; + + // Avoid missed timer error. + timerFlag = false; + return; + } + // Start ADC + if (PIN_COUNT > 1) { + ADMUX = adcmux[adcindex]; + ADCSRB = adcsrb[adcindex]; + ADCSRA = adcsra[adcindex]; + if (adcindex == 0) timerFlag = false; + adcindex = adcindex < (PIN_COUNT - 1) ? adcindex + 1 : 0; + } else { + timerFlag = false; + } + // Check for buffer needed. + if (isrBufNeeded) { + // Remove buffer from empty queue. + isrBuf = emptyQueue[emptyTail]; + emptyTail = queueNext(emptyTail); + isrBuf->count = 0; + isrBuf->overrun = isrOver; + isrBufNeeded = false; + } + // Store ADC data. + isrBuf->data[isrBuf->count++] = d; + + // Check for buffer full. + if (isrBuf->count >= PIN_COUNT*SAMPLES_PER_BLOCK) { + // Put buffer isrIn full queue. + uint8_t tmp = fullHead; // Avoid extra fetch of volatile fullHead. + fullQueue[tmp] = (block_t*)isrBuf; + fullHead = queueNext(tmp); + + // Set buffer needed and clear overruns. + isrBufNeeded = true; + isrOver = 0; + } +} +//------------------------------------------------------------------------------ +// timer1 interrupt to clear OCF1B +ISR(TIMER1_COMPB_vect) { + // Make sure ADC ISR responded to timer event. + if (timerFlag) timerError = true; + timerFlag = true; +} +//============================================================================== +// Error messages stored in flash. +#define error(msg) error_P(PSTR(msg)) +//------------------------------------------------------------------------------ +void error_P(const char* msg) { + sd.errorPrint_P(msg); + fatalBlink(); +} +//------------------------------------------------------------------------------ +// +void fatalBlink() { + while (true) { + if (ERROR_LED_PIN >= 0) { + digitalWrite(ERROR_LED_PIN, HIGH); + delay(200); + digitalWrite(ERROR_LED_PIN, LOW); + delay(200); + } + } +} +//============================================================================== +#if ADPS0 != 0 || ADPS1 != 1 || ADPS2 != 2 +#error unexpected ADC prescaler bits +#endif +//------------------------------------------------------------------------------ +// initialize ADC and timer1 +void adcInit(metadata_t* meta) { + uint8_t adps; // prescaler bits for ADCSRA + uint32_t ticks = F_CPU*SAMPLE_INTERVAL + 0.5; // Sample interval cpu cycles. + + if (ADC_REF & ~((1 << REFS0) | (1 << REFS1))) { + error("Invalid ADC reference"); + } +#ifdef ADC_PRESCALER + if (ADC_PRESCALER > 7 || ADC_PRESCALER < 2) { + error("Invalid ADC prescaler"); + } + adps = ADC_PRESCALER; +#else // ADC_PRESCALER + // Allow extra cpu cycles to change ADC settings if more than one pin. + int32_t adcCycles = (ticks - ISR_TIMER0)/PIN_COUNT; + - (PIN_COUNT > 1 ? ISR_SETUP_ADC : 0); + + for (adps = 7; adps > 0; adps--) { + if (adcCycles >= (MIN_ADC_CYCLES << adps)) break; + } +#endif // ADC_PRESCALER + meta->adcFrequency = F_CPU >> adps; + if (meta->adcFrequency > (RECORD_EIGHT_BITS ? 2000000 : 1000000)) { + error("Sample Rate Too High"); + } +#if ROUND_SAMPLE_INTERVAL + // Round so interval is multiple of ADC clock. + ticks += 1 << (adps - 1); + ticks >>= adps; + ticks <<= adps; +#endif // ROUND_SAMPLE_INTERVAL + + if (PIN_COUNT > sizeof(meta->pinNumber)/sizeof(meta->pinNumber[0])) { + error("Too many pins"); + } + meta->pinCount = PIN_COUNT; + meta->recordEightBits = RECORD_EIGHT_BITS; + + for (int i = 0; i < PIN_COUNT; i++) { + uint8_t pin = PIN_LIST[i]; + if (pin >= NUM_ANALOG_INPUTS) error("Invalid Analog pin number"); + meta->pinNumber[i] = pin; + + // Set ADC reference and low three bits of analog pin number. + adcmux[i] = (pin & 7) | ADC_REF; + if (RECORD_EIGHT_BITS) adcmux[i] |= 1 << ADLAR; + + // If this is the first pin, trigger on timer/counter 1 compare match B. + adcsrb[i] = i == 0 ? (1 << ADTS2) | (1 << ADTS0) : 0; +#ifdef MUX5 + if (pin > 7) adcsrb[i] |= (1 << MUX5); +#endif // MUX5 + adcsra[i] = (1 << ADEN) | (1 << ADIE) | adps; + adcsra[i] |= i == 0 ? 1 << ADATE : 1 << ADSC; + } + + // Setup timer1 + TCCR1A = 0; + uint8_t tshift; + if (ticks < 0X10000) { + // no prescale, CTC mode + TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10); + tshift = 0; + } else if (ticks < 0X10000*8) { + // prescale 8, CTC mode + TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11); + tshift = 3; + } else if (ticks < 0X10000*64) { + // prescale 64, CTC mode + TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11) | (1 << CS10); + tshift = 6; + } else if (ticks < 0X10000*256) { + // prescale 256, CTC mode + TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS12); + tshift = 8; + } else if (ticks < 0X10000*1024) { + // prescale 1024, CTC mode + TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS12) | (1 << CS10); + tshift = 10; + } else { + error("Sample Rate Too Slow"); + } + // divide by prescaler + ticks >>= tshift; + // set TOP for timer reset + ICR1 = ticks - 1; + // compare for ADC start + OCR1B = 0; + + // multiply by prescaler + ticks <<= tshift; + + // Sample interval in CPU clock ticks. + meta->sampleInterval = ticks; + meta->cpuFrequency = F_CPU; + float sampleRate = (float)meta->cpuFrequency/meta->sampleInterval; + Serial.print(F("Sample pins:")); + for (int i = 0; i < meta->pinCount; i++) { + Serial.print(' '); + Serial.print(meta->pinNumber[i], DEC); + } + Serial.println(); + Serial.print(F("ADC bits: ")); + Serial.println(meta->recordEightBits ? 8 : 10); + Serial.print(F("ADC clock kHz: ")); + Serial.println(meta->adcFrequency/1000); + Serial.print(F("Sample Rate: ")); + Serial.println(sampleRate); + Serial.print(F("Sample interval usec: ")); + Serial.println(1000000.0/sampleRate, 4); +} +//------------------------------------------------------------------------------ +// enable ADC and timer1 interrupts +void adcStart() { + // initialize ISR + isrBufNeeded = true; + isrOver = 0; + adcindex = 1; + + // Clear any pending interrupt. + ADCSRA |= 1 << ADIF; + + // Setup for first pin. + ADMUX = adcmux[0]; + ADCSRB = adcsrb[0]; + ADCSRA = adcsra[0]; + + // Enable timer1 interrupts. + timerError = false; + timerFlag = false; + TCNT1 = 0; + TIFR1 = 1 << OCF1B; + TIMSK1 = 1 << OCIE1B; +} +//------------------------------------------------------------------------------ +void adcStop() { + TIMSK1 = 0; + ADCSRA = 0; +} +//------------------------------------------------------------------------------ +// Convert binary file to CSV file. +void binaryToCsv() { + uint8_t lastPct = 0; + block_t buf; + metadata_t* pm; + uint32_t t0 = millis(); + char csvName[13]; + StdioStream csvStream; + + if (!binFile.isOpen()) { + Serial.println(F("No current binary file")); + return; + } + binFile.rewind(); + if (!binFile.read(&buf , 512) == 512) error("Read metadata failed"); + // Create a new CSV file. + strcpy(csvName, binName); + strcpy_P(&csvName[BASE_NAME_SIZE + 3], PSTR("CSV")); + + if (!csvStream.fopen(csvName, "w")) { + error("open csvStream failed"); + } + Serial.println(); + Serial.print(F("Writing: ")); + Serial.print(csvName); + Serial.println(F(" - type any character to stop")); + pm = (metadata_t*)&buf; + csvStream.print(F("Interval,")); + float intervalMicros = 1.0e6*pm->sampleInterval/(float)pm->cpuFrequency; + csvStream.print(intervalMicros, 4); + csvStream.println(F(",usec")); + for (uint8_t i = 0; i < pm->pinCount; i++) { + if (i) csvStream.putc(','); + csvStream.print(F("pin")); + csvStream.print(pm->pinNumber[i]); + } + csvStream.println(); + uint32_t tPct = millis(); + while (!Serial.available() && binFile.read(&buf, 512) == 512) { + uint16_t i; + if (buf.count == 0) break; + if (buf.overrun) { + csvStream.print(F("OVERRUN,")); + csvStream.println(buf.overrun); + } + for (uint16_t j = 0; j < buf.count; j += PIN_COUNT) { + for (uint16_t i = 0; i < PIN_COUNT; i++) { + if (i) csvStream.putc(','); + csvStream.print(buf.data[i + j]); + } + csvStream.println(); + } + if ((millis() - tPct) > 1000) { + uint8_t pct = binFile.curPosition()/(binFile.fileSize()/100); + if (pct != lastPct) { + tPct = millis(); + lastPct = pct; + Serial.print(pct, DEC); + Serial.println('%'); + } + } + if (Serial.available()) break; + } + csvStream.fclose(); + Serial.print(F("Done: ")); + Serial.print(0.001*(millis() - t0)); + Serial.println(F(" Seconds")); +} +//------------------------------------------------------------------------------ +// read data file and check for overruns +void checkOverrun() { + bool headerPrinted = false; + block_t buf; + uint32_t bgnBlock, endBlock; + uint32_t bn = 0; + + if (!binFile.isOpen()) { + Serial.println(F("No current binary file")); + return; + } + if (!binFile.contiguousRange(&bgnBlock, &endBlock)) { + error("contiguousRange failed"); + } + binFile.rewind(); + Serial.println(); + Serial.println(F("Checking overrun errors - type any character to stop")); + if (!binFile.read(&buf , 512) == 512) { + error("Read metadata failed"); + } + bn++; + while (binFile.read(&buf, 512) == 512) { + if (buf.count == 0) break; + if (buf.overrun) { + if (!headerPrinted) { + Serial.println(); + Serial.println(F("Overruns:")); + Serial.println(F("fileBlockNumber,sdBlockNumber,overrunCount")); + headerPrinted = true; + } + Serial.print(bn); + Serial.print(','); + Serial.print(bgnBlock + bn); + Serial.print(','); + Serial.println(buf.overrun); + } + bn++; + } + if (!headerPrinted) { + Serial.println(F("No errors found")); + } else { + Serial.println(F("Done")); + } +} +//------------------------------------------------------------------------------ +// dump data file to Serial +void dumpData() { + block_t buf; + if (!binFile.isOpen()) { + Serial.println(F("No current binary file")); + return; + } + binFile.rewind(); + if (binFile.read(&buf , 512) != 512) { + error("Read metadata failed"); + } + Serial.println(); + Serial.println(F("Type any character to stop")); + delay(1000); + while (!Serial.available() && binFile.read(&buf , 512) == 512) { + if (buf.count == 0) break; + if (buf.overrun) { + Serial.print(F("OVERRUN,")); + Serial.println(buf.overrun); + } + for (uint16_t i = 0; i < buf.count; i++) { + Serial.print(buf.data[i], DEC); + if ((i+1)%PIN_COUNT) { + Serial.print(','); + } else { + Serial.println(); + } + } + } + Serial.println(F("Done")); +} +//------------------------------------------------------------------------------ +// log data +// max number of blocks to erase per erase call +uint32_t const ERASE_SIZE = 262144L; +void logData() { + uint32_t bgnBlock, endBlock; + + // Allocate extra buffer space. + block_t block[BUFFER_BLOCK_COUNT]; + + Serial.println(); + + // Initialize ADC and timer1. + adcInit((metadata_t*) &block[0]); + + // Find unused file name. + if (BASE_NAME_SIZE > 6) { + error("FILE_BASE_NAME too long"); + } + while (sd.exists(binName)) { + if (binName[BASE_NAME_SIZE + 1] != '9') { + binName[BASE_NAME_SIZE + 1]++; + } else { + binName[BASE_NAME_SIZE + 1] = '0'; + if (binName[BASE_NAME_SIZE] == '9') { + error("Can't create file name"); + } + binName[BASE_NAME_SIZE]++; + } + } + // Delete old tmp file. + if (sd.exists(TMP_FILE_NAME)) { + Serial.println(F("Deleting tmp file")); + if (!sd.remove(TMP_FILE_NAME)) { + error("Can't remove tmp file"); + } + } + // Create new file. + Serial.println(F("Creating new file")); + binFile.close(); + if (!binFile.createContiguous(sd.vwd(), + TMP_FILE_NAME, 512 * FILE_BLOCK_COUNT)) { + error("createContiguous failed"); + } + // Get the address of the file on the SD. + if (!binFile.contiguousRange(&bgnBlock, &endBlock)) { + error("contiguousRange failed"); + } + // Use SdFat's internal buffer. + uint8_t* cache = (uint8_t*)sd.vol()->cacheClear(); + if (cache == 0) error("cacheClear failed"); + + // Flash erase all data in the file. + Serial.println(F("Erasing all data")); + uint32_t bgnErase = bgnBlock; + uint32_t endErase; + while (bgnErase < endBlock) { + endErase = bgnErase + ERASE_SIZE; + if (endErase > endBlock) endErase = endBlock; + if (!sd.card()->erase(bgnErase, endErase)) { + error("erase failed"); + } + bgnErase = endErase + 1; + } + // Start a multiple block write. + if (!sd.card()->writeStart(bgnBlock, FILE_BLOCK_COUNT)) { + error("writeBegin failed"); + } + // Write metadata. + if (!sd.card()->writeData((uint8_t*)&block[0])) { + error("Write metadata failed"); + } + // Initialize queues. + emptyHead = emptyTail = 0; + fullHead = fullTail = 0; + + // Use SdFat buffer for one block. + emptyQueue[emptyHead] = (block_t*)cache; + emptyHead = queueNext(emptyHead); + + // Put rest of buffers in the empty queue. + for (uint8_t i = 0; i < BUFFER_BLOCK_COUNT; i++) { + emptyQueue[emptyHead] = &block[i]; + emptyHead = queueNext(emptyHead); + } + // Give SD time to prepare for big write. + delay(1000); + Serial.println(F("Logging - type any character to stop")); + // Wait for Serial Idle. + Serial.flush(); + delay(10); + uint32_t bn = 1; + uint32_t t0 = millis(); + uint32_t t1 = t0; + uint32_t overruns = 0; + uint32_t count = 0; + uint32_t maxLatency = 0; + + // Start logging interrupts. + adcStart(); + while (1) { + if (fullHead != fullTail) { + // Get address of block to write. + block_t* pBlock = fullQueue[fullTail]; + + // Write block to SD. + uint32_t usec = micros(); + if (!sd.card()->writeData((uint8_t*)pBlock)) { + error("write data failed"); + } + usec = micros() - usec; + t1 = millis(); + if (usec > maxLatency) maxLatency = usec; + count += pBlock->count; + + // Add overruns and possibly light LED. + if (pBlock->overrun) { + overruns += pBlock->overrun; + if (ERROR_LED_PIN >= 0) { + digitalWrite(ERROR_LED_PIN, HIGH); + } + } + // Move block to empty queue. + emptyQueue[emptyHead] = pBlock; + emptyHead = queueNext(emptyHead); + fullTail = queueNext(fullTail); + bn++; + if (bn == FILE_BLOCK_COUNT) { + // File full so stop ISR calls. + adcStop(); + break; + } + } + if (timerError) { + error("Missed timer event - rate too high"); + } + if (Serial.available()) { + // Stop ISR calls. + adcStop(); + if (isrBuf != 0 && isrBuf->count >= PIN_COUNT) { + // Truncate to last complete sample. + isrBuf->count = PIN_COUNT*(isrBuf->count/PIN_COUNT); + // Put buffer in full queue. + fullQueue[fullHead] = isrBuf; + fullHead = queueNext(fullHead); + isrBuf = 0; + } + if (fullHead == fullTail) break; + } + } + if (!sd.card()->writeStop()) { + error("writeStop failed"); + } + // Truncate file if recording stopped early. + if (bn != FILE_BLOCK_COUNT) { + Serial.println(F("Truncating file")); + if (!binFile.truncate(512L * bn)) { + error("Can't truncate file"); + } + } + if (!binFile.rename(sd.vwd(), binName)) { + error("Can't rename file"); + } + Serial.print(F("File renamed: ")); + Serial.println(binName); + Serial.print(F("Max block write usec: ")); + Serial.println(maxLatency); + Serial.print(F("Record time sec: ")); + Serial.println(0.001*(t1 - t0), 3); + Serial.print(F("Sample count: ")); + Serial.println(count/PIN_COUNT); + Serial.print(F("Samples/sec: ")); + Serial.println((1000.0/PIN_COUNT)*count/(t1-t0)); + Serial.print(F("Overruns: ")); + Serial.println(overruns); + Serial.println(F("Done")); +} +//------------------------------------------------------------------------------ +void setup(void) { + if (ERROR_LED_PIN >= 0) { + pinMode(ERROR_LED_PIN, OUTPUT); + } + Serial.begin(9600); + + // Read the first sample pin to init the ADC. + analogRead(PIN_LIST[0]); + + Serial.print(F("FreeRam: ")); + Serial.println(FreeRam()); + + // initialize file system. + if (!sd.begin(SD_CS_PIN, SPI_FULL_SPEED)) { + sd.initErrorPrint(); + fatalBlink(); + } +} +//------------------------------------------------------------------------------ +void loop(void) { + // discard any input + while (Serial.read() >= 0) {} + Serial.println(); + Serial.println(F("type:")); + Serial.println(F("c - convert file to CSV")); + Serial.println(F("d - dump data to Serial")); + Serial.println(F("e - overrun error details")); + Serial.println(F("r - record ADC data")); + + while(!Serial.available()) {} + char c = tolower(Serial.read()); + if (ERROR_LED_PIN >= 0) { + digitalWrite(ERROR_LED_PIN, LOW); + } + // Read any extra Serial data. + do { + delay(10); + } while (Serial.read() >= 0); + + if (c == 'c') { + binaryToCsv(); + } else if (c == 'd') { + dumpData(); + } else if (c == 'e') { + checkOverrun(); + } else if (c == 'r') { + logData(); + } else { + Serial.println(F("Invalid entry")); + } +} diff --git a/SdFat/examples/LowLatencyLogger/LowLatencyLogger.ino b/SdFat/examples/LowLatencyLogger/LowLatencyLogger.ino new file mode 100644 index 0000000..74cc79c --- /dev/null +++ b/SdFat/examples/LowLatencyLogger/LowLatencyLogger.ino @@ -0,0 +1,529 @@ +/** + * This program logs data to a binary file. Functions are included + * to convert the binary file to a CSV text file. + * + * Samples are logged at regular intervals. The maximum logging rate + * depends on the quality of your SD card and the time required to + * read sensor data. This example has been tested at 500 Hz with + * good SD card on an Uno. 4000 HZ is possible on a Due. + * + * If your SD card has a long write latency, it may be necessary to use + * slower sample rates. Using a Mega Arduino helps overcome latency + * problems since 13 512 byte buffers will be used. + * + * Data is written to the file using a SD multiple block write command. + */ +#include +#include +//------------------------------------------------------------------------------ +// User data functions. Modify these functions for your data items. +#include "UserDataType.h" // Edit this include file to change data_t. + +// Acquire a data record. +void acquireData(data_t* data) { + data->time = micros(); + for (int i = 0; i < ADC_DIM; i++) { + data->adc[i] = analogRead(i); + } +} + +// Print a data record. +void printData(Print* pr, data_t* data) { + pr->print(data->time); + for (int i = 0; i < ADC_DIM; i++) { + pr->write(','); + pr->print(data->adc[i]); + } + pr->println(); +} + +// Print data header. +void printHeader(Print* pr) { + pr->print(F("time")); + for (int i = 0; i < ADC_DIM; i++) { + pr->print(F(",adc")); + pr->print(i); + } + pr->println(); +} +//============================================================================== +// Start of configuration constants. +//============================================================================== +//Interval between data records in microseconds. +const uint32_t LOG_INTERVAL_USEC = 2000; +//------------------------------------------------------------------------------ +// Pin definitions. +// +// SD chip select pin. +const uint8_t SD_CS_PIN = SS; +// +// Digital pin to indicate an error, set to -1 if not used. +// The led blinks for fatal errors. The led goes on solid for SD write +// overrun errors and logging continues. +const int8_t ERROR_LED_PIN = 3; +//------------------------------------------------------------------------------ +// File definitions. +// +// Maximum file size in blocks. +// The program creates a contiguous file with FILE_BLOCK_COUNT 512 byte blocks. +// This file is flash erased using special SD commands. The file will be +// truncated if logging is stopped early. +const uint32_t FILE_BLOCK_COUNT = 256000; + +// log file base name. Must be six characters or less. +#define FILE_BASE_NAME "DATA" +//------------------------------------------------------------------------------ +// Buffer definitions. +// +// The logger will use SdFat's buffer plus BUFFER_BLOCK_COUNT additional +// buffers. +// +#ifndef RAMEND +// Assume ARM. Use total of nine 512 byte buffers. +const uint8_t BUFFER_BLOCK_COUNT = 8; +// +#elif RAMEND < 0X8FF +#error Too little SRAM +// +#elif RAMEND < 0X10FF +// Use total of two 512 byte buffers. +const uint8_t BUFFER_BLOCK_COUNT = 1; +// +#elif RAMEND < 0X20FF +// Use total of five 512 byte buffers. +const uint8_t BUFFER_BLOCK_COUNT = 4; +// +#else // RAMEND +// Use total of 13 512 byte buffers. +const uint8_t BUFFER_BLOCK_COUNT = 12; +#endif // RAMEND +//============================================================================== +// End of configuration constants. +//============================================================================== +// Temporary log file. Will be deleted if a reset or power failure occurs. +#define TMP_FILE_NAME "TMP_LOG.BIN" + +// Size of file base name. Must not be larger than six. +const uint8_t BASE_NAME_SIZE = sizeof(FILE_BASE_NAME) - 1; + +SdFat sd; + +SdBaseFile binFile; + +char binName[13] = FILE_BASE_NAME "00.BIN"; + +// Number of data records in a block. +const uint16_t DATA_DIM = (512 - 4)/sizeof(data_t); + +//Compute fill so block size is 512 bytes. FILL_DIM may be zero. +const uint16_t FILL_DIM = 512 - 4 - DATA_DIM*sizeof(data_t); + +struct block_t { + uint16_t count; + uint16_t overrun; + data_t data[DATA_DIM]; + uint8_t fill[FILL_DIM]; +}; + +const uint8_t QUEUE_DIM = BUFFER_BLOCK_COUNT + 2; + +block_t* emptyQueue[QUEUE_DIM]; +uint8_t emptyHead; +uint8_t emptyTail; + +block_t* fullQueue[QUEUE_DIM]; +uint8_t fullHead; +uint8_t fullTail; + +// Advance queue index. +inline uint8_t queueNext(uint8_t ht) {return ht < (QUEUE_DIM - 1) ? ht + 1 : 0;} +//============================================================================== +// Error messages stored in flash. +#define error(msg) error_P(PSTR(msg)) +//------------------------------------------------------------------------------ +void error_P(const char* msg) { + sd.errorPrint_P(msg); + fatalBlink(); +} +//------------------------------------------------------------------------------ +// +void fatalBlink() { + while (true) { + if (ERROR_LED_PIN >= 0) { + digitalWrite(ERROR_LED_PIN, HIGH); + delay(200); + digitalWrite(ERROR_LED_PIN, LOW); + delay(200); + } + } +} +//============================================================================== +// Convert binary file to CSV file. +void binaryToCsv() { + uint8_t lastPct = 0; + block_t block; + uint32_t t0 = millis(); + uint32_t syncCluster = 0; + SdFile csvFile; + char csvName[13]; + + if (!binFile.isOpen()) { + Serial.println(); + Serial.println(F("No current binary file")); + return; + } + binFile.rewind(); + // Create a new csvFile. + strcpy(csvName, binName); + strcpy_P(&csvName[BASE_NAME_SIZE + 3], PSTR("CSV")); + + if (!csvFile.open(csvName, O_WRITE | O_CREAT | O_TRUNC)) { + error("open csvFile failed"); + } + Serial.println(); + Serial.print(F("Writing: ")); + Serial.print(csvName); + Serial.println(F(" - type any character to stop")); + printHeader(&csvFile); + uint32_t tPct = millis(); + while (!Serial.available() && binFile.read(&block, 512) == 512) { + uint16_t i; + if (block.count == 0) break; + if (block.overrun) { + csvFile.print(F("OVERRUN,")); + csvFile.println(block.overrun); + } + for (i = 0; i < block.count; i++) { + printData(&csvFile, &block.data[i]); + } + if (csvFile.curCluster() != syncCluster) { + csvFile.sync(); + syncCluster = csvFile.curCluster(); + } + if ((millis() - tPct) > 1000) { + uint8_t pct = binFile.curPosition()/(binFile.fileSize()/100); + if (pct != lastPct) { + tPct = millis(); + lastPct = pct; + Serial.print(pct, DEC); + Serial.println('%'); + } + } + if (Serial.available()) break; + } + csvFile.close(); + Serial.print(F("Done: ")); + Serial.print(0.001*(millis() - t0)); + Serial.println(F(" Seconds")); +} +//------------------------------------------------------------------------------ +// read data file and check for overruns +void checkOverrun() { + bool headerPrinted = false; + block_t block; + uint32_t bgnBlock, endBlock; + uint32_t bn = 0; + + if (!binFile.isOpen()) { + Serial.println(); + Serial.println(F("No current binary file")); + return; + } + if (!binFile.contiguousRange(&bgnBlock, &endBlock)) { + error("contiguousRange failed"); + } + binFile.rewind(); + Serial.println(); + Serial.println(F("Checking overrun errors - type any character to stop")); + while (binFile.read(&block, 512) == 512) { + if (block.count == 0) break; + if (block.overrun) { + if (!headerPrinted) { + Serial.println(); + Serial.println(F("Overruns:")); + Serial.println(F("fileBlockNumber,sdBlockNumber,overrunCount")); + headerPrinted = true; + } + Serial.print(bn); + Serial.print(','); + Serial.print(bgnBlock + bn); + Serial.print(','); + Serial.println(block.overrun); + } + bn++; + } + if (!headerPrinted) { + Serial.println(F("No errors found")); + } else { + Serial.println(F("Done")); + } +} +//------------------------------------------------------------------------------ +// dump data file to Serial +void dumpData() { + block_t block; + if (!binFile.isOpen()) { + Serial.println(); + Serial.println(F("No current binary file")); + return; + } + binFile.rewind(); + Serial.println(); + Serial.println(F("Type any character to stop")); + delay(1000); + printHeader(&Serial); + while (!Serial.available() && binFile.read(&block , 512) == 512) { + if (block.count == 0) break; + if (block.overrun) { + Serial.print(F("OVERRUN,")); + Serial.println(block.overrun); + } + for (uint16_t i = 0; i < block.count; i++) { + printData(&Serial, &block.data[i]); + } + } + Serial.println(F("Done")); +} +//------------------------------------------------------------------------------ +// log data +// max number of blocks to erase per erase call +uint32_t const ERASE_SIZE = 262144L; +void logData() { + uint32_t bgnBlock, endBlock; + + // Allocate extra buffer space. + block_t block[BUFFER_BLOCK_COUNT]; + block_t* curBlock = 0; + Serial.println(); + + // Find unused file name. + if (BASE_NAME_SIZE > 6) { + error("FILE_BASE_NAME too long"); + } + while (sd.exists(binName)) { + if (binName[BASE_NAME_SIZE + 1] != '9') { + binName[BASE_NAME_SIZE + 1]++; + } else { + binName[BASE_NAME_SIZE + 1] = '0'; + if (binName[BASE_NAME_SIZE] == '9') { + error("Can't create file name"); + } + binName[BASE_NAME_SIZE]++; + } + } + // Delete old tmp file. + if (sd.exists(TMP_FILE_NAME)) { + Serial.println(F("Deleting tmp file")); + if (!sd.remove(TMP_FILE_NAME)) { + error("Can't remove tmp file"); + } + } + // Create new file. + Serial.println(F("Creating new file")); + binFile.close(); + if (!binFile.createContiguous(sd.vwd(), + TMP_FILE_NAME, 512 * FILE_BLOCK_COUNT)) { + error("createContiguous failed"); + } + // Get the address of the file on the SD. + if (!binFile.contiguousRange(&bgnBlock, &endBlock)) { + error("contiguousRange failed"); + } + // Use SdFat's internal buffer. + uint8_t* cache = (uint8_t*)sd.vol()->cacheClear(); + if (cache == 0) error("cacheClear failed"); + + // Flash erase all data in the file. + Serial.println(F("Erasing all data")); + uint32_t bgnErase = bgnBlock; + uint32_t endErase; + while (bgnErase < endBlock) { + endErase = bgnErase + ERASE_SIZE; + if (endErase > endBlock) endErase = endBlock; + if (!sd.card()->erase(bgnErase, endErase)) { + error("erase failed"); + } + bgnErase = endErase + 1; + } + // Start a multiple block write. + if (!sd.card()->writeStart(bgnBlock, FILE_BLOCK_COUNT)) { + error("writeBegin failed"); + } + // Initialize queues. + emptyHead = emptyTail = 0; + fullHead = fullTail = 0; + + // Use SdFat buffer for one block. + emptyQueue[emptyHead] = (block_t*)cache; + emptyHead = queueNext(emptyHead); + + // Put rest of buffers in the empty queue. + for (uint8_t i = 0; i < BUFFER_BLOCK_COUNT; i++) { + emptyQueue[emptyHead] = &block[i]; + emptyHead = queueNext(emptyHead); + } + Serial.println(F("Logging - type any character to stop")); + // Wait for Serial Idle. + Serial.flush(); + delay(10); + uint32_t bn = 0; + uint32_t t0 = millis(); + uint32_t t1 = t0; + uint32_t overrun = 0; + uint32_t overrunTotal = 0; + uint32_t count = 0; + uint32_t maxLatency = 0; + int32_t diff; + // Start at a multiple of interval. + uint32_t logTime = micros()/LOG_INTERVAL_USEC + 1; + logTime *= LOG_INTERVAL_USEC; + bool closeFile = false; + while (1) { + // Time for next data record. + logTime += LOG_INTERVAL_USEC; + if (Serial.available()) closeFile = true; + + if (closeFile) { + if (curBlock != 0 && curBlock->count >= 0) { + // Put buffer in full queue. + fullQueue[fullHead] = curBlock; + fullHead = queueNext(fullHead); + curBlock = 0; + } + } else { + if (curBlock == 0 && emptyTail != emptyHead) { + curBlock = emptyQueue[emptyTail]; + emptyTail = queueNext(emptyTail); + curBlock->count = 0; + curBlock->overrun = overrun; + overrun = 0; + } + do { + diff = logTime - micros(); + } while(diff > 0); + if (diff < -10) error("LOG_INTERVAL_USEC too small"); + if (curBlock == 0) { + overrun++; + } else { + acquireData(&curBlock->data[curBlock->count++]); + if (curBlock->count == DATA_DIM) { + fullQueue[fullHead] = curBlock; + fullHead = queueNext(fullHead); + curBlock = 0; + } + } + } + + if (fullHead == fullTail) { + // Exit loop if done. + if (closeFile) break; + } else if (!sd.card()->isBusy()) { + // Get address of block to write. + block_t* pBlock = fullQueue[fullTail]; + fullTail = queueNext(fullTail); + // Write block to SD. + uint32_t usec = micros(); + if (!sd.card()->writeData((uint8_t*)pBlock)) { + error("write data failed"); + } + usec = micros() - usec; + t1 = millis(); + if (usec > maxLatency) maxLatency = usec; + count += pBlock->count; + + // Add overruns and possibly light LED. + if (pBlock->overrun) { + overrunTotal += pBlock->overrun; + if (ERROR_LED_PIN >= 0) { + digitalWrite(ERROR_LED_PIN, HIGH); + } + } + // Move block to empty queue. + emptyQueue[emptyHead] = pBlock; + emptyHead = queueNext(emptyHead); + bn++; + if (bn == FILE_BLOCK_COUNT) { + // File full so stop + break; + } + } + } + if (!sd.card()->writeStop()) { + error("writeStop failed"); + } + // Truncate file if recording stopped early. + if (bn != FILE_BLOCK_COUNT) { + Serial.println(F("Truncating file")); + if (!binFile.truncate(512L * bn)) { + error("Can't truncate file"); + } + } + if (!binFile.rename(sd.vwd(), binName)) { + error("Can't rename file"); + } + Serial.print(F("File renamed: ")); + Serial.println(binName); + Serial.print(F("Max block write usec: ")); + Serial.println(maxLatency); + Serial.print(F("Record time sec: ")); + Serial.println(0.001*(t1 - t0), 3); + Serial.print(F("Sample count: ")); + Serial.println(count); + Serial.print(F("Samples/sec: ")); + Serial.println((1000.0)*count/(t1-t0)); + Serial.print(F("Overruns: ")); + Serial.println(overrunTotal); + Serial.println(F("Done")); +} +//------------------------------------------------------------------------------ +void setup(void) { + if (ERROR_LED_PIN >= 0) { + pinMode(ERROR_LED_PIN, OUTPUT); + } + Serial.begin(9600); + + Serial.print(F("FreeRam: ")); + Serial.println(FreeRam()); + Serial.print(F("Records/block: ")); + Serial.println(DATA_DIM); + if (sizeof(block_t) != 512) error("Invalid block size"); + // initialize file system. + if (!sd.begin(SD_CS_PIN, SPI_FULL_SPEED)) { + sd.initErrorPrint(); + fatalBlink(); + } +} +//------------------------------------------------------------------------------ +void loop(void) { + // discard any input + while (Serial.read() >= 0) {} + Serial.println(); + Serial.println(F("type:")); + Serial.println(F("c - convert file to CSV")); + Serial.println(F("d - dump data to Serial")); + Serial.println(F("e - overrun error details")); + Serial.println(F("r - record data")); + + while(!Serial.available()) {} + char c = tolower(Serial.read()); + + // Discard extra Serial data. + do { + delay(10); + } while (Serial.read() >= 0); + + if (ERROR_LED_PIN >= 0) { + digitalWrite(ERROR_LED_PIN, LOW); + } + if (c == 'c') { + binaryToCsv(); + } else if (c == 'd') { + dumpData(); + } else if (c == 'e') { + checkOverrun(); + } else if (c == 'r') { + logData(); + } else { + Serial.println(F("Invalid entry")); + } +} diff --git a/SdFat/examples/LowLatencyLogger/UserDataType.h b/SdFat/examples/LowLatencyLogger/UserDataType.h new file mode 100644 index 0000000..8e161e2 --- /dev/null +++ b/SdFat/examples/LowLatencyLogger/UserDataType.h @@ -0,0 +1,8 @@ +#ifndef UserDataType_h +#define UserDataType_h +const uint8_t ADC_DIM = 4; +struct data_t { + unsigned long time; + unsigned short adc[ADC_DIM]; +}; +#endif // UserDataType_h diff --git a/SdFat/examples/OpenNext/OpenNext.ino b/SdFat/examples/OpenNext/OpenNext.ino new file mode 100644 index 0000000..61a4852 --- /dev/null +++ b/SdFat/examples/OpenNext/OpenNext.ino @@ -0,0 +1,40 @@ +/* + * Print size, modify date/time, and name for all files in root. + */ +#include + +// SD chip select pin +const uint8_t chipSelect = SS; + +// file system object +SdFat sd; + +SdFile file; +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + delay(1000); + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt(); + + // open next file in root. The volume working directory, vwd, is root + while (file.openNext(sd.vwd(), O_READ)) { + file.printFileSize(&Serial); + Serial.write(' '); + file.printModifyDateTime(&Serial); + Serial.write(' '); + file.printName(&Serial); + if (file.isDir()) { + // Indicate a directory. + Serial.write('/'); + } + Serial.println(); + file.close(); + } + Serial.println("Done!"); +} +//------------------------------------------------------------------------------ +void loop() {} diff --git a/SdFat/examples/PrintBenchmark/PrintBenchmark.ino b/SdFat/examples/PrintBenchmark/PrintBenchmark.ino new file mode 100644 index 0000000..66613f5 --- /dev/null +++ b/SdFat/examples/PrintBenchmark/PrintBenchmark.ino @@ -0,0 +1,119 @@ +/* + * This sketch is a simple Print benchmark. + */ +#include +#include + +// SD chip select pin +const uint8_t chipSelect = SS; + +// number of lines to print +const uint16_t N_PRINT = 20000; + +// file system +SdFat sd; + +// test file +SdFile file; + +// Serial output stream +ArduinoOutStream cout(Serial); +//------------------------------------------------------------------------------ +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + while (!Serial) { + // wait for Leonardo + } +} +//------------------------------------------------------------------------------ +void loop() { + uint32_t maxLatency; + uint32_t minLatency; + uint32_t totalLatency; + + while (Serial.read() >= 0) { + } + // pstr stores strings in flash to save RAM + cout << pstr("Type any character to start\n"); + while (Serial.read() <= 0) { + } + delay(400); // catch Due reset problem + + cout << pstr("Free RAM: ") << FreeRam() << endl; + + // initialize the SD card at SPI_FULL_SPEED for best performance. + // try SPI_HALF_SPEED if bus errors occur. + if (!sd.begin(chipSelect, SPI_FULL_SPEED)) sd.initErrorHalt(); + + cout << pstr("Type is FAT") << int(sd.vol()->fatType()) << endl; + + // open or create file - truncate existing file. + if (!file.open("BENCH.TXT", O_CREAT | O_TRUNC | O_RDWR)) { + error("open failed"); + } + cout << pstr("Starting print test. Please wait.\n\n"); + + // do write test + for (int test = 0; test < 3; test++) { + + switch(test) { + case 0: + cout << pstr("Test of println(uint16_t)\n"); + break; + + case 1: + cout << pstr("Test of printField(uint16_t, char)\n"); + break; + + case 2: + cout << pstr("Test of println(double)\n"); + break; + } + file.truncate(0); + maxLatency = 0; + minLatency = 999999; + totalLatency = 0; + uint32_t t = millis(); + for (uint16_t i = 0; i < N_PRINT; i++) { + uint32_t m = micros(); + + switch(test) { + case 0: + file.println(i); + break; + + case 1: + file.printField(i, '\n'); + break; + + case 2: + file.println((double)0.01*i); + break; + } + + if (file.writeError) { + error("write failed"); + } + m = micros() - m; + if (maxLatency < m) maxLatency = m; + if (minLatency > m) minLatency = m; + totalLatency += m; + } + file.sync(); + t = millis() - t; + double s = file.fileSize(); + cout << pstr("Time ") << 0.001*t << pstr(" sec\n"); + cout << pstr("File size ") << 0.001*s << pstr(" KB\n"); + cout << pstr("Write ") << s/t << pstr(" KB/sec\n"); + cout << pstr("Maximum latency: ") << maxLatency; + cout << pstr(" usec, Minimum Latency: ") << minLatency; + cout << pstr(" usec, Avg Latency: "); + cout << totalLatency/N_PRINT << pstr(" usec\n\n"); + } + file.close(); + cout << pstr("Done!\n\n"); +} + diff --git a/SdFat/examples/QuickStart/QuickStart.ino b/SdFat/examples/QuickStart/QuickStart.ino new file mode 100644 index 0000000..8a045b9 --- /dev/null +++ b/SdFat/examples/QuickStart/QuickStart.ino @@ -0,0 +1,156 @@ +// Quick hardware test. +// +#include +// +// Set DISABLE_CHIP_SELECT to disable a second SPI device. +// For example, with the Ethernet shield, set DISABLE_CHIP_SELECT +// to 10 to disable the Ethernet controller. +const int8_t DISABLE_CHIP_SELECT = -1; +// +// Test with reduced SPI speed for breadboards. +// Change spiSpeed to SPI_FULL_SPEED for better performance +// Use SPI_QUARTER_SPEED for even slower SPI bus speed +const uint8_t spiSpeed = SPI_HALF_SPEED; +//------------------------------------------------------------------------------ +// Normally the SdFat class is used in applications in place +// of Sd2Card, SdVolume, and SdFile for root. +// These internal classes are used here to diagnose problems. +Sd2Card card; +SdVolume volume; +SdFile root; + +// Serial streams +ArduinoOutStream cout(Serial); + +// input buffer for line +char cinBuf[40]; +ArduinoInStream cin(Serial, cinBuf, sizeof(cinBuf)); + +// SD card chip select +int chipSelect; + +void cardOrSpeed() { + cout << pstr("Try another SD card or reduce the SPI bus speed.\n"); + cout << pstr("Edit spiSpeed in this sketch to change it.\n"); +} + +void reformatMsg() { + cout << pstr("Try reformatting the card. For best results use\n"); + cout << pstr("the SdFormatter sketch in SdFat/examples or download\n"); + cout << pstr("and use SDFormatter from www.sdcard.org/consumer.\n"); +} + +void setup() { + Serial.begin(9600); + while (!Serial) {} // Wait for Leonardo. + delay(1000); // Delay for Due. + + cout << pstr("\nSPI pins:\n"); + cout << pstr("MOSI: ") << int(MOSI) << endl; + cout << pstr("MISO: ") << int(MISO) << endl; + cout << pstr("SCK: ") << int(SCK) << endl; + + if (DISABLE_CHIP_SELECT < 0) { + cout << pstr( + "\nBe sure to edit DISABLE_CHIP_SELECT if you have\n" + "a second SPI device. For example, with the Ethernet\n" + "shield, DISABLE_CHIP_SELECT should be set to 10\n" + "to disable the Ethernet controller.\n"); + } + cout << pstr( + "\nSD chip select is the key hardware option.\n" + "Common values are:\n" + "Arduino Ethernet shield, pin 4\n" + "Sparkfun SD shield, pin 8\n" + "Adafruit SD shields and modules, pin 10\n"); +} + +bool firstTry = true; +void loop() { + // read any existing Serial data + while (Serial.read() >= 0) {} + + if (!firstTry) cout << pstr("\nRestarting\n"); + firstTry = false; + + cout << pstr("\nEnter the chip select pin number: "); + cin.readline(); + if (cin >> chipSelect) { + cout << chipSelect << endl; + } else { + cout << pstr("\nInvalid pin number\n"); + return; + } + if (DISABLE_CHIP_SELECT < 0) { + cout << pstr( + "\nAssuming the SD is the only SPI device.\n" + "Edit DISABLE_CHIP_SELECT to disable another device.\n"); + } else { + cout << pstr("\nDisabling SPI device on pin "); + cout << int(DISABLE_CHIP_SELECT) << endl; + pinMode(DISABLE_CHIP_SELECT, OUTPUT); + digitalWrite(DISABLE_CHIP_SELECT, HIGH); + } + if (!card.init(spiSpeed, chipSelect)) { + cout << pstr( + "\nSD initialization failed.\n" + "Do not reformat the card!\n" + "Is the card correctly inserted?\n" + "Is chipSelect set to the correct value?\n" + "Does another SPI device need to be disabled?\n" + "Is there a wiring/soldering problem?\n"); + cout << pstr("errorCode: ") << hex << showbase << int(card.errorCode()); + cout << pstr(", errorData: ") << int(card.errorData()); + cout << dec << noshowbase << endl; + return; + } + cout << pstr("\nCard successfully initialized.\n"); + cout << endl; + + uint32_t size = card.cardSize(); + if (size == 0) { + cout << pstr("Can't determine the card size.\n"); + cardOrSpeed(); + return; + } + uint32_t sizeMB = 0.000512 * size + 0.5; + cout << pstr("Card size: ") << sizeMB; + cout << pstr(" MB (MB = 1,000,000 bytes)\n"); + cout << endl; + + if (!volume.init(&card)) { + if (card.errorCode()) { + cout << pstr("Can't read the card.\n"); + cardOrSpeed(); + } else { + cout << pstr("Can't find a valid FAT16/FAT32 partition.\n"); + reformatMsg(); + } + return; + } + cout << pstr("Volume is FAT") << int(volume.fatType()); + cout << pstr(", Cluster size (bytes): ") << 512L * volume.blocksPerCluster(); + cout << endl << endl; + + root.close(); + if (!root.openRoot(&volume)) { + cout << pstr("Can't open root directory.\n"); + reformatMsg(); + return; + } + cout << pstr("Files found (name date time size):\n"); + root.ls(LS_R | LS_DATE | LS_SIZE); + + if ((sizeMB > 1100 && volume.blocksPerCluster() < 64) + || (sizeMB < 2200 && volume.fatType() == 32)) { + cout << pstr("\nThis card should be reformatted for best performance.\n"); + cout << pstr("Use a cluster size of 32 KB for cards larger than 1 GB.\n"); + cout << pstr("Only cards larger than 2 GB should be formatted FAT32.\n"); + reformatMsg(); + return; + } + // read any existing Serial data + while (Serial.read() >= 0) {} + cout << pstr("\nSuccess! Type any character to restart.\n"); + while (Serial.read() < 0) {} +} \ No newline at end of file diff --git a/SdFat/examples/RawWrite/RawWrite.ino b/SdFat/examples/RawWrite/RawWrite.ino new file mode 100644 index 0000000..319d0fd --- /dev/null +++ b/SdFat/examples/RawWrite/RawWrite.ino @@ -0,0 +1,174 @@ +/* + * This sketch illustrates raw write functions in SdFat that + * can be used for high speed data logging. These functions + * are used in the WaveRP library to record audio with the + * Adafruit Wave Shield using the built-in Arduino ADC. + * + * The WaveRP library captures data from the ADC in an ISR + * that is driven driven by timer one. Data is collected in + * two 512 byte buffers and written to the SD card. + * + * This sketch simulates logging from a source that produces + * data at a constant rate of one block every MICROS_PER_BLOCK. + * + * If a high quality SanDisk card is used with this sketch + * no overruns occur and the maximum block write time is + * under 2000 micros. + * + * Note: WaveRP creates a very large file then truncates it + * to the length that is used for a recording. It only takes + * a few seconds to erase a 500 MB file since the card only + * marks the blocks as erased; no data transfer is required. + */ + +#include +#include + +// SD chip select pin +const uint8_t chipSelect = SS; + +// number of blocks in the contiguous file +const uint32_t BLOCK_COUNT = 10000UL; + +// time to produce a block of data +const uint32_t MICROS_PER_BLOCK = 10000; + +// file system +SdFat sd; + +// test file +SdFile file; + +// file extent +uint32_t bgnBlock, endBlock; + +// Serial output stream +ArduinoOutStream cout(Serial); +//------------------------------------------------------------------------------ +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) +//------------------------------------------------------------------------------ +// log of first overruns +#define OVER_DIM 20 +struct { + uint32_t block; + uint32_t micros; +} over[OVER_DIM]; +//------------------------------------------------------------------------------ +void setup(void) { + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo +} +//------------------------------------------------------------------------------ +void loop(void) { + while (Serial.read() >= 0) {} + // pstr stores strings in flash to save RAM + cout << pstr("Type any character to start\n"); + while (Serial.read() <= 0) {} + delay(400); // catch Due reset problem + + cout << pstr("Free RAM: ") << FreeRam() << endl; + + // initialize the SD card at SPI_FULL_SPEED for best performance. + // try SPI_HALF_SPEED if bus errors occur. + if (!sd.begin(chipSelect, SPI_FULL_SPEED)) sd.initErrorHalt(); + + // delete possible existing file + sd.remove("RAW.TXT"); + + // create a contiguous file + if (!file.createContiguous(sd.vwd(), "RAW.TXT", 512UL*BLOCK_COUNT)) { + error("createContiguous failed"); + } + // get the location of the file's blocks + if (!file.contiguousRange(&bgnBlock, &endBlock)) { + error("contiguousRange failed"); + } + //*********************NOTE************************************** + // NO SdFile calls are allowed while cache is used for raw writes + //*************************************************************** + + // clear the cache and use it as a 512 byte buffer + uint8_t* pCache = (uint8_t*)sd.vol()->cacheClear(); + + // fill cache with eight lines of 64 bytes each + memset(pCache, ' ', 512); + for (uint16_t i = 0; i < 512; i += 64) { + // put line number at end of line then CR/LF + pCache[i + 61] = '0' + (i/64); + pCache[i + 62] = '\r'; + pCache[i + 63] = '\n'; + } + + cout << pstr("Start raw write of ") << file.fileSize() << pstr(" bytes at\n"); + cout << 512000000UL/MICROS_PER_BLOCK << pstr(" bytes per second\n"); + cout << pstr("Please wait ") << (BLOCK_COUNT*MICROS_PER_BLOCK)/1000000UL; + cout << pstr(" seconds\n"); + + // tell card to setup for multiple block write with pre-erase + if (!sd.card()->writeStart(bgnBlock, BLOCK_COUNT)) { + error("writeStart failed"); + } + // init stats + uint16_t overruns = 0; + uint32_t maxWriteTime = 0; + uint32_t t = micros(); + uint32_t tNext = t; + + // write data + for (uint32_t b = 0; b < BLOCK_COUNT; b++) { + // write must be done by this time + tNext += MICROS_PER_BLOCK; + + // put block number at start of first line in block + uint32_t n = b; + for (int8_t d = 5; d >= 0; d--){ + pCache[d] = n || d == 5 ? n % 10 + '0' : ' '; + n /= 10; + } + // write a 512 byte block + uint32_t tw = micros(); + if (!sd.card()->writeData(pCache)) error("writeData failed"); + tw = micros() - tw; + + // check for max write time + if (tw > maxWriteTime) { + maxWriteTime = tw; + } + // check for overrun + if (micros() > tNext) { + if (overruns < OVER_DIM) { + over[overruns].block = b; + over[overruns].micros = tw; + } + overruns++; + // advance time to reflect overrun + tNext = micros(); + } + else { + // wait for time to write next block + while(micros() < tNext); + } + } + // total write time + t = micros() - t; + + // end multiple block write mode + if (!sd.card()->writeStop()) error("writeStop failed"); + + cout << pstr("Done\n"); + cout << pstr("Elapsed time: ") << setprecision(3)<< 1.e-6*t; + cout << pstr(" seconds\n"); + cout << pstr("Max write time: ") << maxWriteTime << pstr(" micros\n"); + cout << pstr("Overruns: ") << overruns << endl; + if (overruns) { + uint8_t n = overruns > OVER_DIM ? OVER_DIM : overruns; + cout << pstr("fileBlock,micros") << endl; + for (uint8_t i = 0; i < n; i++) { + cout << over[i].block << ',' << over[i].micros << endl; + } + } + // close file for next pass of loop + file.close(); + Serial.println(); +} \ No newline at end of file diff --git a/SdFat/examples/ReadWriteSdFat/ReadWriteSdFat.ino b/SdFat/examples/ReadWriteSdFat/ReadWriteSdFat.ino new file mode 100644 index 0000000..09bc124 --- /dev/null +++ b/SdFat/examples/ReadWriteSdFat/ReadWriteSdFat.ino @@ -0,0 +1,68 @@ +// Ported to SdFat from the native Arduino SD library example by Bill Greiman +// On the Ethernet Shield, CS is pin 4. SdFat handles setting SS +const int chipSelect = 4; +/* + SD card read/write + + This example shows how to read and write data to and from an SD card file + The circuit: + * SD card attached to SPI bus as follows: + ** MOSI - pin 11 + ** MISO - pin 12 + ** CLK - pin 13 + ** CS - pin 4 + + created Nov 2010 + by David A. Mellis + updated 2 Dec 2010 + by Tom Igoe + modified by Bill Greiman 11 Apr 2011 + This example code is in the public domain. + + */ +#include +SdFat sd; +SdFile myFile; + +void setup() { + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + Serial.println("Type any character to start"); + while (Serial.read() <= 0) {} + delay(400); // catch Due reset problem + + // Initialize SdFat or print a detailed error message and halt + // Use half speed like the native library. + // change to SPI_FULL_SPEED for more performance. + if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt(); + + // open the file for write at end like the Native SD library + if (!myFile.open("test.txt", O_RDWR | O_CREAT | O_AT_END)) { + sd.errorHalt("opening test.txt for write failed"); + } + // if the file opened okay, write to it: + Serial.print("Writing to test.txt..."); + myFile.println("testing 1, 2, 3."); + + // close the file: + myFile.close(); + Serial.println("done."); + + // re-open the file for reading: + if (!myFile.open("test.txt", O_READ)) { + sd.errorHalt("opening test.txt for read failed"); + } + Serial.println("test.txt:"); + + // read from the file until there's nothing else in it: + int data; + while ((data = myFile.read()) >= 0) Serial.write(data); + // close the file: + myFile.close(); +} + +void loop() { + // nothing happens after setup +} + + diff --git a/SdFat/examples/SdFormatter/SdFormatter.ino b/SdFat/examples/SdFormatter/SdFormatter.ino new file mode 100644 index 0000000..35a5d00 --- /dev/null +++ b/SdFat/examples/SdFormatter/SdFormatter.ino @@ -0,0 +1,486 @@ +/* + * This sketch will format an SD or SDHC card. + * Warning all data will be deleted! + * + * For SD/SDHC cards larger than 64 MB this + * sketch attempts to match the format + * generated by SDFormatter available here: + * + * http://www.sdcard.org/consumers/formatter/ + * + * For smaller cards this sketch uses FAT16 + * and SDFormatter uses FAT12. + */ +// Print extra info for debug if DEBUG_PRINT is nonzero +#define DEBUG_PRINT 0 +#include +#if DEBUG_PRINT +#include +#endif // DEBUG_PRINT +// +// Change the value of chipSelect if your hardware does +// not use the default value, SS. Common values are: +// Arduino Ethernet shield: pin 4 +// Sparkfun SD shield: pin 8 +// Adafruit SD shields and modules: pin 10 +const uint8_t chipSelect = SS; + +// Change spiSpeed to SPI_FULL_SPEED for better performance +// Use SPI_QUARTER_SPEED for even slower SPI bus speed +const uint8_t spiSpeed = SPI_HALF_SPEED; + +// Serial output stream +ArduinoOutStream cout(Serial); + +Sd2Card card; +uint32_t cardSizeBlocks; +uint16_t cardCapacityMB; + +// cache for SD block +cache_t cache; + +// MBR information +uint8_t partType; +uint32_t relSector; +uint32_t partSize; + +// Fake disk geometry +uint8_t numberOfHeads; +uint8_t sectorsPerTrack; + +// FAT parameters +uint16_t reservedSectors; +uint8_t sectorsPerCluster; +uint32_t fatStart; +uint32_t fatSize; +uint32_t dataStart; + +// constants for file system structure +uint16_t const BU16 = 128; +uint16_t const BU32 = 8192; + +// strings needed in file system structures +char noName[] = "NO NAME "; +char fat16str[] = "FAT16 "; +char fat32str[] = "FAT32 "; +//------------------------------------------------------------------------------ +#define sdError(msg) sdError_P(PSTR(msg)) + +void sdError_P(const char* str) { + cout << pstr("error: "); + cout << pgm(str) << endl; + if (card.errorCode()) { + cout << pstr("SD error: ") << hex << int(card.errorCode()); + cout << ',' << int(card.errorData()) << dec << endl; + } + while (1); +} +//------------------------------------------------------------------------------ +#if DEBUG_PRINT +void debugPrint() { + cout << pstr("FreeRam: ") << FreeRam() << endl; + cout << pstr("partStart: ") << relSector << endl; + cout << pstr("partSize: ") << partSize << endl; + cout << pstr("reserved: ") << reservedSectors << endl; + cout << pstr("fatStart: ") << fatStart << endl; + cout << pstr("fatSize: ") << fatSize << endl; + cout << pstr("dataStart: ") << dataStart << endl; + cout << pstr("clusterCount: "); + cout << ((relSector + partSize - dataStart)/sectorsPerCluster) << endl; + cout << endl; + cout << pstr("Heads: ") << int(numberOfHeads) << endl; + cout << pstr("Sectors: ") << int(sectorsPerTrack) << endl; + cout << pstr("Cylinders: "); + cout << cardSizeBlocks/(numberOfHeads*sectorsPerTrack) << endl; +} +#endif // DEBUG_PRINT +//------------------------------------------------------------------------------ +// write cached block to the card +uint8_t writeCache(uint32_t lbn) { + return card.writeBlock(lbn, cache.data); +} +//------------------------------------------------------------------------------ +// initialize appropriate sizes for SD capacity +void initSizes() { + if (cardCapacityMB <= 6) { + sdError("Card is too small."); + } else if (cardCapacityMB <= 16) { + sectorsPerCluster = 2; + } else if (cardCapacityMB <= 32) { + sectorsPerCluster = 4; + } else if (cardCapacityMB <= 64) { + sectorsPerCluster = 8; + } else if (cardCapacityMB <= 128) { + sectorsPerCluster = 16; + } else if (cardCapacityMB <= 1024) { + sectorsPerCluster = 32; + } else if (cardCapacityMB <= 32768) { + sectorsPerCluster = 64; + } else { + // SDXC cards + sectorsPerCluster = 128; + } + + cout << pstr("Blocks/Cluster: ") << int(sectorsPerCluster) << endl; + // set fake disk geometry + sectorsPerTrack = cardCapacityMB <= 256 ? 32 : 63; + + if (cardCapacityMB <= 16) { + numberOfHeads = 2; + } else if (cardCapacityMB <= 32) { + numberOfHeads = 4; + } else if (cardCapacityMB <= 128) { + numberOfHeads = 8; + } else if (cardCapacityMB <= 504) { + numberOfHeads = 16; + } else if (cardCapacityMB <= 1008) { + numberOfHeads = 32; + } else if (cardCapacityMB <= 2016) { + numberOfHeads = 64; + } else if (cardCapacityMB <= 4032) { + numberOfHeads = 128; + } else { + numberOfHeads = 255; + } +} +//------------------------------------------------------------------------------ +// zero cache and optionally set the sector signature +void clearCache(uint8_t addSig) { + memset(&cache, 0, sizeof(cache)); + if (addSig) { + cache.mbr.mbrSig0 = BOOTSIG0; + cache.mbr.mbrSig1 = BOOTSIG1; + } +} +//------------------------------------------------------------------------------ +// zero FAT and root dir area on SD +void clearFatDir(uint32_t bgn, uint32_t count) { + clearCache(false); + if (!card.writeStart(bgn, count)) { + sdError("Clear FAT/DIR writeStart failed"); + } + for (uint32_t i = 0; i < count; i++) { + if ((i & 0XFF) == 0) cout << '.'; + if (!card.writeData(cache.data)) { + sdError("Clear FAT/DIR writeData failed"); + } + } + if (!card.writeStop()) { + sdError("Clear FAT/DIR writeStop failed"); + } + cout << endl; +} +//------------------------------------------------------------------------------ +// return cylinder number for a logical block number +uint16_t lbnToCylinder(uint32_t lbn) { + return lbn / (numberOfHeads * sectorsPerTrack); +} +//------------------------------------------------------------------------------ +// return head number for a logical block number +uint8_t lbnToHead(uint32_t lbn) { + return (lbn % (numberOfHeads * sectorsPerTrack)) / sectorsPerTrack; +} +//------------------------------------------------------------------------------ +// return sector number for a logical block number +uint8_t lbnToSector(uint32_t lbn) { + return (lbn % sectorsPerTrack) + 1; +} +//------------------------------------------------------------------------------ +// format and write the Master Boot Record +void writeMbr() { + clearCache(true); + part_t* p = cache.mbr.part; + p->boot = 0; + uint16_t c = lbnToCylinder(relSector); + if (c > 1023) sdError("MBR CHS"); + p->beginCylinderHigh = c >> 8; + p->beginCylinderLow = c & 0XFF; + p->beginHead = lbnToHead(relSector); + p->beginSector = lbnToSector(relSector); + p->type = partType; + uint32_t endLbn = relSector + partSize - 1; + c = lbnToCylinder(endLbn); + if (c <= 1023) { + p->endCylinderHigh = c >> 8; + p->endCylinderLow = c & 0XFF; + p->endHead = lbnToHead(endLbn); + p->endSector = lbnToSector(endLbn); + } else { + // Too big flag, c = 1023, h = 254, s = 63 + p->endCylinderHigh = 3; + p->endCylinderLow = 255; + p->endHead = 254; + p->endSector = 63; + } + p->firstSector = relSector; + p->totalSectors = partSize; + if (!writeCache(0)) sdError("write MBR"); +} +//------------------------------------------------------------------------------ +// generate serial number from card size and micros since boot +uint32_t volSerialNumber() { + return (cardSizeBlocks << 8) + micros(); +} +//------------------------------------------------------------------------------ +// format the SD as FAT16 +void makeFat16() { + uint32_t nc; + for (dataStart = 2 * BU16;; dataStart += BU16) { + nc = (cardSizeBlocks - dataStart)/sectorsPerCluster; + fatSize = (nc + 2 + 255)/256; + uint32_t r = BU16 + 1 + 2 * fatSize + 32; + if (dataStart < r) continue; + relSector = dataStart - r + BU16; + break; + } + // check valid cluster count for FAT16 volume + if (nc < 4085 || nc >= 65525) sdError("Bad cluster count"); + reservedSectors = 1; + fatStart = relSector + reservedSectors; + partSize = nc * sectorsPerCluster + 2 * fatSize + reservedSectors + 32; + if (partSize < 32680) { + partType = 0X01; + } else if (partSize < 65536) { + partType = 0X04; + } else { + partType = 0X06; + } + // write MBR + writeMbr(); + clearCache(true); + fat_boot_t* pb = &cache.fbs; + pb->jump[0] = 0XEB; + pb->jump[1] = 0X00; + pb->jump[2] = 0X90; + for (uint8_t i = 0; i < sizeof(pb->oemId); i++) { + pb->oemId[i] = ' '; + } + pb->bytesPerSector = 512; + pb->sectorsPerCluster = sectorsPerCluster; + pb->reservedSectorCount = reservedSectors; + pb->fatCount = 2; + pb->rootDirEntryCount = 512; + pb->mediaType = 0XF8; + pb->sectorsPerFat16 = fatSize; + pb->sectorsPerTrack = sectorsPerTrack; + pb->headCount = numberOfHeads; + pb->hidddenSectors = relSector; + pb->totalSectors32 = partSize; + pb->driveNumber = 0X80; + pb->bootSignature = EXTENDED_BOOT_SIG; + pb->volumeSerialNumber = volSerialNumber(); + memcpy(pb->volumeLabel, noName, sizeof(pb->volumeLabel)); + memcpy(pb->fileSystemType, fat16str, sizeof(pb->fileSystemType)); + // write partition boot sector + if (!writeCache(relSector)) { + sdError("FAT16 write PBS failed"); + } + // clear FAT and root directory + clearFatDir(fatStart, dataStart - fatStart); + clearCache(false); + cache.fat16[0] = 0XFFF8; + cache.fat16[1] = 0XFFFF; + // write first block of FAT and backup for reserved clusters + if (!writeCache(fatStart) + || !writeCache(fatStart + fatSize)) { + sdError("FAT16 reserve failed"); + } +} +//------------------------------------------------------------------------------ +// format the SD as FAT32 +void makeFat32() { + uint32_t nc; + relSector = BU32; + for (dataStart = 2 * BU32;; dataStart += BU32) { + nc = (cardSizeBlocks - dataStart)/sectorsPerCluster; + fatSize = (nc + 2 + 127)/128; + uint32_t r = relSector + 9 + 2 * fatSize; + if (dataStart >= r) break; + } + // error if too few clusters in FAT32 volume + if (nc < 65525) sdError("Bad cluster count"); + reservedSectors = dataStart - relSector - 2 * fatSize; + fatStart = relSector + reservedSectors; + partSize = nc * sectorsPerCluster + dataStart - relSector; + // type depends on address of end sector + // max CHS has lbn = 16450560 = 1024*255*63 + if ((relSector + partSize) <= 16450560) { + // FAT32 + partType = 0X0B; + } else { + // FAT32 with INT 13 + partType = 0X0C; + } + writeMbr(); + clearCache(true); + + fat32_boot_t* pb = &cache.fbs32; + pb->jump[0] = 0XEB; + pb->jump[1] = 0X00; + pb->jump[2] = 0X90; + for (uint8_t i = 0; i < sizeof(pb->oemId); i++) { + pb->oemId[i] = ' '; + } + pb->bytesPerSector = 512; + pb->sectorsPerCluster = sectorsPerCluster; + pb->reservedSectorCount = reservedSectors; + pb->fatCount = 2; + pb->mediaType = 0XF8; + pb->sectorsPerTrack = sectorsPerTrack; + pb->headCount = numberOfHeads; + pb->hidddenSectors = relSector; + pb->totalSectors32 = partSize; + pb->sectorsPerFat32 = fatSize; + pb->fat32RootCluster = 2; + pb->fat32FSInfo = 1; + pb->fat32BackBootBlock = 6; + pb->driveNumber = 0X80; + pb->bootSignature = EXTENDED_BOOT_SIG; + pb->volumeSerialNumber = volSerialNumber(); + memcpy(pb->volumeLabel, noName, sizeof(pb->volumeLabel)); + memcpy(pb->fileSystemType, fat32str, sizeof(pb->fileSystemType)); + // write partition boot sector and backup + if (!writeCache(relSector) + || !writeCache(relSector + 6)) { + sdError("FAT32 write PBS failed"); + } + clearCache(true); + // write extra boot area and backup + if (!writeCache(relSector + 2) + || !writeCache(relSector + 8)) { + sdError("FAT32 PBS ext failed"); + } + fat32_fsinfo_t* pf = &cache.fsinfo; + pf->leadSignature = FSINFO_LEAD_SIG; + pf->structSignature = FSINFO_STRUCT_SIG; + pf->freeCount = 0XFFFFFFFF; + pf->nextFree = 0XFFFFFFFF; + // write FSINFO sector and backup + if (!writeCache(relSector + 1) + || !writeCache(relSector + 7)) { + sdError("FAT32 FSINFO failed"); + } + clearFatDir(fatStart, 2 * fatSize + sectorsPerCluster); + clearCache(false); + cache.fat32[0] = 0x0FFFFFF8; + cache.fat32[1] = 0x0FFFFFFF; + cache.fat32[2] = 0x0FFFFFFF; + // write first block of FAT and backup for reserved clusters + if (!writeCache(fatStart) + || !writeCache(fatStart + fatSize)) { + sdError("FAT32 reserve failed"); + } +} +//------------------------------------------------------------------------------ +// flash erase all data +uint32_t const ERASE_SIZE = 262144L; +void eraseCard() { + cout << endl << pstr("Erasing\n"); + uint32_t firstBlock = 0; + uint32_t lastBlock; + uint16_t n = 0; + + do { + lastBlock = firstBlock + ERASE_SIZE - 1; + if (lastBlock >= cardSizeBlocks) lastBlock = cardSizeBlocks - 1; + if (!card.erase(firstBlock, lastBlock)) sdError("erase failed"); + cout << '.'; + if ((n++)%32 == 31) cout << endl; + firstBlock += ERASE_SIZE; + } while (firstBlock < cardSizeBlocks); + cout << endl; + + if (!card.readBlock(0, cache.data)) sdError("readBlock"); + cout << hex << showbase << setfill('0') << internal; + cout << pstr("All data set to ") << setw(4) << int(cache.data[0]) << endl; + cout << dec << noshowbase << setfill(' ') << right; + cout << pstr("Erase done\n"); +} +//------------------------------------------------------------------------------ +void formatCard() { + cout << endl; + cout << pstr("Formatting\n"); + initSizes(); + if (card.type() != SD_CARD_TYPE_SDHC) { + cout << pstr("FAT16\n"); + makeFat16(); + } else { + cout << pstr("FAT32\n"); + makeFat32(); + } +#if DEBUG_PRINT + debugPrint(); +#endif // DEBUG_PRINT + cout << pstr("Format done\n"); +} +//------------------------------------------------------------------------------ +void setup() { + char c; + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + + cout << pstr( + "\n" + "This sketch can erase and/or format SD/SDHC cards.\n" + "\n" + "Erase uses the card's fast flash erase command.\n" + "Flash erase sets all data to 0X00 for most cards\n" + "and 0XFF for a few vendor's cards.\n" + "\n" + "Cards larger than 2 GB will be formatted FAT32 and\n" + "smaller cards will be formatted FAT16.\n" + "\n" + "Warning, all data on the card will be erased.\n" + "Enter 'Y' to continue: "); + while (!Serial.available()) {} + delay(400); // catch Due restart problem + + c = Serial.read(); + cout << c << endl; + if (c != 'Y') { + cout << pstr("Quiting, you did not enter 'Y'.\n"); + return; + } + // read any existing Serial data + while (Serial.read() >= 0) {} + + cout << pstr( + "\n" + "Options are:\n" + "E - erase the card and skip formatting.\n" + "F - erase and then format the card. (recommended)\n" + "Q - quick format the card without erase.\n" + "\n" + "Enter option: "); + + while (!Serial.available()) {} + c = Serial.read(); + cout << c << endl; + if (!strchr("EFQ", c)) { + cout << pstr("Quiting, invalid option entered.") << endl; + return; + } + + if (!card.init(spiSpeed, chipSelect)) { + cout << pstr( + "\nSD initialization failure!\n" + "Is the SD card inserted correctly?\n" + "Is chip select correct at the top of this sketch?\n"); + sdError("card.init failed"); + } + cardSizeBlocks = card.cardSize(); + if (cardSizeBlocks == 0) sdError("cardSize"); + cardCapacityMB = (cardSizeBlocks + 2047)/2048; + + cout << pstr("Card Size: ") << cardCapacityMB; + cout << pstr(" MB, (MB = 1,048,576 bytes)") << endl; + + if (c == 'E' || c == 'F') { + eraseCard(); + } + if (c == 'F' || c == 'Q') { + formatCard(); + } +} +//------------------------------------------------------------------------------ +void loop() {} diff --git a/SdFat/examples/SdInfo/SdInfo.ino b/SdFat/examples/SdInfo/SdInfo.ino new file mode 100644 index 0000000..52fda4f --- /dev/null +++ b/SdFat/examples/SdInfo/SdInfo.ino @@ -0,0 +1,197 @@ +/* + * This sketch attempts to initialize an SD card and analyze its structure. + */ +#include +/* + * SD chip select pin. Common values are: + * + * Arduino Ethernet shield, pin 4. + * SparkFun SD shield, pin 8. + * Adafruit SD shields and modules, pin 10. + * Default SD chip select is the SPI SS pin. + */ +const uint8_t SdChipSelect = SS; + +Sd2Card card; +SdVolume vol; + +// serial output steam +ArduinoOutStream cout(Serial); + +// global for card size +uint32_t cardSize; + +// global for card erase size +uint32_t eraseSize; +//------------------------------------------------------------------------------ +// store error strings in flash +#define sdErrorMsg(msg) sdErrorMsg_P(PSTR(msg)); +void sdErrorMsg_P(const char* str) { + cout << pgm(str) << endl; + if (card.errorCode()) { + cout << pstr("SD errorCode: "); + cout << hex << int(card.errorCode()) << endl; + cout << pstr("SD errorData: "); + cout << int(card.errorData()) << dec << endl; + } +} +//------------------------------------------------------------------------------ +uint8_t cidDmp() { + cid_t cid; + if (!card.readCID(&cid)) { + sdErrorMsg("readCID failed"); + return false; + } + cout << pstr("\nManufacturer ID: "); + cout << hex << int(cid.mid) << dec << endl; + cout << pstr("OEM ID: ") << cid.oid[0] << cid.oid[1] << endl; + cout << pstr("Product: "); + for (uint8_t i = 0; i < 5; i++) { + cout << cid.pnm[i]; + } + cout << pstr("\nVersion: "); + cout << int(cid.prv_n) << '.' << int(cid.prv_m) << endl; + cout << pstr("Serial number: ") << hex << cid.psn << dec << endl; + cout << pstr("Manufacturing date: "); + cout << int(cid.mdt_month) << '/'; + cout << (2000 + cid.mdt_year_low + 10 * cid.mdt_year_high) << endl; + cout << endl; + return true; +} +//------------------------------------------------------------------------------ +uint8_t csdDmp() { + csd_t csd; + uint8_t eraseSingleBlock; + if (!card.readCSD(&csd)) { + sdErrorMsg("readCSD failed"); + return false; + } + if (csd.v1.csd_ver == 0) { + eraseSingleBlock = csd.v1.erase_blk_en; + eraseSize = (csd.v1.sector_size_high << 1) | csd.v1.sector_size_low; + } else if (csd.v2.csd_ver == 1) { + eraseSingleBlock = csd.v2.erase_blk_en; + eraseSize = (csd.v2.sector_size_high << 1) | csd.v2.sector_size_low; + } else { + cout << pstr("csd version error\n"); + return false; + } + eraseSize++; + cout << pstr("cardSize: ") << 0.000512*cardSize; + cout << pstr(" MB (MB = 1,000,000 bytes)\n"); + + cout << pstr("flashEraseSize: ") << int(eraseSize) << pstr(" blocks\n"); + cout << pstr("eraseSingleBlock: "); + if (eraseSingleBlock) { + cout << pstr("true\n"); + } else { + cout << pstr("false\n"); + } + return true; +} +//------------------------------------------------------------------------------ +// print partition table +uint8_t partDmp() { + cache_t *p = vol.cacheClear(); + if (!p) { + sdErrorMsg("cacheClear failed"); + return false; + } + if (!card.readBlock(0, p->data)) { + sdErrorMsg("read MBR failed"); + return false; + } + cout << pstr("\nSD Partition Table\n"); + cout << pstr("part,boot,type,start,length\n"); + for (uint8_t ip = 1; ip < 5; ip++) { + part_t *pt = &p->mbr.part[ip - 1]; + cout << int(ip) << ',' << hex << int(pt->boot) << ',' << int(pt->type); + cout << dec << ',' << pt->firstSector <<',' << pt->totalSectors << endl; + } + return true; +} +//------------------------------------------------------------------------------ +void volDmp() { + cout << pstr("\nVolume is FAT") << int(vol.fatType()) << endl; + cout << pstr("blocksPerCluster: ") << int(vol.blocksPerCluster()) << endl; + cout << pstr("clusterCount: ") << vol.clusterCount() << endl; + uint32_t volFree = vol.freeClusterCount(); + cout << pstr("freeClusters: ") << volFree << endl; + float fs = 0.000512*volFree*vol.blocksPerCluster(); + cout << pstr("freeSpace: ") << fs << pstr(" MB (MB = 1,000,000 bytes)\n"); + cout << pstr("fatStartBlock: ") << vol.fatStartBlock() << endl; + cout << pstr("fatCount: ") << int(vol.fatCount()) << endl; + cout << pstr("blocksPerFat: ") << vol.blocksPerFat() << endl; + cout << pstr("rootDirStart: ") << vol.rootDirStart() << endl; + cout << pstr("dataStartBlock: ") << vol.dataStartBlock() << endl; + if (vol.dataStartBlock() % eraseSize) { + cout << pstr("Data area is not aligned on flash erase boundaries!\n"); + cout << pstr("Download and use formatter from www.sdcard.org/consumer!\n"); + } +} +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + while(!Serial) {} // wait for Leonardo + + // use uppercase in hex and use 0X base prefix + cout << uppercase << showbase << endl; + + // pstr stores strings in flash to save RAM + cout << pstr("SdFat version: ") << SD_FAT_VERSION << endl; +} +//------------------------------------------------------------------------------ +void loop() { + // read any existing Serial data + while (Serial.read() >= 0) {} + + // pstr stores strings in flash to save RAM + cout << pstr("\ntype any character to start\n"); + while (Serial.read() <= 0) {} + delay(400); // catch Due reset problem + + uint32_t t = millis(); + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!card.init(SPI_HALF_SPEED, SdChipSelect)) { + sdErrorMsg("\ncard.init failed"); + return; + } + t = millis() - t; + + cardSize = card.cardSize(); + if (cardSize == 0) { + sdErrorMsg("cardSize failed"); + return; + } + cout << pstr("\ninit time: ") << t << " ms" << endl; + cout << pstr("\nCard type: "); + switch (card.type()) { + case SD_CARD_TYPE_SD1: + cout << pstr("SD1\n"); + break; + + case SD_CARD_TYPE_SD2: + cout << pstr("SD2\n"); + break; + + case SD_CARD_TYPE_SDHC: + if (cardSize < 70000000) { + cout << pstr("SDHC\n"); + } else { + cout << pstr("SDXC\n"); + } + break; + + default: + cout << pstr("Unknown\n"); + } + if (!cidDmp()) return; + if (!csdDmp()) return; + if (!partDmp()) return; + if (!vol.init(&card)) { + sdErrorMsg("\nvol.init failed"); + return; + } + volDmp(); +} \ No newline at end of file diff --git a/SdFat/examples/StdioBench/StdioBench.ino b/SdFat/examples/StdioBench/StdioBench.ino new file mode 100644 index 0000000..82ba24b --- /dev/null +++ b/SdFat/examples/StdioBench/StdioBench.ino @@ -0,0 +1,201 @@ + +#include +#include + +// Define PRINT_FIELD nonzero to use printField. +#define PRINT_FIELD 0 + +// Number of lines to list on Serial. +#define STDIO_LIST_COUNT 0 +#define VERIFY_CONTENT 0 + +const uint8_t SD_CS_PIN = SS; +SdFat sd; + +SdFile printFile; +StdioStream stdioFile; + +float f[100]; +char buf[20]; +char* label[] = + {"uint8_t 0 to 255, 100 times ", "uint16_t 0 to 20000", + "uint32_t 0 to 20000", "uint32_t 1000000000 to 1000010000", + "float nnn.ffff, 10000 times"}; +//------------------------------------------------------------------------------ +void setup() { + uint32_t m; + uint32_t printSize; + uint32_t stdioSize; + uint32_t printTime; + uint32_t stdioTime; + + Serial.begin(9600); + Serial.println(F("Type any character to start")); + while (!Serial.available()); + Serial.println(F("Starting test")); + if (!sd.begin(SD_CS_PIN)) sd.errorHalt(); + + for (uint8_t i = 0; i < 100; i++) { + f[i] = 123.0 + 0.12345*i; + } + + for (uint8_t dataType = 0; dataType < 5; dataType++) { + for (uint8_t fileType = 0; fileType < 2; fileType++) { + if (!fileType) { + if (!printFile.open("PRRINT.TXT", O_CREAT | O_RDWR | O_TRUNC)) { + Serial.println("open fail"); + return; + } + printTime = millis(); + switch (dataType) { + case 0: + for (uint16_t i =0; i < 100; i++) { + for (uint8_t j = 0; j < 255; j++) { + printFile.println(j); + } + } + break; + case 1: + for (uint16_t i = 0; i < 20000; i++) { + printFile.println(i); + } + break; + + case 2: + for (uint32_t i = 0; i < 20000; i++) { + printFile.println(i); + } + break; + + case 3: + for (uint16_t i = 0; i < 10000; i++) { + printFile.println(i + 1000000000UL); + } + break; + + case 4: + for (int j = 0; j < 100; j++) { + for (uint8_t i = 0; i < 100; i++) { + printFile.println(f[i], 4); + } + } + break; + default: + break; + } + printFile.sync(); + printTime = millis() - printTime; + printFile.rewind(); + printSize = printFile.fileSize(); + + } else { + if (!stdioFile.fopen("STREAM.TXT", "w+")) { + Serial.println("fopen fail"); + return; + } + stdioTime = millis(); + + switch (dataType) { + case 0: + for (uint16_t i =0; i < 100; i++) { + for (uint8_t j = 0; j < 255; j++) { + #if PRINT_FIELD + stdioFile.printField(j, '\n'); + #else // PRINT_FIELD + stdioFile.println(j); + #endif // PRINT_FIELD + } + } + break; + case 1: + for (uint16_t i = 0; i < 20000; i++) { + #if PRINT_FIELD + stdioFile.printField(i, '\n'); + #else // PRINT_FIELD + stdioFile.println(i); + #endif // PRINT_FIELD + } + break; + + case 2: + for (uint32_t i = 0; i < 20000; i++) { + #if PRINT_FIELD + stdioFile.printField(i, '\n'); + #else // PRINT_FIELD + stdioFile.println(i); + #endif // PRINT_FIELD + } + break; + + case 3: + for (uint16_t i = 0; i < 10000; i++) { + #if PRINT_FIELD + stdioFile.printField(i + 1000000000UL, '\n'); + #else // PRINT_FIELD + stdioFile.println(i + 1000000000UL); + #endif // PRINT_FIELD + } + break; + + case 4: + for (int j = 0; j < 100; j++) { + for (uint8_t i = 0; i < 100; i++) { + #if PRINT_FIELD + stdioFile.printField(f[i], '\n', 4); + #else // PRINT_FIELD + stdioFile.println(f[i], 4); + #endif // PRINT_FIELD + } + } + break; + default: + break; + } + stdioFile.fflush(); + stdioTime = millis() - stdioTime; + stdioSize = stdioFile.ftell(); + if (STDIO_LIST_COUNT) { + size_t len; + stdioFile.rewind(); + for (int i = 0; i < STDIO_LIST_COUNT; i++) { + stdioFile.fgets(buf, sizeof(buf), &len); + Serial.print(len);Serial.print(','); + Serial.print(buf); + } + } + + } + + } + Serial.println(label[dataType]); + if (VERIFY_CONTENT && printSize == stdioSize) { + printFile.rewind(); + stdioFile.rewind(); + for (uint32_t i = 0; i < stdioSize; i++) { + if (printFile.read() != stdioFile.getc()) { + Serial.print(F("Files differ at pos: ")); + Serial.println(i); + return; + } + } + } + + Serial.print("fileSize: "); + if (printSize != stdioSize) { + Serial.print(printSize); + Serial.print(" != "); + } + Serial.println(stdioSize); + Serial.print("print millis: "); + Serial.println(printTime); + Serial.print("stdio millis: "); + Serial.println(stdioTime); + Serial.print("ratio: "); + Serial.println((float)printTime/(float)stdioTime); + Serial.println(); + printFile.close(); + stdioFile.fclose(); + } + Serial.println("Done"); +} +void loop() {} \ No newline at end of file diff --git a/SdFat/examples/StressTest/StressTest.ino b/SdFat/examples/StressTest/StressTest.ino new file mode 100644 index 0000000..20d102f --- /dev/null +++ b/SdFat/examples/StressTest/StressTest.ino @@ -0,0 +1,75 @@ +// This stress test will create and write files until the SD is full. +#include + +// SD chip select pin. +const uint8_t SD_CS_PIN = SS; + +// Set write buffer size. +#ifdef __arm__ +#ifndef CORE_TEENSY +// Due +const size_t BUF_SIZE = 32768; +#else // CORE_TEENSY +// Teensy 3.0 +const size_t BUF_SIZE = 8192; +#endif // CORE_TEENSY +#elif defined(RAMEND) && RAMEND > 5000 +// AVR with more than 4 KB RAM +const size_t BUF_SIZE = 4096; +#else // __arm__ +// other +const size_t BUF_SIZE = 512; +#endif // __arm__ + +const size_t FILE_SIZE_KB = 10240; +const uint16_t BUFS_PER_FILE = (1024L*FILE_SIZE_KB/BUF_SIZE); + +SdFat sd; + +SdFile file; + +uint8_t buf[BUF_SIZE]; +char name[13]; +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + Serial.print("BUF_SIZE "); + Serial.println(BUF_SIZE); + Serial.println("Type any character to start"); + while (Serial.read() < 0) {} + + if (!sd.begin(SD_CS_PIN))sd.errorHalt("sd.begin"); + + // Fill buf with known value. + for (size_t i = 0; i < BUF_SIZE; i++) buf[i] = i; + + // Wait to begin. + do {delay(10);} while (Serial.read() >= 0); + Serial.println("Type any character to stop after next file"); +} +//------------------------------------------------------------------------------ +void loop() { + // Free KB on SD. + uint32_t freeKB = sd.vol()->freeClusterCount()*sd.vol()->blocksPerCluster()/2; + + Serial.print("Free KB: "); + Serial.println(freeKB); + if (freeKB < 2*FILE_SIZE_KB) { + Serial.println(" Done!"); + while(1); + } + sprintf(name, "%lu.DAT", freeKB); + if (!file.open(name, O_WRITE | O_CREAT | O_TRUNC)) { + sd.errorHalt("Open error!"); + } + for (uint16_t i = 0; i < BUFS_PER_FILE; i++) { + if (file.write(buf, BUF_SIZE) != BUF_SIZE) { + sd.errorHalt("Write error!"); + } + } + file.close(); + if (Serial.available()) { + Serial.println("Stopped!"); + while(1); + } +} \ No newline at end of file diff --git a/SdFat/examples/Timestamp/Timestamp.ino b/SdFat/examples/Timestamp/Timestamp.ino new file mode 100644 index 0000000..32b870d --- /dev/null +++ b/SdFat/examples/Timestamp/Timestamp.ino @@ -0,0 +1,168 @@ +/* + * This sketch tests the dateTimeCallback() function + * and the timestamp() function. + */ +#include + +SdFat sd; + +SdFile file; + +// Default SD chip select is SS pin +const uint8_t chipSelect = SS; + +// create Serial stream +ArduinoOutStream cout(Serial); +//------------------------------------------------------------------------------ +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) +//------------------------------------------------------------------------------ +/* + * date/time values for debug + * normally supplied by a real-time clock or GPS + */ +// date 1-Oct-09 +uint16_t year = 2009; +uint8_t month = 10; +uint8_t day = 1; + +// time 20:30:40 +uint8_t hour = 20; +uint8_t minute = 30; +uint8_t second = 40; +//------------------------------------------------------------------------------ +/* + * User provided date time callback function. + * See SdFile::dateTimeCallback() for usage. + */ +void dateTime(uint16_t* date, uint16_t* time) { + // User gets date and time from GPS or real-time + // clock in real callback function + + // return date using FAT_DATE macro to format fields + *date = FAT_DATE(year, month, day); + + // return time using FAT_TIME macro to format fields + *time = FAT_TIME(hour, minute, second); +} +//------------------------------------------------------------------------------ +/* + * Function to print all timestamps. + */ +void printTimestamps(SdFile& f) { + dir_t d; + if (!f.dirEntry(&d)) error("f.dirEntry failed"); + + cout << pstr("Creation: "); + f.printFatDate(d.creationDate); + cout << ' '; + f.printFatTime(d.creationTime); + cout << endl; + + cout << pstr("Modify: "); + f.printFatDate(d.lastWriteDate); + cout <<' '; + f.printFatTime(d.lastWriteTime); + cout << endl; + + cout << pstr("Access: "); + f.printFatDate(d.lastAccessDate); + cout << endl; +} +//------------------------------------------------------------------------------ +void setup(void) { + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + + cout << pstr("Type any character to start\n"); + while (!Serial.available()); + delay(400); // catch Due reset problem + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt(); + + // remove files if they exist + sd.remove("CALLBACK.TXT"); + sd.remove("DEFAULT.TXT"); + sd.remove("STAMP.TXT"); + + // create a new file with default timestamps + if (!file.open("DEFAULT.TXT", O_CREAT | O_WRITE)) { + error("open DEFAULT.TXT failed"); + } + cout << pstr("\nOpen with default times\n"); + printTimestamps(file); + + // close file + file.close(); + /* + * Test the date time callback function. + * + * dateTimeCallback() sets the function + * that is called when a file is created + * or when a file's directory entry is + * modified by sync(). + * + * The callback can be disabled by the call + * SdFile::dateTimeCallbackCancel() + */ + // set date time callback function + SdFile::dateTimeCallback(dateTime); + + // create a new file with callback timestamps + if (!file.open("CALLBACK.TXT", O_CREAT | O_WRITE)) { + error("open CALLBACK.TXT failed"); + } + cout << ("\nOpen with callback times\n"); + printTimestamps(file); + + // change call back date + day += 1; + + // must add two to see change since FAT second field is 5-bits + second += 2; + + // modify file by writing a byte + file.write('t'); + + // force dir update + file.sync(); + + cout << pstr("\nTimes after write\n"); + printTimestamps(file); + + // close file + file.close(); + /* + * Test timestamp() function + * + * Cancel callback so sync will not + * change access/modify timestamp + */ + SdFile::dateTimeCallbackCancel(); + + // create a new file with default timestamps + if (!file.open("STAMP.TXT", O_CREAT | O_WRITE)) { + error("open STAMP.TXT failed"); + } + // set creation date time + if (!file.timestamp(T_CREATE, 2009, 11, 10, 1, 2, 3)) { + error("set create time failed"); + } + // set write/modification date time + if (!file.timestamp(T_WRITE, 2009, 11, 11, 4, 5, 6)) { + error("set write time failed"); + } + // set access date + if (!file.timestamp(T_ACCESS, 2009, 11, 12, 7, 8, 9)) { + error("set access time failed"); + } + cout << pstr("\nTimes after timestamp() calls\n"); + printTimestamps(file); + + file.close(); + cout << pstr("\nDone\n"); +} + +void loop(void){} \ No newline at end of file diff --git a/SdFat/examples/TwoCards/TwoCards.ino b/SdFat/examples/TwoCards/TwoCards.ino new file mode 100644 index 0000000..9065e1f --- /dev/null +++ b/SdFat/examples/TwoCards/TwoCards.ino @@ -0,0 +1,140 @@ +/* + * Example use of two SD cards. + */ +#include +#include +#if !USE_MULTIPLE_CARDS +#error You must set USE_MULTIPLE_CARDS nonzero in SdFatConfig.h +#endif + +SdFat sd1; +const uint8_t SD1_CS = 10; // chip select for sd1 + +SdFat sd2; +const uint8_t SD2_CS = 9; // chip select for sd2 + +const uint8_t BUF_DIM = 100; +uint8_t buf[BUF_DIM]; + +const uint32_t FILE_SIZE = 1000000; +const uint16_t NWRITE = FILE_SIZE/BUF_DIM; +//------------------------------------------------------------------------------ +// print error msg, any SD error codes, and halt. +// store messages in flash +#define errorExit(msg) errorHalt_P(PSTR(msg)) +#define initError(msg) initErrorHalt_P(PSTR(msg)) +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + PgmPrint("FreeRam: "); + + Serial.println(FreeRam()); + + // fill buffer with known data + for (int i = 0; i < sizeof(buf); i++) buf[i] = i; + + PgmPrintln("type any character to start"); + while (Serial.read() <= 0) {} + delay(400); // catch Due reset problem + + // disable sd2 while initializing sd1 + pinMode(SD2_CS, OUTPUT); + digitalWrite(SD2_CS, HIGH); + + // initialize the first card + if (!sd1.begin(SD1_CS)) { + sd1.initError("sd1:"); + } + // create DIR1 on sd1 if it does not exist + if (!sd1.exists("/DIR1")) { + if (!sd1.mkdir("/DIR1")) sd1.errorExit("sd1.mkdir"); + } + // initialize the second card + if (!sd2.begin(SD2_CS)) { + sd2.initError("sd2:"); + } + // create DIR2 on sd2 if it does not exist + if (!sd2.exists("/DIR2")) { + if (!sd2.mkdir("/DIR2")) sd2.errorExit("sd2.mkdir"); + } + // list root directory on both cards + PgmPrintln("------sd1 root-------"); + sd1.ls(); + PgmPrintln("------sd2 root-------"); + sd2.ls(); + + // make /DIR1 the default directory for sd1 + if (!sd1.chdir("/DIR1")) sd1.errorExit("sd1.chdir"); + + // make /DIR2 the default directory for sd2 + if (!sd2.chdir("/DIR2")) sd2.errorExit("sd2.chdir"); + + // list current directory on both cards + PgmPrintln("------sd1 DIR1-------"); + sd1.ls(); + PgmPrintln("------sd2 DIR2-------"); + sd2.ls(); + PgmPrintln("---------------------"); + + // remove RENAME.BIN from /DIR2 directory of sd2 + if (sd2.exists("RENAME.BIN")) { + if (!sd2.remove("RENAME.BIN")) { + sd2.errorExit("remove RENAME.BIN"); + } + } + // set the current working directory for open() to sd1 + sd1.chvol(); + + // create or open /DIR1/TEST.BIN and truncate it to zero length + SdFile file1; + if (!file1.open("TEST.BIN", O_RDWR | O_CREAT | O_TRUNC)) { + sd1.errorExit("file1"); + } + PgmPrintln("Writing TEST.BIN to sd1"); + + // write data to /DIR1/TEST.BIN on sd1 + for (int i = 0; i < NWRITE; i++) { + if (file1.write(buf, sizeof(buf)) != sizeof(buf)) { + sd1.errorExit("sd1.write"); + } + } + // set the current working directory for open() to sd2 + sd2.chvol(); + + // create or open /DIR2/COPY.BIN and truncate it to zero length + SdFile file2; + if (!file2.open("COPY.BIN", O_WRITE | O_CREAT | O_TRUNC)) { + sd2.errorExit("file2"); + } + PgmPrintln("Copying TEST.BIN to COPY.BIN"); + + // copy file1 to file2 + file1.rewind(); + uint32_t t = millis(); + + while (1) { + int n = file1.read(buf, sizeof(buf)); + if (n < 0) sd1.errorExit("read1"); + if (n == 0) break; + if (file2.write(buf, n) != n) sd2.errorExit("write2"); + } + t = millis() - t; + PgmPrint("File size: "); + Serial.println(file2.fileSize()); + PgmPrint("Copy time: "); + Serial.print(t); + PgmPrintln(" millis"); + + // close TEST.BIN + file1.close(); + + // rename the copy + file2.close(); + if (!sd2.rename("COPY.BIN", "RENAME.BIN")) { + sd2.errorExit("sd2.rename"); + } + PgmPrintln("Done"); +} +//------------------------------------------------------------------------------ +void loop() {} diff --git a/SdFat/examples/bench/bench.ino b/SdFat/examples/bench/bench.ino new file mode 100644 index 0000000..a357730 --- /dev/null +++ b/SdFat/examples/bench/bench.ino @@ -0,0 +1,173 @@ +/* + * This sketch is a simple binary write/read benchmark. + */ +#include +#include + +// SD chip select pin +const uint8_t chipSelect = SS; + +// Size of read/write. +const size_t BUF_SIZE = 512; + +// File size in MB where MB = 1,000,000 bytes. +const uint32_t FILE_SIZE_MB = 5; + +// Write pass count. +const uint8_t WRITE_COUNT = 10; + +// Read pass count. +const uint8_t READ_COUNT = 5; +//============================================================================== +// End of configuration constants. +//------------------------------------------------------------------------------ +// File size in bytes. +const uint32_t FILE_SIZE = 1000000UL*FILE_SIZE_MB; + +uint8_t buf[BUF_SIZE]; + +// file system +SdFat sd; + +// test file +SdFile file; + +// Serial output stream +ArduinoOutStream cout(Serial); +//------------------------------------------------------------------------------ +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) +//------------------------------------------------------------------------------ +void cidDmp() { + cid_t cid; + if (!sd.card()->readCID(&cid)) { + error("readCID failed"); + } + cout << pstr("\nManufacturer ID: "); + cout << hex << int(cid.mid) << dec << endl; + cout << pstr("OEM ID: ") << cid.oid[0] << cid.oid[1] << endl; + cout << pstr("Product: "); + for (uint8_t i = 0; i < 5; i++) { + cout << cid.pnm[i]; + } + cout << pstr("\nVersion: "); + cout << int(cid.prv_n) << '.' << int(cid.prv_m) << endl; + cout << pstr("Serial number: ") << hex << cid.psn << dec << endl; + cout << pstr("Manufacturing date: "); + cout << int(cid.mdt_month) << '/'; + cout << (2000 + cid.mdt_year_low + 10 * cid.mdt_year_high) << endl; + cout << endl; +} +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + while (!Serial){} // wait for Leonardo + cout << pstr("\nUse a freshly formatted SD for best performance.\n"); + + // use uppercase in hex and use 0X base prefix + cout << uppercase << showbase << endl; +} +//------------------------------------------------------------------------------ +void loop() { + float s; + uint32_t t; + uint32_t maxLatency; + uint32_t minLatency; + uint32_t totalLatency; + + // discard any input + while (Serial.read() >= 0) {} + + // pstr stores strings in flash to save RAM + cout << pstr("Type any character to start\n"); + while (Serial.read() <= 0) {} + delay(400); // catch Due reset problem + + cout << pstr("Free RAM: ") << FreeRam() << endl; + + // initialize the SD card at SPI_FULL_SPEED for best performance. + // try SPI_HALF_SPEED if bus errors occur. + if (!sd.begin(chipSelect, SPI_FULL_SPEED)) sd.initErrorHalt(); + + cout << pstr("Type is FAT") << int(sd.vol()->fatType()) << endl; + cout << pstr("Card size: ") << sd.card()->cardSize()*512E-9; + cout << pstr(" GB (GB = 1E9 bytes)") << endl; + + cidDmp(); + + // open or create file - truncate existing file. + if (!file.open("BENCH.DAT", O_CREAT | O_TRUNC | O_RDWR)) { + error("open failed"); + } + + // fill buf with known data + for (uint16_t i = 0; i < (BUF_SIZE-2); i++) { + buf[i] = 'A' + (i % 26); + } + buf[BUF_SIZE-2] = '\r'; + buf[BUF_SIZE-1] = '\n'; + + cout << pstr("File size ") << FILE_SIZE_MB << pstr(" MB\n"); + cout << pstr("Buffer size ") << BUF_SIZE << pstr(" bytes\n"); + cout << pstr("Starting write test, please wait.") << endl << endl; + + // do write test + uint32_t n = FILE_SIZE/sizeof(buf); + cout < m) minLatency = m; + totalLatency += m; + } + file.sync(); + t = millis() - t; + s = file.fileSize(); + cout << s/t <<',' << maxLatency << ',' << minLatency; + cout << ',' << totalLatency/n << endl; + } + + cout << endl << pstr("Starting read test, please wait.") << endl; + cout << endl < m) minLatency = m; + totalLatency += m; + if (buf[BUF_SIZE-1] != '\n') { + error("data check"); + } + } + t = millis() - t; + cout << s/t <<',' << maxLatency << ',' << minLatency; + cout << ',' << totalLatency/n << endl; + } + cout << endl << pstr("Done") << endl; + file.close(); +} \ No newline at end of file diff --git a/SdFat/examples/cin_cout/cin_cout.ino b/SdFat/examples/cin_cout/cin_cout.ino new file mode 100644 index 0000000..1cc752c --- /dev/null +++ b/SdFat/examples/cin_cout/cin_cout.ino @@ -0,0 +1,34 @@ +/* + * Demo of ArduinoInStream and ArduinoOutStream + */ +#include + +// create serial output stream +ArduinoOutStream cout(Serial); + +// input buffer for line +char cinBuf[40]; + +// create serial input stream +ArduinoInStream cin(Serial, cinBuf, sizeof(cinBuf)); +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo +} +//------------------------------------------------------------------------------ +void loop() { + int32_t n; + + cout << "\nenter an integer\n"; + + cin.readline(); + + if (cin >> n) { + cout << "The number is: " << n; + } else { + // will fail if no digits or not in range [-2147483648, 2147483647] + cout << "Invalid input: " << cinBuf; + } + cout << endl; +} diff --git a/SdFat/examples/dataLogger/dataLogger.ino b/SdFat/examples/dataLogger/dataLogger.ino new file mode 100644 index 0000000..19e81aa --- /dev/null +++ b/SdFat/examples/dataLogger/dataLogger.ino @@ -0,0 +1,138 @@ +/* + * Simple data logger. + */ +#include + +// SD chip select pin. Be sure to disable any other SPI devices such as Enet. +const uint8_t chipSelect = SS; + +// Interval between data records in milliseconds. +// The interval must be greater than the maximum SD write latency plus the +// time to acquire and write data to the SD to avoid overrun errors. +// Run the bench example to check the quality of your SD card. +const uint32_t SAMPLE_INTERVAL_MS = 200; + +// Log file base name. Must be six characters or less. +#define FILE_BASE_NAME "DATA" +//------------------------------------------------------------------------------ +// File system object. +SdFat sd; + +// Log file. +SdFile file; + +// Time in micros for next data record. +uint32_t logTime; + +//============================================================================== +// User functions. Edit writeHeader() and logData() for your requirements. + +const uint8_t ANALOG_COUNT = 4; +//------------------------------------------------------------------------------ +// Write data header. +void writeHeader() { + file.print(F("micros")); + for (uint8_t i = 0; i < ANALOG_COUNT; i++) { + file.print(F(",adc")); + file.print(i, DEC); + } + file.println(); +} +//------------------------------------------------------------------------------ +// Log a data record. +void logData() { + uint16_t data[ANALOG_COUNT]; + + // Read all channels to avoid SD write latency between readings. + for (uint8_t i = 0; i < ANALOG_COUNT; i++) { + data[i] = analogRead(i); + } + // Write data to file. Start with log time in micros. + file.print(logTime); + + // Write ADC data to CSV record. + for (uint8_t i = 0; i < ANALOG_COUNT; i++) { + file.write(','); + file.print(data[i]); + } + file.println(); +} +//============================================================================== +// Error messages stored in flash. +#define error(msg) error_P(PSTR(msg)) +//------------------------------------------------------------------------------ +void error_P(const char* msg) { + sd.errorHalt_P(msg); +} +//------------------------------------------------------------------------------ +void setup() { + const uint8_t BASE_NAME_SIZE = sizeof(FILE_BASE_NAME) - 1; + char fileName[13] = FILE_BASE_NAME "00.CSV"; + + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + delay(1000); + + Serial.println(F("Type any character to start")); + while (!Serial.available()) {} + + // Initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt(); + + // Find an unused file name. + if (BASE_NAME_SIZE > 6) { + error("FILE_BASE_NAME too long"); + } + while (sd.exists(fileName)) { + if (fileName[BASE_NAME_SIZE + 1] != '9') { + fileName[BASE_NAME_SIZE + 1]++; + } else if (fileName[BASE_NAME_SIZE] != '9') { + fileName[BASE_NAME_SIZE + 1] = '0'; + fileName[BASE_NAME_SIZE]++; + } else { + error("Can't create file name"); + } + } + if (!file.open(fileName, O_CREAT | O_WRITE | O_EXCL)) error("file.open"); + do { + delay(10); + } while (Serial.read() >= 0); + + Serial.print(F("Logging to: ")); + Serial.println(fileName); + Serial.println(F("Type any character to stop")); + + // Write data header. + writeHeader(); + + // Start on a multiple of the sample interval. + logTime = micros()/(1000UL*SAMPLE_INTERVAL_MS) + 1; + logTime *= 1000UL*SAMPLE_INTERVAL_MS; +} +//------------------------------------------------------------------------------ +void loop() { + // Time for next record. + logTime += 1000UL*SAMPLE_INTERVAL_MS; + + // Wait for log time. + int32_t diff; + do { + diff = micros() - logTime; + } while (diff < 0); + + // Check for data rate too high. + if (diff > 10) error("Missed data record"); + + logData(); + + // Force data to SD and update the directory entry to avoid data loss. + if (!file.sync() || file.getWriteError()) error("write error"); + + if (Serial.available()) { + // Close file and stop. + file.close(); + Serial.println(F("Done")); + while(1) {} + } +} \ No newline at end of file diff --git a/SdFat/examples/directoryFunctions/directoryFunctions.ino b/SdFat/examples/directoryFunctions/directoryFunctions.ino new file mode 100644 index 0000000..f69e084 --- /dev/null +++ b/SdFat/examples/directoryFunctions/directoryFunctions.ino @@ -0,0 +1,108 @@ +/* + * Example use of chdir(), ls(), mkdir(), and rmdir(). + */ +#include +// SD card chip select pin. +const uint8_t SD_CHIP_SELECT = SS; +//------------------------------------------------------------------------------ +// Permit SD to be wiped if ALLOW_WIPE is true. +const bool ALLOW_WIPE = false; + +// File system object. +SdFat sd; + +// Use for file creation in folders. +SdFile file; + +// Create a Serial output stream. +ArduinoOutStream cout(Serial); + +// Buffer for Serial input. +char cinBuf[40]; + +// Create a serial input stream. +ArduinoInStream cin(Serial, cinBuf, sizeof(cinBuf)); +//============================================================================== +// Error messages stored in flash. +#define error(msg) error_P(PSTR(msg)) +//------------------------------------------------------------------------------ +void error_P(const char* msg) { + sd.errorHalt_P(msg); +} +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + delay(1000); + + cout << pstr("Type any character to start\n"); + // Wait for input line and discard. + cin.readline(); + + // Initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.begin(SD_CHIP_SELECT, SPI_HALF_SPEED)) sd.initErrorHalt(); + + // Check for empty SD. + if (file.openNext(sd.vwd(), O_READ)) { + cout << pstr("Found files/folders in the root directory.\n"); + if (!ALLOW_WIPE) { + error("SD not empty, use a blank SD or set ALLOW_WIPE true."); + } else { + cout << pstr("Type: 'WIPE' to delete all SD files.\n"); + char buf[10]; + cin.readline(); + cin.get(buf, sizeof(buf)); + if (cin.fail() || strncmp(buf, "WIPE", 4) || buf[4] >= ' ') { + error("Invalid WIPE input"); + } + file.close(); + sd.vwd()->rmRfStar(); + cout << pstr("***SD wiped clean.***\n\n"); + } + } + + // Create a new folder. + if (!sd.mkdir("FOLDER1")) error("Create FOLDER1 failed"); + cout << pstr("Created FOLDER1\n"); + + // Create a file in FOLDER1 using a path. + if (!file.open("FOLDER1/FILE1.TXT", O_CREAT | O_WRITE)) { + error("create FOLDER1/FILE1.TXT failed"); + } + file.close(); + cout << pstr("Created FOLDER1/FILE1.TXT\n"); + + // Change volume working directory to FOLDER1. + if (!sd.chdir("FOLDER1")) error("chdir failed for FOLDER1.\n"); + cout << pstr("chdir to FOLDER1\n"); + + // Create FILE2.TXT in current directory. + if (!file.open("FILE2.TXT", O_CREAT | O_WRITE)) { + error("create FILE2.TXT failed"); + } + file.close(); + cout << pstr("Created FILE2.TXT in current directory\n"); + + cout << pstr("List of files on the SD.\n"); + sd.ls("/", LS_R); + + // Remove files from current directory. + if (!sd.remove("FILE1.TXT") || !sd.remove("FILE2.TXT")) error("remove failed"); + cout << pstr("\nFILE1.TXT and FILE2.TXT removed.\n"); + + // Change current directory to root. + if (!sd.chdir()) error("chdir to root failed.\n"); + + cout << pstr("List of files on the SD.\n"); + sd.ls(LS_R); + + // Remove FOLDER1. + if (!sd.rmdir("FOLDER1")) error("rmdir for FOLDER1 failed\n"); + + cout << pstr("\nFOLDER1 removed, SD empty.\n"); + cout << pstr("Done!\n"); +} +//------------------------------------------------------------------------------ +// Nothing happens in loop. +void loop() {} \ No newline at end of file diff --git a/SdFat/examples/fgets/fgets.ino b/SdFat/examples/fgets/fgets.ino new file mode 100644 index 0000000..c7b909f --- /dev/null +++ b/SdFat/examples/fgets/fgets.ino @@ -0,0 +1,74 @@ +// Demo of fgets function to read lines from a file. +#include + +// SD chip select pin +const uint8_t chipSelect = SS; + +SdFat sd; +// print stream +ArduinoOutStream cout(Serial); +//------------------------------------------------------------------------------ +// store error strings in flash memory +#define error(s) sd.errorHalt_P(PSTR(s)) +//------------------------------------------------------------------------------ +void demoFgets() { + char line[25]; + int n; + // open test file + SdFile rdfile("FGETS.TXT", O_READ); + + // check for open error + if (!rdfile.isOpen()) error("demoFgets"); + + cout << endl << pstr( + "Lines with '>' end with a '\\n' character\n" + "Lines with '#' do not end with a '\\n' character\n" + "\n"); + + // read lines from the file + while ((n = rdfile.fgets(line, sizeof(line))) > 0) { + if (line[n - 1] == '\n') { + cout << '>' << line; + } else { + cout << '#' << line << endl; + } + } +} +//------------------------------------------------------------------------------ +void makeTestFile() { + // create or open test file + SdFile wrfile("FGETS.TXT", O_WRITE | O_CREAT | O_TRUNC); + + // check for open error + if (!wrfile.isOpen()) error("MakeTestFile"); + + // write test file + wrfile.write_P(PSTR( + "Line with CRLF\r\n" + "Line with only LF\n" + "Long line that will require an extra read\n" + "\n" // empty line + "Line at EOF without NL" + )); + wrfile.close(); +} +//------------------------------------------------------------------------------ +void setup(void) { + Serial.begin(9600); + while (!Serial) {} // Wait for Leonardo + + cout << pstr("Type any character to start\n"); + while (Serial.read() <= 0) {} + delay(400); // catch Due reset problem + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt(); + + makeTestFile(); + + demoFgets(); + + cout << pstr("\nDone\n"); +} +void loop(void) {} diff --git a/SdFat/examples/formatting/formatting.ino b/SdFat/examples/formatting/formatting.ino new file mode 100644 index 0000000..f42aa87 --- /dev/null +++ b/SdFat/examples/formatting/formatting.ino @@ -0,0 +1,66 @@ +/* + * Print a table with various formatting options + * Format dates + */ +#include + +// create Serial stream +ArduinoOutStream cout(Serial); +//------------------------------------------------------------------------------ +// print a table to demonstrate format manipulators +void example(void) { + const int max = 10; + const int width = 4; + + for (int row = 1; row <= max; row++) { + for (int col = 1; col <= max; col++) { + cout << setw(width) << row * col << (col == max ? '\n' : ' '); + } + } + cout << endl; +} +//------------------------------------------------------------------------------ +// print a date as mm/dd/yyyy with zero fill in mm and dd +// shows how to set and restore the fill character +void showDate(int m, int d, int y) { + // convert two digit year + if (y < 100) y += 2000; + + // set new fill to '0' save old fill character + char old = cout.fill('0'); + + // print date + cout << setw(2) << m << '/' << setw(2) << d << '/' << y << endl; + + // restore old fill character + cout.fill(old); +} +//------------------------------------------------------------------------------ +void setup(void) { + Serial.begin(9600); + + while (!Serial) {} // wait for Leonardo + delay(2000); + + cout << endl << "default formatting" << endl; + example(); + + cout << showpos << "showpos" << endl; + example(); + + cout << hex << left << showbase << "hex left showbase" << endl; + example(); + + cout << internal << setfill('0') << uppercase; + cout << "uppercase hex internal showbase fill('0')" < + +// SD chip select pin +const uint8_t chipSelect = SS; + +// file system object +SdFat sd; + +// create a serial stream +ArduinoOutStream cout(Serial); +//------------------------------------------------------------------------------ +void makeTestFile() { + ofstream sdout("GETLINE.TXT"); + // use flash for text to save RAM + sdout << pstr( + "short line\n" + "\n" + "17 character line\n" + "too long for buffer\n" + "line with no nl"); + + sdout.close(); +} +//------------------------------------------------------------------------------ +void testGetline() { + const int line_buffer_size = 18; + char buffer[line_buffer_size]; + ifstream sdin("GETLINE.TXT"); + int line_number = 0; + + while (sdin.getline(buffer, line_buffer_size, '\n') || sdin.gcount()) { + int count = sdin.gcount(); + if (sdin.fail()) { + cout << "Partial long line"; + sdin.clear(sdin.rdstate() & ~ios_base::failbit); + } else if (sdin.eof()) { + cout << "Partial final line"; // sdin.fail() is false + } else { + count--; // Don’t include newline in count + cout << "Line " << ++line_number; + } + cout << " (" << count << " chars): " << buffer << endl; + } +} +//------------------------------------------------------------------------------ +void setup(void) { + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + + // pstr stores strings in flash to save RAM + cout << pstr("Type any character to start\n"); + while (Serial.read() <= 0) {} + delay(400); // catch Due reset problem + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt(); + + // make the test file + makeTestFile(); + + // run the example + testGetline(); + cout << "\nDone!\n"; +} +//------------------------------------------------------------------------------ +void loop(void) {} diff --git a/SdFat/examples/readCSV/readCSV.ino b/SdFat/examples/readCSV/readCSV.ino new file mode 100644 index 0000000..5963448 --- /dev/null +++ b/SdFat/examples/readCSV/readCSV.ino @@ -0,0 +1,100 @@ +/* + * This example reads a simple CSV, comma-separated values, file. + * Each line of the file has three values, a long and two floats. + */ +#include + +// SD chip select pin +const uint8_t chipSelect = SS; + +// file system object +SdFat sd; + +// create Serial stream +ArduinoOutStream cout(Serial); + +char fileName[] = "TESTFILE.CSV"; +//------------------------------------------------------------------------------ +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) +//------------------------------------------------------------------------------ +// read and print CSV test file +void readFile() { + long lg; + float f1, f2; + char text[10]; + char c1, c2, c3; // space for commas. + + // open input file + ifstream sdin(fileName); + + // check for open error + if (!sdin.is_open()) error("open"); + + // read until input fails + while (1) { + // Get text field. + sdin.get(text, sizeof(text), ','); + + // Assume EOF if fail. + if (sdin.fail()) break; + + // Get commas and numbers. + sdin >> c1 >> lg >> c2 >> f1 >> c3 >> f2; + + // Skip CR/LF. + sdin.skipWhite(); + + if (sdin.fail()) error("bad input"); + + // error in line if not commas + if (c1 != ',' || c2 != ',' || c3 != ',') error("comma"); + + // print in six character wide columns + cout << text << setw(6) << lg << setw(6) << f1 << setw(6) << f2 << endl; + } + // Error in an input line if file is not at EOF. + if (!sdin.eof()) error("readFile"); +} +//------------------------------------------------------------------------------ +// write test file +void writeFile() { + + // create or open and truncate output file + ofstream sdout(fileName); + + // write file from string stored in flash + sdout << pstr( + "Line 1,1,2.3,4.5\n" + "Line 2,6,7.8,9.0\n" + "Line 3,9,8.7,6.5\n" + "Line 4,-4,-3.2,-1\n") << flush; + + // check for any errors + if (!sdout) error("writeFile"); + + sdout.close(); +} +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + cout << pstr("Type any character to start\n"); + while (Serial.read() <= 0) {} + delay(400); // catch Due reset problem + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance + if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt(); + + // create test file + writeFile(); + + cout << endl; + + // read and print test + readFile(); + + cout << "\nDone!" << endl; +} +void loop() {} \ No newline at end of file diff --git a/SdFat/examples/rename/rename.ino b/SdFat/examples/rename/rename.ino new file mode 100644 index 0000000..9394569 --- /dev/null +++ b/SdFat/examples/rename/rename.ino @@ -0,0 +1,77 @@ +/* + * This sketch demonstrates use of SdFile::rename() + * and SdFat::rename(). + */ +#include + +// SD chip select pin +const uint8_t chipSelect = SS; + +// file system +SdFat sd; + +// Serial print stream +ArduinoOutStream cout(Serial); +//------------------------------------------------------------------------------ +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + + cout << pstr("Insert an empty SD. Type any character to start.") << endl; + while (Serial.read() <= 0) {} + delay(400); // catch Due reset problem + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt(); + + // create a file and write one line to the file + SdFile file("NAME1.TXT", O_WRITE | O_CREAT); + if (!file.isOpen()) error("NAME1"); + file.println("A test line for NAME1.TXT"); + + // rename the file NAME2.TXT and add a line. + // sd.vwd() is the volume working directory, root. + if (!file.rename(sd.vwd(), "NAME2.TXT")) error("NAME2"); + file.println("A test line for NAME2.TXT"); + + // list files + cout << pstr("------") << endl; + sd.ls(LS_R); + + // make a new directory - "DIR1" + if (!sd.mkdir("DIR1")) error("DIR1"); + + // move file into DIR1, rename it NAME3.TXT and add a line + if (!file.rename(sd.vwd(), "DIR1/NAME3.TXT")) error("NAME3"); + file.println("A line for DIR1/NAME3.TXT"); + + // list files + cout << pstr("------") << endl; + sd.ls(LS_R); + + // make directory "DIR2" + if (!sd.mkdir("DIR2")) error("DIR2"); + + // close file before rename(oldPath, newPath) + file.close(); + + // move DIR1 into DIR2 and rename it DIR3 + if (!sd.rename("DIR1", "DIR2/DIR3")) error("DIR2/DIR3"); + + // open file for append in new location and add a line + if (!file.open("DIR2/DIR3/NAME3.TXT", O_WRITE | O_APPEND)) { + error("DIR2/DIR3/NAME3.TXT"); + } + file.println("A line for DIR2/DIR3/NAME3.TXT"); + + // list files + cout << pstr("------") << endl; + sd.ls(LS_R); + + cout << pstr("Done") << endl; +} +void loop() {} diff --git a/SdFat/ios.h b/SdFat/ios.h new file mode 100644 index 0000000..800939e --- /dev/null +++ b/SdFat/ios.h @@ -0,0 +1,394 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef ios_h +#define ios_h +#include +/** + * \file + * \brief \ref ios_base and \ref ios classes + */ +//============================================================================== +/** + * \class ios_base + * \brief Base class for all streams + */ +class ios_base { + public: + /** typedef for iostate bitmask */ + typedef unsigned char iostate; + // State flags. + /** iostate for no flags */ + static const iostate goodbit = 0x00; + /** iostate bad bit for a nonrecoverable error. */ + static const iostate badbit = 0X01; + /** iostate bit for end of file reached */ + static const iostate eofbit = 0x02; + /** iostate fail bit for nonfatal error */ + static const iostate failbit = 0X04; + /** + * unsigned size that can represent maximum file size. + * (violates spec - should be signed) + */ + typedef uint32_t streamsize; + /** type for absolute seek position */ + typedef uint32_t pos_type; + /** type for relative seek offset */ + typedef int32_t off_type; + + /** enumerated type for the direction of relative seeks */ + enum seekdir { + /** seek relative to the beginning of the stream */ + beg, + /** seek relative to the current stream position */ + cur, + /** seek relative to the end of the stream */ + end + }; + /** type for format flags */ + typedef unsigned int fmtflags; + /** left adjust fields */ + static const fmtflags left = 0x0001; + /** right adjust fields */ + static const fmtflags right = 0x0002; + /** fill between sign/base prefix and number */ + static const fmtflags internal = 0x0004; + /** base 10 flag*/ + static const fmtflags dec = 0x0008; + /** base 16 flag */ + static const fmtflags hex = 0x0010; + /** base 8 flag */ + static const fmtflags oct = 0x0020; + // static const fmtflags fixed = 0x0040; + // static const fmtflags scientific = 0x0080; + /** use strings true/false for bool */ + static const fmtflags boolalpha = 0x0100; + /** use prefix 0X for hex and 0 for oct */ + static const fmtflags showbase = 0x0200; + /** always show '.' for floating numbers */ + static const fmtflags showpoint = 0x0400; + /** show + sign for nonnegative numbers */ + static const fmtflags showpos = 0x0800; + /** skip initial white space */ + static const fmtflags skipws = 0x1000; + // static const fmtflags unitbuf = 0x2000; + /** use uppercase letters in number representations */ + static const fmtflags uppercase = 0x4000; + /** mask for adjustfield */ + static const fmtflags adjustfield = left | right | internal; + /** mask for basefield */ + static const fmtflags basefield = dec | hex | oct; + // static const fmtflags floatfield = scientific | fixed; + //---------------------------------------------------------------------------- + /** typedef for iostream open mode */ + typedef uint8_t openmode; + + // Openmode flags. + /** seek to end before each write */ + static const openmode app = 0X4; + /** open and seek to end immediately after opening */ + static const openmode ate = 0X8; + /** perform input and output in binary mode (as opposed to text mode) */ + static const openmode binary = 0X10; + /** open for input */ + static const openmode in = 0X20; + /** open for output */ + static const openmode out = 0X40; + /** truncate an existing stream when opening */ + static const openmode trunc = 0X80; + //---------------------------------------------------------------------------- + ios_base() : m_fill(' '), m_fmtflags(dec | right | skipws) + , m_precision(2), m_width(0) {} + /** \return fill character */ + char fill() {return m_fill;} + /** Set fill character + * \param[in] c new fill character + * \return old fill character + */ + char fill(char c) { + char r = m_fill; + m_fill = c; + return r; + } + /** \return format flags */ + fmtflags flags() const {return m_fmtflags;} + /** set format flags + * \param[in] fl new flag + * \return old flags + */ + fmtflags flags(fmtflags fl) { + fmtflags tmp = m_fmtflags; + m_fmtflags = fl; + return tmp; + } + /** \return precision */ + int precision() const {return m_precision;} + /** set precision + * \param[in] n new precision + * \return old precision + */ + int precision(unsigned int n) { + int r = m_precision; + m_precision = n; + return r; + } + /** set format flags + * \param[in] fl new flags to be or'ed in + * \return old flags + */ + fmtflags setf(fmtflags fl) { + fmtflags r = m_fmtflags; + m_fmtflags |= fl; + return r; + } + /** modify format flags + * \param[in] mask flags to be removed + * \param[in] fl flags to be set after mask bits have been cleared + * \return old flags + */ + fmtflags setf(fmtflags fl, fmtflags mask) { + fmtflags r = m_fmtflags; + m_fmtflags &= ~mask; + m_fmtflags |= fl; + return r; + } + /** clear format flags + * \param[in] fl flags to be cleared + * \return old flags + */ + void unsetf(fmtflags fl) { + m_fmtflags &= ~fl; + } + /** \return width */ + unsigned width() {return m_width;} + /** set width + * \param[in] n new width + * \return old width + */ + unsigned width(unsigned n) { + unsigned r = m_width; + m_width = n; + return r; + } + + protected: + /** \return current number base */ + uint8_t flagsToBase() { + uint8_t f = flags() & basefield; + return f == oct ? 8 : f != hex ? 10 : 16; + } + + private: + char m_fill; + fmtflags m_fmtflags; + unsigned char m_precision; + unsigned int m_width; +}; +//------------------------------------------------------------------------------ +/** function for boolalpha manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& boolalpha(ios_base& str) { + str.setf(ios_base::boolalpha); + return str; +} +/** function for dec manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& dec(ios_base& str) { + str.setf(ios_base::dec, ios_base::basefield); + return str; +} +/** function for hex manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& hex(ios_base& str) { + str.setf(ios_base::hex, ios_base::basefield); + return str; +} +/** function for internal manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& internal(ios_base& str) { + str.setf(ios_base::internal, ios_base::adjustfield); + return str; +} +/** function for left manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& left(ios_base& str) { + str.setf(ios_base::left, ios_base::adjustfield); + return str; +} +/** function for noboolalpha manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& noboolalpha(ios_base& str) { + str.unsetf(ios_base::boolalpha); + return str; +} +/** function for noshowbase manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& noshowbase(ios_base& str) { + str.unsetf(ios_base::showbase); + return str; +} +/** function for noshowpoint manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& noshowpoint(ios_base& str) { + str.unsetf(ios_base::showpoint); + return str; +} +/** function for noshowpos manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& noshowpos(ios_base& str) { + str.unsetf(ios_base::showpos); + return str; +} +/** function for noskipws manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& noskipws(ios_base& str) { + str.unsetf(ios_base::skipws); + return str; +} +/** function for nouppercase manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& nouppercase(ios_base& str) { + str.unsetf(ios_base::uppercase); + return str; +} +/** function for oct manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& oct(ios_base& str) { + str.setf(ios_base::oct, ios_base::basefield); + return str; +} +/** function for right manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& right(ios_base& str) { + str.setf(ios_base::right, ios_base::adjustfield); + return str; +} +/** function for showbase manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& showbase(ios_base& str) { + str.setf(ios_base::showbase); + return str; +} +/** function for showpos manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& showpos(ios_base& str) { + str.setf(ios_base::showpos); + return str; +} +/** function for showpoint manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& showpoint(ios_base& str) { + str.setf(ios_base::showpoint); + return str; +} +/** function for skipws manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& skipws(ios_base& str) { + str.setf(ios_base::skipws); + return str; +} +/** function for uppercase manipulator + * \param[in] str The stream + * \return The stream + */ +inline ios_base& uppercase(ios_base& str) { + str.setf(ios_base::uppercase); + return str; +} +//============================================================================== +/** + * \class ios + * \brief Error and state information for all streams + */ +class ios : public ios_base { + public: + /** Create ios with no error flags set */ + ios() : m_iostate(0) {} + + /** \return null pointer if fail() is true. */ + operator const void*() const { + return !fail() ? reinterpret_cast(this) : 0; + } + /** \return true if fail() else false. */ + bool operator!() const {return fail();} + /** \return The iostate flags for this file. */ + iostate rdstate() const {return m_iostate;} + /** \return True if no iostate flags are set else false. */ + bool good() const {return m_iostate == goodbit;} + /** \return true if end of file has been reached else false. + * + * Warning: An empty file returns false before the first read. + * + * Moral: eof() is only useful in combination with fail(), to find out + * whether EOF was the cause for failure + */ + bool eof() const {return m_iostate & eofbit;} + /** \return true if any iostate bit other than eof are set else false. */ + bool fail() const {return m_iostate & (failbit | badbit);} + /** \return true if bad bit is set else false. */ + bool bad() const {return m_iostate & badbit;} + /** Clear iostate bits. + * + * \param[in] state The flags you want to set after clearing all flags. + **/ + void clear(iostate state = goodbit) {m_iostate = state;} + /** Set iostate bits. + * + * \param[in] state Bitts to set. + **/ + void setstate(iostate state) {m_iostate |= state;} + + private: + iostate m_iostate; +}; +#endif // ios_h diff --git a/SdFat/iostream.h b/SdFat/iostream.h new file mode 100644 index 0000000..6a69f5f --- /dev/null +++ b/SdFat/iostream.h @@ -0,0 +1,153 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef iostream_h +#define iostream_h +/** + * \file + * \brief \ref iostream class + */ +#include +#include +/** Skip white space + * \param[in] is the Stream + * \return The stream + */ +inline istream& ws(istream& is) { + is.skipWhite(); + return is; +} +/** insert endline + * \param[in] os The Stream + * \return The stream + */ +inline ostream& endl(ostream& os) { + os.put('\n'); +#if ENDL_CALLS_FLUSH + os.flush(); +#endif // ENDL_CALLS_FLUSH + return os; +} +/** flush manipulator + * \param[in] os The stream + * \return The stream + */ +inline ostream& flush(ostream& os) { + os.flush(); + return os; +} +/** + * \struct setfill + * \brief type for setfill manipulator + */ +struct setfill { + /** fill character */ + char c; + /** constructor + * + * \param[in] arg new fill character + */ + explicit setfill(char arg) : c(arg) {} +}; +/** setfill manipulator + * \param[in] os the stream + * \param[in] arg set setfill object + * \return the stream + */ +inline ostream &operator<< (ostream &os, const setfill &arg) { + os.fill(arg.c); + return os; +} +/** setfill manipulator + * \param[in] obj the stream + * \param[in] arg set setfill object + * \return the stream + */ +inline istream &operator>>(istream &obj, const setfill &arg) { + obj.fill(arg.c); + return obj; +} +//------------------------------------------------------------------------------ +/** \struct setprecision + * \brief type for setprecision manipulator + */ +struct setprecision { + /** precision */ + unsigned int p; + /** constructor + * \param[in] arg new precision + */ + explicit setprecision(unsigned int arg) : p(arg) {} +}; +/** setprecision manipulator + * \param[in] os the stream + * \param[in] arg set setprecision object + * \return the stream + */ +inline ostream &operator<< (ostream &os, const setprecision &arg) { + os.precision(arg.p); + return os; +} +/** setprecision manipulator + * \param[in] is the stream + * \param[in] arg set setprecision object + * \return the stream + */ +inline istream &operator>>(istream &is, const setprecision &arg) { + is.precision(arg.p); + return is; +} +//------------------------------------------------------------------------------ +/** \struct setw + * \brief type for setw manipulator + */ +struct setw { + /** width */ + unsigned w; + /** constructor + * \param[in] arg new width + */ + explicit setw(unsigned arg) : w(arg) {} +}; +/** setw manipulator + * \param[in] os the stream + * \param[in] arg set setw object + * \return the stream + */ +inline ostream &operator<< (ostream &os, const setw &arg) { + os.width(arg.w); + return os; +} +/** setw manipulator + * \param[in] is the stream + * \param[in] arg set setw object + * \return the stream + */ +inline istream &operator>>(istream &is, const setw &arg) { + is.width(arg.w); + return is; +} +//============================================================================== +/** + * \class iostream + * \brief Input/Output stream + */ +class iostream : public istream, public ostream { +}; +#endif // iostream_h diff --git a/SdFat/istream.cpp b/SdFat/istream.cpp new file mode 100644 index 0000000..49faec5 --- /dev/null +++ b/SdFat/istream.cpp @@ -0,0 +1,411 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#include +#include +//------------------------------------------------------------------------------ +/** + * Extract a character if one is available. + * + * \return The character or -1 if a failure occurs. A failure is indicated + * by the stream state. + */ +int istream::get() { + int c; + m_gcount = 0; + c = getch(); + if (c < 0) { + setstate(failbit); + } else { + m_gcount = 1; + } + return c; +} +//------------------------------------------------------------------------------ +/** + * Extract a character if one is available. + * + * \param[out] c location to receive the extracted character. + * + * \return always returns *this. A failure is indicated by the stream state. + */ +istream& istream::get(char& c) { + int tmp = get(); + if (tmp >= 0) c = tmp; + return *this; +} +//------------------------------------------------------------------------------ +/** + * Extract characters. + * + * \param[out] str Location to receive extracted characters. + * \param[in] n Size of str. + * \param[in] delim Delimiter + * + * Characters are extracted until extraction fails, n is less than 1, + * n-1 characters are extracted, or the next character equals + * \a delim (delim is not extracted). If no characters are extracted + * failbit is set. If end-of-file occurs the eofbit is set. + * + * \return always returns *this. A failure is indicated by the stream state. + */ +istream& istream::get(char *str, streamsize n, char delim) { + int c; + FatPos_t pos; + m_gcount = 0; + while ((m_gcount + 1) < n) { + c = getch(&pos); + if (c < 0) { + break; + } + if (c == delim) { + setpos(&pos); + break; + } + str[m_gcount++] = c; + } + if (n > 0) str[m_gcount] = '\0'; + if (m_gcount == 0) setstate(failbit); + return *this; +} +//------------------------------------------------------------------------------ +void istream::getBool(bool *b) { + if ((flags() & boolalpha) == 0) { + getNumber(b); + return; + } + PGM_P truePtr = PSTR("true"); + PGM_P falsePtr = PSTR("false"); + const uint8_t true_len = 4; + const uint8_t false_len = 5; + bool trueOk = true; + bool falseOk = true; + uint8_t i = 0; + int c = readSkip(); + while (1) { + falseOk = falseOk && c == pgm_read_byte(falsePtr + i); + trueOk = trueOk && c == pgm_read_byte(truePtr + i); + if (trueOk == false && falseOk == false) break; + i++; + if (trueOk && i == true_len) { + *b = true; + return; + } + if (falseOk && i == false_len) { + *b = false; + return; + } + c = getch(); + } + setstate(failbit); +} +//------------------------------------------------------------------------------ +void istream::getChar(char* ch) { + int16_t c = readSkip(); + if (c < 0) { + setstate(failbit); + } else { + *ch = c; + } +} +//------------------------------------------------------------------------------ +// +// http://www.exploringbinary.com/category/numbers-in-computers/ +// +int16_t const EXP_LIMIT = 100; +static const uint32_t uint32_max = (uint32_t)-1; +bool istream::getDouble(double* value) { + bool got_digit = false; + bool got_dot = false; + bool neg; + int16_t c; + bool expNeg = false; + int16_t exp = 0; + int16_t fracExp = 0; + uint32_t frac = 0; + FatPos_t endPos; + double pow10; + double v; + + getpos(&endPos); + c = readSkip(); + neg = c == '-'; + if (c == '-' || c == '+') { + c = getch(); + } + while (1) { + if (isdigit(c)) { + got_digit = true; + if (frac < uint32_max/10) { + frac = frac * 10 + (c - '0'); + if (got_dot) fracExp--; + } else { + if (!got_dot) fracExp++; + } + } else if (!got_dot && c == '.') { + got_dot = true; + } else { + break; + } + if (fracExp < -EXP_LIMIT || fracExp > EXP_LIMIT) goto fail; + c = getch(&endPos); + } + if (!got_digit) goto fail; + if (c == 'e' || c == 'E') { + c = getch(); + expNeg = c == '-'; + if (c == '-' || c == '+') { + c = getch(); + } + while (isdigit(c)) { + if (exp > EXP_LIMIT) goto fail; + exp = exp * 10 + (c - '0'); + c = getch(&endPos); + } + } + v = static_cast(frac); + exp = expNeg ? fracExp - exp : fracExp + exp; + expNeg = exp < 0; + if (expNeg) exp = -exp; + pow10 = 10.0; + while (exp) { + if (exp & 1) { + if (expNeg) { + // check for underflow + if (v < FLT_MIN * pow10 && frac != 0) goto fail; + v /= pow10; + } else { + // check for overflow + if (v > FLT_MAX / pow10) goto fail; + v *= pow10; + } + } + pow10 *= pow10; + exp >>= 1; + } + setpos(&endPos); + *value = neg ? -v : v; + return true; + + fail: + // error restore position to last good place + setpos(&endPos); + setstate(failbit); + return false; +} +//------------------------------------------------------------------------------ +/** + * Extract characters + * + * \param[out] str Location to receive extracted characters. + * \param[in] n Size of str. + * \param[in] delim Delimiter + * + * Characters are extracted until extraction fails, + * the next character equals \a delim (delim is extracted), or n-1 + * characters are extracted. + * + * The failbit is set if no characters are extracted or n-1 characters + * are extracted. If end-of-file occurs the eofbit is set. + * + * \return always returns *this. A failure is indicated by the stream state. + */ +istream& istream::getline(char *str, streamsize n, char delim) { + FatPos_t pos; + int c; + m_gcount = 0; + if (n > 0) str[0] = '\0'; + while (1) { + c = getch(&pos); + if (c < 0) { + break; + } + if (c == delim) { + m_gcount++; + break; + } + if ((m_gcount + 1) >= n) { + setpos(&pos); + setstate(failbit); + break; + } + str[m_gcount++] = c; + str[m_gcount] = '\0'; + } + if (m_gcount == 0) setstate(failbit); + return *this; +} +//------------------------------------------------------------------------------ +bool istream::getNumber(uint32_t posMax, uint32_t negMax, uint32_t* num) { + int16_t c; + int8_t any = 0; + int8_t have_zero = 0; + uint8_t neg; + uint32_t val = 0; + uint32_t cutoff; + uint8_t cutlim; + FatPos_t endPos; + uint8_t f = flags() & basefield; + uint8_t base = f == oct ? 8 : f != hex ? 10 : 16; + getpos(&endPos); + c = readSkip(); + + neg = c == '-' ? 1 : 0; + if (c == '-' || c == '+') { + c = getch(); + } + + if (base == 16 && c == '0') { // TESTSUITE + c = getch(&endPos); + if (c == 'X' || c == 'x') { + c = getch(); + // remember zero in case no hex digits follow x/X + have_zero = 1; + } else { + any = 1; + } + } + // set values for overflow test + cutoff = neg ? negMax : posMax; + cutlim = cutoff % base; + cutoff /= base; + + while (1) { + if (isdigit(c)) { + c -= '0'; + } else if (isalpha(c)) { + c -= isupper(c) ? 'A' - 10 : 'a' - 10; + } else { + break; + } + if (c >= base) { + break; + } + if (val > cutoff || (val == cutoff && c > cutlim)) { + // indicate overflow error + any = -1; + break; + } + val = val * base + c; + c = getch(&endPos); + any = 1; + } + setpos(&endPos); + if (any > 0 || (have_zero && any >= 0)) { + *num = neg ? -val : val; + return true; + } + setstate(failbit); + return false; +} +//------------------------------------------------------------------------------ +/** + * + */ +void istream::getStr(char *str) { + FatPos_t pos; + uint16_t i = 0; + uint16_t m = width() ? width() - 1 : 0XFFFE; + if (m != 0) { + getpos(&pos); + int c = readSkip(); + + while (i < m) { + if (c < 0) { + break; + } + if (isspace(c)) { + setpos(&pos); + break; + } + str[i++] = c; + c = getch(&pos); + } + } + str[i] = '\0'; + if (i == 0) setstate(failbit); + width(0); +} +//------------------------------------------------------------------------------ +/** + * Extract characters and discard them. + * + * \param[in] n maximum number of characters to ignore. + * \param[in] delim Delimiter. + * + * Characters are extracted until extraction fails, \a n characters + * are extracted, or the next input character equals \a delim + * (the delimiter is extracted). If end-of-file occurs the eofbit is set. + * + * Failures are indicated by the state of the stream. + * + * \return *this + * + */ +istream& istream::ignore(streamsize n, int delim) { + int c; + m_gcount = 0; + while (m_gcount < n) { + c = getch(); + if (c < 0) { + break; + } + m_gcount++; + if (c == delim) break; + } + return *this; +} +//------------------------------------------------------------------------------ +/** + * Return the next available character without consuming it. + * + * \return The character if the stream state is good else -1; + * + */ +int istream::peek() { + int16_t c; + FatPos_t pos; + m_gcount = 0; + getpos(&pos); + c = getch(); + if (c < 0) { + if (!bad()) setstate(eofbit); + } else { + setpos(&pos); + } + return c; +} +//------------------------------------------------------------------------------ +int16_t istream::readSkip() { + int16_t c; + do { + c = getch(); + } while (isspace(c) && (flags() & skipws)); + return c; +} +//------------------------------------------------------------------------------ +/** used to implement ws() */ +void istream::skipWhite() { + int c; + FatPos_t pos; + do { + c = getch(&pos); + } while (isspace(c)); + setpos(&pos); +} diff --git a/SdFat/istream.h b/SdFat/istream.h new file mode 100644 index 0000000..64c1d00 --- /dev/null +++ b/SdFat/istream.h @@ -0,0 +1,307 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef istream_h +#define istream_h +/** + * \file + * \brief \ref istream class + */ +#include + +/** + * \class istream + * \brief Input Stream + */ +class istream : public virtual ios { + public: + istream() {} + /** call manipulator + * \param[in] pf function to call + * \return the stream + */ + istream& operator>>(istream& (*pf)(istream& str)) { + return pf(*this); + } + /** call manipulator + * \param[in] pf function to call + * \return the stream + */ + istream& operator>>(ios_base& (*pf)(ios_base& str)) { + pf(*this); + return *this; + } + /** call manipulator + * \param[in] pf function to call + * \return the stream + */ + istream& operator>>(ios& (*pf)(ios& str)) { + pf(*this); + return *this; + } + /** + * Extract a character string + * \param[out] str location to store the string. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream& operator>>(char *str) { + getStr(str); + return *this; + } + /** + * Extract a character + * \param[out] ch location to store the character. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream& operator>>(char& ch) { + getChar(&ch); + return *this; + } + /** + * Extract a character string + * \param[out] str location to store the string. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream& operator>>(signed char *str) { + getStr(reinterpret_cast(str)); + return *this; + } + /** + * Extract a character + * \param[out] ch location to store the character. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream& operator>>(signed char& ch) { + getChar(reinterpret_cast(&ch)); + return *this; + } + /** + * Extract a character string + * \param[out] str location to store the string. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream& operator>>(unsigned char *str) { + getStr(reinterpret_cast(str)); + return *this; + } + /** + * Extract a character + * \param[out] ch location to store the character. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream& operator>>(unsigned char& ch) { + getChar(reinterpret_cast(&ch)); + return *this; + } + /** + * Extract a value of type bool. + * \param[out] arg location to store the value. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream& operator>>(bool& arg) { + getBool(&arg); + return *this; + } + /** + * Extract a value of type short. + * \param[out] arg location to store the value. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream &operator>>(short& arg) { // NOLINT + getNumber(&arg); + return *this; + } + /** + * Extract a value of type unsigned short. + * \param[out] arg location to store the value. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream &operator>>(unsigned short& arg) { // NOLINT + getNumber(&arg); + return *this; + } + /** + * Extract a value of type int. + * \param[out] arg location to store the value. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream &operator>>(int& arg) { + getNumber(&arg); + return *this; + } + /** + * Extract a value of type unsigned int. + * \param[out] arg location to store the value. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream &operator>>(unsigned int& arg) { + getNumber(&arg); + return *this; + } + /** + * Extract a value of type long. + * \param[out] arg location to store the value. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream &operator>>(long& arg) { // NOLINT + getNumber(&arg); + return *this; + } + /** + * Extract a value of type unsigned long. + * \param[out] arg location to store the value. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream &operator>>(unsigned long& arg) { // NOLINT + getNumber(&arg); + return *this; + } + /** + * Extract a value of type double. + * \param[out] arg location to store the value. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream &operator>> (double& arg) { + getDouble(&arg); + return *this; + } + /** + * Extract a value of type float. + * \param[out] arg location to store the value. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream &operator>> (float& arg) { + double v; + getDouble(&v); + arg = v; + return *this; + } + /** + * Extract a value of type void*. + * \param[out] arg location to store the value. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream& operator>> (void*& arg) { + uint32_t val; + getNumber(&val); + arg = reinterpret_cast(val); + return *this; + } + /** + * \return The number of characters extracted by the last unformatted + * input function. + */ + streamsize gcount() const {return m_gcount;} + int get(); + istream& get(char& ch); + istream& get(char *str, streamsize n, char delim = '\n'); + istream& getline(char *str, streamsize count, char delim = '\n'); + istream& ignore(streamsize n = 1, int delim= -1); + int peek(); +// istream& read(char *str, streamsize count); +// streamsize readsome(char *str, streamsize count); + /** + * \return the stream position + */ + pos_type tellg() {return tellpos();} + /** + * Set the stream position + * \param[in] pos The absolute position in which to move the read pointer. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream& seekg(pos_type pos) { + if (!seekpos(pos)) setstate(failbit); + return *this; + } + /** + * Set the stream position. + * + * \param[in] off An offset to move the read pointer relative to way. + * \a off is a signed 32-bit int so the offset is limited to +- 2GB. + * \param[in] way One of ios::beg, ios::cur, or ios::end. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream& seekg(off_type off, seekdir way) { + if (!seekoff(off, way)) setstate(failbit); + return *this; + } + void skipWhite(); + + protected: + /// @cond SHOW_PROTECTED + /** + * Internal - do not use + * \return + */ + virtual int16_t getch() = 0; + /** + * Internal - do not use + * \param[out] pos + * \return + */ + int16_t getch(FatPos_t* pos) { + getpos(pos); + return getch(); + } + /** + * Internal - do not use + * \param[out] pos + */ + virtual void getpos(FatPos_t* pos) = 0; + /** + * Internal - do not use + * \param[in] pos + */ + virtual bool seekoff(off_type off, seekdir way) = 0; + virtual bool seekpos(pos_type pos) = 0; + virtual void setpos(FatPos_t* pos) = 0; + virtual pos_type tellpos() = 0; + + /// @endcond + private: + void getBool(bool *b); + void getChar(char* ch); + bool getDouble(double* value); + template void getNumber(T* value); + bool getNumber(uint32_t posMax, uint32_t negMax, uint32_t* num); + void getStr(char *str); + int16_t readSkip(); + + size_t m_gcount; +}; +//------------------------------------------------------------------------------ +template +void istream::getNumber(T* value) { + uint32_t tmp; + if ((T)-1 < 0) { + // number is signed, max positive value + uint32_t const m = ((uint32_t)-1) >> (33 - sizeof(T) * 8); + // max absolute value of negative number is m + 1. + if (getNumber(m, m + 1, &tmp)) { + *value = (T)tmp; + } + } else { + // max unsigned value for T + uint32_t const m = (T)-1; + if (getNumber(m, m, &tmp)) { + *value = (T)tmp; + } + } +} +#endif // istream_h diff --git a/SdFat/ostream.cpp b/SdFat/ostream.cpp new file mode 100644 index 0000000..d285549 --- /dev/null +++ b/SdFat/ostream.cpp @@ -0,0 +1,176 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#include +#ifndef PSTR +#define PSTR(x) x +#endif +//------------------------------------------------------------------------------ +void ostream::do_fill(unsigned len) { + for (; len < width(); len++) putch(fill()); + width(0); +} +//------------------------------------------------------------------------------ +void ostream::fill_not_left(unsigned len) { + if ((flags() & adjustfield) != left) { + do_fill(len); + } +} +//------------------------------------------------------------------------------ +char* ostream::fmtNum(uint32_t n, char *ptr, uint8_t base) { + char a = flags() & uppercase ? 'A' - 10 : 'a' - 10; + do { + uint32_t m = n; + n /= base; + char c = m - base * n; + *--ptr = c < 10 ? c + '0' : c + a; + } while (n); + return ptr; +} +//------------------------------------------------------------------------------ +void ostream::putBool(bool b) { + if (flags() & boolalpha) { + if (b) { + putPgm(PSTR("true")); + } else { + putPgm(PSTR("false")); + } + } else { + putChar(b ? '1' : '0'); + } +} +//------------------------------------------------------------------------------ +void ostream::putChar(char c) { + fill_not_left(1); + putch(c); + do_fill(1); +} +//------------------------------------------------------------------------------ +void ostream::putDouble(double n) { + uint8_t nd = precision(); + double round = 0.5; + char sign; + char buf[13]; // room for sign, 10 digits, '.', and zero byte + char *end = buf + sizeof(buf) - 1; + char *str = end; + // terminate string + *end = '\0'; + + // get sign and make nonnegative + if (n < 0.0) { + sign = '-'; + n = -n; + } else { + sign = flags() & showpos ? '+' : '\0'; + } + // check for larger than uint32_t + if (n > 4.0E9) { + putPgm(PSTR("BIG FLT")); + return; + } + // round up and separate in and fraction parts + for (uint8_t i = 0; i < nd; ++i) round *= 0.1; + n += round; + uint32_t intPart = n; + double fractionPart = n - intPart; + + // format intPart and decimal point + if (nd || (flags() & showpoint)) *--str = '.'; + str = fmtNum(intPart, str, 10); + + // calculate length for fill + uint8_t len = sign ? 1 : 0; + len += nd + end - str; + + // extract adjust field + fmtflags adj = flags() & adjustfield; + if (adj == internal) { + if (sign) putch(sign); + do_fill(len); + } else { + // do fill for internal or right + fill_not_left(len); + if (sign) *--str = sign; + } + putstr(str); + // output fraction + while (nd-- > 0) { + fractionPart *= 10.0; + int digit = static_cast(fractionPart); + putch(digit + '0'); + fractionPart -= digit; + } + // do fill if not done above + do_fill(len); +} +//------------------------------------------------------------------------------ +void ostream::putNum(int32_t n) { + bool neg = n < 0 && flagsToBase() == 10; + if (neg) n = -n; + putNum(n, neg); +} +//------------------------------------------------------------------------------ +void ostream::putNum(uint32_t n, bool neg) { + char buf[13]; + char* end = buf + sizeof(buf) - 1; + char* num; + char* str; + uint8_t base = flagsToBase(); + *end = '\0'; + str = num = fmtNum(n, end, base); + if (base == 10) { + if (neg) { + *--str = '-'; + } else if (flags() & showpos) { + *--str = '+'; + } + } else if (flags() & showbase) { + if (flags() & hex) { + *--str = flags() & uppercase ? 'X' : 'x'; + } + *--str = '0'; + } + uint8_t len = end - str; + fmtflags adj = flags() & adjustfield; + if (adj == internal) { + while (str < num) putch(*str++); + } + if (adj != left) { + do_fill(len); + } + putstr(str); + do_fill(len); +} +//------------------------------------------------------------------------------ +void ostream::putPgm(const char* str) { + int n; + for (n = 0; pgm_read_byte(&str[n]); n++) {} + fill_not_left(n); + for (uint8_t c; (c = pgm_read_byte(str)); str++) { + putch(c); + } + do_fill(n); +} +//------------------------------------------------------------------------------ +void ostream::putStr(const char *str) { + unsigned n = strlen(str); + fill_not_left(n); + putstr(str); + do_fill(n); +} diff --git a/SdFat/ostream.h b/SdFat/ostream.h new file mode 100644 index 0000000..039d65d --- /dev/null +++ b/SdFat/ostream.h @@ -0,0 +1,287 @@ +/* Arduino SdFat Library + * Copyright (C) 2012 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef ostream_h +#define ostream_h +/** + * \file + * \brief \ref ostream class + */ +#include +//------------------------------------------------------------------------------ +/** macro for flash inserter */ +#define pstr(str) pgm(PSTR(str)) +/** \struct pgm + * \brief type for string in flash + */ +struct pgm { + /** Pointer to flash string */ + char *ptr; + /** constructor + * \param[in] str initializer for pointer. + */ + explicit pgm(char* str) : ptr(str) {} + /** constructor + * \param[in] str initializer for pointer. + */ + explicit pgm(const char *str) : ptr(const_cast(str)) {} +}; +//============================================================================== +/** + * \class ostream + * \brief Output Stream + */ +class ostream : public virtual ios { + public: + ostream() {} + + /** call manipulator + * \param[in] pf function to call + * \return the stream + */ + ostream& operator<< (ostream& (*pf)(ostream& str)) { + return pf(*this); + } + /** call manipulator + * \param[in] pf function to call + * \return the stream + */ + ostream& operator<< (ios_base& (*pf)(ios_base& str)) { + pf(*this); + return *this; + } + /** Output bool + * \param[in] arg value to output + * \return the stream + */ + ostream &operator<< (bool arg) { + putBool(arg); + return *this; + } + /** Output string + * \param[in] arg string to output + * \return the stream + */ + ostream &operator<< (const char *arg) { + putStr(arg); + return *this; + } + /** Output string + * \param[in] arg string to output + * \return the stream + */ + ostream &operator<< (const signed char *arg) { + putStr((const char*)arg); + return *this; + } + /** Output string + * \param[in] arg string to output + * \return the stream + */ + ostream &operator<< (const unsigned char *arg) { + putStr((const char*)arg); + return *this; + } + /** Output character + * \param[in] arg character to output + * \return the stream + */ + ostream &operator<< (char arg) { + putChar(arg); + return *this; + } + /** Output character + * \param[in] arg character to output + * \return the stream + */ + ostream &operator<< (signed char arg) { + putChar(static_cast(arg)); + return *this; + } + /** Output character + * \param[in] arg character to output + * \return the stream + */ + ostream &operator<< (unsigned char arg) { + putChar(static_cast(arg)); + return *this; + } + /** Output double + * \param[in] arg value to output + * \return the stream + */ + ostream &operator<< (double arg) { + putDouble(arg); + return *this; + } + /** Output float + * \param[in] arg value to output + * \return the stream + */ + ostream &operator<< (float arg) { + putDouble(arg); + return *this; + } + /** Output signed short + * \param[in] arg value to output + * \return the stream + */ + ostream &operator<< (short arg) { // NOLINT + putNum((int32_t)arg); + return *this; + } + /** Output unsigned short + * \param[in] arg value to output + * \return the stream + */ + ostream &operator<< (unsigned short arg) { // NOLINT + putNum((uint32_t)arg); + return *this; + } + /** Output signed int + * \param[in] arg value to output + * \return the stream + */ + ostream &operator<< (int arg) { + putNum((int32_t)arg); + return *this; + } + /** Output unsigned int + * \param[in] arg value to output + * \return the stream + */ + ostream &operator<< (unsigned int arg) { + putNum((uint32_t)arg); + return *this; + } + /** Output signed long + * \param[in] arg value to output + * \return the stream + */ + ostream &operator<< (long arg) { // NOLINT + putNum(arg); + return *this; + } + /** Output unsigned long + * \param[in] arg value to output + * \return the stream + */ + ostream &operator<< (unsigned long arg) { // NOLINT + putNum(arg); + return *this; + } + /** Output pointer + * \param[in] arg value to output + * \return the stream + */ + ostream& operator<< (const void* arg) { + putNum(reinterpret_cast(arg)); + return *this; + } + /** Output a string from flash using the pstr() macro + * \param[in] arg pgm struct pointing to string + * \return the stream + */ + ostream &operator<< (pgm arg) { + putPgm(arg.ptr); + return *this; + } + /** Output a string from flash using the Arduino F() macro. + * \param[in] arg pointing to flash string + * \return the stream + */ + ostream &operator<< (const __FlashStringHelper *arg) { + putPgm(reinterpret_cast(arg)); + return *this; + } + /** + * Puts a character in a stream. + * + * The unformatted output function inserts the element \a ch. + * It returns *this. + * + * \param[in] ch The character + * \return A reference to the ostream object. + */ + ostream& put(char ch) { + putch(ch); + return *this; + } +// ostream& write(char *str, streamsize count); + /** + * Flushes the buffer associated with this stream. The flush function + * calls the sync function of the associated file. + * \return A reference to the ostream object. + */ + ostream& flush() { + if (!sync()) setstate(badbit); + return *this; + } + /** + * \return the stream position + */ + pos_type tellp() {return tellpos();} + /** + * Set the stream position + * \param[in] pos The absolute position in which to move the write pointer. + * \return Is always *this. Failure is indicated by the state of *this. + */ + ostream& seekp(pos_type pos) { + if (!seekpos(pos)) setstate(failbit); + return *this; + } + /** + * Set the stream position. + * + * \param[in] off An offset to move the write pointer relative to way. + * \a off is a signed 32-bit int so the offset is limited to +- 2GB. + * \param[in] way One of ios::beg, ios::cur, or ios::end. + * \return Is always *this. Failure is indicated by the state of *this. + */ + ostream& seekp(off_type off, seekdir way) { + if (!seekoff(off, way)) setstate(failbit); + return *this; + } + + protected: + /// @cond SHOW_PROTECTED + /** Put character with binary/text conversion + * \param[in] ch character to write + */ + virtual void putch(char ch) = 0; + virtual void putstr(const char *str) = 0; + virtual bool seekoff(off_type pos, seekdir way) = 0; + virtual bool seekpos(pos_type pos) = 0; + virtual bool sync() = 0; + + virtual pos_type tellpos() = 0; + /// @endcond + private: + void do_fill(unsigned len); + void fill_not_left(unsigned len); + char* fmtNum(uint32_t n, char *ptr, uint8_t base); + void putBool(bool b); + void putChar(char c); + void putDouble(double n); + void putNum(uint32_t n, bool neg = false); + void putNum(int32_t n); + void putPgm(const char* str); + void putStr(const char* str); +}; +#endif // ostream_h diff --git a/SdFat/utility/DigitalPin.h b/SdFat/utility/DigitalPin.h new file mode 100644 index 0000000..a2d2fae --- /dev/null +++ b/SdFat/utility/DigitalPin.h @@ -0,0 +1,518 @@ +/* Arduino DigitalIO Library + * Copyright (C) 2013 by William Greiman + * + * This file is part of the Arduino DigitalIO Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino DigitalIO Library. If not, see + * . + */ +/** + * @file + * @brief Fast Digital Pin functions + * + * @defgroup digitalPin Fast Pin I/O + * @details Fast Digital I/O functions and template class. + * @{ + */ +#ifndef DigitalPin_h +#define DigitalPin_h +#include +#include +//------------------------------------------------------------------------------ +/** + * @class pin_map_t + * @brief struct for mapping digital pins + */ +struct pin_map_t { + volatile uint8_t* ddr; /**< address of DDR for this pin */ + volatile uint8_t* pin; /**< address of PIN for this pin */ + volatile uint8_t* port; /**< address of PORT for this pin */ + uint8_t bit; /**< bit number for this pin */ +}; +//------------------------------------------------------------------------------ +#if defined(__AVR_ATmega168__)\ +||defined(__AVR_ATmega168P__)\ +||defined(__AVR_ATmega328P__) +// 168 and 328 Arduinos +const static pin_map_t pinMap[] = { + {&DDRD, &PIND, &PORTD, 0}, // D0 0 + {&DDRD, &PIND, &PORTD, 1}, // D1 1 + {&DDRD, &PIND, &PORTD, 2}, // D2 2 + {&DDRD, &PIND, &PORTD, 3}, // D3 3 + {&DDRD, &PIND, &PORTD, 4}, // D4 4 + {&DDRD, &PIND, &PORTD, 5}, // D5 5 + {&DDRD, &PIND, &PORTD, 6}, // D6 6 + {&DDRD, &PIND, &PORTD, 7}, // D7 7 + {&DDRB, &PINB, &PORTB, 0}, // B0 8 + {&DDRB, &PINB, &PORTB, 1}, // B1 9 + {&DDRB, &PINB, &PORTB, 2}, // B2 10 + {&DDRB, &PINB, &PORTB, 3}, // B3 11 + {&DDRB, &PINB, &PORTB, 4}, // B4 12 + {&DDRB, &PINB, &PORTB, 5}, // B5 13 + {&DDRC, &PINC, &PORTC, 0}, // C0 14 + {&DDRC, &PINC, &PORTC, 1}, // C1 15 + {&DDRC, &PINC, &PORTC, 2}, // C2 16 + {&DDRC, &PINC, &PORTC, 3}, // C3 17 + {&DDRC, &PINC, &PORTC, 4}, // C4 18 + {&DDRC, &PINC, &PORTC, 5} // C5 19 +}; +//------------------------------------------------------------------------------ +#elif defined(__AVR_ATmega1280__)\ +|| defined(__AVR_ATmega2560__) +// Mega +static const pin_map_t pinMap[] = { + {&DDRE, &PINE, &PORTE, 0}, // E0 0 + {&DDRE, &PINE, &PORTE, 1}, // E1 1 + {&DDRE, &PINE, &PORTE, 4}, // E4 2 + {&DDRE, &PINE, &PORTE, 5}, // E5 3 + {&DDRG, &PING, &PORTG, 5}, // G5 4 + {&DDRE, &PINE, &PORTE, 3}, // E3 5 + {&DDRH, &PINH, &PORTH, 3}, // H3 6 + {&DDRH, &PINH, &PORTH, 4}, // H4 7 + {&DDRH, &PINH, &PORTH, 5}, // H5 8 + {&DDRH, &PINH, &PORTH, 6}, // H6 9 + {&DDRB, &PINB, &PORTB, 4}, // B4 10 + {&DDRB, &PINB, &PORTB, 5}, // B5 11 + {&DDRB, &PINB, &PORTB, 6}, // B6 12 + {&DDRB, &PINB, &PORTB, 7}, // B7 13 + {&DDRJ, &PINJ, &PORTJ, 1}, // J1 14 + {&DDRJ, &PINJ, &PORTJ, 0}, // J0 15 + {&DDRH, &PINH, &PORTH, 1}, // H1 16 + {&DDRH, &PINH, &PORTH, 0}, // H0 17 + {&DDRD, &PIND, &PORTD, 3}, // D3 18 + {&DDRD, &PIND, &PORTD, 2}, // D2 19 + {&DDRD, &PIND, &PORTD, 1}, // D1 20 + {&DDRD, &PIND, &PORTD, 0}, // D0 21 + {&DDRA, &PINA, &PORTA, 0}, // A0 22 + {&DDRA, &PINA, &PORTA, 1}, // A1 23 + {&DDRA, &PINA, &PORTA, 2}, // A2 24 + {&DDRA, &PINA, &PORTA, 3}, // A3 25 + {&DDRA, &PINA, &PORTA, 4}, // A4 26 + {&DDRA, &PINA, &PORTA, 5}, // A5 27 + {&DDRA, &PINA, &PORTA, 6}, // A6 28 + {&DDRA, &PINA, &PORTA, 7}, // A7 29 + {&DDRC, &PINC, &PORTC, 7}, // C7 30 + {&DDRC, &PINC, &PORTC, 6}, // C6 31 + {&DDRC, &PINC, &PORTC, 5}, // C5 32 + {&DDRC, &PINC, &PORTC, 4}, // C4 33 + {&DDRC, &PINC, &PORTC, 3}, // C3 34 + {&DDRC, &PINC, &PORTC, 2}, // C2 35 + {&DDRC, &PINC, &PORTC, 1}, // C1 36 + {&DDRC, &PINC, &PORTC, 0}, // C0 37 + {&DDRD, &PIND, &PORTD, 7}, // D7 38 + {&DDRG, &PING, &PORTG, 2}, // G2 39 + {&DDRG, &PING, &PORTG, 1}, // G1 40 + {&DDRG, &PING, &PORTG, 0}, // G0 41 + {&DDRL, &PINL, &PORTL, 7}, // L7 42 + {&DDRL, &PINL, &PORTL, 6}, // L6 43 + {&DDRL, &PINL, &PORTL, 5}, // L5 44 + {&DDRL, &PINL, &PORTL, 4}, // L4 45 + {&DDRL, &PINL, &PORTL, 3}, // L3 46 + {&DDRL, &PINL, &PORTL, 2}, // L2 47 + {&DDRL, &PINL, &PORTL, 1}, // L1 48 + {&DDRL, &PINL, &PORTL, 0}, // L0 49 + {&DDRB, &PINB, &PORTB, 3}, // B3 50 + {&DDRB, &PINB, &PORTB, 2}, // B2 51 + {&DDRB, &PINB, &PORTB, 1}, // B1 52 + {&DDRB, &PINB, &PORTB, 0}, // B0 53 + {&DDRF, &PINF, &PORTF, 0}, // F0 54 + {&DDRF, &PINF, &PORTF, 1}, // F1 55 + {&DDRF, &PINF, &PORTF, 2}, // F2 56 + {&DDRF, &PINF, &PORTF, 3}, // F3 57 + {&DDRF, &PINF, &PORTF, 4}, // F4 58 + {&DDRF, &PINF, &PORTF, 5}, // F5 59 + {&DDRF, &PINF, &PORTF, 6}, // F6 60 + {&DDRF, &PINF, &PORTF, 7}, // F7 61 + {&DDRK, &PINK, &PORTK, 0}, // K0 62 + {&DDRK, &PINK, &PORTK, 1}, // K1 63 + {&DDRK, &PINK, &PORTK, 2}, // K2 64 + {&DDRK, &PINK, &PORTK, 3}, // K3 65 + {&DDRK, &PINK, &PORTK, 4}, // K4 66 + {&DDRK, &PINK, &PORTK, 5}, // K5 67 + {&DDRK, &PINK, &PORTK, 6}, // K6 68 + {&DDRK, &PINK, &PORTK, 7} // K7 69 +}; +//------------------------------------------------------------------------------ +#elif defined(__AVR_ATmega1284P__)\ +|| defined(__AVR_ATmega1284__)\ +|| defined(__AVR_ATmega644P__)\ +|| defined(__AVR_ATmega644__)\ +|| defined(__AVR_ATmega64__)\ +|| defined(__AVR_ATmega32__)\ +|| defined(__AVR_ATmega324__)\ +|| defined(__AVR_ATmega16__) +// Mighty Layout +static const pin_map_t pinMap[] = { + {&DDRB, &PINB, &PORTB, 0}, // B0 0 + {&DDRB, &PINB, &PORTB, 1}, // B1 1 + {&DDRB, &PINB, &PORTB, 2}, // B2 2 + {&DDRB, &PINB, &PORTB, 3}, // B3 3 + {&DDRB, &PINB, &PORTB, 4}, // B4 4 + {&DDRB, &PINB, &PORTB, 5}, // B5 5 + {&DDRB, &PINB, &PORTB, 6}, // B6 6 + {&DDRB, &PINB, &PORTB, 7}, // B7 7 + {&DDRD, &PIND, &PORTD, 0}, // D0 8 + {&DDRD, &PIND, &PORTD, 1}, // D1 9 + {&DDRD, &PIND, &PORTD, 2}, // D2 10 + {&DDRD, &PIND, &PORTD, 3}, // D3 11 + {&DDRD, &PIND, &PORTD, 4}, // D4 12 + {&DDRD, &PIND, &PORTD, 5}, // D5 13 + {&DDRD, &PIND, &PORTD, 6}, // D6 14 + {&DDRD, &PIND, &PORTD, 7}, // D7 15 + {&DDRC, &PINC, &PORTC, 0}, // C0 16 + {&DDRC, &PINC, &PORTC, 1}, // C1 17 + {&DDRC, &PINC, &PORTC, 2}, // C2 18 + {&DDRC, &PINC, &PORTC, 3}, // C3 19 + {&DDRC, &PINC, &PORTC, 4}, // C4 20 + {&DDRC, &PINC, &PORTC, 5}, // C5 21 + {&DDRC, &PINC, &PORTC, 6}, // C6 22 + {&DDRC, &PINC, &PORTC, 7}, // C7 23 + {&DDRA, &PINA, &PORTA, 0}, // A0 24 + {&DDRA, &PINA, &PORTA, 1}, // A1 25 + {&DDRA, &PINA, &PORTA, 2}, // A2 26 + {&DDRA, &PINA, &PORTA, 3}, // A3 27 + {&DDRA, &PINA, &PORTA, 4}, // A4 28 + {&DDRA, &PINA, &PORTA, 5}, // A5 29 + {&DDRA, &PINA, &PORTA, 6}, // A6 30 + {&DDRA, &PINA, &PORTA, 7} // A7 31 +}; +//------------------------------------------------------------------------------ +#elif defined(__AVR_ATmega32U4__) +#ifdef CORE_TEENSY +// Teensy 2.0 +static const pin_map_t pinMap[] = { + {&DDRB, &PINB, &PORTB, 0}, // B0 0 + {&DDRB, &PINB, &PORTB, 1}, // B1 1 + {&DDRB, &PINB, &PORTB, 2}, // B2 2 + {&DDRB, &PINB, &PORTB, 3}, // B3 3 + {&DDRB, &PINB, &PORTB, 7}, // B7 4 + {&DDRD, &PIND, &PORTD, 0}, // D0 5 + {&DDRD, &PIND, &PORTD, 1}, // D1 6 + {&DDRD, &PIND, &PORTD, 2}, // D2 7 + {&DDRD, &PIND, &PORTD, 3}, // D3 8 + {&DDRC, &PINC, &PORTC, 6}, // C6 9 + {&DDRC, &PINC, &PORTC, 7}, // C7 10 + {&DDRD, &PIND, &PORTD, 6}, // D6 11 + {&DDRD, &PIND, &PORTD, 7}, // D7 12 + {&DDRB, &PINB, &PORTB, 4}, // B4 13 + {&DDRB, &PINB, &PORTB, 5}, // B5 14 + {&DDRB, &PINB, &PORTB, 6}, // B6 15 + {&DDRF, &PINF, &PORTF, 7}, // F7 16 + {&DDRF, &PINF, &PORTF, 6}, // F6 17 + {&DDRF, &PINF, &PORTF, 5}, // F5 18 + {&DDRF, &PINF, &PORTF, 4}, // F4 19 + {&DDRF, &PINF, &PORTF, 1}, // F1 20 + {&DDRF, &PINF, &PORTF, 0}, // F0 21 + {&DDRD, &PIND, &PORTD, 4}, // D4 22 + {&DDRD, &PIND, &PORTD, 5}, // D5 23 + {&DDRE, &PINE, &PORTE, 6} // E6 24 +}; +//------------------------------------------------------------------------------ +#else // CORE_TEENSY +// Leonardo +static const pin_map_t pinMap[] = { + {&DDRD, &PIND, &PORTD, 2}, // D2 0 + {&DDRD, &PIND, &PORTD, 3}, // D3 1 + {&DDRD, &PIND, &PORTD, 1}, // D1 2 + {&DDRD, &PIND, &PORTD, 0}, // D0 3 + {&DDRD, &PIND, &PORTD, 4}, // D4 4 + {&DDRC, &PINC, &PORTC, 6}, // C6 5 + {&DDRD, &PIND, &PORTD, 7}, // D7 6 + {&DDRE, &PINE, &PORTE, 6}, // E6 7 + {&DDRB, &PINB, &PORTB, 4}, // B4 8 + {&DDRB, &PINB, &PORTB, 5}, // B5 9 + {&DDRB, &PINB, &PORTB, 6}, // B6 10 + {&DDRB, &PINB, &PORTB, 7}, // B7 11 + {&DDRD, &PIND, &PORTD, 6}, // D6 12 + {&DDRC, &PINC, &PORTC, 7}, // C7 13 + {&DDRB, &PINB, &PORTB, 3}, // B3 14 + {&DDRB, &PINB, &PORTB, 1}, // B1 15 + {&DDRB, &PINB, &PORTB, 2}, // B2 16 + {&DDRB, &PINB, &PORTB, 0}, // B0 17 + {&DDRF, &PINF, &PORTF, 7}, // F7 18 + {&DDRF, &PINF, &PORTF, 6}, // F6 19 + {&DDRF, &PINF, &PORTF, 5}, // F5 20 + {&DDRF, &PINF, &PORTF, 4}, // F4 21 + {&DDRF, &PINF, &PORTF, 1}, // F1 22 + {&DDRF, &PINF, &PORTF, 0}, // F0 23 + {&DDRD, &PIND, &PORTD, 4}, // D4 24 + {&DDRD, &PIND, &PORTD, 7}, // D7 25 + {&DDRB, &PINB, &PORTB, 4}, // B4 26 + {&DDRB, &PINB, &PORTB, 5}, // B5 27 + {&DDRB, &PINB, &PORTB, 6}, // B6 28 + {&DDRD, &PIND, &PORTD, 6} // D6 29 +}; +#endif // CORE_TEENSY +//------------------------------------------------------------------------------ +#elif defined(__AVR_AT90USB646__)\ +|| defined(__AVR_AT90USB1286__) +// Teensy++ 1.0 & 2.0 +static const pin_map_t pinMap[] = { + {&DDRD, &PIND, &PORTD, 0}, // D0 0 + {&DDRD, &PIND, &PORTD, 1}, // D1 1 + {&DDRD, &PIND, &PORTD, 2}, // D2 2 + {&DDRD, &PIND, &PORTD, 3}, // D3 3 + {&DDRD, &PIND, &PORTD, 4}, // D4 4 + {&DDRD, &PIND, &PORTD, 5}, // D5 5 + {&DDRD, &PIND, &PORTD, 6}, // D6 6 + {&DDRD, &PIND, &PORTD, 7}, // D7 7 + {&DDRE, &PINE, &PORTE, 0}, // E0 8 + {&DDRE, &PINE, &PORTE, 1}, // E1 9 + {&DDRC, &PINC, &PORTC, 0}, // C0 10 + {&DDRC, &PINC, &PORTC, 1}, // C1 11 + {&DDRC, &PINC, &PORTC, 2}, // C2 12 + {&DDRC, &PINC, &PORTC, 3}, // C3 13 + {&DDRC, &PINC, &PORTC, 4}, // C4 14 + {&DDRC, &PINC, &PORTC, 5}, // C5 15 + {&DDRC, &PINC, &PORTC, 6}, // C6 16 + {&DDRC, &PINC, &PORTC, 7}, // C7 17 + {&DDRE, &PINE, &PORTE, 6}, // E6 18 + {&DDRE, &PINE, &PORTE, 7}, // E7 19 + {&DDRB, &PINB, &PORTB, 0}, // B0 20 + {&DDRB, &PINB, &PORTB, 1}, // B1 21 + {&DDRB, &PINB, &PORTB, 2}, // B2 22 + {&DDRB, &PINB, &PORTB, 3}, // B3 23 + {&DDRB, &PINB, &PORTB, 4}, // B4 24 + {&DDRB, &PINB, &PORTB, 5}, // B5 25 + {&DDRB, &PINB, &PORTB, 6}, // B6 26 + {&DDRB, &PINB, &PORTB, 7}, // B7 27 + {&DDRA, &PINA, &PORTA, 0}, // A0 28 + {&DDRA, &PINA, &PORTA, 1}, // A1 29 + {&DDRA, &PINA, &PORTA, 2}, // A2 30 + {&DDRA, &PINA, &PORTA, 3}, // A3 31 + {&DDRA, &PINA, &PORTA, 4}, // A4 32 + {&DDRA, &PINA, &PORTA, 5}, // A5 33 + {&DDRA, &PINA, &PORTA, 6}, // A6 34 + {&DDRA, &PINA, &PORTA, 7}, // A7 35 + {&DDRE, &PINE, &PORTE, 4}, // E4 36 + {&DDRE, &PINE, &PORTE, 5}, // E5 37 + {&DDRF, &PINF, &PORTF, 0}, // F0 38 + {&DDRF, &PINF, &PORTF, 1}, // F1 39 + {&DDRF, &PINF, &PORTF, 2}, // F2 40 + {&DDRF, &PINF, &PORTF, 3}, // F3 41 + {&DDRF, &PINF, &PORTF, 4}, // F4 42 + {&DDRF, &PINF, &PORTF, 5}, // F5 43 + {&DDRF, &PINF, &PORTF, 6}, // F6 44 + {&DDRF, &PINF, &PORTF, 7} // F7 45 +}; +//------------------------------------------------------------------------------ +#else // CPU type +#error unknown CPU type +#endif // CPU type +/** count of pins */ +static const uint8_t digitalPinCount = sizeof(pinMap)/sizeof(pin_map_t); +//============================================================================== +/** generate bad pin number error */ +void badPinNumber(void) + __attribute__((error("Pin number is too large or not a constant"))); +//------------------------------------------------------------------------------ +/** Check for valid pin number + * @param[in] pin Number of pin to be checked. + */ +static inline __attribute__((always_inline)) +void badPinCheck(uint8_t pin) { + if (!__builtin_constant_p(pin) || pin >= digitalPinCount) { + badPinNumber(); + } +} +//------------------------------------------------------------------------------ +/** fast write helper + * @param[in] address I/O register address + * @param[in] bit bit number to write + * @param[in] level value for bit + */ +static inline __attribute__((always_inline)) +void fastBitWriteSafe(volatile uint8_t* address, uint8_t bit, bool level) { + uint8_t oldSREG; + if (address > (uint8_t*)0X5F) { + oldSREG = SREG; + cli(); + } + if (level) { + *address |= 1 << bit; + } else { + *address &= ~(1 << bit); + } + if (address > (uint8_t*)0X5F) { + SREG = oldSREG; + } +} +//------------------------------------------------------------------------------ +/** read pin value + * @param[in] pin Arduino pin number + * @return value read + */ +static inline __attribute__((always_inline)) +bool fastDigitalRead(uint8_t pin) { + badPinCheck(pin); + return (*pinMap[pin].pin >> pinMap[pin].bit) & 1; +} +//------------------------------------------------------------------------------ +/** toggle a pin + * @param[in] pin Arduino pin number + * + * If the pin is in output mode toggle the pin level. + * If the pin is in input mode toggle the state of the 20K pullup. + */ +static inline __attribute__((always_inline)) +void fastDigitalToggle(uint8_t pin) { + badPinCheck(pin); + if (pinMap[pin].pin > (uint8_t*)0X5F) { + // must write bit to high address port + *pinMap[pin].pin = 1 << pinMap[pin].bit; + } else { + // will compile to sbi and PIN register will not be read. + *pinMap[pin].pin |= 1 << pinMap[pin].bit; + } +} +//------------------------------------------------------------------------------ +/** Set pin value + * @param[in] pin Arduino pin number + * @param[in] level value to write + */ +static inline __attribute__((always_inline)) +void fastDigitalWrite(uint8_t pin, bool level) { + badPinCheck(pin); + fastBitWriteSafe(pinMap[pin].port, pinMap[pin].bit, level); +} +//------------------------------------------------------------------------------ +/** set pin mode + * @param[in] pin Arduino pin number + * @param[in] mode if true set output mode else input mode + * + * fastPinMode does not enable or disable the 20K pullup for input mode. + */ +static inline __attribute__((always_inline)) +void fastPinMode(uint8_t pin, bool mode) { + badPinCheck(pin); + fastBitWriteSafe(pinMap[pin].ddr, pinMap[pin].bit, mode); +} +//------------------------------------------------------------------------------ +/** set pin configuration + * @param[in] pin Arduino pin number + * @param[in] mode If true set output mode else input mode + * @param[in] level If mode is output, set level high/low. + * If mode is input, enable or disable the pin's 20K pullup. + */ +static inline __attribute__((always_inline)) +void fastPinConfig(uint8_t pin, bool mode, bool level) { + fastPinMode(pin, mode); + fastDigitalWrite(pin, level); +} +//============================================================================== +/** + * @class DigitalPin + * @brief Fast AVR digital port I/O + */ +template +class DigitalPin { + public: + //---------------------------------------------------------------------------- + /** Constructor */ + DigitalPin() {} + //---------------------------------------------------------------------------- + /** Constructor + * @param[in] pinMode if true set output mode else input mode. + */ + explicit DigitalPin(bool pinMode) { + mode(pinMode); + } + //---------------------------------------------------------------------------- + /** Constructor + * @param[in] mode If true set output mode else input mode + * @param[in] level If mode is output, set level high/low. + * If mode is input, enable or disable the pin's 20K pullup. + */ + DigitalPin(bool mode, bool level) { + config(mode, level); + } + //---------------------------------------------------------------------------- + /** Asignment operator + * @param[in] value If true set the pin's level high else set the + * pin's level low. + * + * @return This DigitalPin instance. + */ + inline DigitalPin & operator = (bool value) __attribute__((always_inline)) { + write(value); + return *this; + } + //---------------------------------------------------------------------------- + /** Parenthesis operator + * @return Pin's level + */ + inline operator bool () const __attribute__((always_inline)) { + return read(); + } + //---------------------------------------------------------------------------- + /** set pin configuration + * @param[in] mode If true set output mode else input mode + * @param[in] level If mode is output, set level high/low. + * If mode is input, enable or disable the pin's 20K pullup. + */ + inline __attribute__((always_inline)) + void config(bool mode, bool level) { + fastPinConfig(PinNumber, mode, level); + } + //---------------------------------------------------------------------------- + /** + * Set pin level high if output mode or enable 20K pullup if input mode. + */ + inline __attribute__((always_inline)) + void high() {write(true);} + //---------------------------------------------------------------------------- + /** + * Set pin level low if output mode or disable 20K pullup if input mode. + */ + inline __attribute__((always_inline)) + void low() {write(false);} + //---------------------------------------------------------------------------- + /** + * Set pin mode + * @param[in] pinMode if true set output mode else input mode. + * + * mode() does not enable or disable the 20K pullup for input mode. + */ + inline __attribute__((always_inline)) + void mode(bool pinMode) { + fastPinMode(PinNumber, pinMode); + } + //---------------------------------------------------------------------------- + /** @return Pin's level */ + inline __attribute__((always_inline)) + bool read() const { + return fastDigitalRead(PinNumber); + } + //---------------------------------------------------------------------------- + /** toggle a pin + * + * If the pin is in output mode toggle the pin's level. + * If the pin is in input mode toggle the state of the 20K pullup. + */ + inline __attribute__((always_inline)) + void toggle() { + fastDigitalToggle(PinNumber); + } + //---------------------------------------------------------------------------- + /** Write the pin's level. + * @param[in] value If true set the pin's level high else set the + * pin's level low. + */ + inline __attribute__((always_inline)) + void write(bool value) { + fastDigitalWrite(PinNumber, value); + } +}; +#endif // DigitalPin_h +/** @} */ \ No newline at end of file diff --git a/SdFat/utility/FatApiConstants.h b/SdFat/utility/FatApiConstants.h new file mode 100644 index 0000000..6a444c9 --- /dev/null +++ b/SdFat/utility/FatApiConstants.h @@ -0,0 +1,65 @@ +/* FatLib Library + * Copyright (C) 2013 by William Greiman + * + * This file is part of the FatLib Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the FatLib Library. If not, see + * . + */ +#ifndef FatApiConstants_h +#define FatApiConstants_h +//------------------------------------------------------------------------------ +// use the gnu style oflag in open() +/** open() oflag for reading */ +uint8_t const O_READ = 0X01; +/** open() oflag - same as O_IN */ +uint8_t const O_RDONLY = O_READ; +/** open() oflag for write */ +uint8_t const O_WRITE = 0X02; +/** open() oflag - same as O_WRITE */ +uint8_t const O_WRONLY = O_WRITE; +/** open() oflag for reading and writing */ +uint8_t const O_RDWR = (O_READ | O_WRITE); +/** open() oflag mask for access modes */ +uint8_t const O_ACCMODE = (O_READ | O_WRITE); +/** The file offset shall be set to the end of the file prior to each write. */ +uint8_t const O_APPEND = 0X04; +/** synchronous writes - call sync() after each write */ +uint8_t const O_SYNC = 0X08; +/** truncate the file to zero length */ +uint8_t const O_TRUNC = 0X10; +/** set the initial position at the end of the file */ +uint8_t const O_AT_END = 0X20; +/** create the file if nonexistent */ +uint8_t const O_CREAT = 0X40; +/** If O_CREAT and O_EXCL are set, open() shall fail if the file exists */ +uint8_t const O_EXCL = 0X80; + +// SdBaseFile class static and const definitions +// flags for ls() +/** ls() flag to print modify date */ +uint8_t const LS_DATE = 1; +/** ls() flag to print file size */ +uint8_t const LS_SIZE = 2; +/** ls() flag for recursive list of subdirectories */ +uint8_t const LS_R = 4; + +// flags for timestamp +/** set the file's last access date */ +uint8_t const T_ACCESS = 1; +/** set the file's creation date and time */ +uint8_t const T_CREATE = 2; +/** Set the file's write date and time */ +uint8_t const T_WRITE = 4; +#endif // FatApiConstants_h diff --git a/SdFat/utility/FatStructs.h b/SdFat/utility/FatStructs.h new file mode 100644 index 0000000..bf0da38 --- /dev/null +++ b/SdFat/utility/FatStructs.h @@ -0,0 +1,678 @@ +/* FatLib Library + * Copyright (C) 2013 by William Greiman + * + * This file is part of the FatLib Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the FatLib Library. If not, see + * . + */ +#ifndef FatStructs_h +#define FatStructs_h +/** + * \file + * \brief FAT file structures + */ +/* + * mostly from Microsoft document fatgen103.doc + * http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx + */ +//------------------------------------------------------------------------------ +/** Value for byte 510 of boot block or MBR */ +uint8_t const BOOTSIG0 = 0X55; +/** Value for byte 511 of boot block or MBR */ +uint8_t const BOOTSIG1 = 0XAA; +/** Value for bootSignature field int FAT/FAT32 boot sector */ +uint8_t const EXTENDED_BOOT_SIG = 0X29; +//------------------------------------------------------------------------------ +/** + * \struct partitionTable + * \brief MBR partition table entry + * + * A partition table entry for a MBR formatted storage device. + * The MBR partition table has four entries. + */ +struct partitionTable { + /** + * Boot Indicator . Indicates whether the volume is the active + * partition. Legal values include: 0X00. Do not use for booting. + * 0X80 Active partition. + */ + uint8_t boot; + /** + * Head part of Cylinder-head-sector address of the first block in + * the partition. Legal values are 0-255. Only used in old PC BIOS. + */ + uint8_t beginHead; + /** + * Sector part of Cylinder-head-sector address of the first block in + * the partition. Legal values are 1-63. Only used in old PC BIOS. + */ + unsigned beginSector : 6; + /** High bits cylinder for first block in partition. */ + unsigned beginCylinderHigh : 2; + /** + * Combine beginCylinderLow with beginCylinderHigh. Legal values + * are 0-1023. Only used in old PC BIOS. + */ + uint8_t beginCylinderLow; + /** + * Partition type. See defines that begin with PART_TYPE_ for + * some Microsoft partition types. + */ + uint8_t type; + /** + * head part of cylinder-head-sector address of the last sector in the + * partition. Legal values are 0-255. Only used in old PC BIOS. + */ + uint8_t endHead; + /** + * Sector part of cylinder-head-sector address of the last sector in + * the partition. Legal values are 1-63. Only used in old PC BIOS. + */ + unsigned endSector : 6; + /** High bits of end cylinder */ + unsigned endCylinderHigh : 2; + /** + * Combine endCylinderLow with endCylinderHigh. Legal values + * are 0-1023. Only used in old PC BIOS. + */ + uint8_t endCylinderLow; + /** Logical block address of the first block in the partition. */ + uint32_t firstSector; + /** Length of the partition, in blocks. */ + uint32_t totalSectors; +}__attribute__((packed)); +/** Type name for partitionTable */ +typedef struct partitionTable part_t; +//------------------------------------------------------------------------------ +/** + * \struct masterBootRecord + * + * \brief Master Boot Record + * + * The first block of a storage device that is formatted with a MBR. + */ +struct masterBootRecord { + /** Code Area for master boot program. */ + uint8_t codeArea[440]; + /** Optional Windows NT disk signature. May contain boot code. */ + uint32_t diskSignature; + /** Usually zero but may be more boot code. */ + uint16_t usuallyZero; + /** Partition tables. */ + part_t part[4]; + /** First MBR signature byte. Must be 0X55 */ + uint8_t mbrSig0; + /** Second MBR signature byte. Must be 0XAA */ + uint8_t mbrSig1; +}__attribute__((packed)); +/** Type name for masterBootRecord */ +typedef struct masterBootRecord mbr_t; +//------------------------------------------------------------------------------ +/** + * \struct fat_boot + * + * \brief Boot sector for a FAT12/FAT16 volume. + * + */ +struct fat_boot { + /** + * The first three bytes of the boot sector must be valid, + * executable x 86-based CPU instructions. This includes a + * jump instruction that skips the next non-executable bytes. + */ + uint8_t jump[3]; + /** + * This is typically a string of characters that identifies + * the operating system that formatted the volume. + */ + char oemId[8]; + /** + * The size of a hardware sector. Valid decimal values for this + * field are 512, 1024, 2048, and 4096. For most disks used in + * the United States, the value of this field is 512. + */ + uint16_t bytesPerSector; + /** + * Number of sectors per allocation unit. This value must be a + * power of 2 that is greater than 0. The legal values are + * 1, 2, 4, 8, 16, 32, 64, and 128. 128 should be avoided. + */ + uint8_t sectorsPerCluster; + /** + * The number of sectors preceding the start of the first FAT, + * including the boot sector. The value of this field is always 1. + */ + uint16_t reservedSectorCount; + /** + * The number of copies of the FAT on the volume. + * The value of this field is always 2. + */ + uint8_t fatCount; + /** + * For FAT12 and FAT16 volumes, this field contains the count of + * 32-byte directory entries in the root directory. For FAT32 volumes, + * this field must be set to 0. For FAT12 and FAT16 volumes, this + * value should always specify a count that when multiplied by 32 + * results in a multiple of bytesPerSector. FAT16 volumes should + * use the value 512. + */ + uint16_t rootDirEntryCount; + /** + * This field is the old 16-bit total count of sectors on the volume. + * This count includes the count of all sectors in all four regions + * of the volume. This field can be 0; if it is 0, then totalSectors32 + * must be non-zero. For FAT32 volumes, this field must be 0. For + * FAT12 and FAT16 volumes, this field contains the sector count, and + * totalSectors32 is 0 if the total sector count fits + * (is less than 0x10000). + */ + uint16_t totalSectors16; + /** + * This dates back to the old MS-DOS 1.x media determination and is + * no longer usually used for anything. 0xF8 is the standard value + * for fixed (nonremovable) media. For removable media, 0xF0 is + * frequently used. Legal values are 0xF0 or 0xF8-0xFF. + */ + uint8_t mediaType; + /** + * Count of sectors occupied by one FAT on FAT12/FAT16 volumes. + * On FAT32 volumes this field must be 0, and sectorsPerFat32 + * contains the FAT size count. + */ + uint16_t sectorsPerFat16; + /** Sectors per track for interrupt 0x13. Not used otherwise. */ + uint16_t sectorsPerTrack; + /** Number of heads for interrupt 0x13. Not used otherwise. */ + uint16_t headCount; + /** + * Count of hidden sectors preceding the partition that contains this + * FAT volume. This field is generally only relevant for media + * visible on interrupt 0x13. + */ + uint32_t hidddenSectors; + /** + * This field is the new 32-bit total count of sectors on the volume. + * This count includes the count of all sectors in all four regions + * of the volume. This field can be 0; if it is 0, then + * totalSectors16 must be non-zero. + */ + uint32_t totalSectors32; + /** + * Related to the BIOS physical drive number. Floppy drives are + * identified as 0x00 and physical hard disks are identified as + * 0x80, regardless of the number of physical disk drives. + * Typically, this value is set prior to issuing an INT 13h BIOS + * call to specify the device to access. The value is only + * relevant if the device is a boot device. + */ + uint8_t driveNumber; + /** used by Windows NT - should be zero for FAT */ + uint8_t reserved1; + /** 0X29 if next three fields are valid */ + uint8_t bootSignature; + /** + * A random serial number created when formatting a disk, + * which helps to distinguish between disks. + * Usually generated by combining date and time. + */ + uint32_t volumeSerialNumber; + /** + * A field once used to store the volume label. The volume label + * is now stored as a special file in the root directory. + */ + char volumeLabel[11]; + /** + * A field with a value of either FAT, FAT12 or FAT16, + * depending on the disk format. + */ + char fileSystemType[8]; + /** X86 boot code */ + uint8_t bootCode[448]; + /** must be 0X55 */ + uint8_t bootSectorSig0; + /** must be 0XAA */ + uint8_t bootSectorSig1; +}__attribute__((packed)); +/** Type name for FAT Boot Sector */ +typedef struct fat_boot fat_boot_t; +//------------------------------------------------------------------------------ +/** + * \struct fat32_boot + * + * \brief Boot sector for a FAT32 volume. + * + */ +struct fat32_boot { + /** + * The first three bytes of the boot sector must be valid, + * executable x 86-based CPU instructions. This includes a + * jump instruction that skips the next non-executable bytes. + */ + uint8_t jump[3]; + /** + * This is typically a string of characters that identifies + * the operating system that formatted the volume. + */ + char oemId[8]; + /** + * The size of a hardware sector. Valid decimal values for this + * field are 512, 1024, 2048, and 4096. For most disks used in + * the United States, the value of this field is 512. + */ + uint16_t bytesPerSector; + /** + * Number of sectors per allocation unit. This value must be a + * power of 2 that is greater than 0. The legal values are + * 1, 2, 4, 8, 16, 32, 64, and 128. 128 should be avoided. + */ + uint8_t sectorsPerCluster; + /** + * The number of sectors preceding the start of the first FAT, + * including the boot sector. Must not be zero + */ + uint16_t reservedSectorCount; + /** + * The number of copies of the FAT on the volume. + * The value of this field is always 2. + */ + uint8_t fatCount; + /** + * FAT12/FAT16 only. For FAT32 volumes, this field must be set to 0. + */ + uint16_t rootDirEntryCount; + /** + * For FAT32 volumes, this field must be 0. + */ + uint16_t totalSectors16; + /** + * This dates back to the old MS-DOS 1.x media determination and is + * no longer usually used for anything. 0xF8 is the standard value + * for fixed (non-removable) media. For removable media, 0xF0 is + * frequently used. Legal values are 0xF0 or 0xF8-0xFF. + */ + uint8_t mediaType; + /** + * On FAT32 volumes this field must be 0, and sectorsPerFat32 + * contains the FAT size count. + */ + uint16_t sectorsPerFat16; + /** Sectors per track for interrupt 0x13. Not used otherwise. */ + uint16_t sectorsPerTrack; + /** Number of heads for interrupt 0x13. Not used otherwise. */ + uint16_t headCount; + /** + * Count of hidden sectors preceding the partition that contains this + * FAT volume. This field is generally only relevant for media + * visible on interrupt 0x13. + */ + uint32_t hidddenSectors; + /** + * Contains the total number of sectors in the FAT32 volume. + */ + uint32_t totalSectors32; + /** + * Count of sectors occupied by one FAT on FAT32 volumes. + */ + uint32_t sectorsPerFat32; + /** + * This field is only defined for FAT32 media and does not exist on + * FAT12 and FAT16 media. + * Bits 0-3 -- Zero-based number of active FAT. + * Only valid if mirroring is disabled. + * Bits 4-6 -- Reserved. + * Bit 7 -- 0 means the FAT is mirrored at runtime into all FATs. + * -- 1 means only one FAT is active; it is the one referenced + * in bits 0-3. + * Bits 8-15 -- Reserved. + */ + uint16_t fat32Flags; + /** + * FAT32 version. High byte is major revision number. + * Low byte is minor revision number. Only 0.0 define. + */ + uint16_t fat32Version; + /** + * Cluster number of the first cluster of the root directory for FAT32. + * This usually 2 but not required to be 2. + */ + uint32_t fat32RootCluster; + /** + * Sector number of FSINFO structure in the reserved area of the + * FAT32 volume. Usually 1. + */ + uint16_t fat32FSInfo; + /** + * If non-zero, indicates the sector number in the reserved area + * of the volume of a copy of the boot record. Usually 6. + * No value other than 6 is recommended. + */ + uint16_t fat32BackBootBlock; + /** + * Reserved for future expansion. Code that formats FAT32 volumes + * should always set all of the bytes of this field to 0. + */ + uint8_t fat32Reserved[12]; + /** + * Related to the BIOS physical drive number. Floppy drives are + * identified as 0x00 and physical hard disks are identified as + * 0x80, regardless of the number of physical disk drives. + * Typically, this value is set prior to issuing an INT 13h BIOS + * call to specify the device to access. The value is only + * relevant if the device is a boot device. + */ + uint8_t driveNumber; + /** used by Windows NT - should be zero for FAT */ + uint8_t reserved1; + /** 0X29 if next three fields are valid */ + uint8_t bootSignature; + /** + * A random serial number created when formatting a disk, + * which helps to distinguish between disks. + * Usually generated by combining date and time. + */ + uint32_t volumeSerialNumber; + /** + * A field once used to store the volume label. The volume label + * is now stored as a special file in the root directory. + */ + char volumeLabel[11]; + /** + * A text field with a value of FAT32. + */ + char fileSystemType[8]; + /** X86 boot code */ + uint8_t bootCode[420]; + /** must be 0X55 */ + uint8_t bootSectorSig0; + /** must be 0XAA */ + uint8_t bootSectorSig1; +}__attribute__((packed)); +/** Type name for FAT32 Boot Sector */ +typedef struct fat32_boot fat32_boot_t; +//------------------------------------------------------------------------------ +/** Lead signature for a FSINFO sector */ +uint32_t const FSINFO_LEAD_SIG = 0x41615252; +/** Struct signature for a FSINFO sector */ +uint32_t const FSINFO_STRUCT_SIG = 0x61417272; +/** + * \struct fat32_fsinfo + * + * \brief FSINFO sector for a FAT32 volume. + * + */ +struct fat32_fsinfo { + /** must be 0X52, 0X52, 0X61, 0X41 */ + uint32_t leadSignature; + /** must be zero */ + uint8_t reserved1[480]; + /** must be 0X72, 0X72, 0X41, 0X61 */ + uint32_t structSignature; + /** + * Contains the last known free cluster count on the volume. + * If the value is 0xFFFFFFFF, then the free count is unknown + * and must be computed. Any other value can be used, but is + * not necessarily correct. It should be range checked at least + * to make sure it is <= volume cluster count. + */ + uint32_t freeCount; + /** + * This is a hint for the FAT driver. It indicates the cluster + * number at which the driver should start looking for free clusters. + * If the value is 0xFFFFFFFF, then there is no hint and the driver + * should start looking at cluster 2. + */ + uint32_t nextFree; + /** must be zero */ + uint8_t reserved2[12]; + /** must be 0X00, 0X00, 0X55, 0XAA */ + uint8_t tailSignature[4]; +}__attribute__((packed)); +/** Type name for FAT32 FSINFO Sector */ +typedef struct fat32_fsinfo fat32_fsinfo_t; +//------------------------------------------------------------------------------ +// End Of Chain values for FAT entries +/** FAT12 end of chain value used by Microsoft. */ +uint16_t const FAT12EOC = 0XFFF; +/** Minimum value for FAT12 EOC. Use to test for EOC. */ +uint16_t const FAT12EOC_MIN = 0XFF8; +/** FAT16 end of chain value used by Microsoft. */ +uint16_t const FAT16EOC = 0XFFFF; +/** Minimum value for FAT16 EOC. Use to test for EOC. */ +uint16_t const FAT16EOC_MIN = 0XFFF8; +/** FAT32 end of chain value used by Microsoft. */ +uint32_t const FAT32EOC = 0X0FFFFFFF; +/** Minimum value for FAT32 EOC. Use to test for EOC. */ +uint32_t const FAT32EOC_MIN = 0X0FFFFFF8; +/** Mask a for FAT32 entry. Entries are 28 bits. */ +uint32_t const FAT32MASK = 0X0FFFFFFF; +//------------------------------------------------------------------------------ +/** + * \struct directoryEntry + * \brief FAT short directory entry + * + * Short means short 8.3 name, not the entry size. + * + * Date Format. A FAT directory entry date stamp is a 16-bit field that is + * basically a date relative to the MS-DOS epoch of 01/01/1980. Here is the + * format (bit 0 is the LSB of the 16-bit word, bit 15 is the MSB of the + * 16-bit word): + * + * Bits 9-15: Count of years from 1980, valid value range 0-127 + * inclusive (1980-2107). + * + * Bits 5-8: Month of year, 1 = January, valid value range 1-12 inclusive. + * + * Bits 0-4: Day of month, valid value range 1-31 inclusive. + * + * Time Format. A FAT directory entry time stamp is a 16-bit field that has + * a granularity of 2 seconds. Here is the format (bit 0 is the LSB of the + * 16-bit word, bit 15 is the MSB of the 16-bit word). + * + * Bits 11-15: Hours, valid value range 0-23 inclusive. + * + * Bits 5-10: Minutes, valid value range 0-59 inclusive. + * + * Bits 0-4: 2-second count, valid value range 0-29 inclusive (0 - 58 seconds). + * + * The valid time range is from Midnight 00:00:00 to 23:59:58. + */ +struct directoryEntry { + /** Short 8.3 name. + * + * The first eight bytes contain the file name with blank fill. + * The last three bytes contain the file extension with blank fill. + */ + uint8_t name[11]; + /** Entry attributes. + * + * The upper two bits of the attribute byte are reserved and should + * always be set to 0 when a file is created and never modified or + * looked at after that. See defines that begin with DIR_ATT_. + */ + uint8_t attributes; + /** + * Reserved for use by Windows NT. Set value to 0 when a file is + * created and never modify or look at it after that. + */ + uint8_t reservedNT; + /** + * The granularity of the seconds part of creationTime is 2 seconds + * so this field is a count of tenths of a second and its valid + * value range is 0-199 inclusive. (WHG note - seems to be hundredths) + */ + uint8_t creationTimeTenths; + /** Time file was created. */ + uint16_t creationTime; + /** Date file was created. */ + uint16_t creationDate; + /** + * Last access date. Note that there is no last access time, only + * a date. This is the date of last read or write. In the case of + * a write, this should be set to the same date as lastWriteDate. + */ + uint16_t lastAccessDate; + /** + * High word of this entry's first cluster number (always 0 for a + * FAT12 or FAT16 volume). + */ + uint16_t firstClusterHigh; + /** Time of last write. File creation is considered a write. */ + uint16_t lastWriteTime; + /** Date of last write. File creation is considered a write. */ + uint16_t lastWriteDate; + /** Low word of this entry's first cluster number. */ + uint16_t firstClusterLow; + /** 32-bit unsigned holding this file's size in bytes. */ + uint32_t fileSize; +}__attribute__((packed)); +//------------------------------------------------------------------------------ +// Definitions for directory entries +// +/** Type name for directoryEntry */ +typedef struct directoryEntry dir_t; +/** escape for name[0] = 0XE5 */ +uint8_t const DIR_NAME_0XE5 = 0X05; +/** name[0] value for entry that is free after being "deleted" */ +uint8_t const DIR_NAME_DELETED = 0XE5; +/** name[0] value for entry that is free and no allocated entries follow */ +uint8_t const DIR_NAME_FREE = 0X00; +/** file is read-only */ +uint8_t const DIR_ATT_READ_ONLY = 0X01; +/** File should hidden in directory listings */ +uint8_t const DIR_ATT_HIDDEN = 0X02; +/** Entry is for a system file */ +uint8_t const DIR_ATT_SYSTEM = 0X04; +/** Directory entry contains the volume label */ +uint8_t const DIR_ATT_VOLUME_ID = 0X08; +/** Entry is for a directory */ +uint8_t const DIR_ATT_DIRECTORY = 0X10; +/** Old DOS archive bit for backup support */ +uint8_t const DIR_ATT_ARCHIVE = 0X20; +/** Test value for long name entry. Test is + (d->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME. */ +uint8_t const DIR_ATT_LONG_NAME = 0X0F; +/** Test mask for long name entry */ +uint8_t const DIR_ATT_LONG_NAME_MASK = 0X3F; +/** defined attribute bits */ +uint8_t const DIR_ATT_DEFINED_BITS = 0X3F; +/** Directory entry is part of a long name + * \param[in] dir Pointer to a directory entry. + * + * \return true if the entry is for part of a long name else false. + */ +static inline uint8_t DIR_IS_LONG_NAME(const dir_t* dir) { + return (dir->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME; +} +/** Mask for file/subdirectory tests */ +uint8_t const DIR_ATT_FILE_TYPE_MASK = (DIR_ATT_VOLUME_ID | DIR_ATT_DIRECTORY); +/** Directory entry is for a file + * \param[in] dir Pointer to a directory entry. + * + * \return true if the entry is for a normal file else false. + */ +static inline uint8_t DIR_IS_FILE(const dir_t* dir) { + return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == 0; +} +/** Directory entry is for a subdirectory + * \param[in] dir Pointer to a directory entry. + * + * \return true if the entry is for a subdirectory else false. + */ +static inline uint8_t DIR_IS_SUBDIR(const dir_t* dir) { + return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == DIR_ATT_DIRECTORY; +} +/** Directory entry is for a file or subdirectory + * \param[in] dir Pointer to a directory entry. + * + * \return true if the entry is for a normal file or subdirectory else false. + */ +static inline uint8_t DIR_IS_FILE_OR_SUBDIR(const dir_t* dir) { + return (dir->attributes & DIR_ATT_VOLUME_ID) == 0; +} +/** date field for FAT directory entry + * \param[in] year [1980,2107] + * \param[in] month [1,12] + * \param[in] day [1,31] + * + * \return Packed date for dir_t entry. + */ +static inline uint16_t FAT_DATE(uint16_t year, uint8_t month, uint8_t day) { + return (year - 1980) << 9 | month << 5 | day; +} +/** year part of FAT directory date field + * \param[in] fatDate Date in packed dir format. + * + * \return Extracted year [1980,2107] + */ +static inline uint16_t FAT_YEAR(uint16_t fatDate) { + return 1980 + (fatDate >> 9); +} +/** month part of FAT directory date field + * \param[in] fatDate Date in packed dir format. + * + * \return Extracted month [1,12] + */ +static inline uint8_t FAT_MONTH(uint16_t fatDate) { + return (fatDate >> 5) & 0XF; +} +/** day part of FAT directory date field + * \param[in] fatDate Date in packed dir format. + * + * \return Extracted day [1,31] + */ +static inline uint8_t FAT_DAY(uint16_t fatDate) { + return fatDate & 0X1F; +} +/** time field for FAT directory entry + * \param[in] hour [0,23] + * \param[in] minute [0,59] + * \param[in] second [0,59] + * + * \return Packed time for dir_t entry. + */ +static inline uint16_t FAT_TIME(uint8_t hour, uint8_t minute, uint8_t second) { + return hour << 11 | minute << 5 | second >> 1; +} +/** hour part of FAT directory time field + * \param[in] fatTime Time in packed dir format. + * + * \return Extracted hour [0,23] + */ +static inline uint8_t FAT_HOUR(uint16_t fatTime) { + return fatTime >> 11; +} +/** minute part of FAT directory time field + * \param[in] fatTime Time in packed dir format. + * + * \return Extracted minute [0,59] + */ +static inline uint8_t FAT_MINUTE(uint16_t fatTime) { + return(fatTime >> 5) & 0X3F; +} +/** second part of FAT directory time field + * Note second/2 is stored in packed time. + * + * \param[in] fatTime Time in packed dir format. + * + * \return Extracted second [0,58] + */ +static inline uint8_t FAT_SECOND(uint16_t fatTime) { + return 2*(fatTime & 0X1F); +} +/** Default date for file timestamps is 1 Jan 2000 */ +uint16_t const FAT_DEFAULT_DATE = ((2000 - 1980) << 9) | (1 << 5) | 1; +/** Default time for file timestamp is 1 am */ +uint16_t const FAT_DEFAULT_TIME = (1 << 11); +#endif // FatStructs_h diff --git a/SdFat/utility/FmtNumber.cpp b/SdFat/utility/FmtNumber.cpp new file mode 100644 index 0000000..1c3e704 --- /dev/null +++ b/SdFat/utility/FmtNumber.cpp @@ -0,0 +1,405 @@ +/* FatLib Library + * Copyright (C) 2013 by William Greiman + * + * This file is part of the FatLib Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the FatLib Library. If not, see + * . + */ +#include +#include +// Use Stimmer div/mod 10 on avr +#ifdef __AVR__ +#define USE_STIMMER +#endif // __AVR__ +//------------------------------------------------------------------------------ +// Stimmer div/mod 10 for AVR +// this code fragment works out i/10 and i%10 by calculating +// i*(51/256)*(256/255)/2 == i*51/510 == i/10 +// by "j.k" I mean 32.8 fixed point, j is integer part, k is fractional part +// j.k = ((j+1.0)*51.0)/256.0 +// (we add 1 because we will be using the floor of the result later) +// divmod10_asm16 and divmod10_asm32 are public domain code by Stimmer. +// http://forum.arduino.cc/index.php?topic=167414.msg1293679#msg1293679 +#define divmod10_asm16(in32, mod8, tmp8) \ +asm volatile( \ + " ldi %2,51 \n\t" \ + " mul %A0,%2 \n\t" \ + " clr %A0 \n\t" \ + " add r0,%2 \n\t" \ + " adc %A0,r1 \n\t" \ + " mov %1,r0 \n\t" \ + " mul %B0,%2 \n\t" \ + " clr %B0 \n\t" \ + " add %A0,r0 \n\t" \ + " adc %B0,r1 \n\t" \ + " clr r1 \n\t" \ + " add %1,%A0 \n\t" \ + " adc %A0,%B0 \n\t" \ + " adc %B0,r1 \n\t" \ + " add %1,%B0 \n\t" \ + " adc %A0,r1 \n\t" \ + " adc %B0,r1 \n\t" \ + " lsr %B0 \n\t" \ + " ror %A0 \n\t" \ + " ror %1 \n\t" \ + " ldi %2,10 \n\t" \ + " mul %1,%2 \n\t" \ + " mov %1,r1 \n\t" \ + " clr r1 \n\t" \ + :"+r"(in32), "=d"(mod8), "=d"(tmp8) : : "r0") + +#define divmod10_asm32(in32, mod8, tmp8) \ +asm volatile( \ + " ldi %2,51 \n\t" \ + " mul %A0,%2 \n\t" \ + " clr %A0 \n\t" \ + " add r0,%2 \n\t" \ + " adc %A0,r1 \n\t" \ + " mov %1,r0 \n\t" \ + " mul %B0,%2 \n\t" \ + " clr %B0 \n\t" \ + " add %A0,r0 \n\t" \ + " adc %B0,r1 \n\t" \ + " mul %C0,%2 \n\t" \ + " clr %C0 \n\t" \ + " add %B0,r0 \n\t" \ + " adc %C0,r1 \n\t" \ + " mul %D0,%2 \n\t" \ + " clr %D0 \n\t" \ + " add %C0,r0 \n\t" \ + " adc %D0,r1 \n\t" \ + " clr r1 \n\t" \ + " add %1,%A0 \n\t" \ + " adc %A0,%B0 \n\t" \ + " adc %B0,%C0 \n\t" \ + " adc %C0,%D0 \n\t" \ + " adc %D0,r1 \n\t" \ + " add %1,%B0 \n\t" \ + " adc %A0,%C0 \n\t" \ + " adc %B0,%D0 \n\t" \ + " adc %C0,r1 \n\t" \ + " adc %D0,r1 \n\t" \ + " add %1,%D0 \n\t" \ + " adc %A0,r1 \n\t" \ + " adc %B0,r1 \n\t" \ + " adc %C0,r1 \n\t" \ + " adc %D0,r1 \n\t" \ + " lsr %D0 \n\t" \ + " ror %C0 \n\t" \ + " ror %B0 \n\t" \ + " ror %A0 \n\t" \ + " ror %1 \n\t" \ + " ldi %2,10 \n\t" \ + " mul %1,%2 \n\t" \ + " mov %1,r1 \n\t" \ + " clr r1 \n\t" \ + :"+r"(in32), "=d"(mod8), "=d"(tmp8) : : "r0") +//------------------------------------------------------------------------------ +/* +// C++ code is based on this version of divmod10 by robtillaart. +// http://forum.arduino.cc/index.php?topic=167414.msg1246851#msg1246851 +// from robtillaart post: +// The code is based upon the divu10() code from the book Hackers Delight1. +// My insight was that the error formula in divu10() was in fact modulo 10 +// but not always. Sometimes it was 10 more. +void divmod10(uint32_t in, uint32_t &div, uint32_t &mod) +{ + // q = in * 0.8; + uint32_t q = (in >> 1) + (in >> 2); + q = q + (q >> 4); + q = q + (q >> 8); + q = q + (q >> 16); // not needed for 16 bit version + + // q = q / 8; ==> q = in *0.1; + q = q >> 3; + + // determine error + uint32_t r = in - ((q << 3) + (q << 1)); // r = in - q*10; + div = q + (r > 9); + if (r > 9) mod = r - 10; + else mod = r; +} +// Hackers delight function is here: +// http://www.hackersdelight.org/hdcodetxt/divuc.c.txt +// Code below uses 8/10 = 0.1100 1100 1100 1100 1100 1100 1100 1100. +// 15 ops including the multiply, or 17 elementary ops. +unsigned divu10(unsigned n) { + unsigned q, r; + + q = (n >> 1) + (n >> 2); + q = q + (q >> 4); + q = q + (q >> 8); + q = q + (q >> 16); + q = q >> 3; + r = n - q*10; + return q + ((r + 6) >> 4); +// return q + (r > 9); +} +*/ +//------------------------------------------------------------------------------ + +static const float m[] PROGMEM = {1e-1, 1e-2, 1e-4, 1e-8, 1e-16, 1e-32}; +static const float p[] PROGMEM = {1e+1, 1e+2, 1e+4, 1e+8, 1e+16, 1e+32}; +// scale float v by power of ten. return v*10^n +float scale10(float v, int8_t n) { + const float *s; + if (n < 0) { + n = -n; + s = m; + } else { + s = p; + } + n &= 63; + for (uint8_t i = 0; n; n >>= 1, i++) { + if (n & 1) v *= pgm_read_float(&s[i]); + } + return v; +} +//------------------------------------------------------------------------------ +// Format 16-bit unsigned +char* fmtDec(uint16_t n, char* p) { + while (n > 9) { +#ifdef USE_STIMMER + uint8_t tmp8, r; + divmod10_asm16(n, r, tmp8); +#else // USE_STIMMER + uint16_t t = n; + n = (n >> 1) + (n >> 2); + n = n + (n >> 4); + n = n + (n >> 8); + // n = n + (n >> 16); // no code for 16-bit n + n = n >> 3; + uint8_t r = t - (((n << 2) + n) << 1); + if (r > 9) { + n++; + r -= 10; + } +#endif // USE_STIMMER + *--p = r + '0'; + } + *--p = n + '0'; + return p; +} +//------------------------------------------------------------------------------ +// format 32-bit unsigned +char* fmtDec(uint32_t n, char* p) { + while (n >> 16) { +#ifdef USE_STIMMER + uint8_t tmp8, r; + divmod10_asm32(n, r, tmp8); +#else // USE_STIMMER + uint32_t t = n; + n = (n >> 1) + (n >> 2); + n = n + (n >> 4); + n = n + (n >> 8); + n = n + (n >> 16); + n = n >> 3; + uint8_t r = t - (((n << 2) + n) << 1); + if (r > 9) { + n++; + r -= 10; + } +#endif // USE_STIMMER + *--p = r + '0'; + } + return fmtDec((uint16_t)n, p); +} +//------------------------------------------------------------------------------ +char* fmtFloat(float value, char* p, uint8_t prec) { + char sign = value < 0 ? '-' : 0; + if (sign) value = -value; + + if (isnan(value)) { + *--p = 'n'; + *--p = 'a'; + *--p = 'n'; + return p; + } + if (isinf(value)) { + *--p = 'f'; + *--p = 'n'; + *--p = 'i'; + return p; + } + if (value > 4294967040.0) { + *--p = 'f'; + *--p = 'v'; + *--p = 'o'; + return p; + } + if (prec > 9) prec = 9; + value += scale10(0.5, -prec); + + uint32_t whole = value; + if (prec) { + char* tmp = p - prec; + uint32_t fraction = scale10(value - whole, prec); + p = fmtDec(fraction, p); + while (p > tmp) *--p = '0'; + *--p = '.'; + } + p = fmtDec(whole, p); + if (sign) *--p = sign; + return p; +} +//------------------------------------------------------------------------------ +/** Print a number followed by a field terminator. + * \param[in] value The number to be printed. + * \param[in] ptr Pointer to last char in buffer. + * \param[in] prec Number of digits after decimal point. + * \param[in] expChar Use exp format if non zero. + * \return Pointer to first character of result. + */ +char* fmtFloat(float value, char* ptr, uint8_t prec, char expChar) { + bool neg = value < 0; + if (neg) value = -value; + + // check for nan inf ovf + if (isnan(value)) { + *--ptr = 'n'; + *--ptr = 'a'; + *--ptr = 'n'; + return ptr; + } + if (isinf(value)) { + *--ptr = 'f'; + *--ptr = 'n'; + *--ptr = 'i'; + return ptr; + } + if (!expChar && value > 4294967040.0) { + *--ptr = 'f'; + *--ptr = 'v'; + *--ptr = 'o'; + return ptr; + } + if (prec > 9) prec = 9; + float round = scale10(0.5, -prec); + if (expChar) { + int8_t exp = 0; + bool expNeg = false; + if (value) { + while (value > 10.0) { + value *= 0.1; + exp++; + } + while (value < 1.0) { + value *= 10.0; + exp--; + } + value += round; + if (value > 10.0) { + value *= 0.1; + exp++; + } + expNeg = exp < 0; + if (expNeg) exp = -exp; + } + ptr = fmtDec((uint16_t)exp, ptr); + if (exp < 10) *--ptr = '0'; + *--ptr = expNeg ? '-' : '+'; + *--ptr = expChar; + } else { + // round value + value += round; + } + uint32_t whole = value; + if (prec) { + char* tmp = ptr - prec; + uint32_t fraction = scale10(value - whole, prec); + ptr = fmtDec(fraction, ptr); + while (ptr > tmp) *--ptr = '0'; + *--ptr = '.'; + } + ptr = fmtDec(whole, ptr); + if (neg) *--ptr = '-'; + return ptr; +} +//------------------------------------------------------------------------------ +char* fmtHex(uint32_t n, char* p) { + do { + uint8_t h = n & 0XF; + *--p = h + (h < 10 ? '0' : 'A' - 10); + n >>= 4; + } while (n); + return p; +} +//------------------------------------------------------------------------------ +float scanFloat(const char* str, char** ptr) { + int16_t const EXP_LIMIT = 100; + bool digit = false; + bool dot = false; + uint32_t fract = 0; + int fracExp = 0; + uint8_t nd = 0; + bool neg; + int c; + float v; + const char* successPtr; + + if (ptr) *ptr = const_cast(str); + + while (isspace((c = *str++))) {} + neg = c == '-'; + if (c == '-' || c == '+') c = *str++; + // Skip leading zeros + while (c == '0') { + c = *str++; + digit = true; + } + for (;;) { + if (isdigit(c)) { + digit = true; + if (nd < 9) { + fract = 10*fract + c - '0'; + nd++; + if (dot) fracExp--; + } else { + if (!dot) fracExp++; + } + } else if (c == '.') { + if (dot) goto fail; + dot = true; + } else { + if (!digit) goto fail; + break; + } + successPtr = str; + c = *str++; + } + if (c == 'e' || c == 'E') { + int exp = 0; + c = *str++; + bool expNeg = c == '-'; + if (c == '-' || c == '+') { + c = *str++; + } + while (isdigit(c)) { + if (exp > EXP_LIMIT) goto fail; + exp = 10*exp + c - '0'; + successPtr = str; + c = *str++; + } + fracExp += expNeg ? -exp : exp; + } + if (ptr) *ptr = const_cast(successPtr); + v = scale10(static_cast(fract), fracExp); + return neg ? -v: v; + + fail: + return 0; +} + + diff --git a/SdFat/utility/FmtNumber.h b/SdFat/utility/FmtNumber.h new file mode 100644 index 0000000..dd11018 --- /dev/null +++ b/SdFat/utility/FmtNumber.h @@ -0,0 +1,30 @@ +/* FatLib Library + * Copyright (C) 2013 by William Greiman + * + * This file is part of the FatLib Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the FatLib Library. If not, see + * . + */ +#ifndef FmtNumber_h +#define FmtNumber_h +#include +char* fmtDec(uint16_t n, char* p); +char* fmtDec(uint32_t n, char* p); +char* fmtFloat(float value, char* p, uint8_t prec); +char* fmtFloat(float value, char* ptr, uint8_t prec, char expChar); +char* fmtHex(uint32_t n, char* p); +float scale10(float v, int8_t n); +float scanFloat(const char* str, char** ptr); +#endif // FmtNumber_h diff --git a/SdFat/utility/SoftSPI.h b/SdFat/utility/SoftSPI.h new file mode 100644 index 0000000..29c1a3b --- /dev/null +++ b/SdFat/utility/SoftSPI.h @@ -0,0 +1,159 @@ +/* Arduino DigitalIO Library + * Copyright (C) 2013 by William Greiman + * + * This file is part of the Arduino DigitalIO Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino DigitalIO Library. If not, see + * . + */ +/** + * @file + * @brief Software SPI. + * + * @defgroup softSPI Software SPI + * @details Software SPI Template Class. + * @{ + */ + +#ifndef SoftSPI_h +#define SoftSPI_h +#include +//------------------------------------------------------------------------------ +/** Nop for timing. */ +#define nop asm volatile ("nop\n\t") +//------------------------------------------------------------------------------ +/** Pin Mode for MISO is input.*/ +const bool MISO_MODE = false; +/** Pullups disabled for MISO are disabled. */ +const bool MISO_LEVEL = false; +/** Pin Mode for MOSI is output.*/ +const bool MOSI_MODE = true; +/** Pin Mode for SCK is output. */ +const bool SCK_MODE = true; +//------------------------------------------------------------------------------ +/** + * @class SoftSPI + * @brief Fast software SPI. + */ +template +class SoftSPI { + public: + //----------------------------------------------------------------------------- + /** Initialize SoftSPI pins. */ + void begin() { + fastPinConfig(MisoPin, MISO_MODE, MISO_LEVEL); + fastPinConfig(MosiPin, MOSI_MODE, !MODE_CPHA(Mode)); + fastPinConfig(SckPin, SCK_MODE, MODE_CPOL(Mode)); + } + //---------------------------------------------------------------------------- + /** Soft SPI receive byte. + * @return Data byte received. + */ + inline __attribute__((always_inline)) + uint8_t receive() { + uint8_t data = 0; + receiveBit(7, &data); + receiveBit(6, &data); + receiveBit(5, &data); + receiveBit(4, &data); + receiveBit(3, &data); + receiveBit(2, &data); + receiveBit(1, &data); + receiveBit(0, &data); + return data; + } + //---------------------------------------------------------------------------- + /** Soft SPI send byte. + * @param[in] data Data byte to send. + */ + inline __attribute__((always_inline)) + void send(uint8_t data) { + sendBit(7, data); + sendBit(6, data); + sendBit(5, data); + sendBit(4, data); + sendBit(3, data); + sendBit(2, data); + sendBit(1, data); + sendBit(0, data); + } + //---------------------------------------------------------------------------- + /** Soft SPI transfer byte. + * @param[in] txData Data byte to send. + * @return Data byte received. + */ + inline __attribute__((always_inline)) + uint8_t transfer(uint8_t txData) { + uint8_t rxData = 0; + transferBit(7, &rxData, txData); + transferBit(6, &rxData, txData); + transferBit(5, &rxData, txData); + transferBit(4, &rxData, txData); + transferBit(3, &rxData, txData); + transferBit(2, &rxData, txData); + transferBit(1, &rxData, txData); + transferBit(0, &rxData, txData); + return rxData; + } + private: + //---------------------------------------------------------------------------- + inline __attribute__((always_inline)) + bool MODE_CPHA(uint8_t mode) {return (mode & 1) != 0;} + inline __attribute__((always_inline)) + bool MODE_CPOL(uint8_t mode) {return (mode & 2) != 0;} + inline __attribute__((always_inline)) + void receiveBit(uint8_t bit, uint8_t* data) { + if (MODE_CPHA(Mode)) { + fastDigitalWrite(SckPin, !MODE_CPOL(Mode)); + } + nop;nop; + fastDigitalWrite(SckPin, + MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode)); + if (fastDigitalRead(MisoPin)) *data |= 1 << bit; + if (!MODE_CPHA(Mode)) { + fastDigitalWrite(SckPin, MODE_CPOL(Mode)); + } + } + //---------------------------------------------------------------------------- + inline __attribute__((always_inline)) + void sendBit(uint8_t bit, uint8_t data) { + if (MODE_CPHA(Mode)) { + fastDigitalWrite(SckPin, !MODE_CPOL(Mode)); + } + fastDigitalWrite(MosiPin, data & (1 << bit)); + fastDigitalWrite(SckPin, + MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode)); + nop;nop; + if (!MODE_CPHA(Mode)) { + fastDigitalWrite(SckPin, MODE_CPOL(Mode)); + } + } + //---------------------------------------------------------------------------- + inline __attribute__((always_inline)) + void transferBit(uint8_t bit, uint8_t* rxData, uint8_t txData) { + if (MODE_CPHA(Mode)) { + fastDigitalWrite(SckPin, !MODE_CPOL(Mode)); + } + fastDigitalWrite(MosiPin, txData & (1 << bit)); + fastDigitalWrite(SckPin, + MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode)); + if (fastDigitalRead(MisoPin)) *rxData |= 1 << bit; + if (!MODE_CPHA(Mode)) { + fastDigitalWrite(SckPin, MODE_CPOL(Mode)); + } + } + //---------------------------------------------------------------------------- +}; +#endif // SoftSPI_h +/** @} */ \ No newline at end of file diff --git a/SdFatTestSuite/SdFatTestSuite.cpp b/SdFatTestSuite/SdFatTestSuite.cpp new file mode 100644 index 0000000..1fc3435 --- /dev/null +++ b/SdFatTestSuite/SdFatTestSuite.cpp @@ -0,0 +1,82 @@ +/* Arduino SdFat Library + * Copyright (C) 2011 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#include +static uint16_t failCount; +static uint16_t testCount; +static Print* testOut = &Serial; +//------------------------------------------------------------------------------ +static size_t strlenPGM(PGM_P str) { + PGM_P end = str; + while (pgm_read_byte(end++)) {} + return end - str; +} +//------------------------------------------------------------------------------ +void testBegin() { + Serial.begin(9600); + while (!Serial) {} // wait for leonardo + testOut = &Serial; + SerialPrintln_P(PSTR("Type any character to begin.")); + while (Serial.read() <= 0) {} + delay(200); // Catch Due reset problem + + print_P(testOut, PSTR("FreeRam: ")); + testOut->println(FreeRam()); + testOut->println(); + failCount = 0; + testCount = 0; +} +//------------------------------------------------------------------------------ +void testEnd() { + testOut->println(); + println_P(testOut, PSTR("Compiled: " __DATE__ " " __TIME__)); + print_P(testOut, PSTR("FreeRam: ")); + testOut->println(FreeRam()); + print_P(testOut, PSTR("Test count: ")); + testOut->println(testCount); + print_P(testOut, PSTR("Fail count: ")); + testOut->println(failCount); +} +//------------------------------------------------------------------------------ +static void testResult(bool b, uint8_t n) { + while (n++ < 60) testOut->write(' '); + if (b) { + println_P(testOut, PSTR("..ok")); + } else { + println_P(testOut, PSTR("FAIL")); + failCount++; + } + testCount++; +} +//------------------------------------------------------------------------------ +void testVerify_P(char* result, PGM_P expect) { + testOut->write('"'); + testOut->print(result); + testOut->print("\",\""); + print_P(testOut, expect); + testOut->write('"'); + uint8_t n = strlen(result) + strlenPGM(expect) + 5; + testResult(!strcmp_P(result, expect), n); +} +//------------------------------------------------------------------------------ +void testVerify_P(bool b, PGM_P msg) { + print_P(testOut, msg); + uint8_t n = strlenPGM(msg); + testResult(b, n); +} diff --git a/SdFatTestSuite/SdFatTestSuite.h b/SdFatTestSuite/SdFatTestSuite.h new file mode 100644 index 0000000..736f67f --- /dev/null +++ b/SdFatTestSuite/SdFatTestSuite.h @@ -0,0 +1,45 @@ +/* Arduino SdFat Library + * Copyright (C) 2011 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef SdFatTestSuite_h +#define SdFatTestSuite_h +#include +#include + +#if defined(__arm__) && !defined(strcmp_P) +#define strcmp_P(a, b) strcmp((a), (b)) +#endif // strcmp_P + +#if defined(__arm__) && !defined(strncpy_P) +#define strncpy_P(s, t, n) strncpy(s, t, n) +#endif // strncpy_P + +#if defined(__arm__) && !defined(strlen_P) +#define strlen_P(str) strlen(str) +#endif // strlen_P + +#define testVerifyBool(result) testVerify_P(result, PSTR(#result)) +#define testVerifyMsg(result, msg) testVerify_P(result, PSTR(msg)) +#define testVerifyStr(result, expect) testVerify_P(result, PSTR(expect)) + +void testBegin(); +void testEnd(); +void testVerify_P(bool b, PGM_P msg); +void testVerify_P(char* result, PGM_P expect); +#endif // SdFatTestSuite_h diff --git a/SdFatTestSuite/examples/ATS_SD_File/ATS_SD_File.ino b/SdFatTestSuite/examples/ATS_SD_File/ATS_SD_File.ino new file mode 100644 index 0000000..215c735 --- /dev/null +++ b/SdFatTestSuite/examples/ATS_SD_File/ATS_SD_File.ino @@ -0,0 +1,105 @@ +// modified from ArduinoTestSuite 0022 by William Greiman +// Tests writing to and reading from a file, in particular the +// the Stream implementation (e.g. read() and peek()). + +#include +#include +SdFat SD; +#define FILE_WRITE O_RDWR | O_CREAT | O_AT_END +#define ATS_PrintTestStatus(msg, b) testVerify_P(b, PSTR(msg)) +void setup() { + boolean b; + SdFile f; + uint32_t fs; + + testBegin(); + + ATS_PrintTestStatus("SD.begin()", b = SD.begin()); + if (!b) goto done; + + SD.remove("test.txt"); + + f.open("test.txt", FILE_WRITE); + ATS_PrintTestStatus("SD.open()", f.isOpen()); + if (!f.isOpen()) goto done; + + f.print("abc"); + f.print("de"); + f.close(); + + f.open("test.txt", FILE_WRITE); + ATS_PrintTestStatus("SD.open()", f.isOpen()); + if (!f.isOpen()) goto done; + + f.print("fgh"); + f.close(); + + f.open("test.txt", O_READ); + ATS_PrintTestStatus("SD.open()", f.isOpen()); + if (!f.isOpen()) goto done; + fs =f.fileSize(); + ATS_PrintTestStatus("read()", f.read() == 'a'); + ATS_PrintTestStatus("peek()", f.peek() == 'b'); + ATS_PrintTestStatus("read()", f.read() == 'b'); + ATS_PrintTestStatus("read()", f.read() == 'c'); + ATS_PrintTestStatus("peek()", f.peek() == 'd'); + ATS_PrintTestStatus("peek()", f.peek() == 'd'); + ATS_PrintTestStatus("peek()", f.peek() == 'd'); + ATS_PrintTestStatus("peek()", f.peek() == 'd'); + ATS_PrintTestStatus("read()", f.read() == 'd'); + ATS_PrintTestStatus("available()", f.curPosition() != fs); + ATS_PrintTestStatus("read()", f.read() == 'e'); + ATS_PrintTestStatus("available()", f.curPosition() != fs); + ATS_PrintTestStatus("peek()", f.peek() == 'f'); + ATS_PrintTestStatus("read()", f.read() == 'f'); + ATS_PrintTestStatus("peek()", f.peek() == 'g'); + ATS_PrintTestStatus("available()", f.curPosition() != fs); + ATS_PrintTestStatus("peek()", f.peek() == 'g'); + ATS_PrintTestStatus("read()", f.read() == 'g'); + ATS_PrintTestStatus("available()", f.curPosition() != fs); + ATS_PrintTestStatus("available()", f.curPosition() != fs); + ATS_PrintTestStatus("available()", f.curPosition() != fs); + ATS_PrintTestStatus("peek()", f.peek() == 'h'); + ATS_PrintTestStatus("read()", f.read() == 'h'); + ATS_PrintTestStatus("available()", f.curPosition() == fs); + ATS_PrintTestStatus("peek()", f.peek() == -1); + ATS_PrintTestStatus("read()", f.read() == -1); + ATS_PrintTestStatus("peek()", f.peek() == -1); + ATS_PrintTestStatus("read()", f.read() == -1); + + f.close(); + + SD.remove("test2.txt"); + + f.open("test2.txt", FILE_WRITE); + ATS_PrintTestStatus("SD.open()", f.isOpen()); + if (!f.isOpen()) goto done; + + f.print("ABC"); + f.close(); + + f.open("test.txt", O_READ); + ATS_PrintTestStatus("SD.open()", f.isOpen()); + if (!f.isOpen()) goto done; + + ATS_PrintTestStatus("peek()", f.peek() == 'a'); + + f.close(); + + f.open("test2.txt", O_READ); + ATS_PrintTestStatus("SD.open()", f.isOpen()); + if (!f.isOpen()) goto done; + + ATS_PrintTestStatus("peek()", f.peek() == 'A'); + ATS_PrintTestStatus("read()", f.read() == 'A'); + + f.close(); + +done: + testEnd(); + +} + +void loop() {} + + diff --git a/SdFatTestSuite/examples/ATS_SD_Files/ATS_SD_Files.ino b/SdFatTestSuite/examples/ATS_SD_Files/ATS_SD_Files.ino new file mode 100644 index 0000000..74e7ff6 --- /dev/null +++ b/SdFatTestSuite/examples/ATS_SD_Files/ATS_SD_Files.ino @@ -0,0 +1,75 @@ +// modified from ArduinoTestSuite 0022 by William Greiman +#include +#include +SdFat SD; +#define FILE_WRITE O_RDWR | O_CREAT | O_AT_END +#define ATS_PrintTestStatus(msg, b) testVerify_P(b, PSTR(msg)) + +void setup() { + boolean b; + SdFile f; + + testBegin(); + + ATS_PrintTestStatus("SD.begin()", b = SD.begin()); + if (!b) goto done; + + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf.txt")); + ATS_PrintTestStatus("SD.open()", f.open("asdf.txt", FILE_WRITE)); f.close(); + ATS_PrintTestStatus("SD.exists()", SD.exists("asdf.txt")); + ATS_PrintTestStatus("SD.exists()", SD.exists("/asdf.txt")); + ATS_PrintTestStatus("SD.remove()", SD.remove("asdf.txt")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf.txt")); + + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf")); + ATS_PrintTestStatus("SD.mkdir()", SD.mkdir("asdf")); + ATS_PrintTestStatus("SD.exists()", SD.exists("asdf")); + ATS_PrintTestStatus("SD.exists()", SD.exists("/asdf")); + ATS_PrintTestStatus("SD.exists()", SD.exists("asdf/")); + ATS_PrintTestStatus("SD.rmdir()", SD.rmdir("asdf")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf")); + + ATS_PrintTestStatus("SD.mkdir()", SD.mkdir("x/y/z")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x/")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x/y")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x/y/")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x/y/z")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x/y/z/")); + ATS_PrintTestStatus("SD.exists()", SD.exists("/x/y/z/")); + ATS_PrintTestStatus("SD.rmdir()", SD.rmdir("x/y/z")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x/y")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("x/y/z")); + ATS_PrintTestStatus("SD.rmdir()", SD.rmdir("x/y/")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("x/y")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("x/y/z")); + ATS_PrintTestStatus("SD.rmdir()", SD.rmdir("/x")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("x")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("x/y")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("x/y/z")); + + ATS_PrintTestStatus("!SD.open()", !(f.open("asdf/asdf.txt", FILE_WRITE))); f.close(); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf.txt")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf/asdf.txt")); + ATS_PrintTestStatus("SD.mkdir()", SD.mkdir("asdf")); + ATS_PrintTestStatus("SD.exists()", SD.exists("asdf")); + ATS_PrintTestStatus("SD.open()", f.open("asdf/asdf.txt", FILE_WRITE)); f.close(); + ATS_PrintTestStatus("SD.exists()", SD.exists("asdf/asdf.txt")); + ATS_PrintTestStatus("!SD.rmdir()", !SD.rmdir("asdf")); + ATS_PrintTestStatus("SD.exists()", SD.exists("asdf")); + ATS_PrintTestStatus("SD.exists()", SD.exists("asdf/asdf.txt")); + ATS_PrintTestStatus("SD.remove()", SD.remove("asdf/asdf.txt")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf/asdf.txt")); + ATS_PrintTestStatus("SD.exists()", SD.exists("asdf")); + ATS_PrintTestStatus("SD.rmdir()", SD.rmdir("asdf")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf")); + +done: + + testEnd(); + +} +void loop() {} diff --git a/SdFatTestSuite/examples/ATS_SD_Seek/ATS_SD_Seek.ino b/SdFatTestSuite/examples/ATS_SD_Seek/ATS_SD_Seek.ino new file mode 100644 index 0000000..221d1d7 --- /dev/null +++ b/SdFatTestSuite/examples/ATS_SD_Seek/ATS_SD_Seek.ino @@ -0,0 +1,108 @@ +// modified from ArduinoTestSuite 0022 by William Greiman +// Tests writing to and reading from a file, in particular the +// the Stream implementation (e.g. read() and peek()). +#include +#include +SdFat SD; +#define FILE_WRITE O_RDWR | O_CREAT | O_AT_END +#define ATS_PrintTestStatus(msg, b) testVerify_P(b, PSTR(msg)) + +void setup() { + boolean b; + SdFile f; + + testBegin(); + + ATS_PrintTestStatus("SD.begin()", b = SD.begin()); + if (!b) goto done; + + SD.remove("test.txt"); + + f.open("test.txt", FILE_WRITE); + ATS_PrintTestStatus("SD.open()", f.isOpen()); + if (!f.isOpen()) goto done; + + ATS_PrintTestStatus("initial position", f.curPosition() == 0); + ATS_PrintTestStatus("initial size", f.fileSize() == 0); + + f.print("0123456789"); + + ATS_PrintTestStatus("position after writing", f.curPosition() == 10); + ATS_PrintTestStatus("size after writing", f.fileSize() == 10); + + f.seekSet(0); + + ATS_PrintTestStatus("size after seek", f.fileSize() == 10); + ATS_PrintTestStatus("position after seek", f.curPosition() == 0); + + f.seekSet(7); + + ATS_PrintTestStatus("position after seek", f.curPosition() == 7); + ATS_PrintTestStatus("reading after seek", f.read() == '7'); + ATS_PrintTestStatus("position after reading after seeking", f.curPosition() == 8); + ATS_PrintTestStatus("reading after reading after seeking", f.read() == '8'); + + f.seekSet(3); + + ATS_PrintTestStatus("position after seeking", f.curPosition() == 3); + ATS_PrintTestStatus("peeking after seeking", f.peek() == '3'); + ATS_PrintTestStatus("position after peeking after seeking", f.curPosition() == 3); + ATS_PrintTestStatus("peeking after peeking after seeking", f.peek() == '3'); + ATS_PrintTestStatus("position after peeking after seeking", f.curPosition() == 3); + ATS_PrintTestStatus("peeking after peeking after seeking", f.read() == '3'); + ATS_PrintTestStatus("position after peeking after seeking", f.curPosition() == 4); + + f.seekSet(1); + + ATS_PrintTestStatus("position after seeking", f.curPosition() == 1); + ATS_PrintTestStatus("peeking after seeking", f.peek() == '1'); + + f.seekSet(4); + + ATS_PrintTestStatus("position after seeking", f.curPosition() == 4); + ATS_PrintTestStatus("peeking after seeking", f.peek() == '4'); + + f.seekSet(7); + + ATS_PrintTestStatus("position()", f.curPosition() == 7); + ATS_PrintTestStatus("read()", f.read() == '7'); + + f.seekSet(0); + f.peek(); + f.print("AB"); + + ATS_PrintTestStatus("position()", f.curPosition() == 2); + ATS_PrintTestStatus("size()", f.fileSize() == 10); + ATS_PrintTestStatus("read()", f.read() == '2'); + + f.seekSet(0); + + ATS_PrintTestStatus("read()", f.read() == 'A'); + ATS_PrintTestStatus("read()", f.read() == 'B'); + ATS_PrintTestStatus("read()", f.read() == '2'); + + f.close(); + + f.open("test.txt", O_READ); + ATS_PrintTestStatus("SD.open()", f.isOpen()); + if (!f.isOpen()) goto done; + + ATS_PrintTestStatus("position()", f.curPosition() == 0); + ATS_PrintTestStatus("size()", f.fileSize() == 10); + ATS_PrintTestStatus("peek()", f.peek() == 'A'); + ATS_PrintTestStatus("read()", f.read() == 'A'); + + f.seekSet(4); + + ATS_PrintTestStatus("position()", f.curPosition() == 4); + ATS_PrintTestStatus("size()", f.fileSize() == 10); + ATS_PrintTestStatus("peek()", f.peek() == '4'); + ATS_PrintTestStatus("read()", f.read() == '4'); + + f.close(); + +done: + testEnd(); +} + +void loop() {} \ No newline at end of file diff --git a/SdFatTestSuite/examples/fstreamTest/fstreamTest.ino b/SdFatTestSuite/examples/fstreamTest/fstreamTest.ino new file mode 100644 index 0000000..5b18b14 --- /dev/null +++ b/SdFatTestSuite/examples/fstreamTest/fstreamTest.ino @@ -0,0 +1,93 @@ +#include +#include +SdFat sd; +char *testName = "SDFAT.TST"; +//------------------------------------------------------------------------------ +void fstreamOpen() { + ios::openmode nocreate[] = {ios::in, ios::in | ios::out}; + ios::openmode create[] = + {ios::out, ios::out | ios::app, ios::app, ios::out | ios::trunc, + ios::in | ios::out | ios::trunc, ios::in | ios::out | ios::app, + ios::in | ios::app}; + ios::openmode illegal[] = + {0, ios::trunc, ios::app | ios::trunc, ios::in | ios::app | ios::trunc, + ios::in | ios::trunc, ios::out | ios::app | ios::trunc, + ios::in | ios::out | ios::app | ios::trunc}; + + sd.remove(testName); + fstream file(testName); + testVerifyMsg(!file.is_open()&& !sd.exists(testName), "fstream constructor"); + + for (uint8_t i = 0 ; i < sizeof(nocreate)/sizeof(nocreate[1]); i++) { + file.close(); + sd.remove(testName); + file.open(testName, nocreate[i]); + testVerifyMsg(!sd.exists(testName) && !file.is_open(), "fstream nocreate !exists"); + } + for (uint8_t i = 0 ; i < sizeof(create)/sizeof(create[1]); i++) { + file.close(); + sd.remove(testName); + file.open(testName, create[i]); + testVerifyMsg(sd.exists(testName) && file.is_open(), "fstream create openmode"); + } + for (uint8_t i = 0 ; i < sizeof(illegal)/sizeof(illegal[1]); i++) { + file.close(); + file.open(testName, illegal[i]); + testVerifyMsg(sd.exists(testName) && !file.is_open(), "fstream illegal openmode"); + } + for (uint8_t i = 0 ; i < sizeof(nocreate)/sizeof(nocreate[1]); i++) { + file.close(); + file.open(testName, nocreate[i]); + testVerifyMsg(sd.exists(testName) && file.is_open(), "fstream nocreate exists"); + } +} +//------------------------------------------------------------------------------ +void testPosition() { + sd.remove(testName); + ofstream ofs(testName); + testVerifyBool(ofs.good() && ofs.tellp() == 0); + ofs.seekp(0, ios::end); + testVerifyBool(ofs.good() && ofs.tellp() == 0); + ofs << "abcde"; + testVerifyBool(ofs.good() && ofs.tellp() == 5); + ofs.seekp(4); + testVerifyBool(ofs.good() && ofs.tellp() == 4); + ofs.seekp(-1, ios::cur); + testVerifyBool(ofs.good() && ofs.tellp() == 3); + ofs.close(); + ifstream ifs(testName, ios::ate); + testVerifyBool(ifs.good() && ifs.tellg() == 5); + ifs.seekg(0); + testVerifyBool(ifs.get() == 'a' && ifs.get() == 'b'); + testVerifyBool(ifs.tellg() == 2 && ifs.good()); + ifs.seekg(3, ios::cur); + testVerifyBool(ifs.tellg() == 5 && ifs.good()); + ifs.seekg(4, ios::beg); + testVerifyBool(ifs.good() && ifs.tellg() == 4); + ifs.close(); + ofs.open(testName, ios::app); + testVerifyBool(ofs.good() && ofs.tellp() == 0); + ofs << 'f'; + testVerifyBool(ofs.good() && ofs.tellp() == 6); + ofs.close(); + ofs.open(testName, ios::trunc); + ofs.seekp(0, ios::end); + testVerifyBool(ofs.good() && ofs.tellp() == 0); + ofs << "ABCDEF"; + ofs.close(); + fstream fs(testName); + testVerifyBool(fs.good() && fs.tellp() == 0 && fs.tellg() == 0); + fs.seekg(2); + testVerifyBool(fs.good() && fs.get() == 'C'); +} +//------------------------------------------------------------------------------ +void setup() { + + testBegin(); + if (!sd.begin()) sd.initErrorHalt(); + fstreamOpen(); + testPosition(); + testEnd(); +} +//------------------------------------------------------------------------------ +void loop() {} diff --git a/SdFatTestSuite/examples/istreamTest/istreamTest.ino b/SdFatTestSuite/examples/istreamTest/istreamTest.ino new file mode 100644 index 0000000..3407cc4 --- /dev/null +++ b/SdFatTestSuite/examples/istreamTest/istreamTest.ino @@ -0,0 +1,260 @@ +#include +#include + +char buf[100]; +ibufstream ib; +#define ibInit(s) ibInit_P(PSTR(s)) + +//---------------------------------------------------------- +void ibInit_P(PGM_P p) { + if (strlen_P(p) >= sizeof(buf)) { + ib.init(""); + ib.setstate(ios::badbit); + } else { + ib.clear(); + strncpy_P(buf, p, sizeof(buf)); + ib.init(buf); + } +} +//------------------------------------------------------------------------------ +void istreamBool() { + bool b; + ibInit(" 0 1 2"); + testVerifyBool((ib >> b) && !b); + testVerifyBool((ib >> b) && b); + testVerifyBool(!(ib >> b) && !ib.good()); + + ibInit(" true false err"); + testVerifyBool((ib >> boolalpha >> b) && b && ib.good()); + testVerifyBool((ib >> b) && !b && ib.good()); + testVerifyBool(!(ib >> b) && ib.fail()); + + ibInit("1"); + testVerifyBool((ib >> noboolalpha >> b) && b && ib.eof()); +} +//------------------------------------------------------------------------------ +void istreamChar() { + char c; + signed char sc; + unsigned char uc; + + ibInit("c s u g"); + testVerifyBool((ib >> c) && ib.good() && c == 'c'); + testVerifyBool((ib >> sc) && ib.good() && sc == 's'); + testVerifyBool((ib >> uc) && ib.good() && uc == 'u'); + testVerifyBool(ib.get() == ' '); + testVerifyBool(ib.peek() == 'g' && ib.good()); + testVerifyBool(ib.get() == 'g' && ib.good()); + testVerifyBool(ib.get() == -1 && ib.eof()); +} +//------------------------------------------------------------------------------ +void istreamDouble() { + double f; + ibInit("0 .1 1. 2 3.4 .1e5 1e5 -1E6 +2.3e-3 -123.4567"); + testVerifyBool((ib >> f) && f == 0 && ib.good()); + testVerifyBool((ib >> f) && f == 0.1 && ib.good()); + testVerifyBool((ib >> f) && f == 1.0 && ib.good()); + testVerifyBool((ib >> f) && f == 2.0 && ib.good()); + testVerifyBool((ib >> f) && f == 3.4 && ib.good()); + testVerifyBool((ib >> f) && f == 10000.0 && ib.good()); + testVerifyBool((ib >> f) && f == 1e5 && ib.good()); + testVerifyBool((ib >> f) && f == -1E6 && ib.good()); + testVerifyBool((ib >> f) && f == 2.3e-3 && ib.good()); + testVerifyBool((ib >> f) && fabs(f + 123.4567) < 1e-5 && ib.eof()); + if (fabs(f + 123.4567) >= 1e-5) Serial.println(f, 8); +} +//------------------------------------------------------------------------------ +void istreamFloat() { + float f; + ibInit("0 .1 1. 2 3.4 .1e5 1e5 -1E6 +2.3e-3 -123.4567"); + testVerifyBool((ib >> f) && f == 0 && ib.good()); + testVerifyBool((ib >> f) && f == 0.1f && ib.good()); + testVerifyBool((ib >> f) && f == 1.0 && ib.good()); + testVerifyBool((ib >> f) && f == 2.0 && ib.good()); + testVerifyBool((ib >> f) && f == 3.4f && ib.good()); + testVerifyBool((ib >> f) && f == 10000.0 && ib.good()); + testVerifyBool((ib >> f) && f == 1e5 && ib.good()); + testVerifyBool((ib >> f) && f == -1E6 && ib.good()); + testVerifyBool((ib >> f) && f == 2.3e-3f && ib.good()); + testVerifyBool((ib >> f) && fabs(f + 123.4567f) < 1e-5 && ib.eof()); + if (fabs(f + 123.4567) >= 1e-5) Serial.println(f, 8); +} +//------------------------------------------------------------------------------ +void istreamGet() { + char s[4]; + ibInit("ab c"); + testVerifyBool(ib.get() == 'a' && ib.good() && ib.gcount() == 1); + testVerifyBool(ib.get() == 'b' && ib.good() && ib.gcount() == 1); + testVerifyBool(ib.get() == ' ' && ib.good() && ib.gcount() == 1); + testVerifyBool(ib.get() == 'c' && ib.good() && ib.gcount() == 1); + testVerifyBool(ib.get() == -1 && ib.eof() && ib.gcount() == 0); + + ibInit("ab\ncdef"); + ib.get(s, sizeof(s)); + testVerifyBool(ib.good() && ib.gcount() == 2); + testVerifyStr(s, "ab"); + testVerifyBool(ib.get() == '\n' && ib.good() && ib.gcount() == 1); + ib.get(s, sizeof(s)); + testVerifyBool(ib.good() && ib.gcount() == 3); + testVerifyStr(s, "cde"); + ib.get(s, sizeof(s)); + testVerifyBool(ib.eof() && ib.gcount() == 1); + testVerifyStr(s, "f"); + + ibInit( + "short line\n" + "\n" + "17 character line\n" + "too long for buffer\n" + "line with no nl" + ); + char buf[18]; + ib.getline(buf, sizeof(buf)); + testVerifyBool(ib.good() && ib.gcount() == 11); + testVerifyStr(buf, "short line"); + ib.getline(buf, sizeof(buf)); + testVerifyBool(ib.good() && ib.gcount() == 1 && buf[0] == '\0'); + ib.getline(buf, sizeof(buf)); + testVerifyBool(ib.good() && ib.gcount() == 18); + testVerifyStr(buf, "17 character line"); + ib.getline(buf, sizeof(buf)); + testVerifyBool(ib.fail() && !ib.eof() && ib.gcount() == 17); + testVerifyStr(buf, "too long for buff"); + ib.clear(); + ib.getline(buf, sizeof(buf)); + testVerifyBool(ib.good() && !ib.eof() && ib.gcount() == 3); + testVerifyStr(buf, "er"); + ib.getline(buf, sizeof(buf)); + testVerifyBool(!ib.fail() && ib.eof() && ib.gcount() == 15); + testVerifyStr(buf, "line with no nl"); +} +//------------------------------------------------------------------------------ +void istreamNumber() { + short s; + signed short ss; + unsigned short us; + int i; + signed int si; + unsigned int ui; + long l; + signed long sl; + unsigned long ul; + + ibInit("-32769"); + testVerifyBool(!(ib >> s) && ib.fail()); + ibInit("-32768 0 32767 32768"); + testVerifyBool((ib >> s) && s == -32768 && ib.good()); + testVerifyBool((ib >> s) && s == 0 && ib.good()); + testVerifyBool((ib >> s) && s == 32767 && ib.good()); + testVerifyBool(!(ib >> s) && ib.fail()); + + ibInit("-32769"); + testVerifyBool(!(ib >> ss) && ib.fail()); + ibInit("-32768 0 32767 32768"); + testVerifyBool((ib >> ss) && ss == -32768 && ib.good()); + testVerifyBool((ib >> ss) && ss == 0 && ib.good()); + testVerifyBool((ib >> ss) && ss == 32767 && ib.good()); + testVerifyBool(!(ib >> ss) && ib.fail()); + + ibInit("0 65535 65536"); + testVerifyBool((ib >> us) && us == 0 && ib.good()); + testVerifyBool((ib >> us) && us == 65535 && ib.good()); + testVerifyBool(!(ib >> us) && ib.fail()); + +if (sizeof(int) == 2) { + ibInit("-32769"); + testVerifyBool(!(ib >> i) && ib.fail()); + ibInit("-32768 0 32767 32768"); + testVerifyBool((ib >> i) && i == -32768 && ib.good()); + testVerifyBool((ib >> i) && i == 0 && ib.good()); + testVerifyBool((ib >> i) && i == 32767 && ib.good()); + testVerifyBool(!(ib >> i) && ib.fail()); + + ibInit("-32769"); + testVerifyBool(!(ib >> si) && ib.fail()); + ibInit("-32768 0 32767 32768"); + testVerifyBool((ib >> si) && si == -32768 && ib.good()); + testVerifyBool((ib >> si) && si == 0 && ib.good()); + testVerifyBool((ib >> si) && si == 32767 && ib.good()); + testVerifyBool(!(ib >> si) && ib.fail()); + + ibInit("0 65535 65536"); + testVerifyBool((ib >> ui) && ui == 0 && ib.good()); + testVerifyBool((ib >> ui) && ui == 65535 && ib.good()); + testVerifyBool(!(ib >> ui) && ib.fail()); + } else { + ibInit("-2147483649"); + testVerifyBool(!(ib >> i) && ib.fail()); + ibInit("-2147483648 0 2147483647 2147483648"); + testVerifyBool((ib >> i) && i == -2147483648 && ib.good()); + testVerifyBool((ib >> i) && i == 0 && ib.good()); + testVerifyBool((ib >> i) && i == 2147483647 && ib.good()); + testVerifyBool(!(ib >> i) && ib.fail()); + + ibInit("-2147483649"); + testVerifyBool(!(ib >> si) && ib.fail()); + ibInit("-2147483648 0 2147483647 2147483648"); + testVerifyBool((ib >> si) && si == -2147483648 && ib.good()); + testVerifyBool((ib >> si) && si == 0 && ib.good()); + testVerifyBool((ib >> si) && si == 2147483647 && ib.good()); + testVerifyBool(!(ib >> si) && ib.fail()); + + ibInit("0 4294967295 4294967296"); + testVerifyBool((ib >> ui) && ui == 0 && ib.good()); + testVerifyBool((ib >> ui) && ui == 4294967295 && ib.good()); + testVerifyBool(!(ib >> ui) && ib.fail()); + } + ibInit("-2147483649"); + testVerifyBool(!(ib >> l) && ib.fail()); + ibInit("-2147483648 0 2147483647 2147483648"); + testVerifyBool((ib >> l) && l == -2147483648 && ib.good()); + testVerifyBool((ib >> l) && l == 0 && ib.good()); + testVerifyBool((ib >> l) && l == 2147483647 && ib.good()); + testVerifyBool(!(ib >> l) && ib.fail()); + + ibInit("-2147483649"); + testVerifyBool(!(ib >> sl) && ib.fail()); + ibInit("-2147483648 0 2147483647 2147483648"); + testVerifyBool((ib >> sl) && sl == -2147483648 && ib.good()); + testVerifyBool((ib >> sl) && sl == 0 && ib.good()); + testVerifyBool((ib >> sl) && sl == 2147483647 && ib.good()); + testVerifyBool(!(ib >> sl) && ib.fail()); + + ibInit("0 4294967295 4294967296"); + testVerifyBool((ib >> ul) && ul == 0 && ib.good()); + testVerifyBool((ib >> ul) && ul == 4294967295 && ib.good()); + testVerifyBool(!(ib >> ul) && ib.fail()); + + // octal hex + ibInit("123 abc 0xdef 0XABC 567"); + testVerifyBool((ib >> oct >> i) && i == 83); + testVerifyBool((ib >> hex >> i) && i == 0xabc); + testVerifyBool((ib >> i) && i == 0xdef); + testVerifyBool((ib >> i) && i == 0xabc); + testVerifyBool((ib >> dec >> i) && i ==567); +} +//------------------------------------------------------------------------------ +void istreamStr() { + char str[20]; + ibInit("abc def\r\n hij"); + testVerifyBool((ib >> str) && ib.good()); + testVerifyStr(str, "abc"); + testVerifyBool((ib >> str) && ib.good()); + testVerifyStr(str, "def"); + testVerifyBool((ib >> str) && ib.eof()); + testVerifyStr(str, "hij"); +} +//------------------------------------------------------------------------------ +void setup() { + testBegin(); + istreamBool(); + istreamChar(); + istreamDouble(); + istreamFloat(); + istreamGet(); + istreamNumber(); + istreamStr(); + testEnd(); +} +//------------------------------------------------------------------------------ +void loop() {} \ No newline at end of file diff --git a/SdFatTestSuite/examples/ostreamTest/ostreamTest.ino b/SdFatTestSuite/examples/ostreamTest/ostreamTest.ino new file mode 100644 index 0000000..8c27438 --- /dev/null +++ b/SdFatTestSuite/examples/ostreamTest/ostreamTest.ino @@ -0,0 +1,171 @@ +#include +#include +//------------------------------------------------------------------------------ +void ostreamBool() { + char buf[40]; + obufstream ob(buf, sizeof(buf)); + bool f = false; + bool t = true; + ob << t << ',' << f << ',' << setw(2) << t << ',' << left << setw(2) << f; + testVerifyStr(buf, "1,0, 1,0 "); + + ob.init(buf, sizeof(buf)); + ob << boolalpha << t << ',' << f << ',' << setw(5) << t; + ob << ',' << right << setw(6) << f; + testVerifyStr(buf, "true,false,true , false"); +} +//------------------------------------------------------------------------------ +void ostreamChar() { + char buf[40]; + obufstream ob(buf, sizeof(buf)); + char c = 'c'; + signed char sc = 's'; + unsigned char uc = 'u'; + ob <<'l' << c << sc << uc; + ob.put('p'); + testVerifyStr(buf, "lcsup"); + + ob.init(buf, sizeof(buf)); + ob << 's' << setw(2) << 'r' << 'n' << left << setw(2) << 'l'; + ob << 'm' << right << setw(2) << 'e'; + testVerifyStr(buf, "s rnl m e"); + + ob.init(buf, sizeof(buf)); + ob << setfill('f') << setw(5) << 'r'; + testVerifyStr(buf, "ffffr"); +} +//------------------------------------------------------------------------------ +void ostreamFloat() { + char buf[50]; + obufstream ob(buf, sizeof(buf)); + float f = 9.87654; + double d = -123.4567; + ob << f <<','; + ob << internal << setw(10) << d << ','; + ob << setfill('0') << setw(10) << d; + testVerifyStr(buf, "9.88,- 123.46,-000123.46"); + + ob.init(buf, sizeof(buf)); + ob << setw(10) << left << d << ',' << showpos << -d << ','; + ob << setprecision(0) << d; + testVerifyStr(buf, "-123.46000,+123.46,-123"); + + ob.init(buf, sizeof(buf)); + ob << showpoint << d << noshowpoint << ',' << d << ','; + ob << setprecision(4) << f << ',' << setprecision(2) << noshowpos << f; + testVerifyStr(buf, "-123.,-123,+9.8765,9.88"); +} +//------------------------------------------------------------------------------ +void ostreamNumber() { + char buf[50]; + obufstream ob(buf, sizeof(buf)); + + short s = 1; + short signed ss = 2; + short unsigned su = 3; + int i = 4; + int signed is = 5; + int unsigned iu = 6; + long l = 7; + long signed ls = 8; + long unsigned lu = 9; + + + ob << s << ss << su << i << is << iu << l <: command. + +The call sd2.chvol() will set the current working directory to the volume +working directory for sd2. + +If the volume working directory for sd2 is "/MUSIC" the call + +file.open("BIGBAND.WAV", O_READ); + +will then open "/MUSIC/BIGBAND.WAV" on sd2. + +The following functions are used to change or get current directories. +See the html documentation for more information. + +bool SdFat::chdir(bool set_cwd = false); +bool SdFat::chdir(const char* path, bool set_cwd = false); +void SdFat::chvol(); +SdBaseFile* SdFat::vwd(); +static SdBaseFile* SdBaseFile::cwd(); diff --git a/changes.txt b/changes.txt new file mode 100644 index 0000000..671d08c --- /dev/null +++ b/changes.txt @@ -0,0 +1,387 @@ +05 Aug 2014 + +New examples. + +Teensy 3.x SPI mods. + +Test version of StdioStream. + +25 Dec 2013 + +Improved cluster allocation speed. + +Fix for Teensy 3.0 + +21 Jun 2013 + +Improved speed of single block write. + +Added StressTest example. + +04 May 2013 + +Fix FreeRam() for 1.05/1.53 malloc. + +Reorganised SPI code. + +SPI speed set by SCK divisor. + +Faster directory search in file open. + +Removed deprecated functions. + +13 Mar 2013 + +Fix for 1.0.4 malloc + +New Software SPI + +07 Feb 2013 + +Patch for 1.5.2 version of malloc. + +Updated SPI driver for Teensy 3.0 + +Added fast printField() functions. + +19 Dec 2012 + +Fixed SoftSPI bug + +01 Dec 2012 + +Added support for the Arduino Due. + +The default for ALLOW_DEPRECATED_FUNCTIONS has been changed to +false. If you get compile errors for these functions, either +change to the preferred replacement function indicated in the +error message or set ALLOW_DEPRECATED_FUNCTIONS nonzero. + +A key change was to remove sd.init(spiRateID, chipSelect) in favor of +sd.begin(chipSelect, spiRateID). The difference between these two is +the order of the arguments which has caused serious confusion at times. + +A massive number of internal changes have been made. There are over 2600 +lines in the diff file of this version and the 20120719 version. + +20 Oct 2012 + +Changes to support ARM processors. Tested with a Teensy 3.0. + +Changes for higher performance with large reads and writes. + +25 Aug 2012 + +Added uint32_t available(); + +Support for new industrial SD cards + +Better support for MiniSerial and MiniSerial example + +Changes to support newer versions of avr-gcc + +Changed RawWrite example to use micros() for delay between blocks. + +Changed SdFatSize example to use MiniSerial + +19 Jul 2012 + +Require Arduino 1.0 or greater. Change file type for all examples to *.ino. + +Modify the SdFormatter example to format SDXC cards as FAT32. This is not the +SDXC standard which is exFAT. + +30 May 2012 + +Added << operator for Arduino flash string macro F(). + +New RawWrite example for fast write of contiguous files. + +New faster software SPI + +Software SPI for Leonardo boards + +Don't use __cxa_pure_virtual by default for Arduino 1.0 or greater. + +26 Mar 2012 + +Removed definition for SS_PIN, MISO_PIN, MOSI_PIN, and SCK_PIN. Used the +Arduino 1.0 symbols SS, MISO, MOSI, and SCK. + +Added Arduino style SdFat::begin(chipSelect, spiSpeed); + +Added options for SD crc checking. Enabling crc checking increases reliability +at the cost of speed. Edit SdFatConfig.h to select CRC options. + +Override Print::getWriteError() and Print::clearWriteError() to use +SdBaseFile functions. + +Many internal changes. + +08 Jan 2012 + +Changes to allow use of the SerialPort library. + +Error messages and output from programs are now sent to a stdOut Print +stream. + +The default stdOut is a small non-interrupt driven class that outputs messages +to serial port zero. This allows an alternate Serial library like SerialPort +to be used with SdFat. + +You can redirect stdOut with SdFat::setStdOut(Print* stream) and +get the current stdOut stream with SdFat::stdOut(). + +If USE_SERIAL_FOR_STD_OUT in SdFatConfig.h is nonzero, the Arduino Serial +object will be used as the default for stdOut. + + +05 Dec 2011 + +Changes for Arduino 1.0 + + +17 Sep 2011 + +Changes for Arduino 1.0 beta 4 + +Improved SPI handling + +02 Sep 2011 +-------------------------------------------------------------------------------- +Warning: +Several changes are not backward compatible with the previous +version of SdFat. + +The function cwd() was renamed vwd() to allow multiple SD cards. + +The type SdBaseFile was added to the class hierarchy to avoid conflicts with +other Arduino libraries that are derived from the Print class. Directory +files should be declared type SdBaseFile. +-------------------------------------------------------------------------------- + +Added support for multiple SD cards. + +Change the name of SdFat::cwd() to SdFat::vwd() since the volume +working directory is not the current working directory with +multiple SD cards. + +Added the static function SdBaseFile::cwd() to return a pointer +to the current working directory. + +Added the TwoCards.pde example to demonstrate use of multiple SD cards. + +Added readCSV.pde example to demonstrate iostream extractors. + +Added bool SdBaseFile::timestamp(SdBaseFile* file) to copy one +file's timestamps to another file. + +Improved messages in the QuickStart.pde example. + +Added maximum latency test to the bench.pde example. + +Rearanged class hierarchy to fix conflicts with Flash.h and other Adruino +libraries. Print is no longer a private parent of file stream classes. + +Added high speed multiple block read functions to Sd2Card. + +Changed include files in SdFatUtil.h + +Removed option to write protect block zero of an SD card. + +Changes for Arduino 1.0. + +02 Jul 2011 + +This is a major update based on previous beta versions. +Read all changes since 10 Oct 2001 + +Simplified examples in extra/examplesV1 + +28 Jun 2011 + +This is a release candidate to replace sdfatlib20101010. + +Initialize SPI bus before every access. + +Improved write multiple block functions for fast data logging. + +SdVolume::cacheClear() returns zero if it fails. + +Documentation changes. + +04 Jun 2011 + +Added SdFatTestSuite and fixed bugs found by test programs. + +Added functions: + +bool SdFat::truncate(const char* path, uint32_t length); + +int16_t SdFile::fgets(char* str, int16_t num, char* delim); + +11 May 2011 + +Added QuickStart sketch and QuickStart.txt file for fast hardware test. + +Added several new examples. + +Version of ls() that can write to any Print object. + +New functions including freeClusterCount(), openNext() rename(). + +14 Apr 2011 + +Total rewrite to add iostreams and SdFat class with current working directory. +Old API maintained for backward compatibility. + + +27 Nov 2010 + + +Added experimental support for FAT12. This can be enabled by setting +FAT12_SUPPORT nonzero in SdFatConfig.h. + +Added an experimental sketch, SdFatFormatter.pde, to format SD cards as +FAT16 and SDHC cards as FAT32. See SdFat/examples/SdFormatter. + +The return type of SdVolume::cacheClear was changed to cache_t*. + +Many internal changes to support FAT12 and formatting SD/SDHC cards. + + +10 Oct 2010 + +Added Mega 2560. + +Fixed rmRfStar() bug. + +Fixed Sanguino NULL definition. + +18 Aug 2010 + +Optimized write() for append at end of file. Up to 50% faster sequential write. + +13 Aug 2010 + +Added the following function to allow the SD chip select pin to be set +at runtime. Warning - if the hardware SS pin is not used as chip select, +the hardware SS pin will be set to output mode by init(). An avr processor +will not function as an SPI master unless SS is set to output mode. + +uint8_t Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin); + +Added more SPI clock rate choices. The above init() function and +uint8_t Sd2Card::init(uint8_t sckRateID) call the new function +uint8_t Sd2Card::setSckRate(uint8_t sckRateID). + +setSckRate() sets the SPI clock rate to F_CPU/pow(2, 1 + sckRateID). +On an 16 MHz cpu this ranges from 8 MHz for sckRateId = 0 to 125 kHz +for sckRateID = 6. This function must be called after the init() call. + +Modified most examples to call card.init(SPI_HALF_SPEED) to avoid SPI bus +errors with breadboards and jumpers. This sets the SPI speed to F_CPU/4. +Defined SPI_FULL_SPEED so init(SPI_FULL_SPEED) sets the SPI speed to F_CPU/2. + +Added the following function to cancel date/time callback. This function +must now be used instead of dateTimeCallback(NULL). + +static void SdFat::dateTimeCallbackCancel(void); + + +The following member functions have been added for users who wish to avoid +calls to functions with non-const references. + +uint8_t SdFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock); +uint8_t SdFile::createContiguous(SdFile* dirFile, + const char* fileName, uint32_t size); +static void SdFile::dateTimeCallback( + void (*dateTime)(uint16_t* date, uint16_t* time)); +uint8_t SdFile::dirEntry(dir_t* dir); +uint8_t SdFile::makeDir(SdFile* dir, const char* dirName); +uint8_t SdFile::open(SdFile* dirFile, const char* fileName, uint8_t oflag); +uint8_t SdFile::open(SdFile* dirFile, const char* fileName); +uint8_t SdFile::open(SdFile* dirFile, uint16_t index, uint8_t oflag); +uint8_t SdFile::openRoot(SdVolume* vol); +int8_t SdFile::readDir(dir_t* dir); +static uint8_t remove(SdFile* dirFile, const char* fileName); +uint8_t SdVolume::init(Sd2Card* dev); +uint8_t SdVolume::init(Sd2Card* dev, uint8_t part); + +The following member functions have been marked as deprecated since they +are now wrappers for the new functions. dateTimeCallback is the only wrapper +with extra overhead. The other wrappers are squeezed out by the complier. +These wrappers will be maintained in the future for backward compatibility. + +uint8_t SdFile::contiguousRange(uint32_t& bgnBlock, uint32_t& endBlock); +uint8_t SdFile::createContiguous(SdFile& dirFile, + const char* fileName, uint32_t size); +static void SdFile::dateTimeCallback( + void (*dateTime)(uint16_t& date, uint16_t& time)); +uint8_t SdFile::dirEntry(dir_t& dir); +uint8_t SdFile::makeDir(SdFile& dir, const char* dirName); +uint8_t SdFile::open(SdFile& dirFile, const char* fileName, uint8_t oflag); +uint8_t SdFile::open(SdFile& dirFile, const char* fileName); +uint8_t SdFile::open(SdFile& dirFile, uint16_t index, uint8_t oflag); +uint8_t SdFile::openRoot(SdVolume& vol); +int8_t SdFile::readDir(dir_t& dir); +static uint8_t remove(SdFile& dirFile, const char* fileName); +uint8_t SdVolume::init(Sd2Card& dev); +uint8_t SdVolume::init(Sd2Card& dev, uint8_t part); + +The deprecated function can be disabled by editing SdFat.h and setting +#define ALLOW_DEPRECATED_FUNCTIONS 0 + +Fixed file modify time for file rewrite. + +Major internal cleanup/reformat based on Google cpplint.py code style. + +New Sd2Card::init() algorithm. + +New SdFatInfo sketch for modified SdReadData() and other internal changes. + +Modified examples to eliminate deprecated functions. + +11 Jun 2010 +Added definitions for Teensy to ArduinoPins.h (Paul Stoffregen) + +Added troubleshooting.txt + + +23 Dec 2009 + +Added Software SPI capability. See Sd2Card.h + +Defining MEGA_SOFT_SPI allows an unmodified Adafruit GPS Shield to be used +on Mega Arduinos. Software SPI works well with GPS Shield V1.1 +but many SD cards will fail with GPS Shield V1.0. + +Added file ArduinoPins.h for pin definitions. + +More error printout in examples. + + +25 Nov 2009 + +Added new functions for SdFile class: + +dateTimeCallback(), dirEntry(), isRoot(), isSubDir, ls(), +makeDir(), printDirName(), printFatDate(), printFatTime(), +printTwoDigits(), rmDir(), and rmRStar(). + +Added new examples to test and illustrate use of new functions. + +Removed sdCard() from SdFile class. + +Fixed several bugs. + + + + +12 Nov 2009 + +Major rewrite of the version of SdFat that was included with +the WaveRP library. + +This is a preview that is being released to obtain comments +from several colleagues and future users. diff --git a/html/_arduino_stream_8h.html b/html/_arduino_stream_8h.html new file mode 100644 index 0000000..ed730d3 --- /dev/null +++ b/html/_arduino_stream_8h.html @@ -0,0 +1,93 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/ArduinoStream.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
ArduinoStream.h File Reference
+
+
+ +

ArduinoInStream and ArduinoOutStream classes. +More...

+
#include <bufstream.h>
+
+Include dependency graph for ArduinoStream.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + + + + + +

+Classes

class  ArduinoInStream
 Input stream for Arduino Stream objects. More...
 
class  ArduinoOutStream
 Output stream for Arduino Print objects. More...
 
+

Detailed Description

+
+ + + + diff --git a/html/_arduino_stream_8h__dep__incl.png b/html/_arduino_stream_8h__dep__incl.png new file mode 100644 index 0000000..89ad823 Binary files /dev/null and b/html/_arduino_stream_8h__dep__incl.png differ diff --git a/html/_arduino_stream_8h__incl.png b/html/_arduino_stream_8h__incl.png new file mode 100644 index 0000000..8a4d8e1 Binary files /dev/null and b/html/_arduino_stream_8h__incl.png differ diff --git a/html/_minimum_serial_8cpp.html b/html/_minimum_serial_8cpp.html new file mode 100644 index 0000000..ec93702 --- /dev/null +++ b/html/_minimum_serial_8cpp.html @@ -0,0 +1,91 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/MinimumSerial.cpp File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
MinimumSerial.cpp File Reference
+
+
+
#include <Arduino.h>
+#include <MinimumSerial.h>
+
+Include dependency graph for MinimumSerial.cpp:
+
+
+ + +
+
+ + + +

+Variables

MinimumSerial MiniSerial
 
+

Variable Documentation

+ +
+
+ + + + +
MinimumSerial MiniSerial
+
+ +
+
+
+ + + + diff --git a/html/_minimum_serial_8cpp__incl.png b/html/_minimum_serial_8cpp__incl.png new file mode 100644 index 0000000..3f5b7e2 Binary files /dev/null and b/html/_minimum_serial_8cpp__incl.png differ diff --git a/html/_minimum_serial_8h.html b/html/_minimum_serial_8h.html new file mode 100644 index 0000000..89d1782 --- /dev/null +++ b/html/_minimum_serial_8h.html @@ -0,0 +1,77 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/MinimumSerial.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
MinimumSerial.h File Reference
+
+
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + + +

+Classes

class  MinimumSerial
 mini serial class for the SdFat library. More...
 
+
+ + + + diff --git a/html/_minimum_serial_8h__dep__incl.png b/html/_minimum_serial_8h__dep__incl.png new file mode 100644 index 0000000..7e33962 Binary files /dev/null and b/html/_minimum_serial_8h__dep__incl.png differ diff --git a/html/_sd2_card_8cpp.html b/html/_sd2_card_8cpp.html new file mode 100644 index 0000000..6eeb2cb --- /dev/null +++ b/html/_sd2_card_8cpp.html @@ -0,0 +1,119 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/Sd2Card.cpp File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
Sd2Card.cpp File Reference
+
+
+
#include <Sd2Card.h>
+#include <SdSpi.h>
+
+Include dependency graph for Sd2Card.cpp:
+
+
+ + +
+
+ + + + + +

+Macros

#define CHECK_PROGRAMMING   0
 
#define SD_TRACE(m, b)
 
+

Macro Definition Documentation

+ +
+
+ + + + +
#define CHECK_PROGRAMMING   0
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
#define SD_TRACE( m,
 
)
+
+ +
+
+
+ + + + diff --git a/html/_sd2_card_8cpp__incl.png b/html/_sd2_card_8cpp__incl.png new file mode 100644 index 0000000..7d99fd1 Binary files /dev/null and b/html/_sd2_card_8cpp__incl.png differ diff --git a/html/_sd2_card_8h.html b/html/_sd2_card_8h.html new file mode 100644 index 0000000..1283f93 --- /dev/null +++ b/html/_sd2_card_8h.html @@ -0,0 +1,563 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/Sd2Card.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
Sd2Card.h File Reference
+
+
+ +

Sd2Card class for V2 SD/SDHC cards. +More...

+
#include <Arduino.h>
+#include <SdFatConfig.h>
+#include <SdInfo.h>
+#include <SdSpi.h>
+
+Include dependency graph for Sd2Card.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + + +

+Classes

class  Sd2Card
 Raw access to SD and SDHC flash memory cards. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Variables

uint8_t const SD_CARD_ERROR_ACMD23 = 0X9
 
uint8_t const SD_CARD_ERROR_ACMD41 = 0XA
 
uint8_t const SD_CARD_ERROR_BAD_CSD = 0XB
 
uint8_t const SD_CARD_ERROR_CMD0 = 0X1
 
uint8_t const SD_CARD_ERROR_CMD12 = 0X3
 
uint8_t const SD_CARD_ERROR_CMD17 = 0X4
 
uint8_t const SD_CARD_ERROR_CMD18 = 0X5
 
uint8_t const SD_CARD_ERROR_CMD24 = 0X6
 
uint8_t const SD_CARD_ERROR_CMD25 = 0X7
 
uint8_t const SD_CARD_ERROR_CMD58 = 0X8
 
uint8_t const SD_CARD_ERROR_CMD59 = 0X1A
 
uint8_t const SD_CARD_ERROR_CMD8 = 0X2
 
uint8_t const SD_CARD_ERROR_ERASE = 0XC
 
uint8_t const SD_CARD_ERROR_ERASE_SINGLE_BLOCK = 0XD
 
uint8_t const SD_CARD_ERROR_ERASE_TIMEOUT = 0XE
 
uint8_t const SD_CARD_ERROR_INIT_NOT_CALLED = 0X19
 
uint8_t const SD_CARD_ERROR_READ = 0XF
 
uint8_t const SD_CARD_ERROR_READ_CRC = 0X1B
 
uint8_t const SD_CARD_ERROR_READ_REG = 0X10
 
uint8_t const SD_CARD_ERROR_READ_TIMEOUT = 0X11
 
uint8_t const SD_CARD_ERROR_SCK_RATE = 0X18
 
uint8_t const SD_CARD_ERROR_SPI_DMA = 0X1C
 
uint8_t const SD_CARD_ERROR_STOP_TRAN = 0X12
 
uint8_t const SD_CARD_ERROR_WRITE = 0X13
 
uint8_t const SD_CARD_ERROR_WRITE_BLOCK_ZERO = 0X14
 
uint8_t const SD_CARD_ERROR_WRITE_MULTIPLE = 0X15
 
uint8_t const SD_CARD_ERROR_WRITE_PROGRAMMING = 0X16
 
uint8_t const SD_CARD_ERROR_WRITE_TIMEOUT = 0X17
 
uint8_t const SD_CARD_TYPE_SD1 = 1
 
uint8_t const SD_CARD_TYPE_SD2 = 2
 
uint8_t const SD_CARD_TYPE_SDHC = 3
 
+

Detailed Description

+

Sd2Card class for V2 SD/SDHC cards.

+

Variable Documentation

+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_ACMD23 = 0X9
+
+

SET_WR_BLK_ERASE_COUNT failed

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_ACMD41 = 0XA
+
+

ACMD41 initialization process timeout

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_BAD_CSD = 0XB
+
+

card returned a bad CSR version field

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_CMD0 = 0X1
+
+

timeout error for command CMD0 (initialize card in SPI mode)

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_CMD12 = 0X3
+
+

card returned an error response for CMD12 (stop multiblock read)

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_CMD17 = 0X4
+
+

card returned an error response for CMD17 (read block)

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_CMD18 = 0X5
+
+

card returned an error response for CMD18 (read multiple block)

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_CMD24 = 0X6
+
+

card returned an error response for CMD24 (write block)

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_CMD25 = 0X7
+
+

WRITE_MULTIPLE_BLOCKS command failed

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_CMD58 = 0X8
+
+

card returned an error response for CMD58 (read OCR)

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_CMD59 = 0X1A
+
+

card returned an error for CMD59 (CRC_ON_OFF)

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_CMD8 = 0X2
+
+

CMD8 was not accepted - not a valid SD card

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_ERASE = 0XC
+
+

erase block group command failed

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_ERASE_SINGLE_BLOCK = 0XD
+
+

card not capable of single block erase

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_ERASE_TIMEOUT = 0XE
+
+

Erase sequence timed out

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_INIT_NOT_CALLED = 0X19
+
+

init() not called

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_READ = 0XF
+
+

card returned an error token instead of read data

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_READ_CRC = 0X1B
+
+

invalid read CRC

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_READ_REG = 0X10
+
+

read CID or CSD failed

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_READ_TIMEOUT = 0X11
+
+

timeout while waiting for start of read data

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_SCK_RATE = 0X18
+
+

incorrect rate selected

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_SPI_DMA = 0X1C
+
+

SPI DMA error

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_STOP_TRAN = 0X12
+
+

card did not accept STOP_TRAN_TOKEN

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_WRITE = 0X13
+
+

card returned an error token as a response to a write operation

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_WRITE_BLOCK_ZERO = 0X14
+
+

attempt to write protected block zero

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_WRITE_MULTIPLE = 0X15
+
+

card did not go ready for a multiple block write

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_WRITE_PROGRAMMING = 0X16
+
+

card returned an error to a CMD13 status check after a write

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_ERROR_WRITE_TIMEOUT = 0X17
+
+

timeout occurred during write programming

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_TYPE_SD1 = 1
+
+

Standard capacity V1 SD card

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_TYPE_SD2 = 2
+
+

Standard capacity V2 SD card

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CARD_TYPE_SDHC = 3
+
+

High Capacity SD card

+ +
+
+
+ + + + diff --git a/html/_sd2_card_8h__dep__incl.png b/html/_sd2_card_8h__dep__incl.png new file mode 100644 index 0000000..5de5e20 Binary files /dev/null and b/html/_sd2_card_8h__dep__incl.png differ diff --git a/html/_sd2_card_8h__incl.png b/html/_sd2_card_8h__incl.png new file mode 100644 index 0000000..32dbf13 Binary files /dev/null and b/html/_sd2_card_8h__incl.png differ diff --git a/html/_sd_base_file_8cpp.html b/html/_sd_base_file_8cpp.html new file mode 100644 index 0000000..9c02348 --- /dev/null +++ b/html/_sd_base_file_8cpp.html @@ -0,0 +1,69 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdBaseFile.cpp File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+
+
SdBaseFile.cpp File Reference
+
+
+
#include <SdFat.h>
+
+Include dependency graph for SdBaseFile.cpp:
+
+
+ + +
+
+ + + + diff --git a/html/_sd_base_file_8cpp__incl.png b/html/_sd_base_file_8cpp__incl.png new file mode 100644 index 0000000..76e424f Binary files /dev/null and b/html/_sd_base_file_8cpp__incl.png differ diff --git a/html/_sd_base_file_8h.html b/html/_sd_base_file_8h.html new file mode 100644 index 0000000..8a71b97 --- /dev/null +++ b/html/_sd_base_file_8h.html @@ -0,0 +1,283 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdBaseFile.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
SdBaseFile.h File Reference
+
+
+ +

SdBaseFile class. +More...

+
#include <Arduino.h>
+#include <SdFatConfig.h>
+#include <SdVolume.h>
+#include <utility/FatApiConstants.h>
+
+Include dependency graph for SdBaseFile.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + + + + + +

+Classes

struct  FatPos_t
 internal type for istream do not use in user apps More...
 
class  SdBaseFile
 Base class for SdFile with Print and C++ streams. More...
 
+ + + + + + + + + + + +

+Macros

#define PGM_P   const char*
 
#define pgm_read_byte(addr)   (*(const unsigned char*)(addr))
 
#define pgm_read_word(addr)   (*(const uint16_t*)(addr))
 
#define PROGMEM   const
 
#define PSTR(x)   (x)
 
+ + + + + + + + + + + + + +

+Variables

uint8_t const FAT_FILE_TYPE_CLOSED = 0
 
uint8_t const FAT_FILE_TYPE_MIN_DIR = FAT_FILE_TYPE_ROOT_FIXED
 
uint8_t const FAT_FILE_TYPE_NORMAL = 1
 
uint8_t const FAT_FILE_TYPE_ROOT32 = 3
 
uint8_t const FAT_FILE_TYPE_ROOT_FIXED = 2
 
uint8_t const FAT_FILE_TYPE_SUBDIR = 4
 
+

Detailed Description

+

SdBaseFile class.

+

Macro Definition Documentation

+ +
+
+ + + + +
#define PGM_P   const char*
+
+

pointer to flash for ARM

+ +
+
+ +
+
+ + + + + + + + +
#define pgm_read_byte( addr)   (*(const unsigned char*)(addr))
+
+

read 8-bits from flash for ARM

+ +
+
+ +
+
+ + + + + + + + +
#define pgm_read_word( addr)   (*(const uint16_t*)(addr))
+
+

read 16-bits from flash for ARM

+ +
+
+ +
+
+ + + + +
#define PROGMEM   const
+
+

store in flash for ARM

+ +
+
+ +
+
+ + + + + + + + +
#define PSTR( x)   (x)
+
+

store literal string in flash for ARM

+ +
+
+

Variable Documentation

+ +
+
+ + + + +
uint8_t const FAT_FILE_TYPE_CLOSED = 0
+
+

This file has not been opened.

+ +
+
+ +
+
+ + + + +
uint8_t const FAT_FILE_TYPE_MIN_DIR = FAT_FILE_TYPE_ROOT_FIXED
+
+

Test value for directory type

+ +
+
+ +
+
+ + + + +
uint8_t const FAT_FILE_TYPE_NORMAL = 1
+
+

A normal file

+ +
+
+ +
+
+ + + + +
uint8_t const FAT_FILE_TYPE_ROOT32 = 3
+
+

A FAT32 root directory

+ +
+
+ +
+
+ + + + +
uint8_t const FAT_FILE_TYPE_ROOT_FIXED = 2
+
+

A FAT12 or FAT16 root directory

+ +
+
+ +
+
+ + + + +
uint8_t const FAT_FILE_TYPE_SUBDIR = 4
+
+

A subdirectory file

+ +
+
+
+ + + + diff --git a/html/_sd_base_file_8h__dep__incl.png b/html/_sd_base_file_8h__dep__incl.png new file mode 100644 index 0000000..5d9d54c Binary files /dev/null and b/html/_sd_base_file_8h__dep__incl.png differ diff --git a/html/_sd_base_file_8h__incl.png b/html/_sd_base_file_8h__incl.png new file mode 100644 index 0000000..8b70887 Binary files /dev/null and b/html/_sd_base_file_8h__incl.png differ diff --git a/html/_sd_base_file_print_8cpp.html b/html/_sd_base_file_print_8cpp.html new file mode 100644 index 0000000..3a58e57 --- /dev/null +++ b/html/_sd_base_file_print_8cpp.html @@ -0,0 +1,165 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdBaseFilePrint.cpp File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
SdBaseFilePrint.cpp File Reference
+
+
+
#include <SdFat.h>
+#include <utility/FmtNumber.h>
+
+Include dependency graph for SdBaseFilePrint.cpp:
+
+
+ + +
+
+ + + + + + +

+Functions

static void print2u (Print *pr, uint8_t v)
 
template<typename Type >
static int printFieldT (SdBaseFile *file, char sign, Type value, char term)
 
+

Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void print2u (Print * pr,
uint8_t v 
)
+
+static
+
+ +
+
+ +
+
+
+template<typename Type >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static int printFieldT (SdBaseFilefile,
char sign,
Type value,
char term 
)
+
+static
+
+

Template for SdBaseFile::printField()

+ +
+
+
+ + + + diff --git a/html/_sd_base_file_print_8cpp__incl.png b/html/_sd_base_file_print_8cpp__incl.png new file mode 100644 index 0000000..b4ed504 Binary files /dev/null and b/html/_sd_base_file_print_8cpp__incl.png differ diff --git a/html/_sd_fat_8cpp.html b/html/_sd_fat_8cpp.html new file mode 100644 index 0000000..6a36c78 --- /dev/null +++ b/html/_sd_fat_8cpp.html @@ -0,0 +1,69 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdFat.cpp File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+
+
SdFat.cpp File Reference
+
+
+
#include <SdFat.h>
+
+Include dependency graph for SdFat.cpp:
+
+
+ + +
+
+ + + + diff --git a/html/_sd_fat_8cpp__incl.png b/html/_sd_fat_8cpp__incl.png new file mode 100644 index 0000000..b0397a1 Binary files /dev/null and b/html/_sd_fat_8cpp__incl.png differ diff --git a/html/_sd_fat_8h.html b/html/_sd_fat_8h.html new file mode 100644 index 0000000..d877e1e --- /dev/null +++ b/html/_sd_fat_8h.html @@ -0,0 +1,128 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdFat.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
SdFat.h File Reference
+
+
+ +

SdFat class. +More...

+
#include <SdFile.h>
+#include <SdStream.h>
+#include <ArduinoStream.h>
+#include <MinimumSerial.h>
+
+Include dependency graph for SdFat.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + + +

+Classes

class  SdFat
 Integration class for the SdFat library. More...
 
+ + + + + +

+Macros

#define DBG_FAIL_MACRO
 
#define SD_FAT_VERSION   20140806
 
+

Detailed Description

+

SdFat class.

+

Macro Definition Documentation

+ +
+
+ + + + +
#define DBG_FAIL_MACRO
+
+

Macro for debug.

+ +
+
+ +
+
+ + + + +
#define SD_FAT_VERSION   20140806
+
+

SdFat version YYYYMMDD

+ +
+
+
+ + + + diff --git a/html/_sd_fat_8h__dep__incl.png b/html/_sd_fat_8h__dep__incl.png new file mode 100644 index 0000000..7aff3fa Binary files /dev/null and b/html/_sd_fat_8h__dep__incl.png differ diff --git a/html/_sd_fat_8h__incl.png b/html/_sd_fat_8h__incl.png new file mode 100644 index 0000000..d4aff2a Binary files /dev/null and b/html/_sd_fat_8h__incl.png differ diff --git a/html/_sd_fat_config_8h.html b/html/_sd_fat_config_8h.html new file mode 100644 index 0000000..7af6421 --- /dev/null +++ b/html/_sd_fat_config_8h.html @@ -0,0 +1,363 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdFatConfig.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
SdFatConfig.h File Reference
+
+
+ +

configuration definitions +More...

+
#include <stdint.h>
+
+Include dependency graph for SdFatConfig.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

#define DESTRUCTOR_CLOSES_FILE   0
 
#define ENDL_CALLS_FLUSH   0
 
#define FAT12_SUPPORT   0
 
#define LEONARDO_SOFT_SPI   0
 
#define MEGA_SOFT_SPI   0
 
#define USE_ARDUINO_SPI_LIBRARY   0
 
#define USE_MULTI_BLOCK_SD_IO   1
 
#define USE_MULTIPLE_CARDS   0
 
#define USE_SD_CRC   0
 
#define USE_SEPARATE_FAT_CACHE   0
 
#define USE_SERIAL_FOR_STD_OUT   0
 
#define USE_SOFTWARE_SPI   0
 
+ + + + + + + + + + + +

+Variables

uint8_t const SOFT_SPI_CS_PIN = 10
 
uint8_t const SOFT_SPI_MISO_PIN = 12
 
uint8_t const SOFT_SPI_MOSI_PIN = 11
 
uint8_t const SOFT_SPI_SCK_PIN = 13
 
const uint8_t SPI_SCK_INIT_DIVISOR = 128
 
+

Detailed Description

+

configuration definitions

+

Macro Definition Documentation

+ +
+
+ + + + +
#define DESTRUCTOR_CLOSES_FILE   0
+
+

Set DESTRUCTOR_CLOSES_FILE nonzero to close a file in its destructor.

+

Causes use of lots of heap in ARM.

+ +
+
+ +
+
+ + + + +
#define ENDL_CALLS_FLUSH   0
+
+

Call flush for endl if ENDL_CALLS_FLUSH is nonzero

+

The standard for iostreams is to call flush. This is very costly for SdFat. Each call to flush causes 2048 bytes of I/O to the SD.

+

SdFat has a single 512 byte buffer for SD I/O so it must write the current data block to the SD, read the directory block from the SD, update the directory entry, write the directory block to the SD and read the data block back into the buffer.

+

The SD flash memory controller is not designed for this many rewrites so performance may be reduced by more than a factor of 100.

+

If ENDL_CALLS_FLUSH is zero, you must call flush and/or close to force all data to be written to the SD.

+ +
+
+ +
+
+ + + + +
#define FAT12_SUPPORT   0
+
+

Allow FAT12 volumes if FAT12_SUPPORT is nonzero. FAT12 has not been well tested.

+ +
+
+ +
+
+ + + + +
#define LEONARDO_SOFT_SPI   0
+
+

Define LEONARDO_SOFT_SPI nonzero to use software SPI on Leonardo Arduinos. Default pins used are SS 10, MOSI 11, MISO 12, and SCK 13. Edit Software Spi pins to change pin numbers.

+

LEONARDO_SOFT_SPI allows an unmodified 328 Shield to be used on Leonardo Arduinos.

+ +
+
+ +
+
+ + + + +
#define MEGA_SOFT_SPI   0
+
+

Define MEGA_SOFT_SPI nonzero to use software SPI on Mega Arduinos. Default pins used are SS 10, MOSI 11, MISO 12, and SCK 13. Edit Software Spi pins to change pin numbers.

+

MEGA_SOFT_SPI allows an unmodified 328 Shield to be used on Mega Arduinos.

+ +
+
+ +
+
+ + + + +
#define USE_ARDUINO_SPI_LIBRARY   0
+
+

Force use of Arduino Standard SPI library if USE_ARDUINO_SPI_LIBRARY is nonzero.

+ +
+
+ +
+
+ + + + +
#define USE_MULTI_BLOCK_SD_IO   1
+
+

Set USE_MULTI_BLOCK_SD_IO nonzero to use multi-block SD read/write.

+

Don't use mult-block read/write on small AVR boards.

+ +
+
+ +
+
+ + + + +
#define USE_MULTIPLE_CARDS   0
+
+

To use multiple SD cards set USE_MULTIPLE_CARDS nonzero.

+

Using multiple cards costs about 200 bytes of flash.

+

Each card requires about 550 bytes of SRAM so use of a Mega is recommended.

+ +
+
+ +
+
+ + + + +
#define USE_SD_CRC   0
+
+

To enable SD card CRC checking set USE_SD_CRC nonzero.

+

Set USE_SD_CRC to 1 to use a smaller slower CRC-CCITT function.

+

Set USE_SD_CRC to 2 to used a larger faster table driven CRC-CCITT function.

+ +
+
+ +
+
+ + + + +
#define USE_SEPARATE_FAT_CACHE   0
+
+

Set USE_SEPARATE_FAT_CACHE nonzero to use a second 512 byte cache for FAT table entries. Improves performance for large writes that are not a multiple of 512 bytes.

+ +
+
+ +
+
+ + + + +
#define USE_SERIAL_FOR_STD_OUT   0
+
+

For AVR

+

Set USE_SERIAL_FOR_STD_OUT nonzero to use Serial (the HardwareSerial class) for error messages and output from print functions like ls().

+

If USE_SERIAL_FOR_STD_OUT is zero, a small non-interrupt driven class is used to output messages to serial port zero. This allows an alternate Serial library like SerialPort to be used with SdFat.

+

You can redirect stdOut with SdFat::setStdOut(Print* stream) and get the current stream with SdFat::stdOut().

+ +
+
+ +
+
+ + + + +
#define USE_SOFTWARE_SPI   0
+
+

Set USE_SOFTWARE_SPI nonzero to always use software SPI on AVR.

+ +
+
+

Variable Documentation

+ +
+
+ + + + +
uint8_t const SOFT_SPI_CS_PIN = 10
+
+

Default Software SPI chip select pin

+ +
+
+ +
+
+ + + + +
uint8_t const SOFT_SPI_MISO_PIN = 12
+
+

Software SPI Master In Slave Out pin

+ +
+
+ +
+
+ + + + +
uint8_t const SOFT_SPI_MOSI_PIN = 11
+
+

Software SPI Master Out Slave In pin

+ +
+
+ +
+
+ + + + +
uint8_t const SOFT_SPI_SCK_PIN = 13
+
+

Software SPI Clock pin

+ +
+
+ +
+
+ + + + +
const uint8_t SPI_SCK_INIT_DIVISOR = 128
+
+

SPI SCK divisor for SD initialization commands. or greater

+ +
+
+
+ + + + diff --git a/html/_sd_fat_config_8h__dep__incl.png b/html/_sd_fat_config_8h__dep__incl.png new file mode 100644 index 0000000..3546c21 Binary files /dev/null and b/html/_sd_fat_config_8h__dep__incl.png differ diff --git a/html/_sd_fat_config_8h__incl.png b/html/_sd_fat_config_8h__incl.png new file mode 100644 index 0000000..27b925d Binary files /dev/null and b/html/_sd_fat_config_8h__incl.png differ diff --git a/html/_sd_fat_error_print_8cpp.html b/html/_sd_fat_error_print_8cpp.html new file mode 100644 index 0000000..cabc280 --- /dev/null +++ b/html/_sd_fat_error_print_8cpp.html @@ -0,0 +1,128 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdFatErrorPrint.cpp File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
SdFatErrorPrint.cpp File Reference
+
+
+
#include <SdFat.h>
+
+Include dependency graph for SdFatErrorPrint.cpp:
+
+
+ + +
+
+ + + + + +

+Functions

static void pstrPrint (PGM_P str)
 
static void pstrPrintln (PGM_P str)
 
+

Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
static void pstrPrint (PGM_P str)
+
+static
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void pstrPrintln (PGM_P str)
+
+static
+
+ +
+
+
+ + + + diff --git a/html/_sd_fat_error_print_8cpp__incl.png b/html/_sd_fat_error_print_8cpp__incl.png new file mode 100644 index 0000000..abb8d55 Binary files /dev/null and b/html/_sd_fat_error_print_8cpp__incl.png differ diff --git a/html/_sd_fat_util_8cpp.html b/html/_sd_fat_util_8cpp.html new file mode 100644 index 0000000..ce9eb39 --- /dev/null +++ b/html/_sd_fat_util_8cpp.html @@ -0,0 +1,106 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdFatUtil.cpp File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
SdFatUtil.cpp File Reference
+
+
+
#include <stdlib.h>
+#include <SdFat.h>
+#include <SdFatUtil.h>
+
+Include dependency graph for SdFatUtil.cpp:
+
+
+ + +
+
+ + + + + +

+Variables

char * __brkval
 
char __bss_end
 
+

Variable Documentation

+ +
+
+ + + + +
char* __brkval
+
+ +
+
+ +
+
+ + + + +
char __bss_end
+
+ +
+
+
+ + + + diff --git a/html/_sd_fat_util_8cpp__incl.png b/html/_sd_fat_util_8cpp__incl.png new file mode 100644 index 0000000..1d9fe62 Binary files /dev/null and b/html/_sd_fat_util_8cpp__incl.png differ diff --git a/html/_sd_fat_util_8h.html b/html/_sd_fat_util_8h.html new file mode 100644 index 0000000..8baedf6 --- /dev/null +++ b/html/_sd_fat_util_8h.html @@ -0,0 +1,146 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdFatUtil.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
SdFatUtil.h File Reference
+
+
+ +

Useful utility functions. +More...

+
#include <SdFat.h>
+
+Include dependency graph for SdFatUtil.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + +

+Namespaces

 SdFatUtil
 
+ + + + + +

+Macros

#define PgmPrint(x)   SerialPrint_P(PSTR(x))
 
#define PgmPrintln(x)   SerialPrintln_P(PSTR(x))
 
+ + + + + + + + + + + +

+Functions

int SdFatUtil::FreeRam ()
 
void SdFatUtil::print_P (Print *pr, PGM_P str)
 
void SdFatUtil::println_P (Print *pr, PGM_P str)
 
void SdFatUtil::SerialPrint_P (PGM_P str)
 
void SdFatUtil::SerialPrintln_P (PGM_P str)
 
+

Detailed Description

+

Useful utility functions.

+

Macro Definition Documentation

+ +
+
+ + + + + + + + +
#define PgmPrint( x)   SerialPrint_P(PSTR(x))
+
+

Store and print a string in flash memory.

+ +
+
+ +
+
+ + + + + + + + +
#define PgmPrintln( x)   SerialPrintln_P(PSTR(x))
+
+

Store and print a string in flash memory followed by a CR/LF.

+ +
+
+
+ + + + diff --git a/html/_sd_fat_util_8h__dep__incl.png b/html/_sd_fat_util_8h__dep__incl.png new file mode 100644 index 0000000..946a91b Binary files /dev/null and b/html/_sd_fat_util_8h__dep__incl.png differ diff --git a/html/_sd_fat_util_8h__incl.png b/html/_sd_fat_util_8h__incl.png new file mode 100644 index 0000000..f157338 Binary files /dev/null and b/html/_sd_fat_util_8h__incl.png differ diff --git a/html/_sd_fatmainpage_8h.html b/html/_sd_fatmainpage_8h.html new file mode 100644 index 0000000..010931b --- /dev/null +++ b/html/_sd_fatmainpage_8h.html @@ -0,0 +1,61 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdFatmainpage.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+
+
SdFatmainpage.h File Reference
+
+
+
+ + + + diff --git a/html/_sd_file_8cpp.html b/html/_sd_file_8cpp.html new file mode 100644 index 0000000..945c795 --- /dev/null +++ b/html/_sd_file_8cpp.html @@ -0,0 +1,69 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdFile.cpp File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+
+
SdFile.cpp File Reference
+
+
+
#include <SdFile.h>
+
+Include dependency graph for SdFile.cpp:
+
+
+ + +
+
+ + + + diff --git a/html/_sd_file_8cpp__incl.png b/html/_sd_file_8cpp__incl.png new file mode 100644 index 0000000..98c343b Binary files /dev/null and b/html/_sd_file_8cpp__incl.png differ diff --git a/html/_sd_file_8h.html b/html/_sd_file_8h.html new file mode 100644 index 0000000..0b48392 --- /dev/null +++ b/html/_sd_file_8h.html @@ -0,0 +1,90 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdFile.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
SdFile.h File Reference
+
+
+ +

SdFile class. +More...

+
#include <SdBaseFile.h>
+
+Include dependency graph for SdFile.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + + +

+Classes

class  SdFile
 SdBaseFile with Print. More...
 
+

Detailed Description

+

SdFile class.

+
+ + + + diff --git a/html/_sd_file_8h__dep__incl.png b/html/_sd_file_8h__dep__incl.png new file mode 100644 index 0000000..edf47f2 Binary files /dev/null and b/html/_sd_file_8h__dep__incl.png differ diff --git a/html/_sd_file_8h__incl.png b/html/_sd_file_8h__incl.png new file mode 100644 index 0000000..a8ce42d Binary files /dev/null and b/html/_sd_file_8h__incl.png differ diff --git a/html/_sd_spi_8h.html b/html/_sd_spi_8h.html new file mode 100644 index 0000000..d8bd311 --- /dev/null +++ b/html/_sd_spi_8h.html @@ -0,0 +1,161 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdSpi.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
SdSpi.h File Reference
+
+
+ +

SdSpi class for V2 SD/SDHC cards. +More...

+
#include <Arduino.h>
+#include <SdFatConfig.h>
+
+Include dependency graph for SdSpi.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + + +

+Classes

class  SdSpi
 SPI class for access to SD and SDHC flash memory cards. More...
 
+ + + + + + + +

+Macros

#define USE_AVR_NATIVE_SPI_INLINE   1
 
#define USE_NATIVE_MK20DX128_SPI   0
 
#define USE_NATIVE_SAM3X_SPI   0
 
+ + + +

+Variables

uint8_t const SD_CHIP_SELECT_PIN = SS
 
+

Detailed Description

+

SdSpi class for V2 SD/SDHC cards.

+

Macro Definition Documentation

+ +
+
+ + + + +
#define USE_AVR_NATIVE_SPI_INLINE   1
+
+

inline avr native functions if nonzero.

+ +
+
+ +
+
+ + + + +
#define USE_NATIVE_MK20DX128_SPI   0
+
+

Zero - don't use native MK20DX128 SPI

+ +
+
+ +
+
+ + + + +
#define USE_NATIVE_SAM3X_SPI   0
+
+

Zero - don't use native SAM3X SPI

+ +
+
+

Variable Documentation

+ +
+
+ + + + +
uint8_t const SD_CHIP_SELECT_PIN = SS
+
+

The default chip select pin for the SD card is SS.

+ +
+
+
+ + + + diff --git a/html/_sd_spi_8h__dep__incl.png b/html/_sd_spi_8h__dep__incl.png new file mode 100644 index 0000000..1ee96f0 Binary files /dev/null and b/html/_sd_spi_8h__dep__incl.png differ diff --git a/html/_sd_spi_8h__incl.png b/html/_sd_spi_8h__incl.png new file mode 100644 index 0000000..f139ffd Binary files /dev/null and b/html/_sd_spi_8h__incl.png differ diff --git a/html/_sd_spi_a_v_r_8cpp.html b/html/_sd_spi_a_v_r_8cpp.html new file mode 100644 index 0000000..02f885c --- /dev/null +++ b/html/_sd_spi_a_v_r_8cpp.html @@ -0,0 +1,69 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdSpiAVR.cpp File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+
+
SdSpiAVR.cpp File Reference
+
+
+
#include <SdSpi.h>
+
+Include dependency graph for SdSpiAVR.cpp:
+
+
+ + +
+
+ + + + diff --git a/html/_sd_spi_a_v_r_8cpp__incl.png b/html/_sd_spi_a_v_r_8cpp__incl.png new file mode 100644 index 0000000..2985f2c Binary files /dev/null and b/html/_sd_spi_a_v_r_8cpp__incl.png differ diff --git a/html/_sd_spi_arduino_8cpp.html b/html/_sd_spi_arduino_8cpp.html new file mode 100644 index 0000000..e710a3d --- /dev/null +++ b/html/_sd_spi_arduino_8cpp.html @@ -0,0 +1,69 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdSpiArduino.cpp File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+
+
SdSpiArduino.cpp File Reference
+
+
+
#include <SdSpi.h>
+
+Include dependency graph for SdSpiArduino.cpp:
+
+
+ + +
+
+ + + + diff --git a/html/_sd_spi_arduino_8cpp__incl.png b/html/_sd_spi_arduino_8cpp__incl.png new file mode 100644 index 0000000..089e1e7 Binary files /dev/null and b/html/_sd_spi_arduino_8cpp__incl.png differ diff --git a/html/_sd_spi_m_k20_d_x128_8cpp.html b/html/_sd_spi_m_k20_d_x128_8cpp.html new file mode 100644 index 0000000..864f6ee --- /dev/null +++ b/html/_sd_spi_m_k20_d_x128_8cpp.html @@ -0,0 +1,69 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdSpiMK20DX128.cpp File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+
+
SdSpiMK20DX128.cpp File Reference
+
+
+
#include <SdSpi.h>
+
+Include dependency graph for SdSpiMK20DX128.cpp:
+
+
+ + +
+
+ + + + diff --git a/html/_sd_spi_m_k20_d_x128_8cpp__incl.png b/html/_sd_spi_m_k20_d_x128_8cpp__incl.png new file mode 100644 index 0000000..880369d Binary files /dev/null and b/html/_sd_spi_m_k20_d_x128_8cpp__incl.png differ diff --git a/html/_sd_spi_s_a_m3_x_8cpp.html b/html/_sd_spi_s_a_m3_x_8cpp.html new file mode 100644 index 0000000..7560272 --- /dev/null +++ b/html/_sd_spi_s_a_m3_x_8cpp.html @@ -0,0 +1,69 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdSpiSAM3X.cpp File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+
+
SdSpiSAM3X.cpp File Reference
+
+
+
#include <SdSpi.h>
+
+Include dependency graph for SdSpiSAM3X.cpp:
+
+
+ + +
+
+ + + + diff --git a/html/_sd_spi_s_a_m3_x_8cpp__incl.png b/html/_sd_spi_s_a_m3_x_8cpp__incl.png new file mode 100644 index 0000000..cfbc026 Binary files /dev/null and b/html/_sd_spi_s_a_m3_x_8cpp__incl.png differ diff --git a/html/_sd_stream_8cpp.html b/html/_sd_stream_8cpp.html new file mode 100644 index 0000000..cbf3226 --- /dev/null +++ b/html/_sd_stream_8cpp.html @@ -0,0 +1,69 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdStream.cpp File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+
+
SdStream.cpp File Reference
+
+
+
#include <SdFat.h>
+
+Include dependency graph for SdStream.cpp:
+
+
+ + +
+
+ + + + diff --git a/html/_sd_stream_8cpp__incl.png b/html/_sd_stream_8cpp__incl.png new file mode 100644 index 0000000..4de78af Binary files /dev/null and b/html/_sd_stream_8cpp__incl.png differ diff --git a/html/_sd_stream_8h.html b/html/_sd_stream_8h.html new file mode 100644 index 0000000..cd3e55b --- /dev/null +++ b/html/_sd_stream_8h.html @@ -0,0 +1,100 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdStream.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
SdStream.h File Reference
+
+
+ +

fstream, ifstream, and ofstream classes +More...

+
#include <SdBaseFile.h>
+#include <iostream.h>
+
+Include dependency graph for SdStream.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + + + + + + + + + + + +

+Classes

class  fstream
 SD file input/output stream. More...
 
class  ifstream
 SD file input stream. More...
 
class  ofstream
 SD card output stream. More...
 
class  SdStreamBase
 Base class for SD streams. More...
 
+

Detailed Description

+

fstream, ifstream, and ofstream classes

+
+ + + + diff --git a/html/_sd_stream_8h__dep__incl.png b/html/_sd_stream_8h__dep__incl.png new file mode 100644 index 0000000..45e8404 Binary files /dev/null and b/html/_sd_stream_8h__dep__incl.png differ diff --git a/html/_sd_stream_8h__incl.png b/html/_sd_stream_8h__incl.png new file mode 100644 index 0000000..b396434 Binary files /dev/null and b/html/_sd_stream_8h__incl.png differ diff --git a/html/_sd_volume_8cpp.html b/html/_sd_volume_8cpp.html new file mode 100644 index 0000000..176546a --- /dev/null +++ b/html/_sd_volume_8cpp.html @@ -0,0 +1,69 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdVolume.cpp File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+
+
SdVolume.cpp File Reference
+
+
+
#include <SdFat.h>
+
+Include dependency graph for SdVolume.cpp:
+
+
+ + +
+
+ + + + diff --git a/html/_sd_volume_8cpp__incl.png b/html/_sd_volume_8cpp__incl.png new file mode 100644 index 0000000..0ec10db Binary files /dev/null and b/html/_sd_volume_8cpp__incl.png differ diff --git a/html/_sd_volume_8h.html b/html/_sd_volume_8h.html new file mode 100644 index 0000000..9c98cae --- /dev/null +++ b/html/_sd_volume_8h.html @@ -0,0 +1,95 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/SdVolume.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
SdVolume.h File Reference
+
+
+ +

SdVolume class. +More...

+
#include <SdFatConfig.h>
+#include <Sd2Card.h>
+#include <utility/FatStructs.h>
+
+Include dependency graph for SdVolume.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + + + + + +

+Classes

union  cache_t
 Cache for an SD data block. More...
 
class  SdVolume
 Access FAT16 and FAT32 volumes on SD and SDHC cards. More...
 
+

Detailed Description

+

SdVolume class.

+
+ + + + diff --git a/html/_sd_volume_8h__dep__incl.png b/html/_sd_volume_8h__dep__incl.png new file mode 100644 index 0000000..0856aa8 Binary files /dev/null and b/html/_sd_volume_8h__dep__incl.png differ diff --git a/html/_sd_volume_8h__incl.png b/html/_sd_volume_8h__incl.png new file mode 100644 index 0000000..543574c Binary files /dev/null and b/html/_sd_volume_8h__incl.png differ diff --git a/html/_stdio_stream_8cpp.html b/html/_stdio_stream_8cpp.html new file mode 100644 index 0000000..e9dc3d3 --- /dev/null +++ b/html/_stdio_stream_8cpp.html @@ -0,0 +1,108 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/StdioStream.cpp File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
StdioStream.cpp File Reference
+
+
+
#include <Arduino.h>
+#include <StdioStream.h>
+#include <utility/FmtNumber.h>
+
+Include dependency graph for StdioStream.cpp:
+
+
+ + +
+
+ + + + + +

+Macros

#define FLOAT_NEW_WAY
 
#define NEW_WAY
 
+

Detailed Description

+

StdioStream implementation

+

Macro Definition Documentation

+ +
+
+ + + + +
#define FLOAT_NEW_WAY
+
+ +
+
+ +
+
+ + + + +
#define NEW_WAY
+
+ +
+
+
+ + + + diff --git a/html/_stdio_stream_8cpp__incl.png b/html/_stdio_stream_8cpp__incl.png new file mode 100644 index 0000000..056184d Binary files /dev/null and b/html/_stdio_stream_8cpp__incl.png differ diff --git a/html/_stdio_stream_8h.html b/html/_stdio_stream_8h.html new file mode 100644 index 0000000..a172d53 --- /dev/null +++ b/html/_stdio_stream_8h.html @@ -0,0 +1,206 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/StdioStream.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
StdioStream.h File Reference
+
+
+
#include <limits.h>
+#include <Arduino.h>
+#include <SdFat.h>
+#include <SdBaseFile.h>
+#include <stdio.h>
+
+Include dependency graph for StdioStream.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + + +

+Classes

class  StdioStream
 StdioStream implements a minimal stdio stream. More...
 
+ + + + + + + + + + + +

+Macros

#define EOF   (-1)
 
#define NULL   0
 
#define SEEK_CUR   1
 
#define SEEK_END   2
 
#define SEEK_SET   0
 
+ + + + + +

+Variables

const uint8_t STREAM_BUF_SIZE = 64
 
const uint8_t UNGETC_BUF_SIZE = 2
 
+

Detailed Description

+

StdioStream class

+

Macro Definition Documentation

+ +
+
+ + + + +
#define EOF   (-1)
+
+

End-of-file return value.

+ +
+
+ +
+
+ + + + +
#define NULL   0
+
+

Null pointer

+ +
+
+ +
+
+ + + + +
#define SEEK_CUR   1
+
+

Seek relative to current position.

+ +
+
+ +
+
+ + + + +
#define SEEK_END   2
+
+

Seek relative to end-of-file.

+ +
+
+ +
+
+ + + + +
#define SEEK_SET   0
+
+

Seek relative to start-of-file.

+ +
+
+

Variable Documentation

+ +
+
+ + + + +
const uint8_t STREAM_BUF_SIZE = 64
+
+

Total size of stream buffer. The entire buffer is used for output. During input UNGETC_BUF_SIZE of this space is reserved for ungetc.

+ +
+
+ +
+
+ + + + +
const uint8_t UNGETC_BUF_SIZE = 2
+
+

Amount of buffer allocated for ungetc during input.

+ +
+
+
+ + + + diff --git a/html/_stdio_stream_8h__dep__incl.png b/html/_stdio_stream_8h__dep__incl.png new file mode 100644 index 0000000..7ac0598 Binary files /dev/null and b/html/_stdio_stream_8h__dep__incl.png differ diff --git a/html/_stdio_stream_8h__incl.png b/html/_stdio_stream_8h__incl.png new file mode 100644 index 0000000..dfe26e6 Binary files /dev/null and b/html/_stdio_stream_8h__incl.png differ diff --git a/html/annotated.html b/html/annotated.html new file mode 100644 index 0000000..aefb7dd --- /dev/null +++ b/html/annotated.html @@ -0,0 +1,90 @@ + + + + + + +SdFat: Class List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
oNSdFatUtil
oCArduinoInStreamInput stream for Arduino Stream objects
oCArduinoOutStreamOutput stream for Arduino Print objects
oCcache_tCache for an SD data block
oCFatPos_tInternal type for istream do not use in user apps
oCfstreamSD file input/output stream
oCibufstreamParse a char string
oCifstreamSD file input stream
oCiosError and state information for all streams
oCios_baseBase class for all streams
oCiostreamInput/Output stream
oCistreamInput Stream
oCMinimumSerialMini serial class for the SdFat library
oCobufstreamFormat a char string
oCofstreamSD card output stream
oCostreamOutput Stream
oCpgmType for string in flash
oCSd2CardRaw access to SD and SDHC flash memory cards
oCSdBaseFileBase class for SdFile with Print and C++ streams
oCSdFatIntegration class for the SdFat library
oCSdFileSdBaseFile with Print
oCSdSpiSPI class for access to SD and SDHC flash memory cards
oCSdStreamBaseBase class for SD streams
oCSdVolumeAccess FAT16 and FAT32 volumes on SD and SDHC cards
oCsetfillType for setfill manipulator
oCsetprecisionType for setprecision manipulator
oCsetwType for setw manipulator
\CStdioStreamStdioStream implements a minimal stdio stream
+
+
+ + + + diff --git a/html/bc_s.png b/html/bc_s.png new file mode 100644 index 0000000..224b29a Binary files /dev/null and b/html/bc_s.png differ diff --git a/html/bdwn.png b/html/bdwn.png new file mode 100644 index 0000000..940a0b9 Binary files /dev/null and b/html/bdwn.png differ diff --git a/html/bufstream_8h.html b/html/bufstream_8h.html new file mode 100644 index 0000000..691a7dc --- /dev/null +++ b/html/bufstream_8h.html @@ -0,0 +1,93 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/bufstream.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
bufstream.h File Reference
+
+
+ +

ibufstream and obufstream classes +More...

+
#include <iostream.h>
+
+Include dependency graph for bufstream.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + + + + + +

+Classes

class  ibufstream
 parse a char string More...
 
class  obufstream
 format a char string More...
 
+

Detailed Description

+

ibufstream and obufstream classes

+
+ + + + diff --git a/html/bufstream_8h__dep__incl.png b/html/bufstream_8h__dep__incl.png new file mode 100644 index 0000000..3ca022d Binary files /dev/null and b/html/bufstream_8h__dep__incl.png differ diff --git a/html/bufstream_8h__incl.png b/html/bufstream_8h__incl.png new file mode 100644 index 0000000..76258a4 Binary files /dev/null and b/html/bufstream_8h__incl.png differ diff --git a/html/class_arduino_in_stream-members.html b/html/class_arduino_in_stream-members.html new file mode 100644 index 0000000..769488b --- /dev/null +++ b/html/class_arduino_in_stream-members.html @@ -0,0 +1,156 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
ArduinoInStream Member List
+
+
+ +

This is the complete list of members for ArduinoInStream, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
adjustfieldios_basestatic
appios_basestatic
ArduinoInStream(Stream &hws, char *buf, size_t size)ArduinoInStreaminline
ateios_basestatic
bad() const iosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() const iosinline
eofbitios_basestatic
fail() const iosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() const ios_baseinline
flags(fmtflags fl)ios_baseinline
flagsToBase()ios_baseinlineprotected
fmtflags typedefios_base
gcount() const istreaminline
get()istream
get(char &ch)istream
get(char *str, streamsize n, char delim= '\n')istream
getline(char *str, streamsize count, char delim= '\n')istream
good() const iosinline
goodbitios_basestatic
hexios_basestatic
ibufstream()ibufstreaminline
ibufstream(const char *str)ibufstreaminlineexplicit
ignore(streamsize n=1, int delim=-1)istream
inios_basestatic
init(const char *str)ibufstreaminline
internalios_basestatic
ios()iosinline
ios_base()ios_baseinline
iostate typedefios_base
istream()istreaminline
leftios_basestatic
octios_basestatic
off_type typedefios_base
openmode typedefios_base
operator const void *() const iosinline
operator!() const iosinline
operator>>(istream &(*pf)(istream &str))istreaminline
operator>>(ios_base &(*pf)(ios_base &str))istreaminline
operator>>(ios &(*pf)(ios &str))istreaminline
operator>>(char *str)istreaminline
operator>>(char &ch)istreaminline
operator>>(signed char *str)istreaminline
operator>>(signed char &ch)istreaminline
operator>>(unsigned char *str)istreaminline
operator>>(unsigned char &ch)istreaminline
operator>>(bool &arg)istreaminline
operator>>(short &arg)istreaminline
operator>>(unsigned short &arg)istreaminline
operator>>(int &arg)istreaminline
operator>>(unsigned int &arg)istreaminline
operator>>(long &arg)istreaminline
operator>>(unsigned long &arg)istreaminline
operator>>(double &arg)istreaminline
operator>>(float &arg)istreaminline
operator>>(void *&arg)istreaminline
outios_basestatic
peek()istream
pos_type typedefios_base
precision() const ios_baseinline
precision(unsigned int n)ios_baseinline
rdstate() const iosinline
readline()ArduinoInStreaminline
rightios_basestatic
seekdir enum nameios_base
seekg(pos_type pos)istreaminline
seekg(off_type off, seekdir way)istreaminline
seekoff(off_type off, seekdir way)ArduinoInStreaminlineprotected
seekpos(pos_type pos)ArduinoInStreaminlineprotected
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipWhite()istream
skipwsios_basestatic
streamsize typedefios_base
tellg()istreaminline
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
+ + + + diff --git a/html/class_arduino_in_stream.html b/html/class_arduino_in_stream.html new file mode 100644 index 0000000..587597c --- /dev/null +++ b/html/class_arduino_in_stream.html @@ -0,0 +1,2696 @@ + + + + + + +SdFat: ArduinoInStream Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

Input stream for Arduino Stream objects. + More...

+ +

#include <ArduinoStream.h>

+
+Inheritance diagram for ArduinoInStream:
+
+
Inheritance graph
+ + +
[legend]
+
+Collaboration diagram for ArduinoInStream:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + +

+Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, +cur, +end + }
 
typedef uint32_t streamsize
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ArduinoInStream (Stream &hws, char *buf, size_t size)
 
bool bad () const
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
streamsize gcount () const
 
int get ()
 
istreamget (char &ch)
 
istreamget (char *str, streamsize n, char delim= '\n')
 
istreamgetline (char *str, streamsize count, char delim= '\n')
 
bool good () const
 
istreamignore (streamsize n=1, int delim=-1)
 
void init (const char *str)
 
 operator const void * () const
 
bool operator! () const
 
istreamoperator>> (istream &(*pf)(istream &str))
 
istreamoperator>> (ios_base &(*pf)(ios_base &str))
 
istreamoperator>> (ios &(*pf)(ios &str))
 
istreamoperator>> (char *str)
 
istreamoperator>> (char &ch)
 
istreamoperator>> (signed char *str)
 
istreamoperator>> (signed char &ch)
 
istreamoperator>> (unsigned char *str)
 
istreamoperator>> (unsigned char &ch)
 
istreamoperator>> (bool &arg)
 
istreamoperator>> (short &arg)
 
istreamoperator>> (unsigned short &arg)
 
istreamoperator>> (int &arg)
 
istreamoperator>> (unsigned int &arg)
 
istreamoperator>> (long &arg)
 
istreamoperator>> (unsigned long &arg)
 
istreamoperator>> (double &arg)
 
istreamoperator>> (float &arg)
 
istreamoperator>> (void *&arg)
 
int peek ()
 
int precision () const
 
int precision (unsigned int n)
 
iostate rdstate () const
 
void readline ()
 
istreamseekg (pos_type pos)
 
istreamseekg (off_type off, seekdir way)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
void skipWhite ()
 
pos_type tellg ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
+ + + + + + + +

+Protected Member Functions

uint8_t flagsToBase ()
 
bool seekoff (off_type off, seekdir way)
 
bool seekpos (pos_type pos)
 
+

Detailed Description

+

Input stream for Arduino Stream objects.

+

Member Typedef Documentation

+ +
+
+ + + + + +
+ + + + +
typedef unsigned int ios_base::fmtflags
+
+inherited
+
+

type for format flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef unsigned char ios_base::iostate
+
+inherited
+
+

typedef for iostate bitmask

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef int32_t ios_base::off_type
+
+inherited
+
+

type for relative seek offset

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint8_t ios_base::openmode
+
+inherited
+
+

typedef for iostream open mode

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::pos_type
+
+inherited
+
+

type for absolute seek position

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::streamsize
+
+inherited
+
+

unsigned size that can represent maximum file size. (violates spec - should be signed)

+ +
+
+

Member Enumeration Documentation

+ +
+
+ + + + + +
+ + + + +
enum ios_base::seekdir
+
+inherited
+
+

enumerated type for the direction of relative seeks

+ + + + +
Enumerator
beg  +

seek relative to the beginning of the stream

+
cur  +

seek relative to the current stream position

+
end  +

seek relative to the end of the stream

+
+ +
+
+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
ArduinoInStream::ArduinoInStream (Stream & hws,
char * buf,
size_t size 
)
+
+inline
+
+

Constructor

+
Parameters
+ + + + +
[in]hwshardware stream
[in]bufbuffer for input line
[in]sizesize of input buffer
+
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
bool ios::bad () const
+
+inlineinherited
+
+
Returns
true if bad bit is set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::clear (iostate state = goodbit)
+
+inlineinherited
+
+

Clear iostate bits.

+
Parameters
+ + +
[in]stateThe flags you want to set after clearing all flags.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::eof () const
+
+inlineinherited
+
+
Returns
true if end of file has been reached else false.
+

Warning: An empty file returns false before the first read.

+

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::fail () const
+
+inlineinherited
+
+
Returns
true if any iostate bit other than eof are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
char ios_base::fill ()
+
+inlineinherited
+
+
Returns
fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
char ios_base::fill (char c)
+
+inlineinherited
+
+

Set fill character

+
Parameters
+ + +
[in]cnew fill character
+
+
+
Returns
old fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
fmtflags ios_base::flags () const
+
+inlineinherited
+
+
Returns
format flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::flags (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flag
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t ios_base::flagsToBase ()
+
+inlineprotectedinherited
+
+
Returns
current number base
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
streamsize istream::gcount () const
+
+inlineinherited
+
+
Returns
The number of characters extracted by the last unformatted input function.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int istream::get ()
+
+inherited
+
+

Extract a character if one is available.

+
Returns
The character or -1 if a failure occurs. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream & istream::get (char & c)
+
+inherited
+
+

Extract a character if one is available.

+
Parameters
+ + +
[out]clocation to receive the extracted character.
+
+
+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
istream & istream::get (char * str,
streamsize n,
char delim = '\n' 
)
+
+inherited
+
+

Extract characters.

+
Parameters
+ + + + +
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
+
+
+

Characters are extracted until extraction fails, n is less than 1, n-1 characters are extracted, or the next character equals delim (delim is not extracted). If no characters are extracted failbit is set. If end-of-file occurs the eofbit is set.

+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
istream & istream::getline (char * str,
streamsize n,
char delim = '\n' 
)
+
+inherited
+
+

Extract characters

+
Parameters
+ + + + +
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
+
+
+

Characters are extracted until extraction fails, the next character equals delim (delim is extracted), or n-1 characters are extracted.

+

The failbit is set if no characters are extracted or n-1 characters are extracted. If end-of-file occurs the eofbit is set.

+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::good () const
+
+inlineinherited
+
+
Returns
True if no iostate flags are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
istream & istream::ignore (streamsize n = 1,
int delim = -1 
)
+
+inherited
+
+

Extract characters and discard them.

+
Parameters
+ + + +
[in]nmaximum number of characters to ignore.
[in]delimDelimiter.
+
+
+

Characters are extracted until extraction fails, n characters are extracted, or the next input character equals delim (the delimiter is extracted). If end-of-file occurs the eofbit is set.

+

Failures are indicated by the state of the stream.

+
Returns
*this
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ibufstream::init (const char * str)
+
+inlineinherited
+
+

Initialize an ibufstream

+
Parameters
+ + +
[in]strpointer to string to be parsed Warning: The string will not be copied so must stay in scope.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ios::operator const void * () const
+
+inlineinherited
+
+
Returns
null pointer if fail() is true.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::operator! () const
+
+inlineinherited
+
+
Returns
true if fail() else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (istream &(*)(istream &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (ios_base &(*)(ios_base &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (ios &(*)(ios &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (char * str)
+
+inlineinherited
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (char & ch)
+
+inlineinherited
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (signed char * str)
+
+inlineinherited
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (signed char & ch)
+
+inlineinherited
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned char * str)
+
+inlineinherited
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned char & ch)
+
+inlineinherited
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (bool & arg)
+
+inlineinherited
+
+

Extract a value of type bool.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (short & arg)
+
+inlineinherited
+
+

Extract a value of type short.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned short & arg)
+
+inlineinherited
+
+

Extract a value of type unsigned short.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (int & arg)
+
+inlineinherited
+
+

Extract a value of type int.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned int & arg)
+
+inlineinherited
+
+

Extract a value of type unsigned int.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (long & arg)
+
+inlineinherited
+
+

Extract a value of type long.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned long & arg)
+
+inlineinherited
+
+

Extract a value of type unsigned long.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (double & arg)
+
+inlineinherited
+
+

Extract a value of type double.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (float & arg)
+
+inlineinherited
+
+

Extract a value of type float.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (void *& arg)
+
+inlineinherited
+
+

Extract a value of type void*.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int istream::peek ()
+
+inherited
+
+

Return the next available character without consuming it.

+
Returns
The character if the stream state is good else -1;
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int ios_base::precision () const
+
+inlineinherited
+
+
Returns
precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int ios_base::precision (unsigned int n)
+
+inlineinherited
+
+

set precision

+
Parameters
+ + +
[in]nnew precision
+
+
+
Returns
old precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
iostate ios::rdstate () const
+
+inlineinherited
+
+
Returns
The iostate flags for this file.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void ArduinoInStream::readline ()
+
+inline
+
+

read a line.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::seekg (pos_type pos)
+
+inlineinherited
+
+

Set the stream position

+
Parameters
+ + +
[in]posThe absolute position in which to move the read pointer.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
istream& istream::seekg (off_type off,
seekdir way 
)
+
+inlineinherited
+
+

Set the stream position.

+
Parameters
+ + + +
[in]offAn offset to move the read pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool ArduinoInStream::seekoff (off_type off,
seekdir way 
)
+
+inlineprotected
+
+

Internal - do not use.

+
Parameters
+ + + +
[in]off
[in]way
+
+
+
Returns
true/false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool ArduinoInStream::seekpos (pos_type pos)
+
+inlineprotected
+
+

Internal - do not use.

+
Parameters
+ + +
[in]pos
+
+
+
Returns
true/false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::setf (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flags to be or'ed in
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
+
+inlineinherited
+
+

modify format flags

+
Parameters
+ + + +
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::setstate (iostate state)
+
+inlineinherited
+
+

Set iostate bits.

+
Parameters
+ + +
[in]stateBitts to set.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void istream::skipWhite ()
+
+inherited
+
+

used to implement ws()

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
pos_type istream::tellg ()
+
+inlineinherited
+
+
Returns
the stream position
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios_base::unsetf (fmtflags fl)
+
+inlineinherited
+
+

clear format flags

+
Parameters
+ + +
[in]flflags to be cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
unsigned ios_base::width ()
+
+inlineinherited
+
+
Returns
width
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
unsigned ios_base::width (unsigned n)
+
+inlineinherited
+
+

set width

+
Parameters
+ + +
[in]nnew width
+
+
+
Returns
old width
+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::adjustfield = left | right | internal
+
+staticinherited
+
+

mask for adjustfield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::app = 0X4
+
+staticinherited
+
+

seek to end before each write

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::ate = 0X8
+
+staticinherited
+
+

open and seek to end immediately after opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::badbit = 0X01
+
+staticinherited
+
+

iostate bad bit for a nonrecoverable error.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::basefield = dec | hex | oct
+
+staticinherited
+
+

mask for basefield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::binary = 0X10
+
+staticinherited
+
+

perform input and output in binary mode (as opposed to text mode)

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::boolalpha = 0x0100
+
+staticinherited
+
+

use strings true/false for bool

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::dec = 0x0008
+
+staticinherited
+
+

base 10 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::eofbit = 0x02
+
+staticinherited
+
+

iostate bit for end of file reached

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::failbit = 0X04
+
+staticinherited
+
+

iostate fail bit for nonfatal error

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::goodbit = 0x00
+
+staticinherited
+
+

iostate for no flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::hex = 0x0010
+
+staticinherited
+
+

base 16 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::in = 0X20
+
+staticinherited
+
+

open for input

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::internal = 0x0004
+
+staticinherited
+
+

fill between sign/base prefix and number

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::left = 0x0001
+
+staticinherited
+
+

left adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::oct = 0x0020
+
+staticinherited
+
+

base 8 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::out = 0X40
+
+staticinherited
+
+

open for output

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::right = 0x0002
+
+staticinherited
+
+

right adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showbase = 0x0200
+
+staticinherited
+
+

use prefix 0X for hex and 0 for oct

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpoint = 0x0400
+
+staticinherited
+
+

always show '.' for floating numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpos = 0x0800
+
+staticinherited
+
+

show + sign for nonnegative numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::skipws = 0x1000
+
+staticinherited
+
+

skip initial white space

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::trunc = 0X80
+
+staticinherited
+
+

truncate an existing stream when opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::uppercase = 0x4000
+
+staticinherited
+
+

use uppercase letters in number representations

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/html/class_arduino_in_stream__coll__graph.png b/html/class_arduino_in_stream__coll__graph.png new file mode 100644 index 0000000..4df6fab Binary files /dev/null and b/html/class_arduino_in_stream__coll__graph.png differ diff --git a/html/class_arduino_in_stream__inherit__graph.png b/html/class_arduino_in_stream__inherit__graph.png new file mode 100644 index 0000000..4df6fab Binary files /dev/null and b/html/class_arduino_in_stream__inherit__graph.png differ diff --git a/html/class_arduino_out_stream-members.html b/html/class_arduino_out_stream-members.html new file mode 100644 index 0000000..ae3e3fd --- /dev/null +++ b/html/class_arduino_out_stream-members.html @@ -0,0 +1,145 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
ArduinoOutStream Member List
+
+
+ +

This is the complete list of members for ArduinoOutStream, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
adjustfieldios_basestatic
appios_basestatic
ArduinoOutStream(Print &pr)ArduinoOutStreaminlineexplicit
ateios_basestatic
bad() const iosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() const iosinline
eofbitios_basestatic
fail() const iosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() const ios_baseinline
flags(fmtflags fl)ios_baseinline
flagsToBase()ios_baseinlineprotected
flush()ostreaminline
fmtflags typedefios_base
good() const iosinline
goodbitios_basestatic
hexios_basestatic
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base()ios_baseinline
iostate typedefios_base
leftios_basestatic
octios_basestatic
off_type typedefios_base
openmode typedefios_base
operator const void *() const iosinline
operator!() const iosinline
operator<<(ostream &(*pf)(ostream &str))ostreaminline
operator<<(ios_base &(*pf)(ios_base &str))ostreaminline
operator<<(bool arg)ostreaminline
operator<<(const char *arg)ostreaminline
operator<<(const signed char *arg)ostreaminline
operator<<(const unsigned char *arg)ostreaminline
operator<<(char arg)ostreaminline
operator<<(signed char arg)ostreaminline
operator<<(unsigned char arg)ostreaminline
operator<<(double arg)ostreaminline
operator<<(float arg)ostreaminline
operator<<(short arg)ostreaminline
operator<<(unsigned short arg)ostreaminline
operator<<(int arg)ostreaminline
operator<<(unsigned int arg)ostreaminline
operator<<(long arg)ostreaminline
operator<<(unsigned long arg)ostreaminline
operator<<(const void *arg)ostreaminline
operator<<(pgm arg)ostreaminline
operator<<(const __FlashStringHelper *arg)ostreaminline
ostream()ostreaminline
outios_basestatic
pos_type typedefios_base
precision() const ios_baseinline
precision(unsigned int n)ios_baseinline
put(char ch)ostreaminline
rdstate() const iosinline
rightios_basestatic
seekdir enum nameios_base
seekp(pos_type pos)ostreaminline
seekp(off_type off, seekdir way)ostreaminline
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipwsios_basestatic
streamsize typedefios_base
tellp()ostreaminline
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
+ + + + diff --git a/html/class_arduino_out_stream.html b/html/class_arduino_out_stream.html new file mode 100644 index 0000000..c15d549 --- /dev/null +++ b/html/class_arduino_out_stream.html @@ -0,0 +1,2342 @@ + + + + + + +SdFat: ArduinoOutStream Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

Output stream for Arduino Print objects. + More...

+ +

#include <ArduinoStream.h>

+
+Inheritance diagram for ArduinoOutStream:
+
+
Inheritance graph
+ + +
[legend]
+
+Collaboration diagram for ArduinoOutStream:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + +

+Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, +cur, +end + }
 
typedef uint32_t streamsize
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ArduinoOutStream (Print &pr)
 
bool bad () const
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
ostreamflush ()
 
bool good () const
 
 operator const void * () const
 
bool operator! () const
 
ostreamoperator<< (ostream &(*pf)(ostream &str))
 
ostreamoperator<< (ios_base &(*pf)(ios_base &str))
 
ostreamoperator<< (bool arg)
 
ostreamoperator<< (const char *arg)
 
ostreamoperator<< (const signed char *arg)
 
ostreamoperator<< (const unsigned char *arg)
 
ostreamoperator<< (char arg)
 
ostreamoperator<< (signed char arg)
 
ostreamoperator<< (unsigned char arg)
 
ostreamoperator<< (double arg)
 
ostreamoperator<< (float arg)
 
ostreamoperator<< (short arg)
 
ostreamoperator<< (unsigned short arg)
 
ostreamoperator<< (int arg)
 
ostreamoperator<< (unsigned int arg)
 
ostreamoperator<< (long arg)
 
ostreamoperator<< (unsigned long arg)
 
ostreamoperator<< (const void *arg)
 
ostreamoperator<< (pgm arg)
 
ostreamoperator<< (const __FlashStringHelper *arg)
 
int precision () const
 
int precision (unsigned int n)
 
ostreamput (char ch)
 
iostate rdstate () const
 
ostreamseekp (pos_type pos)
 
ostreamseekp (off_type off, seekdir way)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
pos_type tellp ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
+ + + +

+Protected Member Functions

uint8_t flagsToBase ()
 
+

Detailed Description

+

Output stream for Arduino Print objects.

+

Member Typedef Documentation

+ +
+
+ + + + + +
+ + + + +
typedef unsigned int ios_base::fmtflags
+
+inherited
+
+

type for format flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef unsigned char ios_base::iostate
+
+inherited
+
+

typedef for iostate bitmask

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef int32_t ios_base::off_type
+
+inherited
+
+

type for relative seek offset

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint8_t ios_base::openmode
+
+inherited
+
+

typedef for iostream open mode

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::pos_type
+
+inherited
+
+

type for absolute seek position

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::streamsize
+
+inherited
+
+

unsigned size that can represent maximum file size. (violates spec - should be signed)

+ +
+
+

Member Enumeration Documentation

+ +
+
+ + + + + +
+ + + + +
enum ios_base::seekdir
+
+inherited
+
+

enumerated type for the direction of relative seeks

+ + + + +
Enumerator
beg  +

seek relative to the beginning of the stream

+
cur  +

seek relative to the current stream position

+
end  +

seek relative to the end of the stream

+
+ +
+
+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
ArduinoOutStream::ArduinoOutStream (Print & pr)
+
+inlineexplicit
+
+

constructor

+
Parameters
+ + +
[in]prPrint object for this ArduinoOutStream.
+
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
bool ios::bad () const
+
+inlineinherited
+
+
Returns
true if bad bit is set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::clear (iostate state = goodbit)
+
+inlineinherited
+
+

Clear iostate bits.

+
Parameters
+ + +
[in]stateThe flags you want to set after clearing all flags.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::eof () const
+
+inlineinherited
+
+
Returns
true if end of file has been reached else false.
+

Warning: An empty file returns false before the first read.

+

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::fail () const
+
+inlineinherited
+
+
Returns
true if any iostate bit other than eof are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
char ios_base::fill ()
+
+inlineinherited
+
+
Returns
fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
char ios_base::fill (char c)
+
+inlineinherited
+
+

Set fill character

+
Parameters
+ + +
[in]cnew fill character
+
+
+
Returns
old fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
fmtflags ios_base::flags () const
+
+inlineinherited
+
+
Returns
format flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::flags (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flag
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t ios_base::flagsToBase ()
+
+inlineprotectedinherited
+
+
Returns
current number base
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ostream& ostream::flush ()
+
+inlineinherited
+
+

Flushes the buffer associated with this stream. The flush function calls the sync function of the associated file.

+
Returns
A reference to the ostream object.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::good () const
+
+inlineinherited
+
+
Returns
True if no iostate flags are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ios::operator const void * () const
+
+inlineinherited
+
+
Returns
null pointer if fail() is true.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::operator! () const
+
+inlineinherited
+
+
Returns
true if fail() else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (ostream &(*)(ostream &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (ios_base &(*)(ios_base &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (bool arg)
+
+inlineinherited
+
+

Output bool

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const char * arg)
+
+inlineinherited
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const signed char * arg)
+
+inlineinherited
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const unsigned char * arg)
+
+inlineinherited
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (char arg)
+
+inlineinherited
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (signed char arg)
+
+inlineinherited
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned char arg)
+
+inlineinherited
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (double arg)
+
+inlineinherited
+
+

Output double

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (float arg)
+
+inlineinherited
+
+

Output float

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (short arg)
+
+inlineinherited
+
+

Output signed short

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned short arg)
+
+inlineinherited
+
+

Output unsigned short

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (int arg)
+
+inlineinherited
+
+

Output signed int

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned int arg)
+
+inlineinherited
+
+

Output unsigned int

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (long arg)
+
+inlineinherited
+
+

Output signed long

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned long arg)
+
+inlineinherited
+
+

Output unsigned long

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const void * arg)
+
+inlineinherited
+
+

Output pointer

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (pgm arg)
+
+inlineinherited
+
+

Output a string from flash using the pstr() macro

+
Parameters
+ + +
[in]argpgm struct pointing to string
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const __FlashStringHelper * arg)
+
+inlineinherited
+
+

Output a string from flash using the Arduino F() macro.

+
Parameters
+ + +
[in]argpointing to flash string
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int ios_base::precision () const
+
+inlineinherited
+
+
Returns
precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int ios_base::precision (unsigned int n)
+
+inlineinherited
+
+

set precision

+
Parameters
+ + +
[in]nnew precision
+
+
+
Returns
old precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::put (char ch)
+
+inlineinherited
+
+

Puts a character in a stream.

+

The unformatted output function inserts the element ch. It returns *this.

+
Parameters
+ + +
[in]chThe character
+
+
+
Returns
A reference to the ostream object.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
iostate ios::rdstate () const
+
+inlineinherited
+
+
Returns
The iostate flags for this file.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::seekp (pos_type pos)
+
+inlineinherited
+
+

Set the stream position

+
Parameters
+ + +
[in]posThe absolute position in which to move the write pointer.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
ostream& ostream::seekp (off_type off,
seekdir way 
)
+
+inlineinherited
+
+

Set the stream position.

+
Parameters
+ + + +
[in]offAn offset to move the write pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::setf (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flags to be or'ed in
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
+
+inlineinherited
+
+

modify format flags

+
Parameters
+ + + +
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::setstate (iostate state)
+
+inlineinherited
+
+

Set iostate bits.

+
Parameters
+ + +
[in]stateBitts to set.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
pos_type ostream::tellp ()
+
+inlineinherited
+
+
Returns
the stream position
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios_base::unsetf (fmtflags fl)
+
+inlineinherited
+
+

clear format flags

+
Parameters
+ + +
[in]flflags to be cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
unsigned ios_base::width ()
+
+inlineinherited
+
+
Returns
width
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
unsigned ios_base::width (unsigned n)
+
+inlineinherited
+
+

set width

+
Parameters
+ + +
[in]nnew width
+
+
+
Returns
old width
+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::adjustfield = left | right | internal
+
+staticinherited
+
+

mask for adjustfield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::app = 0X4
+
+staticinherited
+
+

seek to end before each write

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::ate = 0X8
+
+staticinherited
+
+

open and seek to end immediately after opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::badbit = 0X01
+
+staticinherited
+
+

iostate bad bit for a nonrecoverable error.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::basefield = dec | hex | oct
+
+staticinherited
+
+

mask for basefield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::binary = 0X10
+
+staticinherited
+
+

perform input and output in binary mode (as opposed to text mode)

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::boolalpha = 0x0100
+
+staticinherited
+
+

use strings true/false for bool

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::dec = 0x0008
+
+staticinherited
+
+

base 10 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::eofbit = 0x02
+
+staticinherited
+
+

iostate bit for end of file reached

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::failbit = 0X04
+
+staticinherited
+
+

iostate fail bit for nonfatal error

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::goodbit = 0x00
+
+staticinherited
+
+

iostate for no flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::hex = 0x0010
+
+staticinherited
+
+

base 16 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::in = 0X20
+
+staticinherited
+
+

open for input

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::internal = 0x0004
+
+staticinherited
+
+

fill between sign/base prefix and number

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::left = 0x0001
+
+staticinherited
+
+

left adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::oct = 0x0020
+
+staticinherited
+
+

base 8 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::out = 0X40
+
+staticinherited
+
+

open for output

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::right = 0x0002
+
+staticinherited
+
+

right adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showbase = 0x0200
+
+staticinherited
+
+

use prefix 0X for hex and 0 for oct

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpoint = 0x0400
+
+staticinherited
+
+

always show '.' for floating numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpos = 0x0800
+
+staticinherited
+
+

show + sign for nonnegative numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::skipws = 0x1000
+
+staticinherited
+
+

skip initial white space

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::trunc = 0X80
+
+staticinherited
+
+

truncate an existing stream when opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::uppercase = 0x4000
+
+staticinherited
+
+

use uppercase letters in number representations

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/html/class_arduino_out_stream__coll__graph.png b/html/class_arduino_out_stream__coll__graph.png new file mode 100644 index 0000000..97a213b Binary files /dev/null and b/html/class_arduino_out_stream__coll__graph.png differ diff --git a/html/class_arduino_out_stream__inherit__graph.png b/html/class_arduino_out_stream__inherit__graph.png new file mode 100644 index 0000000..97a213b Binary files /dev/null and b/html/class_arduino_out_stream__inherit__graph.png differ diff --git a/html/class_minimum_serial-members.html b/html/class_minimum_serial-members.html new file mode 100644 index 0000000..d3b33b2 --- /dev/null +++ b/html/class_minimum_serial-members.html @@ -0,0 +1,64 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
MinimumSerial Member List
+
+
+ +

This is the complete list of members for MinimumSerial, including all inherited members.

+ + + + +
begin(uint32_t baud)MinimumSerial
read()MinimumSerial
write(uint8_t b)MinimumSerial
+ + + + diff --git a/html/class_minimum_serial.html b/html/class_minimum_serial.html new file mode 100644 index 0000000..4c3b08b --- /dev/null +++ b/html/class_minimum_serial.html @@ -0,0 +1,161 @@ + + + + + + +SdFat: MinimumSerial Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+ +
+
MinimumSerial Class Reference
+
+
+ +

mini serial class for the SdFat library. + More...

+ +

#include <MinimumSerial.h>

+
+Inheritance diagram for MinimumSerial:
+
+
Inheritance graph
+ + +
[legend]
+
+Collaboration diagram for MinimumSerial:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + +

+Public Member Functions

void begin (uint32_t baud)
 
int read ()
 
size_t write (uint8_t b)
 
+

Detailed Description

+

mini serial class for the SdFat library.

+

Member Function Documentation

+ +
+
+ + + + + + + + +
void MinimumSerial::begin (uint32_t baud)
+
+

Set baud rate for serial port zero and enable in non interrupt mode. Do not call this function if you use another serial library.

+
Parameters
+ + +
[in]baudrate
+
+
+ +
+
+ +
+
+ + + + + + + +
int MinimumSerial::read ()
+
+

Unbuffered read

+
Returns
-1 if no character is available or an available character.
+ +
+
+ +
+
+ + + + + + + + +
size_t MinimumSerial::write (uint8_t b)
+
+

Unbuffered write

+
Parameters
+ + +
[in]bbyte to write.
+
+
+
Returns
1
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/html/class_minimum_serial__coll__graph.png b/html/class_minimum_serial__coll__graph.png new file mode 100644 index 0000000..1121af8 Binary files /dev/null and b/html/class_minimum_serial__coll__graph.png differ diff --git a/html/class_minimum_serial__inherit__graph.png b/html/class_minimum_serial__inherit__graph.png new file mode 100644 index 0000000..1121af8 Binary files /dev/null and b/html/class_minimum_serial__inherit__graph.png differ diff --git a/html/class_sd2_card-members.html b/html/class_sd2_card-members.html new file mode 100644 index 0000000..69e4dfb --- /dev/null +++ b/html/class_sd2_card-members.html @@ -0,0 +1,83 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
Sd2Card Member List
+
+
+ +

This is the complete list of members for Sd2Card, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + +
begin(uint8_t chipSelectPin=SD_CHIP_SELECT_PIN, uint8_t sckDivisor=SPI_FULL_SPEED)Sd2Card
cardSize()Sd2Card
erase(uint32_t firstBlock, uint32_t lastBlock)Sd2Card
eraseSingleBlockEnable()Sd2Card
error(uint8_t code)Sd2Cardinline
errorCode() const Sd2Cardinline
errorData() const Sd2Cardinline
init(uint8_t sckDivisor=SPI_FULL_SPEED, uint8_t chipSelectPin=SD_CHIP_SELECT_PIN)Sd2Cardinline
isBusy()Sd2Card
readBlock(uint32_t block, uint8_t *dst)Sd2Card
readCID(cid_t *cid)Sd2Cardinline
readCSD(csd_t *csd)Sd2Cardinline
readData(uint8_t *dst)Sd2Card
readStart(uint32_t blockNumber)Sd2Card
readStop()Sd2Card
sckDivisor()Sd2Cardinline
Sd2Card()Sd2Cardinline
type() const Sd2Cardinline
writeBlock(uint32_t blockNumber, const uint8_t *src)Sd2Card
writeData(const uint8_t *src)Sd2Card
writeStart(uint32_t blockNumber, uint32_t eraseCount)Sd2Card
writeStop()Sd2Card
+ + + + diff --git a/html/class_sd2_card.html b/html/class_sd2_card.html new file mode 100644 index 0000000..954ea43 --- /dev/null +++ b/html/class_sd2_card.html @@ -0,0 +1,717 @@ + + + + + + +SdFat: Sd2Card Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+ +
+
Sd2Card Class Reference
+
+
+ +

Raw access to SD and SDHC flash memory cards. + More...

+ +

#include <Sd2Card.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

bool begin (uint8_t chipSelectPin=SD_CHIP_SELECT_PIN, uint8_t sckDivisor=SPI_FULL_SPEED)
 
uint32_t cardSize ()
 
bool erase (uint32_t firstBlock, uint32_t lastBlock)
 
bool eraseSingleBlockEnable ()
 
void error (uint8_t code)
 
int errorCode () const
 
int errorData () const
 
bool init (uint8_t sckDivisor=SPI_FULL_SPEED, uint8_t chipSelectPin=SD_CHIP_SELECT_PIN)
 
bool isBusy ()
 
bool readBlock (uint32_t block, uint8_t *dst)
 
bool readCID (cid_t *cid)
 
bool readCSD (csd_t *csd)
 
bool readData (uint8_t *dst)
 
bool readStart (uint32_t blockNumber)
 
bool readStop ()
 
uint8_t sckDivisor ()
 
 Sd2Card ()
 
int type () const
 
bool writeBlock (uint32_t blockNumber, const uint8_t *src)
 
bool writeData (const uint8_t *src)
 
bool writeStart (uint32_t blockNumber, uint32_t eraseCount)
 
bool writeStop ()
 
+

Detailed Description

+

Raw access to SD and SDHC flash memory cards.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + +
Sd2Card::Sd2Card ()
+
+inline
+
+

Construct an instance of Sd2Card.

+ +
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
bool Sd2Card::begin (uint8_t chipSelectPin = SD_CHIP_SELECT_PIN,
uint8_t sckDivisor = SPI_FULL_SPEED 
)
+
+

Initialize an SD flash memory card.

+
Parameters
+ + + +
[in]chipSelectPinSD chip select pin number.
[in]sckDivisorSPI SCK clock rate divisor.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. The reason for failure can be determined by calling errorCode() and errorData().
+ +
+
+ +
+
+ + + + + + + +
uint32_t Sd2Card::cardSize ()
+
+

Determine the size of an SD flash memory card.

+
Returns
The number of 512 byte data blocks in the card or zero if an error occurs.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool Sd2Card::erase (uint32_t firstBlock,
uint32_t lastBlock 
)
+
+

Erase a range of blocks.

+
Parameters
+ + + +
[in]firstBlockThe address of the first block in the range.
[in]lastBlockThe address of the last block in the range.
+
+
+
Note
This function requests the SD card to do a flash erase for a range of blocks. The data on the card after an erase operation is either 0 or 1, depends on the card vendor. The card must support single block erase.
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + +
bool Sd2Card::eraseSingleBlockEnable ()
+
+

Determine if card supports single block erase.

+
Returns
The value one, true, is returned if single block erase is supported. The value zero, false, is returned if single block erase is not supported.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void Sd2Card::error (uint8_t code)
+
+inline
+
+

Set SD error code.

+
Parameters
+ + +
[in]codevalue for error code.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int Sd2Card::errorCode () const
+
+inline
+
+
Returns
error code for last error. See Sd2Card.h for a list of error codes.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int Sd2Card::errorData () const
+
+inline
+
+
Returns
error data for last error.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool Sd2Card::init (uint8_t sckDivisor = SPI_FULL_SPEED,
uint8_t chipSelectPin = SD_CHIP_SELECT_PIN 
)
+
+inline
+
+

Initialize an SD flash memory card.

+
Parameters
+ + + +
[in]chipSelectPinSD chip select pin number.
[in]sckDivisorSPI SCK clock rate divisor.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. The reason for failure can be determined by calling errorCode() and errorData().
+ +
+
+ +
+
+ + + + + + + +
bool Sd2Card::isBusy ()
+
+

Check for busy. MISO low indicates the card is busy.

+
Returns
true if busy else false.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool Sd2Card::readBlock (uint32_t blockNumber,
uint8_t * dst 
)
+
+

Read a 512 byte block from an SD card.

+
Parameters
+ + + +
[in]blockNumberLogical block to be read.
[out]dstPointer to the location that will receive the data.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool Sd2Card::readCID (cid_t * cid)
+
+inline
+
+

Read a card's CID register. The CID contains card identification information such as Manufacturer ID, Product name, Product serial number and Manufacturing date.

+
Parameters
+ + +
[out]cidpointer to area for returned data.
+
+
+
Returns
true for success or false for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool Sd2Card::readCSD (csd_t * csd)
+
+inline
+
+

Read a card's CSD register. The CSD contains Card-Specific Data that provides information regarding access to the card's contents.

+
Parameters
+ + +
[out]csdpointer to area for returned data.
+
+
+
Returns
true for success or false for failure.
+ +
+
+ +
+
+ + + + + + + + +
bool Sd2Card::readData (uint8_t * dst)
+
+

Read one data block in a multiple block read sequence

+
Parameters
+ + +
[in]dstPointer to the location for the data to be read.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + + +
bool Sd2Card::readStart (uint32_t blockNumber)
+
+

Start a read multiple blocks sequence.

+
Parameters
+ + +
[in]blockNumberAddress of first block in sequence.
+
+
+
Note
This function is used with readData() and readStop() for optimized multiple block reads. SPI chipSelect must be low for the entire sequence.
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + +
bool Sd2Card::readStop ()
+
+

End a read multiple blocks sequence.

+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t Sd2Card::sckDivisor ()
+
+inline
+
+

Return SCK divisor.

+
Returns
Requested SCK divisor.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int Sd2Card::type () const
+
+inline
+
+

Return the card type: SD V1, SD V2 or SDHC

+
Returns
0 - SD V1, 1 - SD V2, or 3 - SDHC.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool Sd2Card::writeBlock (uint32_t blockNumber,
const uint8_t * src 
)
+
+

Writes a 512 byte block to an SD card.

+
Parameters
+ + + +
[in]blockNumberLogical block to be written.
[in]srcPointer to the location of the data to be written.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + + +
bool Sd2Card::writeData (const uint8_t * src)
+
+

Write one data block in a multiple block write sequence

+
Parameters
+ + +
[in]srcPointer to the location of the data to be written.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool Sd2Card::writeStart (uint32_t blockNumber,
uint32_t eraseCount 
)
+
+

Start a write multiple blocks sequence.

+
Parameters
+ + + +
[in]blockNumberAddress of first block in sequence.
[in]eraseCountThe number of blocks to be pre-erased.
+
+
+
Note
This function is used with writeData() and writeStop() for optimized multiple block writes.
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + +
bool Sd2Card::writeStop ()
+
+

End a write multiple blocks sequence.

+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/html/class_sd_base_file-members.html b/html/class_sd_base_file-members.html new file mode 100644 index 0000000..8df254b --- /dev/null +++ b/html/class_sd_base_file-members.html @@ -0,0 +1,131 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
SdBaseFile Member List
+
+
+ +

This is the complete list of members for SdBaseFile, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
available()SdBaseFileinline
clearWriteError()SdBaseFileinline
close()SdBaseFile
contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock)SdBaseFile
createContiguous(SdBaseFile *dirFile, const char *path, uint32_t size)SdBaseFile
curCluster() const SdBaseFileinline
curPosition() const SdBaseFileinline
cwd()SdBaseFileinlinestatic
dateTimeCallback(void(*dateTime)(uint16_t *date, uint16_t *time))SdBaseFileinlinestatic
dateTimeCallbackCancel()SdBaseFileinlinestatic
dirEntry(dir_t *dir)SdBaseFile
dirName(const dir_t &dir, char *name)SdBaseFilestatic
exists(const char *name)SdBaseFile
fgets(char *str, int16_t num, char *delim=0)SdBaseFile
fileSize() const SdBaseFileinline
firstCluster() const SdBaseFileinline
getFilename(char *name)SdBaseFile
getpos(FatPos_t *pos)SdBaseFile
getWriteError()SdBaseFileinline
isDir() const SdBaseFileinline
isFile() const SdBaseFileinline
isOpen() const SdBaseFileinline
isRoot() const SdBaseFileinline
isSubDir() const SdBaseFileinline
ls(Print *pr, uint8_t flags=0, uint8_t indent=0)SdBaseFile
ls(uint8_t flags=0)SdBaseFile
mkdir(SdBaseFile *dir, const char *path, bool pFlag=true)SdBaseFile
open(SdBaseFile *dirFile, uint16_t index, uint8_t oflag)SdBaseFile
open(SdBaseFile *dirFile, const char *path, uint8_t oflag)SdBaseFile
open(const char *path, uint8_t oflag=O_READ)SdBaseFile
openNext(SdBaseFile *dirFile, uint8_t oflag)SdBaseFile
openRoot(SdVolume *vol)SdBaseFile
peek()SdBaseFile
printCreateDateTime(Print *pr)SdBaseFile
printFatDate(uint16_t fatDate)SdBaseFilestatic
printFatDate(Print *pr, uint16_t fatDate)SdBaseFilestatic
printFatTime(uint16_t fatTime)SdBaseFilestatic
printFatTime(Print *pr, uint16_t fatTime)SdBaseFilestatic
printField(int16_t value, char term)SdBaseFile
printField(uint16_t value, char term)SdBaseFile
printField(int32_t value, char term)SdBaseFile
printField(uint32_t value, char term)SdBaseFile
printFileSize(Print *pr)SdBaseFile
printModifyDateTime(Print *pr)SdBaseFile
printName()SdBaseFile
printName(Print *pr)SdBaseFile
read()SdBaseFile
read(void *buf, size_t nbyte)SdBaseFile
readDir(dir_t *dir)SdBaseFile
remove(SdBaseFile *dirFile, const char *path)SdBaseFilestatic
remove()SdBaseFile
rename(SdBaseFile *dirFile, const char *newPath)SdBaseFile
rewind()SdBaseFileinline
rmdir()SdBaseFile
rmRfStar()SdBaseFile
SdBaseFile()SdBaseFileinline
SdBaseFile(const char *path, uint8_t oflag)SdBaseFile
SdFat classSdBaseFilefriend
seekCur(int32_t offset)SdBaseFileinline
seekEnd(int32_t offset=0)SdBaseFileinline
seekSet(uint32_t pos)SdBaseFile
setpos(FatPos_t *pos)SdBaseFile
sync()SdBaseFile
timestamp(SdBaseFile *file)SdBaseFile
timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)SdBaseFile
truncate(uint32_t size)SdBaseFile
type() const SdBaseFileinline
volume() const SdBaseFileinline
write(const void *buf, size_t nbyte)SdBaseFile
writeErrorSdBaseFile
+ + + + diff --git a/html/class_sd_base_file.html b/html/class_sd_base_file.html new file mode 100644 index 0000000..7d090d8 --- /dev/null +++ b/html/class_sd_base_file.html @@ -0,0 +1,2293 @@ + + + + + + +SdFat: SdBaseFile Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

Base class for SdFile with Print and C++ streams. + More...

+ +

#include <SdBaseFile.h>

+
+Inheritance diagram for SdBaseFile:
+
+
Inheritance graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

uint32_t available ()
 
void clearWriteError ()
 
bool close ()
 
bool contiguousRange (uint32_t *bgnBlock, uint32_t *endBlock)
 
bool createContiguous (SdBaseFile *dirFile, const char *path, uint32_t size)
 
uint32_t curCluster () const
 
uint32_t curPosition () const
 
bool dirEntry (dir_t *dir)
 
bool exists (const char *name)
 
int16_t fgets (char *str, int16_t num, char *delim=0)
 
uint32_t fileSize () const
 
uint32_t firstCluster () const
 
bool getFilename (char *name)
 
void getpos (FatPos_t *pos)
 
bool getWriteError ()
 
bool isDir () const
 
bool isFile () const
 
bool isOpen () const
 
bool isRoot () const
 
bool isSubDir () const
 
void ls (Print *pr, uint8_t flags=0, uint8_t indent=0)
 
void ls (uint8_t flags=0)
 
bool mkdir (SdBaseFile *dir, const char *path, bool pFlag=true)
 
bool open (SdBaseFile *dirFile, uint16_t index, uint8_t oflag)
 
bool open (SdBaseFile *dirFile, const char *path, uint8_t oflag)
 
bool open (const char *path, uint8_t oflag=O_READ)
 
bool openNext (SdBaseFile *dirFile, uint8_t oflag)
 
bool openRoot (SdVolume *vol)
 
int peek ()
 
bool printCreateDateTime (Print *pr)
 
int printField (int16_t value, char term)
 
int printField (uint16_t value, char term)
 
int printField (int32_t value, char term)
 
int printField (uint32_t value, char term)
 
size_t printFileSize (Print *pr)
 
bool printModifyDateTime (Print *pr)
 
size_t printName ()
 
size_t printName (Print *pr)
 
int16_t read ()
 
int read (void *buf, size_t nbyte)
 
int8_t readDir (dir_t *dir)
 
bool remove ()
 
bool rename (SdBaseFile *dirFile, const char *newPath)
 
void rewind ()
 
bool rmdir ()
 
bool rmRfStar ()
 
 SdBaseFile ()
 
 SdBaseFile (const char *path, uint8_t oflag)
 
bool seekCur (int32_t offset)
 
bool seekEnd (int32_t offset=0)
 
bool seekSet (uint32_t pos)
 
void setpos (FatPos_t *pos)
 
bool sync ()
 
bool timestamp (SdBaseFile *file)
 
bool timestamp (uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
 
bool truncate (uint32_t size)
 
uint8_t type () const
 
SdVolumevolume () const
 
int write (const void *buf, size_t nbyte)
 
+ + + + + + + + + + + + + + + + + + + +

+Static Public Member Functions

static SdBaseFilecwd ()
 
static void dateTimeCallback (void(*dateTime)(uint16_t *date, uint16_t *time))
 
static void dateTimeCallbackCancel ()
 
static void dirName (const dir_t &dir, char *name)
 
static void printFatDate (uint16_t fatDate)
 
static void printFatDate (Print *pr, uint16_t fatDate)
 
static void printFatTime (uint16_t fatTime)
 
static void printFatTime (Print *pr, uint16_t fatTime)
 
static bool remove (SdBaseFile *dirFile, const char *path)
 
+ + + +

+Public Attributes

bool writeError
 
+ + + +

+Friends

class SdFat
 
+

Detailed Description

+

Base class for SdFile with Print and C++ streams.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + +
SdBaseFile::SdBaseFile ()
+
+inline
+
+

Create an instance.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
SdBaseFile::SdBaseFile (const char * path,
uint8_t oflag 
)
+
+

Create a file object and open it in the current working directory.

+
Parameters
+ + + +
[in]pathA path with a valid 8.3 DOS name for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of open flags. see SdBaseFile::open(SdBaseFile*, const char*, uint8_t).
+
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdBaseFile::available ()
+
+inline
+
+
Returns
number of bytes available from yhe current position to EOF
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void SdBaseFile::clearWriteError ()
+
+inline
+
+

Set writeError to zero

+ +
+
+ +
+
+ + + + + + + +
bool SdBaseFile::close ()
+
+

Close a file and force cached data and directory information to be written to the storage device.

+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include no file is open or an I/O error.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool SdBaseFile::contiguousRange (uint32_t * bgnBlock,
uint32_t * endBlock 
)
+
+

Check for contiguous file and return its raw block range.

+
Parameters
+ + + +
[out]bgnBlockthe first block address for the file.
[out]endBlockthe last block address for the file.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include file is not contiguous, file has zero length or an I/O error occurred.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool SdBaseFile::createContiguous (SdBaseFiledirFile,
const char * path,
uint32_t size 
)
+
+

Create and open a new contiguous file of a specified size.

+
Note
This function only supports short DOS 8.3 names. See open() for more information.
+
Parameters
+ + + + +
[in]dirFileThe directory where the file will be created.
[in]pathA path with a valid DOS 8.3 file name.
[in]sizeThe desired file size.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include path contains an invalid DOS 8.3 file name, the FAT volume has not been initialized, a file is already open, the file already exists, the root directory is full or an I/O error.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdBaseFile::curCluster () const
+
+inline
+
+
Returns
The current cluster number for a file or directory.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdBaseFile::curPosition () const
+
+inline
+
+
Returns
The current position for a file or directory.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static SdBaseFile* SdBaseFile::cwd ()
+
+inlinestatic
+
+
Returns
Current working directory
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void SdBaseFile::dateTimeCallback (void(*)(uint16_t *date, uint16_t *time) dateTime)
+
+inlinestatic
+
+

Set the date/time callback function

+
Parameters
+ + +
[in]dateTimeThe user's call back function. The callback function is of the form:
+
+
+
void dateTime(uint16_t* date, uint16_t* time) {
+
uint16_t year;
+
uint8_t month, day, hour, minute, second;
+
+
// User gets date and time from GPS or real-time clock here
+
+
// return date using FAT_DATE macro to format fields
+
*date = FAT_DATE(year, month, day);
+
+
// return time using FAT_TIME macro to format fields
+
*time = FAT_TIME(hour, minute, second);
+
}
+

Sets the function that is called when a file is created or when a file's directory entry is modified by sync(). All timestamps, access, creation, and modify, are set when a file is created. sync() maintains the last access date and last modify date/time.

+

See the timestamp() function.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static void SdBaseFile::dateTimeCallbackCancel ()
+
+inlinestatic
+
+

Cancel the date/time callback function.

+ +
+
+ +
+
+ + + + + + + + +
bool SdBaseFile::dirEntry (dir_t * dir)
+
+

Return a file's directory entry.

+
Parameters
+ + +
[out]dirLocation for return of the file's directory entry.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void SdBaseFile::dirName (const dir_t & dir,
char * name 
)
+
+static
+
+

Format the name field of dir into the 13 byte array name in standard 8.3 short name format.

+
Parameters
+ + + +
[in]dirThe directory structure containing the name.
[out]nameA 13 byte char array for the formatted name.
+
+
+ +
+
+ +
+
+ + + + + + + + +
bool SdBaseFile::exists (const char * name)
+
+

Test for the existence of a file in a directory

+
Parameters
+ + +
[in]nameName of the file to be tested for.
+
+
+

The calling instance must be an open directory file.

+

dirFile.exists("TOFIND.TXT") searches for "TOFIND.TXT" in the directory dirFile.

+
Returns
true if the file exists else false.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
int16_t SdBaseFile::fgets (char * str,
int16_t num,
char * delim = 0 
)
+
+

Get a string from a file.

+

fgets() reads bytes from a file into the array pointed to by str, until num - 1 bytes are read, or a delimiter is read and transferred to str, or end-of-file is encountered. The string is then terminated with a null byte.

+

fgets() deletes CR, '\r', from the string. This insures only a '\n' terminates the string for Windows text files which use CRLF for newline.

+
Parameters
+ + + + +
[out]strPointer to the array where the string is stored.
[in]numMaximum number of characters to be read (including the final null byte). Usually the length of the array str is used.
[in]delimOptional set of delimiters. The default is "\n".
+
+
+
Returns
For success fgets() returns the length of the string in str. If no data is read, fgets() returns zero for EOF or -1 if an error occurred.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdBaseFile::fileSize () const
+
+inline
+
+
Returns
The total number of bytes in a file or directory.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdBaseFile::firstCluster () const
+
+inline
+
+
Returns
The first cluster number for a file or directory.
+ +
+
+ +
+
+ + + + + + + + +
bool SdBaseFile::getFilename (char * name)
+
+

Get a file's name

+
Parameters
+ + +
[out]nameAn array of 13 characters for the file's name.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + + +
void SdBaseFile::getpos (FatPos_tpos)
+
+

get position for streams

+
Parameters
+ + +
[out]posstruct to receive position
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::getWriteError ()
+
+inline
+
+
Returns
value of writeError
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::isDir () const
+
+inline
+
+
Returns
True if this is a directory else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::isFile () const
+
+inline
+
+
Returns
True if this is a normal file else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::isOpen () const
+
+inline
+
+
Returns
True if this is an open file/directory else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::isRoot () const
+
+inline
+
+
Returns
True if this is the root directory.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::isSubDir () const
+
+inline
+
+
Returns
True if this is a subdirectory else false.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void SdBaseFile::ls (Print * pr,
uint8_t flags = 0,
uint8_t indent = 0 
)
+
+

List directory contents.

+
Parameters
+ + + +
[in]prPrint stream for list.
[in]flagsThe inclusive OR of
+
+
+

LS_DATE - Print file modification date

+

LS_SIZE - Print file size.

+

LS_R - Recursive list of subdirectories.

+
Parameters
+ + +
[in]indentAmount of space before file name. Used for recursive list to indicate subdirectory level.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void SdBaseFile::ls (uint8_t flags = 0)
+
+

List directory contents to stdOut.

+
Parameters
+ + +
[in]flagsThe inclusive OR of
+
+
+

LS_DATE - Print file modification date

+

LS_SIZE - Print file size.

+

LS_R - Recursive list of subdirectories.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool SdBaseFile::mkdir (SdBaseFileparent,
const char * path,
bool pFlag = true 
)
+
+

Make a new directory.

+
Parameters
+ + + + +
[in]parentAn open SdFat instance for the directory that will contain the new directory.
[in]pathA path with a valid 8.3 DOS name for the new directory.
[in]pFlagCreate missing parent directories if true.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include this file is already open, parent is not a directory, path is invalid or already exists in parent.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool SdBaseFile::open (SdBaseFiledirFile,
uint16_t index,
uint8_t oflag 
)
+
+

Open a file by index.

+
Parameters
+ + + + +
[in]dirFileAn open SdFat instance for the directory.
[in]indexThe index of the directory entry for the file to be opened. The value for index is (directory file position)/32.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC.
+
+
+

See open() by path for definition of flags.

+
Returns
true for success or false for failure.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool SdBaseFile::open (SdBaseFiledirFile,
const char * path,
uint8_t oflag 
)
+
+

Open a file or directory by name.

+
Parameters
+ + + + +
[in]dirFileAn open SdFat instance for the directory containing the file to be opened.
[in]pathA path with a valid 8.3 DOS name for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of flags from the following list
+
+
+

O_READ - Open for reading.

+

O_RDONLY - Same as O_READ.

+

O_WRITE - Open for writing.

+

O_WRONLY - Same as O_WRITE.

+

O_RDWR - Open for reading and writing.

+

O_APPEND - If set, the file offset shall be set to the end of the file prior to each write.

+

O_AT_END - Set the initial position at the end of the file.

+

O_CREAT - If the file exists, this flag has no effect except as noted under O_EXCL below. Otherwise, the file shall be created

+

O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists.

+

O_SYNC - Call sync() after each write. This flag should not be used with write(uint8_t), write_P(PGM_P), writeln_P(PGM_P), or the Arduino Print class. These functions do character at a time writes so sync() will be called after each byte.

+

O_TRUNC - If the file exists and is a regular file, and the file is successfully opened and is not read only, its length shall be truncated to 0.

+

WARNING: A given file must not be opened by more than one SdBaseFile object of file corruption may occur.

+
Note
Directory files must be opened read only. Write and truncation is not allowed for directory files.
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include this file is already open, dirFile is not a directory, path is invalid, the file does not exist or can't be opened in the access mode specified by oflag.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool SdBaseFile::open (const char * path,
uint8_t oflag = O_READ 
)
+
+

Open a file in the current working directory.

+
Parameters
+ + + +
[in]pathA path with a valid 8.3 DOS name for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of open flags. see SdBaseFile::open(SdBaseFile*, const char*, uint8_t).
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool SdBaseFile::openNext (SdBaseFiledirFile,
uint8_t oflag 
)
+
+

Open the next file or subdirectory in a directory.

+
Parameters
+ + + +
[in]dirFileAn open SdFat instance for the directory containing the file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC.
+
+
+

See open() by path for definition of flags.

+
Returns
true for success or false for failure.
+ +
+
+ +
+
+ + + + + + + + +
bool SdBaseFile::openRoot (SdVolumevol)
+
+

Open a volume's root directory.

+
Parameters
+ + +
[in]volThe FAT volume containing the root directory to be opened.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include the file is already open, the FAT volume has not been initialized or it a FAT12 volume.
+ +
+
+ +
+
+ + + + + + + +
int SdBaseFile::peek ()
+
+

Return the next available byte without consuming it.

+
Returns
The byte if no error and not at eof else -1;
+ +
+
+ +
+
+ + + + + + + + +
bool SdBaseFile::printCreateDateTime (Print * pr)
+
+

Print a file's creation date and time

+
Parameters
+ + +
[in]prPrint stream for output.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void SdBaseFile::printFatDate (uint16_t fatDate)
+
+static
+
+

Print a directory date field to stdOut.

+

Format is yyyy-mm-dd.

+
Parameters
+ + +
[in]fatDateThe date field from a directory entry.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void SdBaseFile::printFatDate (Print * pr,
uint16_t fatDate 
)
+
+static
+
+

Print a directory date field.

+

Format is yyyy-mm-dd.

+
Parameters
+ + + +
[in]prPrint stream for output.
[in]fatDateThe date field from a directory entry.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void SdBaseFile::printFatTime (uint16_t fatTime)
+
+static
+
+

Print a directory time field to stdOut.

+

Format is hh:mm:ss.

+
Parameters
+ + +
[in]fatTimeThe time field from a directory entry.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void SdBaseFile::printFatTime (Print * pr,
uint16_t fatTime 
)
+
+static
+
+

Print a directory time field.

+

Format is hh:mm:ss.

+
Parameters
+ + + +
[in]prPrint stream for output.
[in]fatTimeThe time field from a directory entry.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int SdBaseFile::printField (int16_t value,
char term 
)
+
+

Print a number followed by a field terminator.

+
Parameters
+ + + +
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int SdBaseFile::printField (uint16_t value,
char term 
)
+
+

Print a number followed by a field terminator.

+
Parameters
+ + + +
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int SdBaseFile::printField (int32_t value,
char term 
)
+
+

Print a number followed by a field terminator.

+
Parameters
+ + + +
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int SdBaseFile::printField (uint32_t value,
char term 
)
+
+

Print a number followed by a field terminator.

+
Parameters
+ + + +
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + + + + +
size_t SdBaseFile::printFileSize (Print * pr)
+
+ +
+
+ +
+
+ + + + + + + + +
bool SdBaseFile::printModifyDateTime (Print * pr)
+
+

Print a file's modify date and time

+
Parameters
+ + +
[in]prPrint stream for output.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + +
size_t SdBaseFile::printName ()
+
+

Print a file's name to stdOut

+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + + +
size_t SdBaseFile::printName (Print * pr)
+
+

Print a file's name

+
Parameters
+ + +
[in]prPrint stream for output.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + +
int16_t SdBaseFile::read ()
+
+

Read the next byte from a file.

+
Returns
For success read returns the next byte in the file as an int. If an error occurs or end of file is reached -1 is returned.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int SdBaseFile::read (void * buf,
size_t nbyte 
)
+
+

Read data from a file starting at the current position.

+
Parameters
+ + + +
[out]bufPointer to the location that will receive the data.
[in]nbyteMaximum number of bytes to read.
+
+
+
Returns
For success read() returns the number of bytes read. A value less than nbyte, including zero, will be returned if end of file is reached. If an error occurs, read() returns -1. Possible errors include read() called before a file has been opened, corrupt file system or an I/O error occurred.
+ +
+
+ +
+
+ + + + + + + + +
int8_t SdBaseFile::readDir (dir_t * dir)
+
+

Read the next directory entry from a directory file.

+
Parameters
+ + +
[out]dirThe dir_t struct that will receive the data.
+
+
+
Returns
For success readDir() returns the number of bytes read. A value of zero will be returned if end of file is reached. If an error occurs, readDir() returns -1. Possible errors include readDir() called before a directory has been opened, this is not a directory file or an I/O error occurred.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool SdBaseFile::remove (SdBaseFiledirFile,
const char * path 
)
+
+static
+
+

Remove a file.

+

The directory entry and all data for the file are deleted.

+
Parameters
+ + + +
[in]dirFileThe directory that contains the file.
[in]pathPath for the file to be removed.
+
+
+
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include the file is a directory, is read only, dirFile is not a directory, path is not found or an I/O error occurred.
+ +
+
+ +
+
+ + + + + + + +
bool SdBaseFile::remove ()
+
+

Remove a file.

+

The directory entry and all data for the file are deleted.

+
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include the file read-only, is a directory, or an I/O error occurred.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool SdBaseFile::rename (SdBaseFiledirFile,
const char * newPath 
)
+
+

Rename a file or subdirectory.

+
Parameters
+ + + +
[in]dirFileDirectory for the new path.
[in]newPathNew path name for the file/directory.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include dirFile is not open or is not a directory file, newPath is invalid or already exists, or an I/O error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void SdBaseFile::rewind ()
+
+inline
+
+

Set the file's current position to zero.

+ +
+
+ +
+
+ + + + + + + +
bool SdBaseFile::rmdir ()
+
+

Remove a directory file.

+

The directory file will be removed only if it is empty and is not the root directory. rmdir() follows DOS and Windows and ignores the read-only attribute for the directory.

+
Note
This function should not be used to delete the 8.3 version of a directory that has a long name. For example if a directory has the long name "New folder" you should not delete the 8.3 name "NEWFOL~1".
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include the file is not a directory, is the root directory, is not empty, or an I/O error occurred.
+ +
+
+ +
+
+ + + + + + + +
bool SdBaseFile::rmRfStar ()
+
+

Recursively delete a directory and all contained files.

+

This is like the Unix/Linux 'rm -rf *' if called with the root directory hence the name.

+

Warning - This will remove all contents of the directory including subdirectories. The directory will then be removed if it is not root. The read-only attribute for files will be ignored.

+
Note
This function should not be used to delete the 8.3 version of a directory that has a long name. See remove() and rmdir().
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::seekCur (int32_t offset)
+
+inline
+
+

Set the files position to current position + pos. See seekSet().

+
Parameters
+ + +
[in]offsetThe new position in bytes from the current position.
+
+
+
Returns
true for success or false for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::seekEnd (int32_t offset = 0)
+
+inline
+
+

Set the files position to end-of-file + offset. See seekSet().

+
Parameters
+ + +
[in]offsetThe new position in bytes from end-of-file.
+
+
+
Returns
true for success or false for failure.
+ +
+
+ +
+
+ + + + + + + + +
bool SdBaseFile::seekSet (uint32_t pos)
+
+

Sets a file's position.

+
Parameters
+ + +
[in]posThe new position in bytes from the beginning of the file.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + + +
void SdBaseFile::setpos (FatPos_tpos)
+
+

set position for streams

+
Parameters
+ + +
[out]posstruct with value for new position
+
+
+ +
+
+ +
+
+ + + + + + + +
bool SdBaseFile::sync ()
+
+

The sync() call causes all modified data and directory fields to be written to the storage device.

+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include a call to sync() before a file has been opened or an I/O error.
+ +
+
+ +
+
+ + + + + + + + +
bool SdBaseFile::timestamp (SdBaseFilefile)
+
+

Copy a file's timestamps

+
Parameters
+ + +
[in]fileFile to copy timestamps from.
+
+
+
Note
Modify and access timestamps may be overwritten if a date time callback function has been set by dateTimeCallback().
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
bool SdBaseFile::timestamp (uint8_t flags,
uint16_t year,
uint8_t month,
uint8_t day,
uint8_t hour,
uint8_t minute,
uint8_t second 
)
+
+

Set a file's timestamps in its directory entry.

+
Parameters
+ + +
[in]flagsValues for flags are constructed by a bitwise-inclusive OR of flags from the following list
+
+
+

T_ACCESS - Set the file's last access date.

+

T_CREATE - Set the file's creation date and time.

+

T_WRITE - Set the file's last write/modification date and time.

+
Parameters
+ + + + + + + +
[in]yearValid range 1980 - 2107 inclusive.
[in]monthValid range 1 - 12 inclusive.
[in]dayValid range 1 - 31 inclusive.
[in]hourValid range 0 - 23 inclusive.
[in]minuteValid range 0 - 59 inclusive.
[in]secondValid range 0 - 59 inclusive
+
+
+
Note
It is possible to set an invalid date since there is no check for the number of days in a month.
+
+Modify and access timestamps may be overwritten if a date time callback function has been set by dateTimeCallback().
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + + +
bool SdBaseFile::truncate (uint32_t length)
+
+

Truncate a file to a specified length. The current file position will be maintained if it is less than or equal to length otherwise it will be set to end of file.

+
Parameters
+ + +
[in]lengthThe desired length for the file.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include file is read only, file is a directory, length is greater than the current file size or an I/O error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t SdBaseFile::type () const
+
+inline
+
+

Type of file. You should use isFile() or isDir() instead of type() if possible.

+
Returns
The file or directory type.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
SdVolume* SdBaseFile::volume () const
+
+inline
+
+
Returns
SdVolume that contains this file.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int SdBaseFile::write (const void * buf,
size_t nbyte 
)
+
+

Write data to an open file.

+
Note
Data is moved to the cache but may not be written to the storage device until sync() is called.
+
Parameters
+ + + +
[in]bufPointer to the location of the data to be written.
[in]nbyteNumber of bytes to write.
+
+
+
Returns
For success write() returns the number of bytes written, always nbyte. If an error occurs, write() returns -1. Possible errors include write() is called before a file has been opened, write is called for a read-only file, device is full, a corrupt file system or an I/O error.
+ +
+
+

Friends And Related Function Documentation

+ +
+
+ + + + + +
+ + + + +
friend class SdFat
+
+friend
+
+ +
+
+

Member Data Documentation

+ +
+
+ + + + +
bool SdBaseFile::writeError
+
+

writeError is set to true if an error occurs during a write(). Set writeError to false before calling print() and/or write() and check for true after calls to print() and/or write().

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/html/class_sd_base_file__inherit__graph.png b/html/class_sd_base_file__inherit__graph.png new file mode 100644 index 0000000..9ede498 Binary files /dev/null and b/html/class_sd_base_file__inherit__graph.png differ diff --git a/html/class_sd_fat-members.html b/html/class_sd_fat-members.html new file mode 100644 index 0000000..2f19e00 --- /dev/null +++ b/html/class_sd_fat-members.html @@ -0,0 +1,93 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
SdFat Member List
+
+
+ +

This is the complete list of members for SdFat, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
begin(uint8_t chipSelectPin=SD_CHIP_SELECT_PIN, uint8_t sckDivisor=SPI_FULL_SPEED)SdFat
card()SdFatinline
chdir(bool set_cwd=false)SdFat
chdir(const char *path, bool set_cwd=false)SdFat
chvol()SdFat
errorHalt()SdFat
errorHalt(char const *msg)SdFat
errorHalt_P(PGM_P msg)SdFat
errorPrint()SdFat
errorPrint(char const *msg)SdFat
errorPrint_P(PGM_P msg)SdFat
exists(const char *name)SdFat
initErrorHalt()SdFat
initErrorHalt(char const *msg)SdFat
initErrorHalt_P(PGM_P msg)SdFat
initErrorPrint()SdFat
initErrorPrint(char const *msg)SdFat
initErrorPrint_P(PGM_P msg)SdFat
ls(uint8_t flags=0)SdFat
ls(const char *path, uint8_t flags=0)SdFat
ls(Print *pr, uint8_t flags=0)SdFat
ls(Print *pr, const char *path, uint8_t flags=0)SdFat
mkdir(const char *path, bool pFlag=true)SdFat
remove(const char *path)SdFat
rename(const char *oldPath, const char *newPath)SdFat
rmdir(const char *path)SdFat
SdFat()SdFatinline
setStdOut(Print *stream)SdFatinlinestatic
stdOut()SdFatinlinestatic
truncate(const char *path, uint32_t length)SdFat
vol()SdFatinline
vwd()SdFatinline
+ + + + diff --git a/html/class_sd_fat.html b/html/class_sd_fat.html new file mode 100644 index 0000000..c367f0b --- /dev/null +++ b/html/class_sd_fat.html @@ -0,0 +1,976 @@ + + + + + + +SdFat: SdFat Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

Integration class for the SdFat library. + More...

+ +

#include <SdFat.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

bool begin (uint8_t chipSelectPin=SD_CHIP_SELECT_PIN, uint8_t sckDivisor=SPI_FULL_SPEED)
 
Sd2Cardcard ()
 
bool chdir (bool set_cwd=false)
 
bool chdir (const char *path, bool set_cwd=false)
 
void chvol ()
 
void errorHalt ()
 
void errorHalt (char const *msg)
 
void errorHalt_P (PGM_P msg)
 
void errorPrint ()
 
void errorPrint (char const *msg)
 
void errorPrint_P (PGM_P msg)
 
bool exists (const char *name)
 
void initErrorHalt ()
 
void initErrorHalt (char const *msg)
 
void initErrorHalt_P (PGM_P msg)
 
void initErrorPrint ()
 
void initErrorPrint (char const *msg)
 
void initErrorPrint_P (PGM_P msg)
 
void ls (uint8_t flags=0)
 
void ls (const char *path, uint8_t flags=0)
 
void ls (Print *pr, uint8_t flags=0)
 
void ls (Print *pr, const char *path, uint8_t flags=0)
 
bool mkdir (const char *path, bool pFlag=true)
 
bool remove (const char *path)
 
bool rename (const char *oldPath, const char *newPath)
 
bool rmdir (const char *path)
 
 SdFat ()
 
bool truncate (const char *path, uint32_t length)
 
SdVolumevol ()
 
SdBaseFilevwd ()
 
+ + + + + +

+Static Public Member Functions

static void setStdOut (Print *stream)
 
static Print * stdOut ()
 
+

Detailed Description

+

Integration class for the SdFat library.

+

error if old IDE

+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + +
SdFat::SdFat ()
+
+inline
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
bool SdFat::begin (uint8_t chipSelectPin = SD_CHIP_SELECT_PIN,
uint8_t sckDivisor = SPI_FULL_SPEED 
)
+
+

Initialize an SdFat object.

+

Initializes the SD card, SD volume, and root directory.

+
Parameters
+ + + +
[in]chipSelectPinSD chip select pin. See Sd2Card::init().
[in]sckDivisorvalue for SPI SCK divisor. See Sd2Card::init().
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
Sd2Card* SdFat::card ()
+
+inline
+
+
Returns
a pointer to the Sd2Card object.
+ +
+
+ +
+
+ + + + + + + + +
bool SdFat::chdir (bool set_cwd = false)
+
+

Change a volume's working directory to root

+

Changes the volume's working directory to the SD's root directory. Optionally set the current working directory to the volume's working directory.

+
Parameters
+ + +
[in]set_cwdSet the current working directory to this volume's working directory if true.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool SdFat::chdir (const char * path,
bool set_cwd = false 
)
+
+

Change a volume's working directory

+

Changes the volume working directory to the path subdirectory. Optionally set the current working directory to the volume's working directory.

+

Example: If the volume's working directory is "/DIR", chdir("SUB") will change the volume's working directory from "/DIR" to "/DIR/SUB".

+

If path is "/", the volume's working directory will be changed to the root directory

+
Parameters
+ + + +
[in]pathThe name of the subdirectory.
[in]set_cwdSet the current working directory to this volume's working directory if true.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + +
void SdFat::chvol ()
+
+

Set the current working directory to a volume's working directory.

+

This is useful with multiple SD cards.

+

The current working directory is changed to this volume's working directory.

+

This is like the Windows/DOS <drive letter>: command.

+ +
+
+ +
+
+ + + + + + + +
void SdFat::errorHalt ()
+
+

Print any SD error code and halt.

+ +
+
+ +
+
+ + + + + + + + +
void SdFat::errorHalt (char const * msg)
+
+

Print msg, any SD error code, and halt.

+
Parameters
+ + +
[in]msgMessage to print.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void SdFat::errorHalt_P (PGM_P msg)
+
+

Print msg, any SD error code, and halt.

+
Parameters
+ + +
[in]msgMessage in program space (flash memory) to print.
+
+
+ +
+
+ +
+
+ + + + + + + +
void SdFat::errorPrint ()
+
+

Print any SD error code.

+ +
+
+ +
+
+ + + + + + + + +
void SdFat::errorPrint (char const * msg)
+
+

Print msg, any SD error code.

+
Parameters
+ + +
[in]msgMessage to print.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void SdFat::errorPrint_P (PGM_P msg)
+
+

Print msg, any SD error code.

+
Parameters
+ + +
[in]msgMessage in program space (flash memory) to print.
+
+
+ +
+
+ +
+
+ + + + + + + + +
bool SdFat::exists (const char * name)
+
+

Test for the existence of a file.

+
Parameters
+ + +
[in]nameName of the file to be tested for.
+
+
+
Returns
true if the file exists else false.
+ +
+
+ +
+
+ + + + + + + +
void SdFat::initErrorHalt ()
+
+

Print error details and halt after SdFat::init() fails.

+ +
+
+ +
+
+ + + + + + + + +
void SdFat::initErrorHalt (char const * msg)
+
+

Print message, error details, and halt after SdFat::init() fails.

+
Parameters
+ + +
[in]msgMessage to print.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void SdFat::initErrorHalt_P (PGM_P msg)
+
+

Print message, error details, and halt after SdFat::init() fails.

+
Parameters
+ + +
[in]msgMessage in program space (flash memory) to print.
+
+
+ +
+
+ +
+
+ + + + + + + +
void SdFat::initErrorPrint ()
+
+

Print error details after SdFat::init() fails.

+ +
+
+ +
+
+ + + + + + + + +
void SdFat::initErrorPrint (char const * msg)
+
+

Print message and error details and halt after SdFat::init() fails.

+
Parameters
+ + +
[in]msgMessage to print.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void SdFat::initErrorPrint_P (PGM_P msg)
+
+

Print message and error details after SdFat::init() fails.

+
Parameters
+ + +
[in]msgMessage in program space (flash memory) to print.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void SdFat::ls (uint8_t flags = 0)
+
+

List the directory contents of the volume working directory to stdOut.

+
Parameters
+ + +
[in]flagsThe inclusive OR of
+
+
+

LS_DATE - Print file modification date

+

LS_SIZE - Print file size.

+

LS_R - Recursive list of subdirectories.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void SdFat::ls (const char * path,
uint8_t flags = 0 
)
+
+

List the directory contents of the volume working directory to stdOut.

+
Parameters
+ + + +
[in]pathdirectory to list.
[in]flagsThe inclusive OR of
+
+
+

LS_DATE - Print file modification date

+

LS_SIZE - Print file size.

+

LS_R - Recursive list of subdirectories.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void SdFat::ls (Print * pr,
uint8_t flags = 0 
)
+
+

List the directory contents of the volume working directory.

+
Parameters
+ + + +
[in]prPrint stream for list.
[in]flagsThe inclusive OR of
+
+
+

LS_DATE - Print file modification date

+

LS_SIZE - Print file size.

+

LS_R - Recursive list of subdirectories.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void SdFat::ls (Print * pr,
const char * path,
uint8_t flags = 0 
)
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool SdFat::mkdir (const char * path,
bool pFlag = true 
)
+
+

Make a subdirectory in the volume working directory.

+
Parameters
+ + + +
[in]pathA path with a valid 8.3 DOS name for the subdirectory.
[in]pFlagCreate missing parent directories if true.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + + +
bool SdFat::remove (const char * path)
+
+

Remove a file from the volume working directory.

+
Parameters
+ + +
[in]pathA path with a valid 8.3 DOS name for the file.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool SdFat::rename (const char * oldPath,
const char * newPath 
)
+
+

Rename a file or subdirectory.

+
Parameters
+ + + +
[in]oldPathPath name to the file or subdirectory to be renamed.
[in]newPathNew path name of the file or subdirectory.
+
+
+

The newPath object must not exist before the rename call.

+

The file to be renamed must not be open. The directory entry may be moved and file system corruption could occur if the file is accessed by a file object that was opened before the rename() call.

+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + + +
bool SdFat::rmdir (const char * path)
+
+

Remove a subdirectory from the volume's working directory.

+
Parameters
+ + +
[in]pathA path with a valid 8.3 DOS name for the subdirectory.
+
+
+

The subdirectory file will be removed only if it is empty.

+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void SdFat::setStdOut (Print * stream)
+
+inlinestatic
+
+

Set stdOut Print stream for messages.

+
Parameters
+ + +
[in]streamThe new Print stream.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static Print* SdFat::stdOut ()
+
+inlinestatic
+
+
Returns
Print stream for messages.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool SdFat::truncate (const char * path,
uint32_t length 
)
+
+

Truncate a file to a specified length. The current file position will be maintained if it is less than or equal to length otherwise it will be set to end of file.

+
Parameters
+ + + +
[in]pathA path with a valid 8.3 DOS name for the file.
[in]lengthThe desired length for the file.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include file is read only, file is a directory, length is greater than the current file size or an I/O error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
SdVolume* SdFat::vol ()
+
+inline
+
+
Returns
a pointer to the SdVolume object.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
SdBaseFile* SdFat::vwd ()
+
+inline
+
+
Returns
a pointer to the volume working directory.
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/html/class_sd_file-members.html b/html/class_sd_file-members.html new file mode 100644 index 0000000..cc5acb8 --- /dev/null +++ b/html/class_sd_file-members.html @@ -0,0 +1,137 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
SdFile Member List
+
+
+ +

This is the complete list of members for SdFile, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
available()SdBaseFileinline
clearWriteError()SdFileinline
close()SdBaseFile
contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock)SdBaseFile
createContiguous(SdBaseFile *dirFile, const char *path, uint32_t size)SdBaseFile
curCluster() const SdBaseFileinline
curPosition() const SdBaseFileinline
cwd()SdBaseFileinlinestatic
dateTimeCallback(void(*dateTime)(uint16_t *date, uint16_t *time))SdBaseFileinlinestatic
dateTimeCallbackCancel()SdBaseFileinlinestatic
dirEntry(dir_t *dir)SdBaseFile
dirName(const dir_t &dir, char *name)SdBaseFilestatic
exists(const char *name)SdBaseFile
fgets(char *str, int16_t num, char *delim=0)SdBaseFile
fileSize() const SdBaseFileinline
firstCluster() const SdBaseFileinline
getFilename(char *name)SdBaseFile
getpos(FatPos_t *pos)SdBaseFile
getWriteError()SdFileinline
isDir() const SdBaseFileinline
isFile() const SdBaseFileinline
isOpen() const SdBaseFileinline
isRoot() const SdBaseFileinline
isSubDir() const SdBaseFileinline
ls(Print *pr, uint8_t flags=0, uint8_t indent=0)SdBaseFile
ls(uint8_t flags=0)SdBaseFile
mkdir(SdBaseFile *dir, const char *path, bool pFlag=true)SdBaseFile
open(SdBaseFile *dirFile, uint16_t index, uint8_t oflag)SdBaseFile
open(SdBaseFile *dirFile, const char *path, uint8_t oflag)SdBaseFile
open(const char *path, uint8_t oflag=O_READ)SdBaseFile
openNext(SdBaseFile *dirFile, uint8_t oflag)SdBaseFile
openRoot(SdVolume *vol)SdBaseFile
peek()SdBaseFile
printCreateDateTime(Print *pr)SdBaseFile
printFatDate(uint16_t fatDate)SdBaseFilestatic
printFatDate(Print *pr, uint16_t fatDate)SdBaseFilestatic
printFatTime(uint16_t fatTime)SdBaseFilestatic
printFatTime(Print *pr, uint16_t fatTime)SdBaseFilestatic
printField(int16_t value, char term)SdBaseFile
printField(uint16_t value, char term)SdBaseFile
printField(int32_t value, char term)SdBaseFile
printField(uint32_t value, char term)SdBaseFile
printFileSize(Print *pr)SdBaseFile
printModifyDateTime(Print *pr)SdBaseFile
printName()SdBaseFile
printName(Print *pr)SdBaseFile
read()SdBaseFile
read(void *buf, size_t nbyte)SdBaseFile
readDir(dir_t *dir)SdBaseFile
remove(SdBaseFile *dirFile, const char *path)SdBaseFilestatic
remove()SdBaseFile
rename(SdBaseFile *dirFile, const char *newPath)SdBaseFile
rewind()SdBaseFileinline
rmdir()SdBaseFile
rmRfStar()SdBaseFile
SdBaseFile()SdBaseFileinline
SdBaseFile(const char *path, uint8_t oflag)SdBaseFile
SdFile()SdFileinline
SdFile(const char *name, uint8_t oflag)SdFile
seekCur(int32_t offset)SdBaseFileinline
seekEnd(int32_t offset=0)SdBaseFileinline
seekSet(uint32_t pos)SdBaseFile
setpos(FatPos_t *pos)SdBaseFile
sync()SdBaseFile
timestamp(SdBaseFile *file)SdBaseFile
timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)SdBaseFile
truncate(uint32_t size)SdBaseFile
type() const SdBaseFileinline
volume() const SdBaseFileinline
write(uint8_t b)SdFile
write(const char *str)SdFile
write(const void *buf, size_t nbyte)SdFile
write(const uint8_t *buf, size_t size)SdFileinline
write_P(PGM_P str)SdFile
writeErrorSdBaseFile
writeln_P(PGM_P str)SdFile
+ + + + diff --git a/html/class_sd_file.html b/html/class_sd_file.html new file mode 100644 index 0000000..5323d21 --- /dev/null +++ b/html/class_sd_file.html @@ -0,0 +1,2729 @@ + + + + + + +SdFat: SdFile Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

SdBaseFile with Print. + More...

+ +

#include <SdFile.h>

+
+Inheritance diagram for SdFile:
+
+
Inheritance graph
+ + +
[legend]
+
+Collaboration diagram for SdFile:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

uint32_t available ()
 
void clearWriteError ()
 
bool close ()
 
bool contiguousRange (uint32_t *bgnBlock, uint32_t *endBlock)
 
bool createContiguous (SdBaseFile *dirFile, const char *path, uint32_t size)
 
uint32_t curCluster () const
 
uint32_t curPosition () const
 
bool dirEntry (dir_t *dir)
 
bool exists (const char *name)
 
int16_t fgets (char *str, int16_t num, char *delim=0)
 
uint32_t fileSize () const
 
uint32_t firstCluster () const
 
bool getFilename (char *name)
 
void getpos (FatPos_t *pos)
 
bool getWriteError ()
 
bool isDir () const
 
bool isFile () const
 
bool isOpen () const
 
bool isRoot () const
 
bool isSubDir () const
 
void ls (Print *pr, uint8_t flags=0, uint8_t indent=0)
 
void ls (uint8_t flags=0)
 
bool mkdir (SdBaseFile *dir, const char *path, bool pFlag=true)
 
bool open (SdBaseFile *dirFile, uint16_t index, uint8_t oflag)
 
bool open (SdBaseFile *dirFile, const char *path, uint8_t oflag)
 
bool open (const char *path, uint8_t oflag=O_READ)
 
bool openNext (SdBaseFile *dirFile, uint8_t oflag)
 
bool openRoot (SdVolume *vol)
 
int peek ()
 
bool printCreateDateTime (Print *pr)
 
int printField (int16_t value, char term)
 
int printField (uint16_t value, char term)
 
int printField (int32_t value, char term)
 
int printField (uint32_t value, char term)
 
size_t printFileSize (Print *pr)
 
bool printModifyDateTime (Print *pr)
 
size_t printName ()
 
size_t printName (Print *pr)
 
int16_t read ()
 
int read (void *buf, size_t nbyte)
 
int8_t readDir (dir_t *dir)
 
bool remove ()
 
bool rename (SdBaseFile *dirFile, const char *newPath)
 
void rewind ()
 
bool rmdir ()
 
bool rmRfStar ()
 
 SdFile ()
 
 SdFile (const char *name, uint8_t oflag)
 
bool seekCur (int32_t offset)
 
bool seekEnd (int32_t offset=0)
 
bool seekSet (uint32_t pos)
 
void setpos (FatPos_t *pos)
 
bool sync ()
 
bool timestamp (SdBaseFile *file)
 
bool timestamp (uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
 
bool truncate (uint32_t size)
 
uint8_t type () const
 
SdVolumevolume () const
 
size_t write (uint8_t b)
 
int write (const char *str)
 
int write (const void *buf, size_t nbyte)
 
size_t write (const uint8_t *buf, size_t size)
 
void write_P (PGM_P str)
 
void writeln_P (PGM_P str)
 
+ + + + + + + + + + + + + + + + + + + +

+Static Public Member Functions

static SdBaseFilecwd ()
 
static void dateTimeCallback (void(*dateTime)(uint16_t *date, uint16_t *time))
 
static void dateTimeCallbackCancel ()
 
static void dirName (const dir_t &dir, char *name)
 
static void printFatDate (uint16_t fatDate)
 
static void printFatDate (Print *pr, uint16_t fatDate)
 
static void printFatTime (uint16_t fatTime)
 
static void printFatTime (Print *pr, uint16_t fatTime)
 
static bool remove (SdBaseFile *dirFile, const char *path)
 
+ + + +

+Public Attributes

bool writeError
 
+

Detailed Description

+

SdBaseFile with Print.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + +
SdFile::SdFile ()
+
+inline
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
SdFile::SdFile (const char * path,
uint8_t oflag 
)
+
+

Create a file object and open it in the current working directory.

+
Parameters
+ + + +
[in]pathA path with a valid 8.3 DOS name for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of open flags. see SdBaseFile::open(SdBaseFile*, const char*, uint8_t).
+
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdBaseFile::available ()
+
+inlineinherited
+
+
Returns
number of bytes available from yhe current position to EOF
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void SdFile::clearWriteError ()
+
+inline
+
+

Set writeError to zero

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::close ()
+
+inherited
+
+

Close a file and force cached data and directory information to be written to the storage device.

+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include no file is open or an I/O error.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool SdBaseFile::contiguousRange (uint32_t * bgnBlock,
uint32_t * endBlock 
)
+
+inherited
+
+

Check for contiguous file and return its raw block range.

+
Parameters
+ + + +
[out]bgnBlockthe first block address for the file.
[out]endBlockthe last block address for the file.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include file is not contiguous, file has zero length or an I/O error occurred.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool SdBaseFile::createContiguous (SdBaseFiledirFile,
const char * path,
uint32_t size 
)
+
+inherited
+
+

Create and open a new contiguous file of a specified size.

+
Note
This function only supports short DOS 8.3 names. See open() for more information.
+
Parameters
+ + + + +
[in]dirFileThe directory where the file will be created.
[in]pathA path with a valid DOS 8.3 file name.
[in]sizeThe desired file size.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include path contains an invalid DOS 8.3 file name, the FAT volume has not been initialized, a file is already open, the file already exists, the root directory is full or an I/O error.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdBaseFile::curCluster () const
+
+inlineinherited
+
+
Returns
The current cluster number for a file or directory.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdBaseFile::curPosition () const
+
+inlineinherited
+
+
Returns
The current position for a file or directory.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static SdBaseFile* SdBaseFile::cwd ()
+
+inlinestaticinherited
+
+
Returns
Current working directory
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void SdBaseFile::dateTimeCallback (void(*)(uint16_t *date, uint16_t *time) dateTime)
+
+inlinestaticinherited
+
+

Set the date/time callback function

+
Parameters
+ + +
[in]dateTimeThe user's call back function. The callback function is of the form:
+
+
+
void dateTime(uint16_t* date, uint16_t* time) {
+
uint16_t year;
+
uint8_t month, day, hour, minute, second;
+
+
// User gets date and time from GPS or real-time clock here
+
+
// return date using FAT_DATE macro to format fields
+
*date = FAT_DATE(year, month, day);
+
+
// return time using FAT_TIME macro to format fields
+
*time = FAT_TIME(hour, minute, second);
+
}
+

Sets the function that is called when a file is created or when a file's directory entry is modified by sync(). All timestamps, access, creation, and modify, are set when a file is created. sync() maintains the last access date and last modify date/time.

+

See the timestamp() function.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static void SdBaseFile::dateTimeCallbackCancel ()
+
+inlinestaticinherited
+
+

Cancel the date/time callback function.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::dirEntry (dir_t * dir)
+
+inherited
+
+

Return a file's directory entry.

+
Parameters
+ + +
[out]dirLocation for return of the file's directory entry.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void SdBaseFile::dirName (const dir_t & dir,
char * name 
)
+
+staticinherited
+
+

Format the name field of dir into the 13 byte array name in standard 8.3 short name format.

+
Parameters
+ + + +
[in]dirThe directory structure containing the name.
[out]nameA 13 byte char array for the formatted name.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::exists (const char * name)
+
+inherited
+
+

Test for the existence of a file in a directory

+
Parameters
+ + +
[in]nameName of the file to be tested for.
+
+
+

The calling instance must be an open directory file.

+

dirFile.exists("TOFIND.TXT") searches for "TOFIND.TXT" in the directory dirFile.

+
Returns
true if the file exists else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
int16_t SdBaseFile::fgets (char * str,
int16_t num,
char * delim = 0 
)
+
+inherited
+
+

Get a string from a file.

+

fgets() reads bytes from a file into the array pointed to by str, until num - 1 bytes are read, or a delimiter is read and transferred to str, or end-of-file is encountered. The string is then terminated with a null byte.

+

fgets() deletes CR, '\r', from the string. This insures only a '\n' terminates the string for Windows text files which use CRLF for newline.

+
Parameters
+ + + + +
[out]strPointer to the array where the string is stored.
[in]numMaximum number of characters to be read (including the final null byte). Usually the length of the array str is used.
[in]delimOptional set of delimiters. The default is "\n".
+
+
+
Returns
For success fgets() returns the length of the string in str. If no data is read, fgets() returns zero for EOF or -1 if an error occurred.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdBaseFile::fileSize () const
+
+inlineinherited
+
+
Returns
The total number of bytes in a file or directory.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdBaseFile::firstCluster () const
+
+inlineinherited
+
+
Returns
The first cluster number for a file or directory.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::getFilename (char * name)
+
+inherited
+
+

Get a file's name

+
Parameters
+ + +
[out]nameAn array of 13 characters for the file's name.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void SdBaseFile::getpos (FatPos_tpos)
+
+inherited
+
+

get position for streams

+
Parameters
+ + +
[out]posstruct to receive position
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdFile::getWriteError ()
+
+inline
+
+
Returns
value of writeError
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::isDir () const
+
+inlineinherited
+
+
Returns
True if this is a directory else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::isFile () const
+
+inlineinherited
+
+
Returns
True if this is a normal file else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::isOpen () const
+
+inlineinherited
+
+
Returns
True if this is an open file/directory else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::isRoot () const
+
+inlineinherited
+
+
Returns
True if this is the root directory.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::isSubDir () const
+
+inlineinherited
+
+
Returns
True if this is a subdirectory else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void SdBaseFile::ls (Print * pr,
uint8_t flags = 0,
uint8_t indent = 0 
)
+
+inherited
+
+

List directory contents.

+
Parameters
+ + + +
[in]prPrint stream for list.
[in]flagsThe inclusive OR of
+
+
+

LS_DATE - Print file modification date

+

LS_SIZE - Print file size.

+

LS_R - Recursive list of subdirectories.

+
Parameters
+ + +
[in]indentAmount of space before file name. Used for recursive list to indicate subdirectory level.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void SdBaseFile::ls (uint8_t flags = 0)
+
+inherited
+
+

List directory contents to stdOut.

+
Parameters
+ + +
[in]flagsThe inclusive OR of
+
+
+

LS_DATE - Print file modification date

+

LS_SIZE - Print file size.

+

LS_R - Recursive list of subdirectories.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool SdBaseFile::mkdir (SdBaseFileparent,
const char * path,
bool pFlag = true 
)
+
+inherited
+
+

Make a new directory.

+
Parameters
+ + + + +
[in]parentAn open SdFat instance for the directory that will contain the new directory.
[in]pathA path with a valid 8.3 DOS name for the new directory.
[in]pFlagCreate missing parent directories if true.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include this file is already open, parent is not a directory, path is invalid or already exists in parent.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool SdBaseFile::open (SdBaseFiledirFile,
uint16_t index,
uint8_t oflag 
)
+
+inherited
+
+

Open a file by index.

+
Parameters
+ + + + +
[in]dirFileAn open SdFat instance for the directory.
[in]indexThe index of the directory entry for the file to be opened. The value for index is (directory file position)/32.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC.
+
+
+

See open() by path for definition of flags.

+
Returns
true for success or false for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool SdBaseFile::open (SdBaseFiledirFile,
const char * path,
uint8_t oflag 
)
+
+inherited
+
+

Open a file or directory by name.

+
Parameters
+ + + + +
[in]dirFileAn open SdFat instance for the directory containing the file to be opened.
[in]pathA path with a valid 8.3 DOS name for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of flags from the following list
+
+
+

O_READ - Open for reading.

+

O_RDONLY - Same as O_READ.

+

O_WRITE - Open for writing.

+

O_WRONLY - Same as O_WRITE.

+

O_RDWR - Open for reading and writing.

+

O_APPEND - If set, the file offset shall be set to the end of the file prior to each write.

+

O_AT_END - Set the initial position at the end of the file.

+

O_CREAT - If the file exists, this flag has no effect except as noted under O_EXCL below. Otherwise, the file shall be created

+

O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists.

+

O_SYNC - Call sync() after each write. This flag should not be used with write(uint8_t), write_P(PGM_P), writeln_P(PGM_P), or the Arduino Print class. These functions do character at a time writes so sync() will be called after each byte.

+

O_TRUNC - If the file exists and is a regular file, and the file is successfully opened and is not read only, its length shall be truncated to 0.

+

WARNING: A given file must not be opened by more than one SdBaseFile object of file corruption may occur.

+
Note
Directory files must be opened read only. Write and truncation is not allowed for directory files.
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include this file is already open, dirFile is not a directory, path is invalid, the file does not exist or can't be opened in the access mode specified by oflag.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool SdBaseFile::open (const char * path,
uint8_t oflag = O_READ 
)
+
+inherited
+
+

Open a file in the current working directory.

+
Parameters
+ + + +
[in]pathA path with a valid 8.3 DOS name for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of open flags. see SdBaseFile::open(SdBaseFile*, const char*, uint8_t).
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool SdBaseFile::openNext (SdBaseFiledirFile,
uint8_t oflag 
)
+
+inherited
+
+

Open the next file or subdirectory in a directory.

+
Parameters
+ + + +
[in]dirFileAn open SdFat instance for the directory containing the file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC.
+
+
+

See open() by path for definition of flags.

+
Returns
true for success or false for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::openRoot (SdVolumevol)
+
+inherited
+
+

Open a volume's root directory.

+
Parameters
+ + +
[in]volThe FAT volume containing the root directory to be opened.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include the file is already open, the FAT volume has not been initialized or it a FAT12 volume.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int SdBaseFile::peek ()
+
+inherited
+
+

Return the next available byte without consuming it.

+
Returns
The byte if no error and not at eof else -1;
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::printCreateDateTime (Print * pr)
+
+inherited
+
+

Print a file's creation date and time

+
Parameters
+ + +
[in]prPrint stream for output.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void SdBaseFile::printFatDate (uint16_t fatDate)
+
+staticinherited
+
+

Print a directory date field to stdOut.

+

Format is yyyy-mm-dd.

+
Parameters
+ + +
[in]fatDateThe date field from a directory entry.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void SdBaseFile::printFatDate (Print * pr,
uint16_t fatDate 
)
+
+staticinherited
+
+

Print a directory date field.

+

Format is yyyy-mm-dd.

+
Parameters
+ + + +
[in]prPrint stream for output.
[in]fatDateThe date field from a directory entry.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void SdBaseFile::printFatTime (uint16_t fatTime)
+
+staticinherited
+
+

Print a directory time field to stdOut.

+

Format is hh:mm:ss.

+
Parameters
+ + +
[in]fatTimeThe time field from a directory entry.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void SdBaseFile::printFatTime (Print * pr,
uint16_t fatTime 
)
+
+staticinherited
+
+

Print a directory time field.

+

Format is hh:mm:ss.

+
Parameters
+ + + +
[in]prPrint stream for output.
[in]fatTimeThe time field from a directory entry.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
int SdBaseFile::printField (int16_t value,
char term 
)
+
+inherited
+
+

Print a number followed by a field terminator.

+
Parameters
+ + + +
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
int SdBaseFile::printField (uint16_t value,
char term 
)
+
+inherited
+
+

Print a number followed by a field terminator.

+
Parameters
+ + + +
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
int SdBaseFile::printField (int32_t value,
char term 
)
+
+inherited
+
+

Print a number followed by a field terminator.

+
Parameters
+ + + +
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
int SdBaseFile::printField (uint32_t value,
char term 
)
+
+inherited
+
+

Print a number followed by a field terminator.

+
Parameters
+ + + +
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
size_t SdBaseFile::printFileSize (Print * pr)
+
+inherited
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::printModifyDateTime (Print * pr)
+
+inherited
+
+

Print a file's modify date and time

+
Parameters
+ + +
[in]prPrint stream for output.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
size_t SdBaseFile::printName ()
+
+inherited
+
+

Print a file's name to stdOut

+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
size_t SdBaseFile::printName (Print * pr)
+
+inherited
+
+

Print a file's name

+
Parameters
+ + +
[in]prPrint stream for output.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int16_t SdBaseFile::read ()
+
+inherited
+
+

Read the next byte from a file.

+
Returns
For success read returns the next byte in the file as an int. If an error occurs or end of file is reached -1 is returned.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
int SdBaseFile::read (void * buf,
size_t nbyte 
)
+
+inherited
+
+

Read data from a file starting at the current position.

+
Parameters
+ + + +
[out]bufPointer to the location that will receive the data.
[in]nbyteMaximum number of bytes to read.
+
+
+
Returns
For success read() returns the number of bytes read. A value less than nbyte, including zero, will be returned if end of file is reached. If an error occurs, read() returns -1. Possible errors include read() called before a file has been opened, corrupt file system or an I/O error occurred.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int8_t SdBaseFile::readDir (dir_t * dir)
+
+inherited
+
+

Read the next directory entry from a directory file.

+
Parameters
+ + +
[out]dirThe dir_t struct that will receive the data.
+
+
+
Returns
For success readDir() returns the number of bytes read. A value of zero will be returned if end of file is reached. If an error occurs, readDir() returns -1. Possible errors include readDir() called before a directory has been opened, this is not a directory file or an I/O error occurred.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool SdBaseFile::remove (SdBaseFiledirFile,
const char * path 
)
+
+staticinherited
+
+

Remove a file.

+

The directory entry and all data for the file are deleted.

+
Parameters
+ + + +
[in]dirFileThe directory that contains the file.
[in]pathPath for the file to be removed.
+
+
+
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include the file is a directory, is read only, dirFile is not a directory, path is not found or an I/O error occurred.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::remove ()
+
+inherited
+
+

Remove a file.

+

The directory entry and all data for the file are deleted.

+
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include the file read-only, is a directory, or an I/O error occurred.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool SdBaseFile::rename (SdBaseFiledirFile,
const char * newPath 
)
+
+inherited
+
+

Rename a file or subdirectory.

+
Parameters
+ + + +
[in]dirFileDirectory for the new path.
[in]newPathNew path name for the file/directory.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include dirFile is not open or is not a directory file, newPath is invalid or already exists, or an I/O error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void SdBaseFile::rewind ()
+
+inlineinherited
+
+

Set the file's current position to zero.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::rmdir ()
+
+inherited
+
+

Remove a directory file.

+

The directory file will be removed only if it is empty and is not the root directory. rmdir() follows DOS and Windows and ignores the read-only attribute for the directory.

+
Note
This function should not be used to delete the 8.3 version of a directory that has a long name. For example if a directory has the long name "New folder" you should not delete the 8.3 name "NEWFOL~1".
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include the file is not a directory, is the root directory, is not empty, or an I/O error occurred.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::rmRfStar ()
+
+inherited
+
+

Recursively delete a directory and all contained files.

+

This is like the Unix/Linux 'rm -rf *' if called with the root directory hence the name.

+

Warning - This will remove all contents of the directory including subdirectories. The directory will then be removed if it is not root. The read-only attribute for files will be ignored.

+
Note
This function should not be used to delete the 8.3 version of a directory that has a long name. See remove() and rmdir().
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::seekCur (int32_t offset)
+
+inlineinherited
+
+

Set the files position to current position + pos. See seekSet().

+
Parameters
+ + +
[in]offsetThe new position in bytes from the current position.
+
+
+
Returns
true for success or false for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::seekEnd (int32_t offset = 0)
+
+inlineinherited
+
+

Set the files position to end-of-file + offset. See seekSet().

+
Parameters
+ + +
[in]offsetThe new position in bytes from end-of-file.
+
+
+
Returns
true for success or false for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::seekSet (uint32_t pos)
+
+inherited
+
+

Sets a file's position.

+
Parameters
+ + +
[in]posThe new position in bytes from the beginning of the file.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void SdBaseFile::setpos (FatPos_tpos)
+
+inherited
+
+

set position for streams

+
Parameters
+ + +
[out]posstruct with value for new position
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::sync ()
+
+inherited
+
+

The sync() call causes all modified data and directory fields to be written to the storage device.

+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include a call to sync() before a file has been opened or an I/O error.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::timestamp (SdBaseFilefile)
+
+inherited
+
+

Copy a file's timestamps

+
Parameters
+ + +
[in]fileFile to copy timestamps from.
+
+
+
Note
Modify and access timestamps may be overwritten if a date time callback function has been set by dateTimeCallback().
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
bool SdBaseFile::timestamp (uint8_t flags,
uint16_t year,
uint8_t month,
uint8_t day,
uint8_t hour,
uint8_t minute,
uint8_t second 
)
+
+inherited
+
+

Set a file's timestamps in its directory entry.

+
Parameters
+ + +
[in]flagsValues for flags are constructed by a bitwise-inclusive OR of flags from the following list
+
+
+

T_ACCESS - Set the file's last access date.

+

T_CREATE - Set the file's creation date and time.

+

T_WRITE - Set the file's last write/modification date and time.

+
Parameters
+ + + + + + + +
[in]yearValid range 1980 - 2107 inclusive.
[in]monthValid range 1 - 12 inclusive.
[in]dayValid range 1 - 31 inclusive.
[in]hourValid range 0 - 23 inclusive.
[in]minuteValid range 0 - 59 inclusive.
[in]secondValid range 0 - 59 inclusive
+
+
+
Note
It is possible to set an invalid date since there is no check for the number of days in a month.
+
+Modify and access timestamps may be overwritten if a date time callback function has been set by dateTimeCallback().
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::truncate (uint32_t length)
+
+inherited
+
+

Truncate a file to a specified length. The current file position will be maintained if it is less than or equal to length otherwise it will be set to end of file.

+
Parameters
+ + +
[in]lengthThe desired length for the file.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include file is read only, file is a directory, length is greater than the current file size or an I/O error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t SdBaseFile::type () const
+
+inlineinherited
+
+

Type of file. You should use isFile() or isDir() instead of type() if possible.

+
Returns
The file or directory type.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
SdVolume* SdBaseFile::volume () const
+
+inlineinherited
+
+
Returns
SdVolume that contains this file.
+ +
+
+ +
+
+ + + + + + + + +
size_t SdFile::write (uint8_t b)
+
+

Write a byte to a file. Required by the Arduino Print class.

+
Parameters
+ + +
[in]bthe byte to be written. Use getWriteError to check for errors.
+
+
+
Returns
1 for success and 0 for failure.
+ +
+
+ +
+
+ + + + + + + + +
int SdFile::write (const char * str)
+
+

Write a string to a file. Used by the Arduino Print class.

+
Parameters
+ + +
[in]strPointer to the string. Use getWriteError to check for errors.
+
+
+
Returns
count of characters written for success or -1 for failure.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int SdFile::write (const void * buf,
size_t nbyte 
)
+
+

Write data to an open file.

+
Note
Data is moved to the cache but may not be written to the storage device until sync() is called.
+
Parameters
+ + + +
[in]bufPointer to the location of the data to be written.
[in]nbyteNumber of bytes to write.
+
+
+
Returns
For success write() returns the number of bytes written, always nbyte. If an error occurs, write() returns -1. Possible errors include write() is called before a file has been opened, write is called for a read-only file, device is full, a corrupt file system or an I/O error.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
size_t SdFile::write (const uint8_t * buf,
size_t size 
)
+
+inline
+
+ +
+
+ +
+
+ + + + + + + + +
void SdFile::write_P (PGM_P str)
+
+

Write a PROGMEM string to a file.

+
Parameters
+ + +
[in]strPointer to the PROGMEM string. Use getWriteError to check for errors.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void SdFile::writeln_P (PGM_P str)
+
+

Write a PROGMEM string followed by CR/LF to a file.

+
Parameters
+ + +
[in]strPointer to the PROGMEM string. Use getWriteError to check for errors.
+
+
+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
bool SdBaseFile::writeError
+
+inherited
+
+

writeError is set to true if an error occurs during a write(). Set writeError to false before calling print() and/or write() and check for true after calls to print() and/or write().

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/html/class_sd_file__coll__graph.png b/html/class_sd_file__coll__graph.png new file mode 100644 index 0000000..ecb6352 Binary files /dev/null and b/html/class_sd_file__coll__graph.png differ diff --git a/html/class_sd_file__inherit__graph.png b/html/class_sd_file__inherit__graph.png new file mode 100644 index 0000000..ecb6352 Binary files /dev/null and b/html/class_sd_file__inherit__graph.png differ diff --git a/html/class_sd_spi-members.html b/html/class_sd_spi-members.html new file mode 100644 index 0000000..13ce5ba --- /dev/null +++ b/html/class_sd_spi-members.html @@ -0,0 +1,67 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
SdSpi Member List
+
+
+ +

This is the complete list of members for SdSpi, including all inherited members.

+ + + + + + + +
begin()SdSpi
init(uint8_t spiDivisor)SdSpi
receive()SdSpi
receive(uint8_t *buf, size_t n)SdSpi
send(uint8_t data)SdSpi
send(const uint8_t *buf, size_t n)SdSpi
+ + + + diff --git a/html/class_sd_spi.html b/html/class_sd_spi.html new file mode 100644 index 0000000..d9fed66 --- /dev/null +++ b/html/class_sd_spi.html @@ -0,0 +1,236 @@ + + + + + + +SdFat: SdSpi Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+ +
+
SdSpi Class Reference
+
+
+ +

SPI class for access to SD and SDHC flash memory cards. + More...

+ +

#include <SdSpi.h>

+ + + + + + + + + + + + + + +

+Public Member Functions

void begin ()
 
void init (uint8_t spiDivisor)
 
uint8_t receive ()
 
uint8_t receive (uint8_t *buf, size_t n)
 
void send (uint8_t data)
 
void send (const uint8_t *buf, size_t n)
 
+

Detailed Description

+

SPI class for access to SD and SDHC flash memory cards.

+

Member Function Documentation

+ +
+
+ + + + + + + +
void SdSpi::begin ()
+
+

Initialize the SPI bus

+ +
+
+ +
+
+ + + + + + + + +
void SdSpi::init (uint8_t spiDivisor)
+
+

Set SPI options for access to SD/SDHC cards.

+
Parameters
+ + +
[in]spiDivisorSCK clock divider relative to the system clock.
+
+
+ +
+
+ +
+
+ + + + + + + +
uint8_t SdSpi::receive ()
+
+

Receive a byte.

+
Returns
The byte.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
uint8_t SdSpi::receive (uint8_t * buf,
size_t n 
)
+
+

Receive multiple bytes.

+
Parameters
+ + + +
[out]bufBuffer to receive the data.
[in]nNumber of bytes to receive.
+
+
+
Returns
Zero for no error or nonzero error code.
+ +
+
+ +
+
+ + + + + + + + +
void SdSpi::send (uint8_t data)
+
+

Send a byte.

+
Parameters
+ + +
[in]dataByte to send
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void SdSpi::send (const uint8_t * buf,
size_t n 
)
+
+

Send multiple bytes.

+
Parameters
+ + + +
[in]bufBuffer for data to be sent.
[in]nNumber of bytes to send.
+
+
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • Arduino/libraries/SdFat/SdSpi.h
  • +
+
+ + + + diff --git a/html/class_sd_stream_base-members.html b/html/class_sd_stream_base-members.html new file mode 100644 index 0000000..5c44795 --- /dev/null +++ b/html/class_sd_stream_base-members.html @@ -0,0 +1,187 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
SdStreamBase Member List
+
+
+ +

This is the complete list of members for SdStreamBase, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
available()SdBaseFileinlineprotected
bad() const iosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
clearWriteError()SdBaseFileinlineprotected
close()SdBaseFileprotected
contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock)SdBaseFileprotected
createContiguous(SdBaseFile *dirFile, const char *path, uint32_t size)SdBaseFileprotected
cur enum valueios_base
curCluster() const SdBaseFileinlineprotected
curPosition() const SdBaseFileinlineprotected
cwd()SdBaseFileinlineprotectedstatic
dateTimeCallback(void(*dateTime)(uint16_t *date, uint16_t *time))SdBaseFileinlineprotectedstatic
dateTimeCallbackCancel()SdBaseFileinlineprotectedstatic
decios_basestatic
dirEntry(dir_t *dir)SdBaseFileprotected
dirName(const dir_t &dir, char *name)SdBaseFileprotectedstatic
end enum valueios_base
eof() const iosinline
eofbitios_basestatic
exists(const char *name)SdBaseFileprotected
fail() const iosinline
failbitios_basestatic
fgets(char *str, int16_t num, char *delim=0)SdBaseFileprotected
fileSize() const SdBaseFileinlineprotected
fill()ios_baseinline
fill(char c)ios_baseinline
firstCluster() const SdBaseFileinlineprotected
flags() const ios_baseinline
flags(fmtflags fl)ios_baseinline
flagsToBase()ios_baseinlineprotected
fmtflags typedefios_base
getFilename(char *name)SdBaseFileprotected
getpos(FatPos_t *pos)SdBaseFileprotected
getWriteError()SdBaseFileinlineprotected
good() const iosinline
goodbitios_basestatic
hexios_basestatic
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base()ios_baseinline
iostate typedefios_base
isDir() const SdBaseFileinlineprotected
isFile() const SdBaseFileinlineprotected
isOpen() const SdBaseFileinlineprotected
isRoot() const SdBaseFileinlineprotected
isSubDir() const SdBaseFileinlineprotected
leftios_basestatic
ls(Print *pr, uint8_t flags=0, uint8_t indent=0)SdBaseFileprotected
ls(uint8_t flags=0)SdBaseFileprotected
mkdir(SdBaseFile *dir, const char *path, bool pFlag=true)SdBaseFileprotected
octios_basestatic
off_type typedefios_base
open(SdBaseFile *dirFile, uint16_t index, uint8_t oflag)SdBaseFileprotected
open(SdBaseFile *dirFile, const char *path, uint8_t oflag)SdBaseFileprotected
open(const char *path, uint8_t oflag=O_READ)SdBaseFileprotected
openmode typedefios_base
openNext(SdBaseFile *dirFile, uint8_t oflag)SdBaseFileprotected
openRoot(SdVolume *vol)SdBaseFileprotected
operator const void *() const iosinline
operator!() const iosinline
outios_basestatic
peek()SdBaseFileprotected
pos_type typedefios_base
precision() const ios_baseinline
precision(unsigned int n)ios_baseinline
printCreateDateTime(Print *pr)SdBaseFileprotected
printFatDate(uint16_t fatDate)SdBaseFileprotectedstatic
printFatDate(Print *pr, uint16_t fatDate)SdBaseFileprotectedstatic
printFatTime(uint16_t fatTime)SdBaseFileprotectedstatic
printFatTime(Print *pr, uint16_t fatTime)SdBaseFileprotectedstatic
printField(int16_t value, char term)SdBaseFileprotected
printField(uint16_t value, char term)SdBaseFileprotected
printField(int32_t value, char term)SdBaseFileprotected
printField(uint32_t value, char term)SdBaseFileprotected
printFileSize(Print *pr)SdBaseFileprotected
printModifyDateTime(Print *pr)SdBaseFileprotected
printName()SdBaseFileprotected
printName(Print *pr)SdBaseFileprotected
rdstate() const iosinline
read()SdBaseFileprotected
read(void *buf, size_t nbyte)SdBaseFileprotected
readDir(dir_t *dir)SdBaseFileprotected
remove(SdBaseFile *dirFile, const char *path)SdBaseFileprotectedstatic
remove()SdBaseFileprotected
rename(SdBaseFile *dirFile, const char *newPath)SdBaseFileprotected
rewind()SdBaseFileinlineprotected
rightios_basestatic
rmdir()SdBaseFileprotected
rmRfStar()SdBaseFileprotected
SdBaseFile()SdBaseFileinlineprotected
SdBaseFile(const char *path, uint8_t oflag)SdBaseFileprotected
seekCur(int32_t offset)SdBaseFileinlineprotected
seekdir enum nameios_base
seekEnd(int32_t offset=0)SdBaseFileinlineprotected
seekSet(uint32_t pos)SdBaseFileprotected
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setpos(FatPos_t *pos)SdBaseFileprotected
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipwsios_basestatic
streamsize typedefios_base
sync()SdBaseFileprotected
timestamp(SdBaseFile *file)SdBaseFileprotected
timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)SdBaseFileprotected
truncios_basestatic
truncate(uint32_t size)SdBaseFileprotected
type() const SdBaseFileinlineprotected
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
volume() const SdBaseFileinlineprotected
width()ios_baseinline
width(unsigned n)ios_baseinline
write(const void *buf, size_t nbyte)SdBaseFileprotected
writeErrorSdBaseFileprotected
+ + + + diff --git a/html/class_sd_stream_base.html b/html/class_sd_stream_base.html new file mode 100644 index 0000000..86c3995 --- /dev/null +++ b/html/class_sd_stream_base.html @@ -0,0 +1,3906 @@ + + + + + + +SdFat: SdStreamBase Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

Base class for SD streams. + More...

+ +

#include <SdStream.h>

+
+Inheritance diagram for SdStreamBase:
+
+
Inheritance graph
+ + +
[legend]
+
+Collaboration diagram for SdStreamBase:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + +

+Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, +cur, +end + }
 
typedef uint32_t streamsize
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
bool good () const
 
 operator const void * () const
 
bool operator! () const
 
int precision () const
 
int precision (unsigned int n)
 
iostate rdstate () const
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Member Functions

uint32_t available ()
 
void clearWriteError ()
 
bool close ()
 
bool contiguousRange (uint32_t *bgnBlock, uint32_t *endBlock)
 
bool createContiguous (SdBaseFile *dirFile, const char *path, uint32_t size)
 
uint32_t curCluster () const
 
uint32_t curPosition () const
 
bool dirEntry (dir_t *dir)
 
bool exists (const char *name)
 
int16_t fgets (char *str, int16_t num, char *delim=0)
 
uint32_t fileSize () const
 
uint32_t firstCluster () const
 
uint8_t flagsToBase ()
 
bool getFilename (char *name)
 
void getpos (FatPos_t *pos)
 
bool getWriteError ()
 
bool isDir () const
 
bool isFile () const
 
bool isOpen () const
 
bool isRoot () const
 
bool isSubDir () const
 
void ls (Print *pr, uint8_t flags=0, uint8_t indent=0)
 
void ls (uint8_t flags=0)
 
bool mkdir (SdBaseFile *dir, const char *path, bool pFlag=true)
 
bool open (SdBaseFile *dirFile, uint16_t index, uint8_t oflag)
 
bool open (SdBaseFile *dirFile, const char *path, uint8_t oflag)
 
bool open (const char *path, uint8_t oflag=O_READ)
 
bool openNext (SdBaseFile *dirFile, uint8_t oflag)
 
bool openRoot (SdVolume *vol)
 
int peek ()
 
bool printCreateDateTime (Print *pr)
 
int printField (int16_t value, char term)
 
int printField (uint16_t value, char term)
 
int printField (int32_t value, char term)
 
int printField (uint32_t value, char term)
 
size_t printFileSize (Print *pr)
 
bool printModifyDateTime (Print *pr)
 
size_t printName ()
 
size_t printName (Print *pr)
 
int16_t read ()
 
int read (void *buf, size_t nbyte)
 
int8_t readDir (dir_t *dir)
 
bool remove ()
 
bool rename (SdBaseFile *dirFile, const char *newPath)
 
void rewind ()
 
bool rmdir ()
 
bool rmRfStar ()
 
bool seekCur (int32_t offset)
 
bool seekEnd (int32_t offset=0)
 
bool seekSet (uint32_t pos)
 
void setpos (FatPos_t *pos)
 
bool sync ()
 
bool timestamp (SdBaseFile *file)
 
bool timestamp (uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
 
bool truncate (uint32_t size)
 
uint8_t type () const
 
SdVolumevolume () const
 
int write (const void *buf, size_t nbyte)
 
+ + + + + + + + + + + + + + + + + + + +

+Static Protected Member Functions

static SdBaseFilecwd ()
 
static void dateTimeCallback (void(*dateTime)(uint16_t *date, uint16_t *time))
 
static void dateTimeCallbackCancel ()
 
static void dirName (const dir_t &dir, char *name)
 
static void printFatDate (uint16_t fatDate)
 
static void printFatDate (Print *pr, uint16_t fatDate)
 
static void printFatTime (uint16_t fatTime)
 
static void printFatTime (Print *pr, uint16_t fatTime)
 
static bool remove (SdBaseFile *dirFile, const char *path)
 
+ + + +

+Protected Attributes

bool writeError
 
+

Detailed Description

+

Base class for SD streams.

+

Member Typedef Documentation

+ +
+
+ + + + + +
+ + + + +
typedef unsigned int ios_base::fmtflags
+
+inherited
+
+

type for format flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef unsigned char ios_base::iostate
+
+inherited
+
+

typedef for iostate bitmask

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef int32_t ios_base::off_type
+
+inherited
+
+

type for relative seek offset

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint8_t ios_base::openmode
+
+inherited
+
+

typedef for iostream open mode

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::pos_type
+
+inherited
+
+

type for absolute seek position

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::streamsize
+
+inherited
+
+

unsigned size that can represent maximum file size. (violates spec - should be signed)

+ +
+
+

Member Enumeration Documentation

+ +
+
+ + + + + +
+ + + + +
enum ios_base::seekdir
+
+inherited
+
+

enumerated type for the direction of relative seeks

+ + + + +
Enumerator
beg  +

seek relative to the beginning of the stream

+
cur  +

seek relative to the current stream position

+
end  +

seek relative to the end of the stream

+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdBaseFile::available ()
+
+inlineinherited
+
+
Returns
number of bytes available from yhe current position to EOF
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::bad () const
+
+inlineinherited
+
+
Returns
true if bad bit is set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::clear (iostate state = goodbit)
+
+inlineinherited
+
+

Clear iostate bits.

+
Parameters
+ + +
[in]stateThe flags you want to set after clearing all flags.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void SdBaseFile::clearWriteError ()
+
+inlineinherited
+
+

Set writeError to zero

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::close ()
+
+inherited
+
+

Close a file and force cached data and directory information to be written to the storage device.

+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include no file is open or an I/O error.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool SdBaseFile::contiguousRange (uint32_t * bgnBlock,
uint32_t * endBlock 
)
+
+inherited
+
+

Check for contiguous file and return its raw block range.

+
Parameters
+ + + +
[out]bgnBlockthe first block address for the file.
[out]endBlockthe last block address for the file.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include file is not contiguous, file has zero length or an I/O error occurred.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool SdBaseFile::createContiguous (SdBaseFiledirFile,
const char * path,
uint32_t size 
)
+
+inherited
+
+

Create and open a new contiguous file of a specified size.

+
Note
This function only supports short DOS 8.3 names. See open() for more information.
+
Parameters
+ + + + +
[in]dirFileThe directory where the file will be created.
[in]pathA path with a valid DOS 8.3 file name.
[in]sizeThe desired file size.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include path contains an invalid DOS 8.3 file name, the FAT volume has not been initialized, a file is already open, the file already exists, the root directory is full or an I/O error.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdBaseFile::curCluster () const
+
+inlineinherited
+
+
Returns
The current cluster number for a file or directory.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdBaseFile::curPosition () const
+
+inlineinherited
+
+
Returns
The current position for a file or directory.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static SdBaseFile* SdBaseFile::cwd ()
+
+inlinestaticinherited
+
+
Returns
Current working directory
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void SdBaseFile::dateTimeCallback (void(*)(uint16_t *date, uint16_t *time) dateTime)
+
+inlinestaticinherited
+
+

Set the date/time callback function

+
Parameters
+ + +
[in]dateTimeThe user's call back function. The callback function is of the form:
+
+
+
void dateTime(uint16_t* date, uint16_t* time) {
+
uint16_t year;
+
uint8_t month, day, hour, minute, second;
+
+
// User gets date and time from GPS or real-time clock here
+
+
// return date using FAT_DATE macro to format fields
+
*date = FAT_DATE(year, month, day);
+
+
// return time using FAT_TIME macro to format fields
+
*time = FAT_TIME(hour, minute, second);
+
}
+

Sets the function that is called when a file is created or when a file's directory entry is modified by sync(). All timestamps, access, creation, and modify, are set when a file is created. sync() maintains the last access date and last modify date/time.

+

See the timestamp() function.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
static void SdBaseFile::dateTimeCallbackCancel ()
+
+inlinestaticinherited
+
+

Cancel the date/time callback function.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::dirEntry (dir_t * dir)
+
+inherited
+
+

Return a file's directory entry.

+
Parameters
+ + +
[out]dirLocation for return of the file's directory entry.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void SdBaseFile::dirName (const dir_t & dir,
char * name 
)
+
+staticinherited
+
+

Format the name field of dir into the 13 byte array name in standard 8.3 short name format.

+
Parameters
+ + + +
[in]dirThe directory structure containing the name.
[out]nameA 13 byte char array for the formatted name.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::eof () const
+
+inlineinherited
+
+
Returns
true if end of file has been reached else false.
+

Warning: An empty file returns false before the first read.

+

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::exists (const char * name)
+
+inherited
+
+

Test for the existence of a file in a directory

+
Parameters
+ + +
[in]nameName of the file to be tested for.
+
+
+

The calling instance must be an open directory file.

+

dirFile.exists("TOFIND.TXT") searches for "TOFIND.TXT" in the directory dirFile.

+
Returns
true if the file exists else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::fail () const
+
+inlineinherited
+
+
Returns
true if any iostate bit other than eof are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
int16_t SdBaseFile::fgets (char * str,
int16_t num,
char * delim = 0 
)
+
+inherited
+
+

Get a string from a file.

+

fgets() reads bytes from a file into the array pointed to by str, until num - 1 bytes are read, or a delimiter is read and transferred to str, or end-of-file is encountered. The string is then terminated with a null byte.

+

fgets() deletes CR, '\r', from the string. This insures only a '\n' terminates the string for Windows text files which use CRLF for newline.

+
Parameters
+ + + + +
[out]strPointer to the array where the string is stored.
[in]numMaximum number of characters to be read (including the final null byte). Usually the length of the array str is used.
[in]delimOptional set of delimiters. The default is "\n".
+
+
+
Returns
For success fgets() returns the length of the string in str. If no data is read, fgets() returns zero for EOF or -1 if an error occurred.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdBaseFile::fileSize () const
+
+inlineinherited
+
+
Returns
The total number of bytes in a file or directory.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
char ios_base::fill ()
+
+inlineinherited
+
+
Returns
fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
char ios_base::fill (char c)
+
+inlineinherited
+
+

Set fill character

+
Parameters
+ + +
[in]cnew fill character
+
+
+
Returns
old fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdBaseFile::firstCluster () const
+
+inlineinherited
+
+
Returns
The first cluster number for a file or directory.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
fmtflags ios_base::flags () const
+
+inlineinherited
+
+
Returns
format flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::flags (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flag
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t ios_base::flagsToBase ()
+
+inlineprotectedinherited
+
+
Returns
current number base
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::getFilename (char * name)
+
+inherited
+
+

Get a file's name

+
Parameters
+ + +
[out]nameAn array of 13 characters for the file's name.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void SdBaseFile::getpos (FatPos_tpos)
+
+inherited
+
+

get position for streams

+
Parameters
+ + +
[out]posstruct to receive position
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::getWriteError ()
+
+inlineinherited
+
+
Returns
value of writeError
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::good () const
+
+inlineinherited
+
+
Returns
True if no iostate flags are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::isDir () const
+
+inlineinherited
+
+
Returns
True if this is a directory else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::isFile () const
+
+inlineinherited
+
+
Returns
True if this is a normal file else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::isOpen () const
+
+inlineinherited
+
+
Returns
True if this is an open file/directory else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::isRoot () const
+
+inlineinherited
+
+
Returns
True if this is the root directory.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::isSubDir () const
+
+inlineinherited
+
+
Returns
True if this is a subdirectory else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void SdBaseFile::ls (Print * pr,
uint8_t flags = 0,
uint8_t indent = 0 
)
+
+inherited
+
+

List directory contents.

+
Parameters
+ + + +
[in]prPrint stream for list.
[in]flagsThe inclusive OR of
+
+
+

LS_DATE - Print file modification date

+

LS_SIZE - Print file size.

+

LS_R - Recursive list of subdirectories.

+
Parameters
+ + +
[in]indentAmount of space before file name. Used for recursive list to indicate subdirectory level.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void SdBaseFile::ls (uint8_t flags = 0)
+
+inherited
+
+

List directory contents to stdOut.

+
Parameters
+ + +
[in]flagsThe inclusive OR of
+
+
+

LS_DATE - Print file modification date

+

LS_SIZE - Print file size.

+

LS_R - Recursive list of subdirectories.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool SdBaseFile::mkdir (SdBaseFileparent,
const char * path,
bool pFlag = true 
)
+
+inherited
+
+

Make a new directory.

+
Parameters
+ + + + +
[in]parentAn open SdFat instance for the directory that will contain the new directory.
[in]pathA path with a valid 8.3 DOS name for the new directory.
[in]pFlagCreate missing parent directories if true.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include this file is already open, parent is not a directory, path is invalid or already exists in parent.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool SdBaseFile::open (SdBaseFiledirFile,
uint16_t index,
uint8_t oflag 
)
+
+inherited
+
+

Open a file by index.

+
Parameters
+ + + + +
[in]dirFileAn open SdFat instance for the directory.
[in]indexThe index of the directory entry for the file to be opened. The value for index is (directory file position)/32.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC.
+
+
+

See open() by path for definition of flags.

+
Returns
true for success or false for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool SdBaseFile::open (SdBaseFiledirFile,
const char * path,
uint8_t oflag 
)
+
+inherited
+
+

Open a file or directory by name.

+
Parameters
+ + + + +
[in]dirFileAn open SdFat instance for the directory containing the file to be opened.
[in]pathA path with a valid 8.3 DOS name for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of flags from the following list
+
+
+

O_READ - Open for reading.

+

O_RDONLY - Same as O_READ.

+

O_WRITE - Open for writing.

+

O_WRONLY - Same as O_WRITE.

+

O_RDWR - Open for reading and writing.

+

O_APPEND - If set, the file offset shall be set to the end of the file prior to each write.

+

O_AT_END - Set the initial position at the end of the file.

+

O_CREAT - If the file exists, this flag has no effect except as noted under O_EXCL below. Otherwise, the file shall be created

+

O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists.

+

O_SYNC - Call sync() after each write. This flag should not be used with write(uint8_t), write_P(PGM_P), writeln_P(PGM_P), or the Arduino Print class. These functions do character at a time writes so sync() will be called after each byte.

+

O_TRUNC - If the file exists and is a regular file, and the file is successfully opened and is not read only, its length shall be truncated to 0.

+

WARNING: A given file must not be opened by more than one SdBaseFile object of file corruption may occur.

+
Note
Directory files must be opened read only. Write and truncation is not allowed for directory files.
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include this file is already open, dirFile is not a directory, path is invalid, the file does not exist or can't be opened in the access mode specified by oflag.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool SdBaseFile::open (const char * path,
uint8_t oflag = O_READ 
)
+
+inherited
+
+

Open a file in the current working directory.

+
Parameters
+ + + +
[in]pathA path with a valid 8.3 DOS name for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of open flags. see SdBaseFile::open(SdBaseFile*, const char*, uint8_t).
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool SdBaseFile::openNext (SdBaseFiledirFile,
uint8_t oflag 
)
+
+inherited
+
+

Open the next file or subdirectory in a directory.

+
Parameters
+ + + +
[in]dirFileAn open SdFat instance for the directory containing the file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC.
+
+
+

See open() by path for definition of flags.

+
Returns
true for success or false for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::openRoot (SdVolumevol)
+
+inherited
+
+

Open a volume's root directory.

+
Parameters
+ + +
[in]volThe FAT volume containing the root directory to be opened.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include the file is already open, the FAT volume has not been initialized or it a FAT12 volume.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ios::operator const void * () const
+
+inlineinherited
+
+
Returns
null pointer if fail() is true.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::operator! () const
+
+inlineinherited
+
+
Returns
true if fail() else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int SdBaseFile::peek ()
+
+inherited
+
+

Return the next available byte without consuming it.

+
Returns
The byte if no error and not at eof else -1;
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int ios_base::precision () const
+
+inlineinherited
+
+
Returns
precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int ios_base::precision (unsigned int n)
+
+inlineinherited
+
+

set precision

+
Parameters
+ + +
[in]nnew precision
+
+
+
Returns
old precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::printCreateDateTime (Print * pr)
+
+inherited
+
+

Print a file's creation date and time

+
Parameters
+ + +
[in]prPrint stream for output.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void SdBaseFile::printFatDate (uint16_t fatDate)
+
+staticinherited
+
+

Print a directory date field to stdOut.

+

Format is yyyy-mm-dd.

+
Parameters
+ + +
[in]fatDateThe date field from a directory entry.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void SdBaseFile::printFatDate (Print * pr,
uint16_t fatDate 
)
+
+staticinherited
+
+

Print a directory date field.

+

Format is yyyy-mm-dd.

+
Parameters
+ + + +
[in]prPrint stream for output.
[in]fatDateThe date field from a directory entry.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void SdBaseFile::printFatTime (uint16_t fatTime)
+
+staticinherited
+
+

Print a directory time field to stdOut.

+

Format is hh:mm:ss.

+
Parameters
+ + +
[in]fatTimeThe time field from a directory entry.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void SdBaseFile::printFatTime (Print * pr,
uint16_t fatTime 
)
+
+staticinherited
+
+

Print a directory time field.

+

Format is hh:mm:ss.

+
Parameters
+ + + +
[in]prPrint stream for output.
[in]fatTimeThe time field from a directory entry.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
int SdBaseFile::printField (int16_t value,
char term 
)
+
+inherited
+
+

Print a number followed by a field terminator.

+
Parameters
+ + + +
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
int SdBaseFile::printField (uint16_t value,
char term 
)
+
+inherited
+
+

Print a number followed by a field terminator.

+
Parameters
+ + + +
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
int SdBaseFile::printField (int32_t value,
char term 
)
+
+inherited
+
+

Print a number followed by a field terminator.

+
Parameters
+ + + +
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
int SdBaseFile::printField (uint32_t value,
char term 
)
+
+inherited
+
+

Print a number followed by a field terminator.

+
Parameters
+ + + +
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
size_t SdBaseFile::printFileSize (Print * pr)
+
+inherited
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::printModifyDateTime (Print * pr)
+
+inherited
+
+

Print a file's modify date and time

+
Parameters
+ + +
[in]prPrint stream for output.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
size_t SdBaseFile::printName ()
+
+inherited
+
+

Print a file's name to stdOut

+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
size_t SdBaseFile::printName (Print * pr)
+
+inherited
+
+

Print a file's name

+
Parameters
+ + +
[in]prPrint stream for output.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
iostate ios::rdstate () const
+
+inlineinherited
+
+
Returns
The iostate flags for this file.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int16_t SdBaseFile::read ()
+
+inherited
+
+

Read the next byte from a file.

+
Returns
For success read returns the next byte in the file as an int. If an error occurs or end of file is reached -1 is returned.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
int SdBaseFile::read (void * buf,
size_t nbyte 
)
+
+inherited
+
+

Read data from a file starting at the current position.

+
Parameters
+ + + +
[out]bufPointer to the location that will receive the data.
[in]nbyteMaximum number of bytes to read.
+
+
+
Returns
For success read() returns the number of bytes read. A value less than nbyte, including zero, will be returned if end of file is reached. If an error occurs, read() returns -1. Possible errors include read() called before a file has been opened, corrupt file system or an I/O error occurred.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int8_t SdBaseFile::readDir (dir_t * dir)
+
+inherited
+
+

Read the next directory entry from a directory file.

+
Parameters
+ + +
[out]dirThe dir_t struct that will receive the data.
+
+
+
Returns
For success readDir() returns the number of bytes read. A value of zero will be returned if end of file is reached. If an error occurs, readDir() returns -1. Possible errors include readDir() called before a directory has been opened, this is not a directory file or an I/O error occurred.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool SdBaseFile::remove (SdBaseFiledirFile,
const char * path 
)
+
+staticinherited
+
+

Remove a file.

+

The directory entry and all data for the file are deleted.

+
Parameters
+ + + +
[in]dirFileThe directory that contains the file.
[in]pathPath for the file to be removed.
+
+
+
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include the file is a directory, is read only, dirFile is not a directory, path is not found or an I/O error occurred.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::remove ()
+
+inherited
+
+

Remove a file.

+

The directory entry and all data for the file are deleted.

+
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include the file read-only, is a directory, or an I/O error occurred.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool SdBaseFile::rename (SdBaseFiledirFile,
const char * newPath 
)
+
+inherited
+
+

Rename a file or subdirectory.

+
Parameters
+ + + +
[in]dirFileDirectory for the new path.
[in]newPathNew path name for the file/directory.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include dirFile is not open or is not a directory file, newPath is invalid or already exists, or an I/O error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void SdBaseFile::rewind ()
+
+inlineinherited
+
+

Set the file's current position to zero.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::rmdir ()
+
+inherited
+
+

Remove a directory file.

+

The directory file will be removed only if it is empty and is not the root directory. rmdir() follows DOS and Windows and ignores the read-only attribute for the directory.

+
Note
This function should not be used to delete the 8.3 version of a directory that has a long name. For example if a directory has the long name "New folder" you should not delete the 8.3 name "NEWFOL~1".
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include the file is not a directory, is the root directory, is not empty, or an I/O error occurred.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::rmRfStar ()
+
+inherited
+
+

Recursively delete a directory and all contained files.

+

This is like the Unix/Linux 'rm -rf *' if called with the root directory hence the name.

+

Warning - This will remove all contents of the directory including subdirectories. The directory will then be removed if it is not root. The read-only attribute for files will be ignored.

+
Note
This function should not be used to delete the 8.3 version of a directory that has a long name. See remove() and rmdir().
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::seekCur (int32_t offset)
+
+inlineinherited
+
+

Set the files position to current position + pos. See seekSet().

+
Parameters
+ + +
[in]offsetThe new position in bytes from the current position.
+
+
+
Returns
true for success or false for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::seekEnd (int32_t offset = 0)
+
+inlineinherited
+
+

Set the files position to end-of-file + offset. See seekSet().

+
Parameters
+ + +
[in]offsetThe new position in bytes from end-of-file.
+
+
+
Returns
true for success or false for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::seekSet (uint32_t pos)
+
+inherited
+
+

Sets a file's position.

+
Parameters
+ + +
[in]posThe new position in bytes from the beginning of the file.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::setf (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flags to be or'ed in
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
+
+inlineinherited
+
+

modify format flags

+
Parameters
+ + + +
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void SdBaseFile::setpos (FatPos_tpos)
+
+inherited
+
+

set position for streams

+
Parameters
+ + +
[out]posstruct with value for new position
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::setstate (iostate state)
+
+inlineinherited
+
+

Set iostate bits.

+
Parameters
+ + +
[in]stateBitts to set.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool SdBaseFile::sync ()
+
+inherited
+
+

The sync() call causes all modified data and directory fields to be written to the storage device.

+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include a call to sync() before a file has been opened or an I/O error.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::timestamp (SdBaseFilefile)
+
+inherited
+
+

Copy a file's timestamps

+
Parameters
+ + +
[in]fileFile to copy timestamps from.
+
+
+
Note
Modify and access timestamps may be overwritten if a date time callback function has been set by dateTimeCallback().
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
bool SdBaseFile::timestamp (uint8_t flags,
uint16_t year,
uint8_t month,
uint8_t day,
uint8_t hour,
uint8_t minute,
uint8_t second 
)
+
+inherited
+
+

Set a file's timestamps in its directory entry.

+
Parameters
+ + +
[in]flagsValues for flags are constructed by a bitwise-inclusive OR of flags from the following list
+
+
+

T_ACCESS - Set the file's last access date.

+

T_CREATE - Set the file's creation date and time.

+

T_WRITE - Set the file's last write/modification date and time.

+
Parameters
+ + + + + + + +
[in]yearValid range 1980 - 2107 inclusive.
[in]monthValid range 1 - 12 inclusive.
[in]dayValid range 1 - 31 inclusive.
[in]hourValid range 0 - 23 inclusive.
[in]minuteValid range 0 - 59 inclusive.
[in]secondValid range 0 - 59 inclusive
+
+
+
Note
It is possible to set an invalid date since there is no check for the number of days in a month.
+
+Modify and access timestamps may be overwritten if a date time callback function has been set by dateTimeCallback().
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdBaseFile::truncate (uint32_t length)
+
+inherited
+
+

Truncate a file to a specified length. The current file position will be maintained if it is less than or equal to length otherwise it will be set to end of file.

+
Parameters
+ + +
[in]lengthThe desired length for the file.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include file is read only, file is a directory, length is greater than the current file size or an I/O error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t SdBaseFile::type () const
+
+inlineinherited
+
+

Type of file. You should use isFile() or isDir() instead of type() if possible.

+
Returns
The file or directory type.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios_base::unsetf (fmtflags fl)
+
+inlineinherited
+
+

clear format flags

+
Parameters
+ + +
[in]flflags to be cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
SdVolume* SdBaseFile::volume () const
+
+inlineinherited
+
+
Returns
SdVolume that contains this file.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
unsigned ios_base::width ()
+
+inlineinherited
+
+
Returns
width
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
unsigned ios_base::width (unsigned n)
+
+inlineinherited
+
+

set width

+
Parameters
+ + +
[in]nnew width
+
+
+
Returns
old width
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
int SdBaseFile::write (const void * buf,
size_t nbyte 
)
+
+inherited
+
+

Write data to an open file.

+
Note
Data is moved to the cache but may not be written to the storage device until sync() is called.
+
Parameters
+ + + +
[in]bufPointer to the location of the data to be written.
[in]nbyteNumber of bytes to write.
+
+
+
Returns
For success write() returns the number of bytes written, always nbyte. If an error occurs, write() returns -1. Possible errors include write() is called before a file has been opened, write is called for a read-only file, device is full, a corrupt file system or an I/O error.
+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::adjustfield = left | right | internal
+
+staticinherited
+
+

mask for adjustfield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::app = 0X4
+
+staticinherited
+
+

seek to end before each write

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::ate = 0X8
+
+staticinherited
+
+

open and seek to end immediately after opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::badbit = 0X01
+
+staticinherited
+
+

iostate bad bit for a nonrecoverable error.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::basefield = dec | hex | oct
+
+staticinherited
+
+

mask for basefield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::binary = 0X10
+
+staticinherited
+
+

perform input and output in binary mode (as opposed to text mode)

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::boolalpha = 0x0100
+
+staticinherited
+
+

use strings true/false for bool

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::dec = 0x0008
+
+staticinherited
+
+

base 10 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::eofbit = 0x02
+
+staticinherited
+
+

iostate bit for end of file reached

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::failbit = 0X04
+
+staticinherited
+
+

iostate fail bit for nonfatal error

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::goodbit = 0x00
+
+staticinherited
+
+

iostate for no flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::hex = 0x0010
+
+staticinherited
+
+

base 16 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::in = 0X20
+
+staticinherited
+
+

open for input

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::internal = 0x0004
+
+staticinherited
+
+

fill between sign/base prefix and number

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::left = 0x0001
+
+staticinherited
+
+

left adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::oct = 0x0020
+
+staticinherited
+
+

base 8 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::out = 0X40
+
+staticinherited
+
+

open for output

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::right = 0x0002
+
+staticinherited
+
+

right adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showbase = 0x0200
+
+staticinherited
+
+

use prefix 0X for hex and 0 for oct

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpoint = 0x0400
+
+staticinherited
+
+

always show '.' for floating numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpos = 0x0800
+
+staticinherited
+
+

show + sign for nonnegative numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::skipws = 0x1000
+
+staticinherited
+
+

skip initial white space

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::trunc = 0X80
+
+staticinherited
+
+

truncate an existing stream when opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::uppercase = 0x4000
+
+staticinherited
+
+

use uppercase letters in number representations

+ +
+
+ +
+
+ + + + + +
+ + + + +
bool SdBaseFile::writeError
+
+inherited
+
+

writeError is set to true if an error occurs during a write(). Set writeError to false before calling print() and/or write() and check for true after calls to print() and/or write().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/html/class_sd_stream_base__coll__graph.png b/html/class_sd_stream_base__coll__graph.png new file mode 100644 index 0000000..916d5ab Binary files /dev/null and b/html/class_sd_stream_base__coll__graph.png differ diff --git a/html/class_sd_stream_base__inherit__graph.png b/html/class_sd_stream_base__inherit__graph.png new file mode 100644 index 0000000..b4c8948 Binary files /dev/null and b/html/class_sd_stream_base__inherit__graph.png differ diff --git a/html/class_sd_volume-members.html b/html/class_sd_volume-members.html new file mode 100644 index 0000000..2f7ebd5 --- /dev/null +++ b/html/class_sd_volume-members.html @@ -0,0 +1,79 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
SdVolume Member List
+
+
+ +

This is the complete list of members for SdVolume, including all inherited members.

+ + + + + + + + + + + + + + + + + + + +
blocksPerCluster() const SdVolumeinline
blocksPerFat() const SdVolumeinline
cacheClear()SdVolumeinline
clusterCount() const SdVolumeinline
clusterSizeShift() const SdVolumeinline
dataStartBlock() const SdVolumeinline
dbgFat(uint32_t n, uint32_t *v)SdVolumeinline
fatCount() const SdVolumeinline
fatStartBlock() const SdVolumeinline
fatType() const SdVolumeinline
freeClusterCount()SdVolume
init(Sd2Card *dev)SdVolumeinline
init(Sd2Card *dev, uint8_t part)SdVolume
rootDirEntryCount() const SdVolumeinline
rootDirStart() const SdVolumeinline
SdBaseFile classSdVolumefriend
sdCard()SdVolumeinline
SdVolume()SdVolumeinline
+ + + + diff --git a/html/class_sd_volume.html b/html/class_sd_volume.html new file mode 100644 index 0000000..57bd2c1 --- /dev/null +++ b/html/class_sd_volume.html @@ -0,0 +1,580 @@ + + + + + + +SdFat: SdVolume Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+ +
+
SdVolume Class Reference
+
+
+ +

Access FAT16 and FAT32 volumes on SD and SDHC cards. + More...

+ +

#include <SdVolume.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

uint8_t blocksPerCluster () const
 
uint32_t blocksPerFat () const
 
cache_tcacheClear ()
 
uint32_t clusterCount () const
 
uint8_t clusterSizeShift () const
 
uint32_t dataStartBlock () const
 
bool dbgFat (uint32_t n, uint32_t *v)
 
uint8_t fatCount () const
 
uint32_t fatStartBlock () const
 
uint8_t fatType () const
 
int32_t freeClusterCount ()
 
bool init (Sd2Card *dev)
 
bool init (Sd2Card *dev, uint8_t part)
 
uint32_t rootDirEntryCount () const
 
uint32_t rootDirStart () const
 
Sd2CardsdCard ()
 
 SdVolume ()
 
+ + + +

+Friends

class SdBaseFile
 
+

Detailed Description

+

Access FAT16 and FAT32 volumes on SD and SDHC cards.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + +
SdVolume::SdVolume ()
+
+inline
+
+

Create an instance of SdVolume

+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
uint8_t SdVolume::blocksPerCluster () const
+
+inline
+
+
Returns
The volume's cluster size in blocks.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdVolume::blocksPerFat () const
+
+inline
+
+
Returns
The number of blocks in one FAT.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
cache_t* SdVolume::cacheClear ()
+
+inline
+
+

Clear the cache and returns a pointer to the cache. Used by the WaveRP recorder to do raw write to the SD card. Not for normal apps.

+
Returns
A pointer to the cache buffer or zero if an error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdVolume::clusterCount () const
+
+inline
+
+
Returns
The total number of clusters in the volume.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t SdVolume::clusterSizeShift () const
+
+inline
+
+
Returns
The shift count required to multiply by blocksPerCluster.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdVolume::dataStartBlock () const
+
+inline
+
+
Returns
The logical block number for the start of file data.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool SdVolume::dbgFat (uint32_t n,
uint32_t * v 
)
+
+inline
+
+

Debug access to FAT table

+
Parameters
+ + + +
[in]ncluster number.
[out]vvalue of entry
+
+
+
Returns
true for success or false for failure
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t SdVolume::fatCount () const
+
+inline
+
+
Returns
The number of FAT structures on the volume.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdVolume::fatStartBlock () const
+
+inline
+
+
Returns
The logical block number for the start of the first FAT.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t SdVolume::fatType () const
+
+inline
+
+
Returns
The FAT type of the volume. Values are 12, 16 or 32.
+ +
+
+ +
+
+ + + + + + + +
int32_t SdVolume::freeClusterCount ()
+
+

Volume free space in clusters.

+
Returns
Count of free clusters for success or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool SdVolume::init (Sd2Carddev)
+
+inline
+
+

Initialize a FAT volume. Try partition one first then try super floppy format.

+
Parameters
+ + +
[in]devThe Sd2Card where the volume is located.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include not finding a valid partition, not finding a valid FAT file system or an I/O error.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool SdVolume::init (Sd2Carddev,
uint8_t part 
)
+
+

Initialize a FAT volume.

+
Parameters
+ + + +
[in]devThe SD card where the volume is located.
[in]partThe partition to be used. Legal values for part are 1-4 to use the corresponding partition on a device formatted with a MBR, Master Boot Record, or zero if the device is formatted as a super floppy with the FAT boot sector in block zero.
+
+
+
Returns
The value one, true, is returned for success and the value zero, false, is returned for failure. Reasons for failure include not finding a valid partition, not finding a valid FAT file system in the specified partition or an I/O error.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdVolume::rootDirEntryCount () const
+
+inline
+
+
Returns
The number of entries in the root directory for FAT16 volumes.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t SdVolume::rootDirStart () const
+
+inline
+
+
Returns
The logical block number for the start of the root directory on FAT16 volumes or the first cluster number on FAT32 volumes.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
Sd2Card* SdVolume::sdCard ()
+
+inline
+
+

Sd2Card object for this volume

+
Returns
pointer to Sd2Card object.
+ +
+
+

Friends And Related Function Documentation

+ +
+
+ + + + + +
+ + + + +
friend class SdBaseFile
+
+friend
+
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/html/class_stdio_stream-members.html b/html/class_stdio_stream-members.html new file mode 100644 index 0000000..b7ca182 --- /dev/null +++ b/html/class_stdio_stream-members.html @@ -0,0 +1,173 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
StdioStream Member List
+
+
+ +

This is the complete list of members for StdioStream, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
available()SdBaseFileinlineprivate
clearerr()StdioStreaminline
clearWriteError()SdBaseFileinlineprivate
close()SdBaseFileprivate
contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock)SdBaseFileprivate
createContiguous(SdBaseFile *dirFile, const char *path, uint32_t size)SdBaseFileprivate
curCluster() const SdBaseFileinlineprivate
curPosition() const SdBaseFileinlineprivate
cwd()SdBaseFileinlineprivatestatic
dateTimeCallback(void(*dateTime)(uint16_t *date, uint16_t *time))SdBaseFileinlineprivatestatic
dateTimeCallbackCancel()SdBaseFileinlineprivatestatic
dirEntry(dir_t *dir)SdBaseFileprivate
dirName(const dir_t &dir, char *name)SdBaseFileprivatestatic
exists(const char *name)SdBaseFileprivate
fclose()StdioStream
feof()StdioStreaminline
ferror()StdioStreaminline
fflush()StdioStream
fgetc()StdioStreaminline
fgets(char *str, int num, size_t *len=0)StdioStream
SdBaseFile::fgets(char *str, int16_t num, char *delim=0)SdBaseFileprivate
fileSize() const SdBaseFileinlineprivate
firstCluster() const SdBaseFileinlineprivate
fopen(const char *filename, const char *mode)StdioStream
fputc(int c)StdioStreaminline
fputs(const char *str)StdioStream
fputs_P(PGM_P str)StdioStream
fread(void *ptr, size_t size, size_t count)StdioStream
fseek(int32_t offset, int origin)StdioStream
ftell()StdioStream
fwrite(const void *ptr, size_t size, size_t count)StdioStream
getc()StdioStreaminline
getFilename(char *name)SdBaseFileprivate
getpos(FatPos_t *pos)SdBaseFileprivate
getWriteError()SdBaseFileinlineprivate
isDir() const SdBaseFileinlineprivate
isFile() const SdBaseFileinlineprivate
isOpen() const SdBaseFileinlineprivate
isRoot() const SdBaseFileinlineprivate
isSubDir() const SdBaseFileinlineprivate
ls(Print *pr, uint8_t flags=0, uint8_t indent=0)SdBaseFileprivate
ls(uint8_t flags=0)SdBaseFileprivate
mkdir(SdBaseFile *dir, const char *path, bool pFlag=true)SdBaseFileprivate
open(SdBaseFile *dirFile, uint16_t index, uint8_t oflag)SdBaseFileprivate
open(SdBaseFile *dirFile, const char *path, uint8_t oflag)SdBaseFileprivate
open(const char *path, uint8_t oflag=O_READ)SdBaseFileprivate
openNext(SdBaseFile *dirFile, uint8_t oflag)SdBaseFileprivate
openRoot(SdVolume *vol)SdBaseFileprivate
peek()SdBaseFileprivate
print(char c)StdioStreaminline
print(const char *str)StdioStreaminline
print(const __FlashStringHelper *str)StdioStream
print(double val, uint8_t prec=2)StdioStreaminline
print(float val, uint8_t prec=2)StdioStreaminline
print(T val)StdioStreaminline
printCreateDateTime(Print *pr)SdBaseFileprivate
printDec(char n)StdioStreaminline
printDec(signed char n)StdioStream
printDec(unsigned char n)StdioStreaminline
printDec(int16_t n)StdioStream
printDec(uint16_t n)StdioStream
printDec(int32_t n)StdioStream
printDec(uint32_t n)StdioStream
printDec(double value, uint8_t prec)StdioStreaminline
printDec(float value, uint8_t prec)StdioStream
printFatDate(uint16_t fatDate)SdBaseFileprivatestatic
printFatDate(Print *pr, uint16_t fatDate)SdBaseFileprivatestatic
printFatTime(uint16_t fatTime)SdBaseFileprivatestatic
printFatTime(Print *pr, uint16_t fatTime)SdBaseFileprivatestatic
printField(double value, char term, uint8_t prec=2)StdioStreaminline
printField(float value, char term, uint8_t prec=2)StdioStreaminline
printField(T value, char term)StdioStreaminline
SdBaseFile::printField(int16_t value, char term)SdBaseFileprivate
SdBaseFile::printField(uint16_t value, char term)SdBaseFileprivate
SdBaseFile::printField(int32_t value, char term)SdBaseFileprivate
SdBaseFile::printField(uint32_t value, char term)SdBaseFileprivate
printFileSize(Print *pr)SdBaseFileprivate
printHex(uint32_t n)StdioStream
printHexln(uint32_t n)StdioStreaminline
println()StdioStreaminline
println(double val, uint8_t prec=2)StdioStreaminline
println(float val, uint8_t prec=2)StdioStreaminline
println(T val)StdioStreaminline
printModifyDateTime(Print *pr)SdBaseFileprivate
printName()SdBaseFileprivate
printName(Print *pr)SdBaseFileprivate
putc(int c)StdioStreaminline
putCRLF()StdioStreaminline
read()SdBaseFileprivate
read(void *buf, size_t nbyte)SdBaseFileprivate
readDir(dir_t *dir)SdBaseFileprivate
remove(SdBaseFile *dirFile, const char *path)SdBaseFileprivatestatic
remove()SdBaseFileprivate
rename(SdBaseFile *dirFile, const char *newPath)SdBaseFileprivate
rewind()StdioStream
rmdir()SdBaseFileprivate
rmRfStar()SdBaseFileprivate
SdBaseFile()SdBaseFileinlineprivate
SdBaseFile(const char *path, uint8_t oflag)SdBaseFileprivate
seekCur(int32_t offset)SdBaseFileinlineprivate
seekEnd(int32_t offset=0)SdBaseFileinlineprivate
seekSet(uint32_t pos)SdBaseFileprivate
setpos(FatPos_t *pos)SdBaseFileprivate
StdioStream()StdioStreaminline
sync()SdBaseFileprivate
timestamp(SdBaseFile *file)SdBaseFileprivate
timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)SdBaseFileprivate
truncate(uint32_t size)SdBaseFileprivate
type() const SdBaseFileinlineprivate
ungetc(int c)StdioStream
volume() const SdBaseFileinlineprivate
writeErrorSdBaseFileprivate
+ + + + diff --git a/html/class_stdio_stream.html b/html/class_stdio_stream.html new file mode 100644 index 0000000..bd26e5a --- /dev/null +++ b/html/class_stdio_stream.html @@ -0,0 +1,1752 @@ + + + + + + +SdFat: StdioStream Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

StdioStream implements a minimal stdio stream. + More...

+ +

#include <StdioStream.h>

+
+Inheritance diagram for StdioStream:
+
+
Inheritance graph
+ + +
[legend]
+
+Collaboration diagram for StdioStream:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

void clearerr ()
 
int fclose ()
 
int feof ()
 
int ferror ()
 
int fflush ()
 
int fgetc ()
 
char * fgets (char *str, int num, size_t *len=0)
 
bool fopen (const char *filename, const char *mode)
 
int fputc (int c)
 
int fputs (const char *str)
 
int fputs_P (PGM_P str)
 
size_t fread (void *ptr, size_t size, size_t count)
 
int fseek (int32_t offset, int origin)
 
int32_t ftell ()
 
size_t fwrite (const void *ptr, size_t size, size_t count)
 
int getc ()
 
size_t print (char c)
 
size_t print (const char *str)
 
size_t print (const __FlashStringHelper *str)
 
size_t print (double val, uint8_t prec=2)
 
size_t print (float val, uint8_t prec=2)
 
template<typename T >
size_t print (T val)
 
int printDec (char n)
 
int printDec (signed char n)
 
int printDec (unsigned char n)
 
int printDec (int16_t n)
 
int printDec (uint16_t n)
 
int printDec (int32_t n)
 
int printDec (uint32_t n)
 
int printDec (double value, uint8_t prec)
 
int printDec (float value, uint8_t prec)
 
int printField (double value, char term, uint8_t prec=2)
 
int printField (float value, char term, uint8_t prec=2)
 
template<typename T >
int printField (T value, char term)
 
int printHex (uint32_t n)
 
int printHexln (uint32_t n)
 
size_t println ()
 
size_t println (double val, uint8_t prec=2)
 
size_t println (float val, uint8_t prec=2)
 
template<typename T >
size_t println (T val)
 
int putc (int c)
 
int putCRLF ()
 
bool rewind ()
 
 StdioStream ()
 
int ungetc (int c)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Member Functions

uint32_t available ()
 
void clearWriteError ()
 
bool close ()
 
bool contiguousRange (uint32_t *bgnBlock, uint32_t *endBlock)
 
bool createContiguous (SdBaseFile *dirFile, const char *path, uint32_t size)
 
uint32_t curCluster () const
 
uint32_t curPosition () const
 
bool dirEntry (dir_t *dir)
 
bool exists (const char *name)
 
int16_t fgets (char *str, int16_t num, char *delim=0)
 
uint32_t fileSize () const
 
uint32_t firstCluster () const
 
bool getFilename (char *name)
 
void getpos (FatPos_t *pos)
 
bool getWriteError ()
 
bool isDir () const
 
bool isFile () const
 
bool isOpen () const
 
bool isRoot () const
 
bool isSubDir () const
 
void ls (Print *pr, uint8_t flags=0, uint8_t indent=0)
 
void ls (uint8_t flags=0)
 
bool mkdir (SdBaseFile *dir, const char *path, bool pFlag=true)
 
bool open (SdBaseFile *dirFile, uint16_t index, uint8_t oflag)
 
bool open (SdBaseFile *dirFile, const char *path, uint8_t oflag)
 
bool open (const char *path, uint8_t oflag=O_READ)
 
bool openNext (SdBaseFile *dirFile, uint8_t oflag)
 
bool openRoot (SdVolume *vol)
 
int peek ()
 
bool printCreateDateTime (Print *pr)
 
int printField (int16_t value, char term)
 
int printField (uint16_t value, char term)
 
int printField (int32_t value, char term)
 
int printField (uint32_t value, char term)
 
size_t printFileSize (Print *pr)
 
bool printModifyDateTime (Print *pr)
 
size_t printName ()
 
size_t printName (Print *pr)
 
int16_t read ()
 
int read (void *buf, size_t nbyte)
 
int8_t readDir (dir_t *dir)
 
bool remove ()
 
bool rename (SdBaseFile *dirFile, const char *newPath)
 
bool rmdir ()
 
bool rmRfStar ()
 
bool seekCur (int32_t offset)
 
bool seekEnd (int32_t offset=0)
 
bool seekSet (uint32_t pos)
 
void setpos (FatPos_t *pos)
 
bool sync ()
 
bool timestamp (SdBaseFile *file)
 
bool timestamp (uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
 
bool truncate (uint32_t size)
 
uint8_t type () const
 
SdVolumevolume () const
 
+ + + + + + + + + + + + + + + + + + + +

+Static Private Member Functions

static SdBaseFilecwd ()
 
static void dateTimeCallback (void(*dateTime)(uint16_t *date, uint16_t *time))
 
static void dateTimeCallbackCancel ()
 
static void dirName (const dir_t &dir, char *name)
 
static void printFatDate (uint16_t fatDate)
 
static void printFatDate (Print *pr, uint16_t fatDate)
 
static void printFatTime (uint16_t fatTime)
 
static void printFatTime (Print *pr, uint16_t fatTime)
 
static bool remove (SdBaseFile *dirFile, const char *path)
 
+ + + +

+Private Attributes

bool writeError
 
+

Detailed Description

+

StdioStream implements a minimal stdio stream.

+

StdioStream does not support subdirectories or long file names.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + +
StdioStream::StdioStream ()
+
+inline
+
+

Constructor

+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
void StdioStream::clearerr ()
+
+inline
+
+

Clear the stream's end-of-file and error indicators.

+ +
+
+ +
+
+ + + + + + + +
int StdioStream::fclose ()
+
+

Close a stream.

+

A successful call to the fclose function causes the stream to be flushed and the associated file to be closed. Any unwritten buffered data is written to the file; any unread buffered data is discarded. Whether or not the call succeeds, the stream is disassociated from the file.

+
Returns
zero if the stream was successfully closed, or EOF if any any errors are detected.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int StdioStream::feof ()
+
+inline
+
+

Test the stream's end-of-file indicator.

+
Returns
non-zero if and only if the end-of-file indicator is set.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int StdioStream::ferror ()
+
+inline
+
+

Test the stream's error indicator.

+
Returns
return non-zero if and only if the error indicator is set.
+ +
+
+ +
+
+ + + + + + + +
int StdioStream::fflush ()
+
+

Flush the stream.

+

If stream is an output stream or an update stream in which the most recent operation was not input, any unwritten data is written to the file; otherwise the call is an error since any buffered input data would be lost.

+
Returns
sets the error indicator for the stream and returns EOF if an error occurs, otherwise it returns zero.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int StdioStream::fgetc ()
+
+inline
+
+

Get a byte from the stream.

+
Returns
If the end-of-file indicator for the stream is set, or if the stream is at end-of-file, the end-of-file indicator for the stream is set and the fgetc function returns EOF. Otherwise, the fgetc function returns the next character from the input stream.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
char * StdioStream::fgets (char * str,
int num,
size_t * len = 0 
)
+
+

Get a string from a stream.

+

The fgets function reads at most one less than the number of characters specified by num from the stream into the array pointed to by str. No additional characters are read after a new-line character (which is retained) or after end-of-file. A null character is written immediately after the last character read into the array.

+
Parameters
+ + + + +
[out]strPointer to an array of where the string is copied.
[in]numMaximum number of characters including the null character.
[out]lenIf len is not null and fgets is successful, the length of the string is returned.
+
+
+
Returns
str if successful. If end-of-file is encountered and no characters have been read into the array, the contents of the array remain unchanged and a null pointer is returned. If a read error occurs during the operation, the array contents are indeterminate and a null pointer is returned.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool StdioStream::fopen (const char * filename,
const char * mode 
)
+
+

Open a stream.

+

Open a file and associates the stream with it.

+
Parameters
+ + + +
[in]filenamename of the file to be opened.
[in]modea string that indicates the open mode.
+
+
+ + + + + + + + + + + + + + + + + +
"r" or "rb" Open a file for reading. The file must exist.
"w" or "wb" Truncate an existing to zero length or create an empty file for writing.
"wx" or "wbx" Create a file for writing. Fails if the file already exists.
"a" or "ab" Append; open or create file for writing at end-of-file.
"r+" or "rb+" or "r+b" Open a file for update (reading and writing).
"w+" or "w+b" or "wb+" Truncate an existing to zero length or create a file for update.
"w+x" or "w+bx" or "wb+x" Create a file for update. Fails if the file already exists.
"a+" or "a+b" or "ab+" Append; open or create a file for update, writing at end-of-file.
+

The character 'b' shall have no effect, but is allowed for ISO C standard conformance.

+

Opening a file with append mode causes all subsequent writes to the file to be forced to the then current end-of-file, regardless of intervening calls to the fseek function.

+

When a file is opened with update mode, both input and output may be performed on the associated stream. However, output shall not be directly followed by input without an intervening call to the fflush function or to a file positioning function (fseek, or rewind), and input shall not be directly followed by output without an intervening call to a file positioning function, unless the input operation encounters endof-file.

+
Returns
true for success or false for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int StdioStream::fputc (int c)
+
+inline
+
+

Write a byte to a stream.

+
Parameters
+ + +
[in]cthe byte to be written (converted to an unsigned char).
+
+
+
Returns
Upon successful completion, fputc() returns the value it has written. Otherwise, it returns EOF and sets the error indicator for the stream.
+ +
+
+ +
+
+ + + + + + + + +
int StdioStream::fputs (const char * str)
+
+

Write a string to a stream.

+
Parameters
+ + +
[in]stra pointer to the string to be written.
+
+
+
Returns
for success, fputs() returns a non-negative number. Otherwise, it returns EOF and sets the error indicator for the stream.
+ +
+
+ +
+
+ + + + + + + + +
int StdioStream::fputs_P (PGM_P str)
+
+

Write a string stored in flash.

+
Parameters
+ + +
[in]strstring to be written.
+
+
+
Returns
for success, fputs() returns a non-negative number. Otherwise, it returns EOF and sets the error indicator for the stream.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
size_t StdioStream::fread (void * ptr,
size_t size,
size_t count 
)
+
+

Binary input.

+

Reads an array of up to count elements, each one with a size of size bytes.

+
Parameters
+ + + + +
[out]ptrpointer to area of at least (size*count) bytes where the data will be stored.
[in]sizethe size, in bytes, of each element to be read.
[in]countthe number of elements to be read.
+
+
+
Returns
number of elements successfully read, which may be less than count if a read error or end-of-file is encountered. If size or count is zero, fread returns zero and the contents of the array and the state of the stream remain unchanged.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int StdioStream::fseek (int32_t offset,
int origin 
)
+
+

Set the file position for the stream.

+
Parameters
+ + + +
[in]offsetnumber of offset from the origin.
[in]originposition used as reference for the offset. It is specified by one of the following constants.
+
+
+

SEEK_SET - Beginning of file.

+

SEEK_CUR - Current position of the file pointer.

+

SEEK_END - End of file.

+
Returns
zero for success. Otherwise, it returns non-zero and sets the error indicator for the stream.
+ +
+
+ +
+
+ + + + + + + +
int32_t StdioStream::ftell ()
+
+

Get the current position in a stream.

+
Returns
If successful, ftell return the current value of the position indicator. On failure, ftell returns −1L.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
size_t StdioStream::fwrite (const void * ptr,
size_t size,
size_t count 
)
+
+

Binary output.

+

Writes an array of up to count elements, each one with a size of size bytes.

+
Parameters
+ + + + +
[in]ptrpointer to (size*count) bytes of data to be written.
[in]sizethe size, in bytes, of each element to be written.
[in]countthe number of elements to be written.
+
+
+
Returns
number of elements successfully written. if this number is less than count, an error has occured. If size or count is zero, fwrite returns zero.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int StdioStream::getc ()
+
+inline
+
+

Get a byte from the stream.

+

getc and fgetc are equivalent but getc is inline so it is faster but require more flash memory.

+
Returns
If the end-of-file indicator for the stream is set, or if the stream is at end-of-file, the end-of-file indicator for the stream is set and the fgetc function returns EOF. Otherwise, the fgetc function returns the next character from the input stream.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
size_t StdioStream::print (char c)
+
+inline
+
+

Write a character.

+
Parameters
+ + +
[in]cthe character to write.
+
+
+
Returns
the number of bytes written.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
size_t StdioStream::print (const char * str)
+
+inline
+
+

Write a string.

+
Parameters
+ + +
[in]strthe string to be written.
+
+
+
Returns
the number of bytes written.
+ +
+
+ +
+
+ + + + + + + + +
size_t StdioStream::print (const __FlashStringHelper * str)
+
+

Print a string stored in flash memory.

+
Parameters
+ + +
[in]strthe string to print.
+
+
+
Returns
the number of bytes written.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
size_t StdioStream::print (double val,
uint8_t prec = 2 
)
+
+inline
+
+

Print a floating point number.

+
Parameters
+ + + +
[in]precNumber of digits after decimal point.
[in]valthe number to be printed.
+
+
+
Returns
the number of bytes written.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
size_t StdioStream::print (float val,
uint8_t prec = 2 
)
+
+inline
+
+

Print a floating point number.

+
Parameters
+ + + +
[in]precNumber of digits after decimal point.
[in]valthe number to be printed.
+
+
+
Returns
the number of bytes written.
+ +
+
+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + +
size_t StdioStream::print (val)
+
+inline
+
+

Print a number.

+
Parameters
+ + +
[in]valthe number to be printed.
+
+
+
Returns
the number of bytes written.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int StdioStream::printDec (char n)
+
+inline
+
+

Print a char as a number.

+
Parameters
+ + +
[in]nnumber to be printed.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + + + + +
int StdioStream::printDec (signed char n)
+
+

print a signed 8-bit integer

+
Parameters
+ + +
[in]nnumber to be printed.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int StdioStream::printDec (unsigned char n)
+
+inline
+
+

Print an unsigned 8-bit number.

+
Parameters
+ + +
[in]nnumber to be print.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + + + + +
int StdioStream::printDec (int16_t n)
+
+

Print a int16_t

+
Parameters
+ + +
[in]nnumber to be printed.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + + + + +
int StdioStream::printDec (uint16_t n)
+
+

print a uint16_t.

+
Parameters
+ + +
[in]nnumber to be printed.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + + + + +
int StdioStream::printDec (int32_t n)
+
+

Print a signed 32-bit integer.

+
Parameters
+ + +
[in]nnumber to be printed.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + + + + +
int StdioStream::printDec (uint32_t n)
+
+

Write an unsigned 32-bit number.

+
Parameters
+ + +
[in]nnumber to be printed.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
int StdioStream::printDec (double value,
uint8_t prec 
)
+
+inline
+
+

Print a double.

+
Parameters
+ + + +
[in]valueThe number to be printed.
[in]precNumber of digits after decimal point.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int StdioStream::printDec (float value,
uint8_t prec 
)
+
+

Print a float.

+
Parameters
+ + + +
[in]valueThe number to be printed.
[in]precNumber of digits after decimal point.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
int StdioStream::printField (double value,
char term,
uint8_t prec = 2 
)
+
+inline
+
+

Print a number followed by a field terminator.

+
Parameters
+ + + + +
[in]valueThe number to be printed.
[in]termThe field terminator.
[in]precNumber of digits after decimal point.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
int StdioStream::printField (float value,
char term,
uint8_t prec = 2 
)
+
+inline
+
+

Print a number followed by a field terminator.

+
Parameters
+ + + + +
[in]valueThe number to be printed.
[in]termThe field terminator.
[in]precNumber of digits after decimal point.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
int StdioStream::printField (value,
char term 
)
+
+inline
+
+

Print a number followed by a field terminator.

+
Parameters
+ + + +
[in]valueThe number to be printed.
[in]termThe field terminator.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + + + + +
int StdioStream::printHex (uint32_t n)
+
+

Print HEX

+
Parameters
+ + +
[in]nnumber to be printed as HEX.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int StdioStream::printHexln (uint32_t n)
+
+inline
+
+

Print HEX with CRLF

+
Parameters
+ + +
[in]nnumber to be printed as HEX.
+
+
+
Returns
The number of bytes written or -1 if an error occurs.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
size_t StdioStream::println ()
+
+inline
+
+

Write a CR/LF.

+
Returns
two, the number of bytes written, for success or zero for failure.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
size_t StdioStream::println (double val,
uint8_t prec = 2 
)
+
+inline
+
+

Print a floating point number followed by CR/LF.

+
Parameters
+ + + +
[in]valthe number to be printed.
[in]precNumber of digits after decimal point.
+
+
+
Returns
the number of bytes written.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
size_t StdioStream::println (float val,
uint8_t prec = 2 
)
+
+inline
+
+

Print a floating point number followed by CR/LF.

+
Parameters
+ + + +
[in]valthe number to be printed.
[in]precNumber of digits after decimal point.
+
+
+
Returns
the number of bytes written.
+ +
+
+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + +
size_t StdioStream::println (val)
+
+inline
+
+

Print an item followed by CR/LF

+
Parameters
+ + +
[in]valthe item to be printed.
+
+
+
Returns
the number of bytes written.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int StdioStream::putc (int c)
+
+inline
+
+

Write a byte to a stream.

+

putc and fputc are equivalent but putc is inline so it is faster but require more flash memory.

+
Parameters
+ + +
[in]cthe byte to be written (converted to an unsigned char).
+
+
+
Returns
Upon successful completion, fputc() returns the value it has written. Otherwise, it returns EOF and sets the error indicator for the stream.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int StdioStream::putCRLF ()
+
+inline
+
+

Write a CR/LF.

+
Returns
two, the number of bytes written, for success or -1 for failure.
+ +
+
+ +
+
+ + + + + + + +
bool StdioStream::rewind ()
+
+

Set position of a stream to the beginning.

+

The rewind function sets the file position to the beginning of the file. It is equivalent to fseek(0L, SEEK_SET) except that the error indicator for the stream is also cleared.

+
Returns
true for success or false for failure.
+ +
+
+ +
+
+ + + + + + + + +
int StdioStream::ungetc (int c)
+
+

Push a byte back into an input stream.

+
Parameters
+ + +
[in]cthe byte (converted to an unsigned char) to be pushed back.
+
+
+

One character of pushback is guaranteed. If the ungetc function is called too many times without an intervening read or file positioning operation on that stream, the operation may fail.

+

A successful intervening call to a file positioning function (fseek, fsetpos, or rewind) discards any pushed-back characters for the stream.

+
Returns
Upon successful completion, ungetc() returns the byte pushed back after conversion. Otherwise it returns EOF.
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/html/class_stdio_stream__coll__graph.png b/html/class_stdio_stream__coll__graph.png new file mode 100644 index 0000000..f993a00 Binary files /dev/null and b/html/class_stdio_stream__coll__graph.png differ diff --git a/html/class_stdio_stream__inherit__graph.png b/html/class_stdio_stream__inherit__graph.png new file mode 100644 index 0000000..f993a00 Binary files /dev/null and b/html/class_stdio_stream__inherit__graph.png differ diff --git a/html/classes.html b/html/classes.html new file mode 100644 index 0000000..541a20f --- /dev/null +++ b/html/classes.html @@ -0,0 +1,83 @@ + + + + + + +SdFat: Class Index + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
Class Index
+
+
+
A | C | F | I | M | O | P | S
+ + + + + + + + + + + + +
  A  
+
  S  
+
StdioStream   ifstream   ostream   
  c  
+
ios   
  p  
+
ArduinoInStream   Sd2Card   ios_base   
ArduinoOutStream   SdBaseFile   cache_t   iostream   pgm   
  F  
+
SdFat   
  f  
+
istream   
  s  
+
SdFile   
  o  
+
FatPos_t   SdSpi   fstream   setfill   
  M  
+
SdStreamBase   
  i  
+
obufstream   setprecision   
SdVolume   ofstream   setw   
MinimumSerial   ibufstream   
+
A | C | F | I | M | O | P | S
+
+ + + + diff --git a/html/classfstream-members.html b/html/classfstream-members.html new file mode 100644 index 0000000..a381229 --- /dev/null +++ b/html/classfstream-members.html @@ -0,0 +1,247 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
fstream Member List
+
+
+ +

This is the complete list of members for fstream, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
available()SdBaseFileinlineprivate
bad() const iosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)fstreaminline
clearWriteError()SdBaseFileinlineprivate
close()fstreaminline
contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock)SdBaseFileprivate
createContiguous(SdBaseFile *dirFile, const char *path, uint32_t size)SdBaseFileprivate
cur enum valueios_base
curCluster() const SdBaseFileinlineprivate
curPosition() const SdBaseFileinlineprivate
cwd()SdBaseFileinlineprivatestatic
dateTimeCallback(void(*dateTime)(uint16_t *date, uint16_t *time))SdBaseFileinlineprivatestatic
dateTimeCallbackCancel()SdBaseFileinlineprivatestatic
decios_basestatic
dirEntry(dir_t *dir)SdBaseFileprivate
dirName(const dir_t &dir, char *name)SdBaseFileprivatestatic
end enum valueios_base
eof() const iosinline
eofbitios_basestatic
exists(const char *name)SdBaseFileprivate
fail() const iosinline
failbitios_basestatic
fgets(char *str, int16_t num, char *delim=0)SdBaseFileprivate
fileSize() const SdBaseFileinlineprivate
fill()ios_baseinline
fill(char c)ios_baseinline
firstCluster() const SdBaseFileinlineprivate
flags() const ios_baseinline
flags(fmtflags fl)ios_baseinline
flagsToBase()ios_baseinlineprotected
flush()ostreaminline
fmtflags typedefios_base
fstream()fstreaminline
fstream(const char *path, openmode mode=in|out)fstreaminlineexplicit
gcount() const istreaminline
get()istream
get(char &ch)istream
get(char *str, streamsize n, char delim= '\n')istream
getFilename(char *name)SdBaseFileprivate
getline(char *str, streamsize count, char delim= '\n')istream
getpos(FatPos_t *pos)SdBaseFileprivate
getWriteError()SdBaseFileinlineprivate
good() const iosinline
goodbitios_basestatic
hexios_basestatic
ignore(streamsize n=1, int delim=-1)istream
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base()ios_baseinline
iostate typedefios_base
is_open()fstreaminline
isDir() const SdBaseFileinlineprivate
isFile() const SdBaseFileinlineprivate
isOpen() const SdBaseFileinlineprivate
isRoot() const SdBaseFileinlineprivate
isSubDir() const SdBaseFileinlineprivate
istream()istreaminline
leftios_basestatic
ls(Print *pr, uint8_t flags=0, uint8_t indent=0)SdBaseFileprivate
ls(uint8_t flags=0)SdBaseFileprivate
mkdir(SdBaseFile *dir, const char *path, bool pFlag=true)SdBaseFileprivate
octios_basestatic
off_type typedefios_base
open(const char *path, openmode mode=in|out)fstreaminline
SdStreamBase::open(SdBaseFile *dirFile, uint16_t index, uint8_t oflag)SdBaseFileprivate
SdStreamBase::open(SdBaseFile *dirFile, const char *path, uint8_t oflag)SdBaseFileprivate
openmode typedefios_base
openNext(SdBaseFile *dirFile, uint8_t oflag)SdBaseFileprivate
openRoot(SdVolume *vol)SdBaseFileprivate
operator const void *() const iosinline
operator!() const iosinline
operator<<(ostream &(*pf)(ostream &str))ostreaminline
operator<<(ios_base &(*pf)(ios_base &str))ostreaminline
operator<<(bool arg)ostreaminline
operator<<(const char *arg)ostreaminline
operator<<(const signed char *arg)ostreaminline
operator<<(const unsigned char *arg)ostreaminline
operator<<(char arg)ostreaminline
operator<<(signed char arg)ostreaminline
operator<<(unsigned char arg)ostreaminline
operator<<(double arg)ostreaminline
operator<<(float arg)ostreaminline
operator<<(short arg)ostreaminline
operator<<(unsigned short arg)ostreaminline
operator<<(int arg)ostreaminline
operator<<(unsigned int arg)ostreaminline
operator<<(long arg)ostreaminline
operator<<(unsigned long arg)ostreaminline
operator<<(const void *arg)ostreaminline
operator<<(pgm arg)ostreaminline
operator<<(const __FlashStringHelper *arg)ostreaminline
operator>>(istream &(*pf)(istream &str))istreaminline
operator>>(ios_base &(*pf)(ios_base &str))istreaminline
operator>>(ios &(*pf)(ios &str))istreaminline
operator>>(char *str)istreaminline
operator>>(char &ch)istreaminline
operator>>(signed char *str)istreaminline
operator>>(signed char &ch)istreaminline
operator>>(unsigned char *str)istreaminline
operator>>(unsigned char &ch)istreaminline
operator>>(bool &arg)istreaminline
operator>>(short &arg)istreaminline
operator>>(unsigned short &arg)istreaminline
operator>>(int &arg)istreaminline
operator>>(unsigned int &arg)istreaminline
operator>>(long &arg)istreaminline
operator>>(unsigned long &arg)istreaminline
operator>>(double &arg)istreaminline
operator>>(float &arg)istreaminline
operator>>(void *&arg)istreaminline
ostream()ostreaminline
outios_basestatic
iostream::peek()istream
SdStreamBase::peek()SdBaseFileprivate
pos_type typedefios_base
precision() const ios_baseinline
precision(unsigned int n)ios_baseinline
printCreateDateTime(Print *pr)SdBaseFileprivate
printFatDate(uint16_t fatDate)SdBaseFileprivatestatic
printFatDate(Print *pr, uint16_t fatDate)SdBaseFileprivatestatic
printFatTime(uint16_t fatTime)SdBaseFileprivatestatic
printFatTime(Print *pr, uint16_t fatTime)SdBaseFileprivatestatic
printField(int16_t value, char term)SdBaseFileprivate
printField(uint16_t value, char term)SdBaseFileprivate
printField(int32_t value, char term)SdBaseFileprivate
printField(uint32_t value, char term)SdBaseFileprivate
printFileSize(Print *pr)SdBaseFileprivate
printModifyDateTime(Print *pr)SdBaseFileprivate
printName()SdBaseFileprivate
printName(Print *pr)SdBaseFileprivate
put(char ch)ostreaminline
rdstate() const iosinline
read()SdBaseFileprivate
read(void *buf, size_t nbyte)SdBaseFileprivate
readDir(dir_t *dir)SdBaseFileprivate
remove(SdBaseFile *dirFile, const char *path)SdBaseFileprivatestatic
remove()SdBaseFileprivate
rename(SdBaseFile *dirFile, const char *newPath)SdBaseFileprivate
rewind()SdBaseFileinlineprivate
rightios_basestatic
rmdir()SdBaseFileprivate
rmRfStar()SdBaseFileprivate
SdBaseFile()SdBaseFileinlineprivate
SdBaseFile(const char *path, uint8_t oflag)SdBaseFileprivate
seekCur(int32_t offset)SdBaseFileinlineprivate
seekdir enum nameios_base
seekEnd(int32_t offset=0)SdBaseFileinlineprivate
seekg(pos_type pos)istreaminline
seekg(off_type off, seekdir way)istreaminline
seekp(pos_type pos)ostreaminline
seekp(off_type off, seekdir way)ostreaminline
seekSet(uint32_t pos)SdBaseFileprivate
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setpos(FatPos_t *pos)SdBaseFileprivate
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipWhite()istream
skipwsios_basestatic
streamsize typedefios_base
sync()SdBaseFileprivate
tellg()istreaminline
tellp()ostreaminline
timestamp(SdBaseFile *file)SdBaseFileprivate
timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)SdBaseFileprivate
truncios_basestatic
truncate(uint32_t size)SdBaseFileprivate
type() const SdBaseFileinlineprivate
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
volume() const SdBaseFileinlineprivate
width()ios_baseinline
width(unsigned n)ios_baseinline
write(const void *buf, size_t nbyte)SdBaseFileprivate
writeErrorSdBaseFileprivate
+ + + + diff --git a/html/classfstream.html b/html/classfstream.html new file mode 100644 index 0000000..2b21134 --- /dev/null +++ b/html/classfstream.html @@ -0,0 +1,3668 @@ + + + + + + +SdFat: fstream Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

SD file input/output stream. + More...

+ +

#include <SdStream.h>

+
+Inheritance diagram for fstream:
+
+
Inheritance graph
+ + +
[legend]
+
+Collaboration diagram for fstream:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + +

+Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, +cur, +end + }
 
typedef uint32_t streamsize
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
void close ()
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
ostreamflush ()
 
 fstream ()
 
 fstream (const char *path, openmode mode=in|out)
 
streamsize gcount () const
 
int get ()
 
istreamget (char &ch)
 
istreamget (char *str, streamsize n, char delim= '\n')
 
istreamgetline (char *str, streamsize count, char delim= '\n')
 
bool good () const
 
istreamignore (streamsize n=1, int delim=-1)
 
bool is_open ()
 
void open (const char *path, openmode mode=in|out)
 
 operator const void * () const
 
bool operator! () const
 
ostreamoperator<< (ostream &(*pf)(ostream &str))
 
ostreamoperator<< (ios_base &(*pf)(ios_base &str))
 
ostreamoperator<< (bool arg)
 
ostreamoperator<< (const char *arg)
 
ostreamoperator<< (const signed char *arg)
 
ostreamoperator<< (const unsigned char *arg)
 
ostreamoperator<< (char arg)
 
ostreamoperator<< (signed char arg)
 
ostreamoperator<< (unsigned char arg)
 
ostreamoperator<< (double arg)
 
ostreamoperator<< (float arg)
 
ostreamoperator<< (short arg)
 
ostreamoperator<< (unsigned short arg)
 
ostreamoperator<< (int arg)
 
ostreamoperator<< (unsigned int arg)
 
ostreamoperator<< (long arg)
 
ostreamoperator<< (unsigned long arg)
 
ostreamoperator<< (const void *arg)
 
ostreamoperator<< (pgm arg)
 
ostreamoperator<< (const __FlashStringHelper *arg)
 
istreamoperator>> (istream &(*pf)(istream &str))
 
istreamoperator>> (ios_base &(*pf)(ios_base &str))
 
istreamoperator>> (ios &(*pf)(ios &str))
 
istreamoperator>> (char *str)
 
istreamoperator>> (char &ch)
 
istreamoperator>> (signed char *str)
 
istreamoperator>> (signed char &ch)
 
istreamoperator>> (unsigned char *str)
 
istreamoperator>> (unsigned char &ch)
 
istreamoperator>> (bool &arg)
 
istreamoperator>> (short &arg)
 
istreamoperator>> (unsigned short &arg)
 
istreamoperator>> (int &arg)
 
istreamoperator>> (unsigned int &arg)
 
istreamoperator>> (long &arg)
 
istreamoperator>> (unsigned long &arg)
 
istreamoperator>> (double &arg)
 
istreamoperator>> (float &arg)
 
istreamoperator>> (void *&arg)
 
int peek ()
 
int precision () const
 
int precision (unsigned int n)
 
ostreamput (char ch)
 
iostate rdstate () const
 
istreamseekg (pos_type pos)
 
istreamseekg (off_type off, seekdir way)
 
ostreamseekp (pos_type pos)
 
ostreamseekp (off_type off, seekdir way)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
void skipWhite ()
 
pos_type tellg ()
 
pos_type tellp ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
+ + + +

+Protected Member Functions

uint8_t flagsToBase ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Member Functions

uint32_t available ()
 
void clearWriteError ()
 
bool contiguousRange (uint32_t *bgnBlock, uint32_t *endBlock)
 
bool createContiguous (SdBaseFile *dirFile, const char *path, uint32_t size)
 
uint32_t curCluster () const
 
uint32_t curPosition () const
 
bool dirEntry (dir_t *dir)
 
bool exists (const char *name)
 
int16_t fgets (char *str, int16_t num, char *delim=0)
 
uint32_t fileSize () const
 
uint32_t firstCluster () const
 
bool getFilename (char *name)
 
void getpos (FatPos_t *pos)
 
bool getWriteError ()
 
bool isDir () const
 
bool isFile () const
 
bool isOpen () const
 
bool isRoot () const
 
bool isSubDir () const
 
void ls (Print *pr, uint8_t flags=0, uint8_t indent=0)
 
void ls (uint8_t flags=0)
 
bool mkdir (SdBaseFile *dir, const char *path, bool pFlag=true)
 
bool open (SdBaseFile *dirFile, uint16_t index, uint8_t oflag)
 
bool open (SdBaseFile *dirFile, const char *path, uint8_t oflag)
 
bool openNext (SdBaseFile *dirFile, uint8_t oflag)
 
bool openRoot (SdVolume *vol)
 
int peek ()
 
bool printCreateDateTime (Print *pr)
 
int printField (int16_t value, char term)
 
int printField (uint16_t value, char term)
 
int printField (int32_t value, char term)
 
int printField (uint32_t value, char term)
 
size_t printFileSize (Print *pr)
 
bool printModifyDateTime (Print *pr)
 
size_t printName ()
 
size_t printName (Print *pr)
 
int16_t read ()
 
int read (void *buf, size_t nbyte)
 
int8_t readDir (dir_t *dir)
 
bool remove ()
 
bool rename (SdBaseFile *dirFile, const char *newPath)
 
void rewind ()
 
bool rmdir ()
 
bool rmRfStar ()
 
bool seekCur (int32_t offset)
 
bool seekEnd (int32_t offset=0)
 
bool seekSet (uint32_t pos)
 
void setpos (FatPos_t *pos)
 
bool sync ()
 
bool timestamp (SdBaseFile *file)
 
bool timestamp (uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
 
bool truncate (uint32_t size)
 
uint8_t type () const
 
SdVolumevolume () const
 
int write (const void *buf, size_t nbyte)
 
+ + + + + + + + + + + + + + + + + + + +

+Static Private Member Functions

static SdBaseFilecwd ()
 
static void dateTimeCallback (void(*dateTime)(uint16_t *date, uint16_t *time))
 
static void dateTimeCallbackCancel ()
 
static void dirName (const dir_t &dir, char *name)
 
static void printFatDate (uint16_t fatDate)
 
static void printFatDate (Print *pr, uint16_t fatDate)
 
static void printFatTime (uint16_t fatTime)
 
static void printFatTime (Print *pr, uint16_t fatTime)
 
static bool remove (SdBaseFile *dirFile, const char *path)
 
+ + + +

+Private Attributes

bool writeError
 
+

Detailed Description

+

SD file input/output stream.

+

Member Typedef Documentation

+ +
+
+ + + + + +
+ + + + +
typedef unsigned int ios_base::fmtflags
+
+inherited
+
+

type for format flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef unsigned char ios_base::iostate
+
+inherited
+
+

typedef for iostate bitmask

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef int32_t ios_base::off_type
+
+inherited
+
+

type for relative seek offset

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint8_t ios_base::openmode
+
+inherited
+
+

typedef for iostream open mode

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::pos_type
+
+inherited
+
+

type for absolute seek position

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::streamsize
+
+inherited
+
+

unsigned size that can represent maximum file size. (violates spec - should be signed)

+ +
+
+

Member Enumeration Documentation

+ +
+
+ + + + + +
+ + + + +
enum ios_base::seekdir
+
+inherited
+
+

enumerated type for the direction of relative seeks

+ + + + +
Enumerator
beg  +

seek relative to the beginning of the stream

+
cur  +

seek relative to the current stream position

+
end  +

seek relative to the end of the stream

+
+ +
+
+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + +
fstream::fstream ()
+
+inline
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
fstream::fstream (const char * path,
openmode mode = in | out 
)
+
+inlineexplicit
+
+

Constructor with open

+
Parameters
+ + + +
[in]pathpath to open
[in]modeopen mode
+
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
bool ios::bad () const
+
+inlineinherited
+
+
Returns
true if bad bit is set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void fstream::clear (iostate state = goodbit)
+
+inline
+
+

Clear state and writeError

+
Parameters
+ + +
[in]statenew state for stream
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void fstream::close ()
+
+inline
+
+

Close a file and force cached data and directory information to be written to the storage device.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::eof () const
+
+inlineinherited
+
+
Returns
true if end of file has been reached else false.
+

Warning: An empty file returns false before the first read.

+

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::fail () const
+
+inlineinherited
+
+
Returns
true if any iostate bit other than eof are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
char ios_base::fill ()
+
+inlineinherited
+
+
Returns
fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
char ios_base::fill (char c)
+
+inlineinherited
+
+

Set fill character

+
Parameters
+ + +
[in]cnew fill character
+
+
+
Returns
old fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
fmtflags ios_base::flags () const
+
+inlineinherited
+
+
Returns
format flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::flags (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flag
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t ios_base::flagsToBase ()
+
+inlineprotectedinherited
+
+
Returns
current number base
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ostream& ostream::flush ()
+
+inlineinherited
+
+

Flushes the buffer associated with this stream. The flush function calls the sync function of the associated file.

+
Returns
A reference to the ostream object.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
streamsize istream::gcount () const
+
+inlineinherited
+
+
Returns
The number of characters extracted by the last unformatted input function.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int istream::get ()
+
+inherited
+
+

Extract a character if one is available.

+
Returns
The character or -1 if a failure occurs. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream & istream::get (char & c)
+
+inherited
+
+

Extract a character if one is available.

+
Parameters
+ + +
[out]clocation to receive the extracted character.
+
+
+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
istream & istream::get (char * str,
streamsize n,
char delim = '\n' 
)
+
+inherited
+
+

Extract characters.

+
Parameters
+ + + + +
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
+
+
+

Characters are extracted until extraction fails, n is less than 1, n-1 characters are extracted, or the next character equals delim (delim is not extracted). If no characters are extracted failbit is set. If end-of-file occurs the eofbit is set.

+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
istream & istream::getline (char * str,
streamsize n,
char delim = '\n' 
)
+
+inherited
+
+

Extract characters

+
Parameters
+ + + + +
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
+
+
+

Characters are extracted until extraction fails, the next character equals delim (delim is extracted), or n-1 characters are extracted.

+

The failbit is set if no characters are extracted or n-1 characters are extracted. If end-of-file occurs the eofbit is set.

+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::good () const
+
+inlineinherited
+
+
Returns
True if no iostate flags are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
istream & istream::ignore (streamsize n = 1,
int delim = -1 
)
+
+inherited
+
+

Extract characters and discard them.

+
Parameters
+ + + +
[in]nmaximum number of characters to ignore.
[in]delimDelimiter.
+
+
+

Characters are extracted until extraction fails, n characters are extracted, or the next input character equals delim (the delimiter is extracted). If end-of-file occurs the eofbit is set.

+

Failures are indicated by the state of the stream.

+
Returns
*this
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool fstream::is_open ()
+
+inline
+
+
Returns
True if stream is open else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void fstream::open (const char * path,
openmode mode = in | out 
)
+
+inline
+
+

Open a fstream

+
Parameters
+ + + +
[in]pathfile to open
[in]modeopen mode
+
+
+

Valid open modes are (at end, ios::ate, and/or ios::binary may be added):

+

ios::in - Open file for reading.

+

ios::out or ios::out | ios::trunc - Truncate to 0 length, if existent, or create a file for writing only.

+

ios::app or ios::out | ios::app - Append; open or create file for writing at end-of-file.

+

ios::in | ios::out - Open file for update (reading and writing).

+

ios::in | ios::out | ios::trunc - Truncate to zero length, if existent, or create file for update.

+

ios::in | ios::app or ios::in | ios::out | ios::app - Append; open or create text file for update, writing at end of file.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ios::operator const void * () const
+
+inlineinherited
+
+
Returns
null pointer if fail() is true.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::operator! () const
+
+inlineinherited
+
+
Returns
true if fail() else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (ostream &(*)(ostream &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (ios_base &(*)(ios_base &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (bool arg)
+
+inlineinherited
+
+

Output bool

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const char * arg)
+
+inlineinherited
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const signed char * arg)
+
+inlineinherited
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const unsigned char * arg)
+
+inlineinherited
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (char arg)
+
+inlineinherited
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (signed char arg)
+
+inlineinherited
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned char arg)
+
+inlineinherited
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (double arg)
+
+inlineinherited
+
+

Output double

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (float arg)
+
+inlineinherited
+
+

Output float

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (short arg)
+
+inlineinherited
+
+

Output signed short

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned short arg)
+
+inlineinherited
+
+

Output unsigned short

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (int arg)
+
+inlineinherited
+
+

Output signed int

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned int arg)
+
+inlineinherited
+
+

Output unsigned int

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (long arg)
+
+inlineinherited
+
+

Output signed long

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned long arg)
+
+inlineinherited
+
+

Output unsigned long

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const void * arg)
+
+inlineinherited
+
+

Output pointer

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (pgm arg)
+
+inlineinherited
+
+

Output a string from flash using the pstr() macro

+
Parameters
+ + +
[in]argpgm struct pointing to string
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const __FlashStringHelper * arg)
+
+inlineinherited
+
+

Output a string from flash using the Arduino F() macro.

+
Parameters
+ + +
[in]argpointing to flash string
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (istream &(*)(istream &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (ios_base &(*)(ios_base &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (ios &(*)(ios &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (char * str)
+
+inlineinherited
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (char & ch)
+
+inlineinherited
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (signed char * str)
+
+inlineinherited
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (signed char & ch)
+
+inlineinherited
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned char * str)
+
+inlineinherited
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned char & ch)
+
+inlineinherited
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (bool & arg)
+
+inlineinherited
+
+

Extract a value of type bool.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (short & arg)
+
+inlineinherited
+
+

Extract a value of type short.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned short & arg)
+
+inlineinherited
+
+

Extract a value of type unsigned short.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (int & arg)
+
+inlineinherited
+
+

Extract a value of type int.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned int & arg)
+
+inlineinherited
+
+

Extract a value of type unsigned int.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (long & arg)
+
+inlineinherited
+
+

Extract a value of type long.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned long & arg)
+
+inlineinherited
+
+

Extract a value of type unsigned long.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (double & arg)
+
+inlineinherited
+
+

Extract a value of type double.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (float & arg)
+
+inlineinherited
+
+

Extract a value of type float.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (void *& arg)
+
+inlineinherited
+
+

Extract a value of type void*.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int istream::peek ()
+
+inherited
+
+

Return the next available character without consuming it.

+
Returns
The character if the stream state is good else -1;
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int ios_base::precision () const
+
+inlineinherited
+
+
Returns
precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int ios_base::precision (unsigned int n)
+
+inlineinherited
+
+

set precision

+
Parameters
+ + +
[in]nnew precision
+
+
+
Returns
old precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::put (char ch)
+
+inlineinherited
+
+

Puts a character in a stream.

+

The unformatted output function inserts the element ch. It returns *this.

+
Parameters
+ + +
[in]chThe character
+
+
+
Returns
A reference to the ostream object.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
iostate ios::rdstate () const
+
+inlineinherited
+
+
Returns
The iostate flags for this file.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::seekg (pos_type pos)
+
+inlineinherited
+
+

Set the stream position

+
Parameters
+ + +
[in]posThe absolute position in which to move the read pointer.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
istream& istream::seekg (off_type off,
seekdir way 
)
+
+inlineinherited
+
+

Set the stream position.

+
Parameters
+ + + +
[in]offAn offset to move the read pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::seekp (pos_type pos)
+
+inlineinherited
+
+

Set the stream position

+
Parameters
+ + +
[in]posThe absolute position in which to move the write pointer.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
ostream& ostream::seekp (off_type off,
seekdir way 
)
+
+inlineinherited
+
+

Set the stream position.

+
Parameters
+ + + +
[in]offAn offset to move the write pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::setf (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flags to be or'ed in
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
+
+inlineinherited
+
+

modify format flags

+
Parameters
+ + + +
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::setstate (iostate state)
+
+inlineinherited
+
+

Set iostate bits.

+
Parameters
+ + +
[in]stateBitts to set.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void istream::skipWhite ()
+
+inherited
+
+

used to implement ws()

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
pos_type istream::tellg ()
+
+inlineinherited
+
+
Returns
the stream position
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
pos_type ostream::tellp ()
+
+inlineinherited
+
+
Returns
the stream position
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios_base::unsetf (fmtflags fl)
+
+inlineinherited
+
+

clear format flags

+
Parameters
+ + +
[in]flflags to be cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
unsigned ios_base::width ()
+
+inlineinherited
+
+
Returns
width
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
unsigned ios_base::width (unsigned n)
+
+inlineinherited
+
+

set width

+
Parameters
+ + +
[in]nnew width
+
+
+
Returns
old width
+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::adjustfield = left | right | internal
+
+staticinherited
+
+

mask for adjustfield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::app = 0X4
+
+staticinherited
+
+

seek to end before each write

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::ate = 0X8
+
+staticinherited
+
+

open and seek to end immediately after opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::badbit = 0X01
+
+staticinherited
+
+

iostate bad bit for a nonrecoverable error.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::basefield = dec | hex | oct
+
+staticinherited
+
+

mask for basefield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::binary = 0X10
+
+staticinherited
+
+

perform input and output in binary mode (as opposed to text mode)

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::boolalpha = 0x0100
+
+staticinherited
+
+

use strings true/false for bool

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::dec = 0x0008
+
+staticinherited
+
+

base 10 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::eofbit = 0x02
+
+staticinherited
+
+

iostate bit for end of file reached

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::failbit = 0X04
+
+staticinherited
+
+

iostate fail bit for nonfatal error

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::goodbit = 0x00
+
+staticinherited
+
+

iostate for no flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::hex = 0x0010
+
+staticinherited
+
+

base 16 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::in = 0X20
+
+staticinherited
+
+

open for input

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::internal = 0x0004
+
+staticinherited
+
+

fill between sign/base prefix and number

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::left = 0x0001
+
+staticinherited
+
+

left adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::oct = 0x0020
+
+staticinherited
+
+

base 8 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::out = 0X40
+
+staticinherited
+
+

open for output

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::right = 0x0002
+
+staticinherited
+
+

right adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showbase = 0x0200
+
+staticinherited
+
+

use prefix 0X for hex and 0 for oct

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpoint = 0x0400
+
+staticinherited
+
+

always show '.' for floating numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpos = 0x0800
+
+staticinherited
+
+

show + sign for nonnegative numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::skipws = 0x1000
+
+staticinherited
+
+

skip initial white space

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::trunc = 0X80
+
+staticinherited
+
+

truncate an existing stream when opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::uppercase = 0x4000
+
+staticinherited
+
+

use uppercase letters in number representations

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/html/classfstream__coll__graph.png b/html/classfstream__coll__graph.png new file mode 100644 index 0000000..4ae8422 Binary files /dev/null and b/html/classfstream__coll__graph.png differ diff --git a/html/classfstream__inherit__graph.png b/html/classfstream__inherit__graph.png new file mode 100644 index 0000000..4ae8422 Binary files /dev/null and b/html/classfstream__inherit__graph.png differ diff --git a/html/classibufstream-members.html b/html/classibufstream-members.html new file mode 100644 index 0000000..f664e6f --- /dev/null +++ b/html/classibufstream-members.html @@ -0,0 +1,152 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
ibufstream Member List
+
+
+ +

This is the complete list of members for ibufstream, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
bad() const iosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() const iosinline
eofbitios_basestatic
fail() const iosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() const ios_baseinline
flags(fmtflags fl)ios_baseinline
flagsToBase()ios_baseinlineprotected
fmtflags typedefios_base
gcount() const istreaminline
get()istream
get(char &ch)istream
get(char *str, streamsize n, char delim= '\n')istream
getline(char *str, streamsize count, char delim= '\n')istream
good() const iosinline
goodbitios_basestatic
hexios_basestatic
ibufstream()ibufstreaminline
ibufstream(const char *str)ibufstreaminlineexplicit
ignore(streamsize n=1, int delim=-1)istream
inios_basestatic
init(const char *str)ibufstreaminline
internalios_basestatic
ios()iosinline
ios_base()ios_baseinline
iostate typedefios_base
istream()istreaminline
leftios_basestatic
octios_basestatic
off_type typedefios_base
openmode typedefios_base
operator const void *() const iosinline
operator!() const iosinline
operator>>(istream &(*pf)(istream &str))istreaminline
operator>>(ios_base &(*pf)(ios_base &str))istreaminline
operator>>(ios &(*pf)(ios &str))istreaminline
operator>>(char *str)istreaminline
operator>>(char &ch)istreaminline
operator>>(signed char *str)istreaminline
operator>>(signed char &ch)istreaminline
operator>>(unsigned char *str)istreaminline
operator>>(unsigned char &ch)istreaminline
operator>>(bool &arg)istreaminline
operator>>(short &arg)istreaminline
operator>>(unsigned short &arg)istreaminline
operator>>(int &arg)istreaminline
operator>>(unsigned int &arg)istreaminline
operator>>(long &arg)istreaminline
operator>>(unsigned long &arg)istreaminline
operator>>(double &arg)istreaminline
operator>>(float &arg)istreaminline
operator>>(void *&arg)istreaminline
outios_basestatic
peek()istream
pos_type typedefios_base
precision() const ios_baseinline
precision(unsigned int n)ios_baseinline
rdstate() const iosinline
rightios_basestatic
seekdir enum nameios_base
seekg(pos_type pos)istreaminline
seekg(off_type off, seekdir way)istreaminline
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipWhite()istream
skipwsios_basestatic
streamsize typedefios_base
tellg()istreaminline
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
+ + + + diff --git a/html/classibufstream.html b/html/classibufstream.html new file mode 100644 index 0000000..ce0607c --- /dev/null +++ b/html/classibufstream.html @@ -0,0 +1,2599 @@ + + + + + + +SdFat: ibufstream Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

parse a char string + More...

+ +

#include <bufstream.h>

+
+Inheritance diagram for ibufstream:
+
+
Inheritance graph
+ + +
[legend]
+
+Collaboration diagram for ibufstream:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + +

+Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, +cur, +end + }
 
typedef uint32_t streamsize
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
streamsize gcount () const
 
int get ()
 
istreamget (char &ch)
 
istreamget (char *str, streamsize n, char delim= '\n')
 
istreamgetline (char *str, streamsize count, char delim= '\n')
 
bool good () const
 
 ibufstream ()
 
 ibufstream (const char *str)
 
istreamignore (streamsize n=1, int delim=-1)
 
void init (const char *str)
 
 operator const void * () const
 
bool operator! () const
 
istreamoperator>> (istream &(*pf)(istream &str))
 
istreamoperator>> (ios_base &(*pf)(ios_base &str))
 
istreamoperator>> (ios &(*pf)(ios &str))
 
istreamoperator>> (char *str)
 
istreamoperator>> (char &ch)
 
istreamoperator>> (signed char *str)
 
istreamoperator>> (signed char &ch)
 
istreamoperator>> (unsigned char *str)
 
istreamoperator>> (unsigned char &ch)
 
istreamoperator>> (bool &arg)
 
istreamoperator>> (short &arg)
 
istreamoperator>> (unsigned short &arg)
 
istreamoperator>> (int &arg)
 
istreamoperator>> (unsigned int &arg)
 
istreamoperator>> (long &arg)
 
istreamoperator>> (unsigned long &arg)
 
istreamoperator>> (double &arg)
 
istreamoperator>> (float &arg)
 
istreamoperator>> (void *&arg)
 
int peek ()
 
int precision () const
 
int precision (unsigned int n)
 
iostate rdstate () const
 
istreamseekg (pos_type pos)
 
istreamseekg (off_type off, seekdir way)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
void skipWhite ()
 
pos_type tellg ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
+ + + +

+Protected Member Functions

uint8_t flagsToBase ()
 
+

Detailed Description

+

parse a char string

+

Member Typedef Documentation

+ +
+
+ + + + + +
+ + + + +
typedef unsigned int ios_base::fmtflags
+
+inherited
+
+

type for format flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef unsigned char ios_base::iostate
+
+inherited
+
+

typedef for iostate bitmask

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef int32_t ios_base::off_type
+
+inherited
+
+

type for relative seek offset

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint8_t ios_base::openmode
+
+inherited
+
+

typedef for iostream open mode

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::pos_type
+
+inherited
+
+

type for absolute seek position

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::streamsize
+
+inherited
+
+

unsigned size that can represent maximum file size. (violates spec - should be signed)

+ +
+
+

Member Enumeration Documentation

+ +
+
+ + + + + +
+ + + + +
enum ios_base::seekdir
+
+inherited
+
+

enumerated type for the direction of relative seeks

+ + + + +
Enumerator
beg  +

seek relative to the beginning of the stream

+
cur  +

seek relative to the current stream position

+
end  +

seek relative to the end of the stream

+
+ +
+
+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + +
ibufstream::ibufstream ()
+
+inline
+
+

Constructor

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ibufstream::ibufstream (const char * str)
+
+inlineexplicit
+
+

Constructor

+
Parameters
+ + +
[in]strpointer to string to be parsed Warning: The string will not be copied so must stay in scope.
+
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
bool ios::bad () const
+
+inlineinherited
+
+
Returns
true if bad bit is set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::clear (iostate state = goodbit)
+
+inlineinherited
+
+

Clear iostate bits.

+
Parameters
+ + +
[in]stateThe flags you want to set after clearing all flags.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::eof () const
+
+inlineinherited
+
+
Returns
true if end of file has been reached else false.
+

Warning: An empty file returns false before the first read.

+

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::fail () const
+
+inlineinherited
+
+
Returns
true if any iostate bit other than eof are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
char ios_base::fill ()
+
+inlineinherited
+
+
Returns
fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
char ios_base::fill (char c)
+
+inlineinherited
+
+

Set fill character

+
Parameters
+ + +
[in]cnew fill character
+
+
+
Returns
old fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
fmtflags ios_base::flags () const
+
+inlineinherited
+
+
Returns
format flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::flags (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flag
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t ios_base::flagsToBase ()
+
+inlineprotectedinherited
+
+
Returns
current number base
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
streamsize istream::gcount () const
+
+inlineinherited
+
+
Returns
The number of characters extracted by the last unformatted input function.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int istream::get ()
+
+inherited
+
+

Extract a character if one is available.

+
Returns
The character or -1 if a failure occurs. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream & istream::get (char & c)
+
+inherited
+
+

Extract a character if one is available.

+
Parameters
+ + +
[out]clocation to receive the extracted character.
+
+
+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
istream & istream::get (char * str,
streamsize n,
char delim = '\n' 
)
+
+inherited
+
+

Extract characters.

+
Parameters
+ + + + +
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
+
+
+

Characters are extracted until extraction fails, n is less than 1, n-1 characters are extracted, or the next character equals delim (delim is not extracted). If no characters are extracted failbit is set. If end-of-file occurs the eofbit is set.

+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
istream & istream::getline (char * str,
streamsize n,
char delim = '\n' 
)
+
+inherited
+
+

Extract characters

+
Parameters
+ + + + +
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
+
+
+

Characters are extracted until extraction fails, the next character equals delim (delim is extracted), or n-1 characters are extracted.

+

The failbit is set if no characters are extracted or n-1 characters are extracted. If end-of-file occurs the eofbit is set.

+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::good () const
+
+inlineinherited
+
+
Returns
True if no iostate flags are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
istream & istream::ignore (streamsize n = 1,
int delim = -1 
)
+
+inherited
+
+

Extract characters and discard them.

+
Parameters
+ + + +
[in]nmaximum number of characters to ignore.
[in]delimDelimiter.
+
+
+

Characters are extracted until extraction fails, n characters are extracted, or the next input character equals delim (the delimiter is extracted). If end-of-file occurs the eofbit is set.

+

Failures are indicated by the state of the stream.

+
Returns
*this
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ibufstream::init (const char * str)
+
+inline
+
+

Initialize an ibufstream

+
Parameters
+ + +
[in]strpointer to string to be parsed Warning: The string will not be copied so must stay in scope.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ios::operator const void * () const
+
+inlineinherited
+
+
Returns
null pointer if fail() is true.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::operator! () const
+
+inlineinherited
+
+
Returns
true if fail() else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (istream &(*)(istream &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (ios_base &(*)(ios_base &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (ios &(*)(ios &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (char * str)
+
+inlineinherited
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (char & ch)
+
+inlineinherited
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (signed char * str)
+
+inlineinherited
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (signed char & ch)
+
+inlineinherited
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned char * str)
+
+inlineinherited
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned char & ch)
+
+inlineinherited
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (bool & arg)
+
+inlineinherited
+
+

Extract a value of type bool.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (short & arg)
+
+inlineinherited
+
+

Extract a value of type short.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned short & arg)
+
+inlineinherited
+
+

Extract a value of type unsigned short.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (int & arg)
+
+inlineinherited
+
+

Extract a value of type int.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned int & arg)
+
+inlineinherited
+
+

Extract a value of type unsigned int.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (long & arg)
+
+inlineinherited
+
+

Extract a value of type long.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned long & arg)
+
+inlineinherited
+
+

Extract a value of type unsigned long.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (double & arg)
+
+inlineinherited
+
+

Extract a value of type double.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (float & arg)
+
+inlineinherited
+
+

Extract a value of type float.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (void *& arg)
+
+inlineinherited
+
+

Extract a value of type void*.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int istream::peek ()
+
+inherited
+
+

Return the next available character without consuming it.

+
Returns
The character if the stream state is good else -1;
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int ios_base::precision () const
+
+inlineinherited
+
+
Returns
precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int ios_base::precision (unsigned int n)
+
+inlineinherited
+
+

set precision

+
Parameters
+ + +
[in]nnew precision
+
+
+
Returns
old precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
iostate ios::rdstate () const
+
+inlineinherited
+
+
Returns
The iostate flags for this file.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::seekg (pos_type pos)
+
+inlineinherited
+
+

Set the stream position

+
Parameters
+ + +
[in]posThe absolute position in which to move the read pointer.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
istream& istream::seekg (off_type off,
seekdir way 
)
+
+inlineinherited
+
+

Set the stream position.

+
Parameters
+ + + +
[in]offAn offset to move the read pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::setf (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flags to be or'ed in
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
+
+inlineinherited
+
+

modify format flags

+
Parameters
+ + + +
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::setstate (iostate state)
+
+inlineinherited
+
+

Set iostate bits.

+
Parameters
+ + +
[in]stateBitts to set.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void istream::skipWhite ()
+
+inherited
+
+

used to implement ws()

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
pos_type istream::tellg ()
+
+inlineinherited
+
+
Returns
the stream position
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios_base::unsetf (fmtflags fl)
+
+inlineinherited
+
+

clear format flags

+
Parameters
+ + +
[in]flflags to be cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
unsigned ios_base::width ()
+
+inlineinherited
+
+
Returns
width
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
unsigned ios_base::width (unsigned n)
+
+inlineinherited
+
+

set width

+
Parameters
+ + +
[in]nnew width
+
+
+
Returns
old width
+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::adjustfield = left | right | internal
+
+staticinherited
+
+

mask for adjustfield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::app = 0X4
+
+staticinherited
+
+

seek to end before each write

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::ate = 0X8
+
+staticinherited
+
+

open and seek to end immediately after opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::badbit = 0X01
+
+staticinherited
+
+

iostate bad bit for a nonrecoverable error.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::basefield = dec | hex | oct
+
+staticinherited
+
+

mask for basefield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::binary = 0X10
+
+staticinherited
+
+

perform input and output in binary mode (as opposed to text mode)

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::boolalpha = 0x0100
+
+staticinherited
+
+

use strings true/false for bool

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::dec = 0x0008
+
+staticinherited
+
+

base 10 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::eofbit = 0x02
+
+staticinherited
+
+

iostate bit for end of file reached

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::failbit = 0X04
+
+staticinherited
+
+

iostate fail bit for nonfatal error

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::goodbit = 0x00
+
+staticinherited
+
+

iostate for no flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::hex = 0x0010
+
+staticinherited
+
+

base 16 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::in = 0X20
+
+staticinherited
+
+

open for input

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::internal = 0x0004
+
+staticinherited
+
+

fill between sign/base prefix and number

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::left = 0x0001
+
+staticinherited
+
+

left adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::oct = 0x0020
+
+staticinherited
+
+

base 8 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::out = 0X40
+
+staticinherited
+
+

open for output

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::right = 0x0002
+
+staticinherited
+
+

right adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showbase = 0x0200
+
+staticinherited
+
+

use prefix 0X for hex and 0 for oct

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpoint = 0x0400
+
+staticinherited
+
+

always show '.' for floating numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpos = 0x0800
+
+staticinherited
+
+

show + sign for nonnegative numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::skipws = 0x1000
+
+staticinherited
+
+

skip initial white space

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::trunc = 0X80
+
+staticinherited
+
+

truncate an existing stream when opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::uppercase = 0x4000
+
+staticinherited
+
+

use uppercase letters in number representations

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/html/classibufstream__coll__graph.png b/html/classibufstream__coll__graph.png new file mode 100644 index 0000000..8678cc9 Binary files /dev/null and b/html/classibufstream__coll__graph.png differ diff --git a/html/classibufstream__inherit__graph.png b/html/classibufstream__inherit__graph.png new file mode 100644 index 0000000..5b2c2ed Binary files /dev/null and b/html/classibufstream__inherit__graph.png differ diff --git a/html/classifstream-members.html b/html/classifstream-members.html new file mode 100644 index 0000000..4df8efd --- /dev/null +++ b/html/classifstream-members.html @@ -0,0 +1,221 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
ifstream Member List
+
+
+ +

This is the complete list of members for ifstream, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
available()SdBaseFileinlineprivate
bad() const iosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
clearWriteError()SdBaseFileinlineprivate
close()ifstreaminline
contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock)SdBaseFileprivate
createContiguous(SdBaseFile *dirFile, const char *path, uint32_t size)SdBaseFileprivate
cur enum valueios_base
curCluster() const SdBaseFileinlineprivate
curPosition() const SdBaseFileinlineprivate
cwd()SdBaseFileinlineprivatestatic
dateTimeCallback(void(*dateTime)(uint16_t *date, uint16_t *time))SdBaseFileinlineprivatestatic
dateTimeCallbackCancel()SdBaseFileinlineprivatestatic
decios_basestatic
dirEntry(dir_t *dir)SdBaseFileprivate
dirName(const dir_t &dir, char *name)SdBaseFileprivatestatic
end enum valueios_base
eof() const iosinline
eofbitios_basestatic
exists(const char *name)SdBaseFileprivate
fail() const iosinline
failbitios_basestatic
fgets(char *str, int16_t num, char *delim=0)SdBaseFileprivate
fileSize() const SdBaseFileinlineprivate
fill()ios_baseinline
fill(char c)ios_baseinline
firstCluster() const SdBaseFileinlineprivate
flags() const ios_baseinline
flags(fmtflags fl)ios_baseinline
flagsToBase()ios_baseinlineprotected
fmtflags typedefios_base
gcount() const istreaminline
get()istream
get(char &ch)istream
get(char *str, streamsize n, char delim= '\n')istream
getFilename(char *name)SdBaseFileprivate
getline(char *str, streamsize count, char delim= '\n')istream
getpos(FatPos_t *pos)SdBaseFileprivate
getWriteError()SdBaseFileinlineprivate
good() const iosinline
goodbitios_basestatic
hexios_basestatic
ifstream()ifstreaminline
ifstream(const char *path, openmode mode=in)ifstreaminlineexplicit
ignore(streamsize n=1, int delim=-1)istream
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base()ios_baseinline
iostate typedefios_base
is_open()ifstreaminline
isDir() const SdBaseFileinlineprivate
isFile() const SdBaseFileinlineprivate
isOpen() const SdBaseFileinlineprivate
isRoot() const SdBaseFileinlineprivate
isSubDir() const SdBaseFileinlineprivate
istream()istreaminline
leftios_basestatic
ls(Print *pr, uint8_t flags=0, uint8_t indent=0)SdBaseFileprivate
ls(uint8_t flags=0)SdBaseFileprivate
mkdir(SdBaseFile *dir, const char *path, bool pFlag=true)SdBaseFileprivate
octios_basestatic
off_type typedefios_base
open(const char *path, openmode mode=in)ifstreaminline
SdStreamBase::open(SdBaseFile *dirFile, uint16_t index, uint8_t oflag)SdBaseFileprivate
SdStreamBase::open(SdBaseFile *dirFile, const char *path, uint8_t oflag)SdBaseFileprivate
openmode typedefios_base
openNext(SdBaseFile *dirFile, uint8_t oflag)SdBaseFileprivate
openRoot(SdVolume *vol)SdBaseFileprivate
operator const void *() const iosinline
operator!() const iosinline
operator>>(istream &(*pf)(istream &str))istreaminline
operator>>(ios_base &(*pf)(ios_base &str))istreaminline
operator>>(ios &(*pf)(ios &str))istreaminline
operator>>(char *str)istreaminline
operator>>(char &ch)istreaminline
operator>>(signed char *str)istreaminline
operator>>(signed char &ch)istreaminline
operator>>(unsigned char *str)istreaminline
operator>>(unsigned char &ch)istreaminline
operator>>(bool &arg)istreaminline
operator>>(short &arg)istreaminline
operator>>(unsigned short &arg)istreaminline
operator>>(int &arg)istreaminline
operator>>(unsigned int &arg)istreaminline
operator>>(long &arg)istreaminline
operator>>(unsigned long &arg)istreaminline
operator>>(double &arg)istreaminline
operator>>(float &arg)istreaminline
operator>>(void *&arg)istreaminline
outios_basestatic
istream::peek()istream
SdStreamBase::peek()SdBaseFileprivate
pos_type typedefios_base
precision() const ios_baseinline
precision(unsigned int n)ios_baseinline
printCreateDateTime(Print *pr)SdBaseFileprivate
printFatDate(uint16_t fatDate)SdBaseFileprivatestatic
printFatDate(Print *pr, uint16_t fatDate)SdBaseFileprivatestatic
printFatTime(uint16_t fatTime)SdBaseFileprivatestatic
printFatTime(Print *pr, uint16_t fatTime)SdBaseFileprivatestatic
printField(int16_t value, char term)SdBaseFileprivate
printField(uint16_t value, char term)SdBaseFileprivate
printField(int32_t value, char term)SdBaseFileprivate
printField(uint32_t value, char term)SdBaseFileprivate
printFileSize(Print *pr)SdBaseFileprivate
printModifyDateTime(Print *pr)SdBaseFileprivate
printName()SdBaseFileprivate
printName(Print *pr)SdBaseFileprivate
rdstate() const iosinline
read()SdBaseFileprivate
read(void *buf, size_t nbyte)SdBaseFileprivate
readDir(dir_t *dir)SdBaseFileprivate
remove(SdBaseFile *dirFile, const char *path)SdBaseFileprivatestatic
remove()SdBaseFileprivate
rename(SdBaseFile *dirFile, const char *newPath)SdBaseFileprivate
rewind()SdBaseFileinlineprivate
rightios_basestatic
rmdir()SdBaseFileprivate
rmRfStar()SdBaseFileprivate
SdBaseFile()SdBaseFileinlineprivate
SdBaseFile(const char *path, uint8_t oflag)SdBaseFileprivate
seekCur(int32_t offset)SdBaseFileinlineprivate
seekdir enum nameios_base
seekEnd(int32_t offset=0)SdBaseFileinlineprivate
seekg(pos_type pos)istreaminline
seekg(off_type off, seekdir way)istreaminline
seekSet(uint32_t pos)SdBaseFileprivate
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setpos(FatPos_t *pos)SdBaseFileprivate
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipWhite()istream
skipwsios_basestatic
streamsize typedefios_base
sync()SdBaseFileprivate
tellg()istreaminline
timestamp(SdBaseFile *file)SdBaseFileprivate
timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)SdBaseFileprivate
truncios_basestatic
truncate(uint32_t size)SdBaseFileprivate
type() const SdBaseFileinlineprivate
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
volume() const SdBaseFileinlineprivate
width()ios_baseinline
width(unsigned n)ios_baseinline
write(const void *buf, size_t nbyte)SdBaseFileprivate
writeErrorSdBaseFileprivate
+ + + + diff --git a/html/classifstream.html b/html/classifstream.html new file mode 100644 index 0000000..97ac364 --- /dev/null +++ b/html/classifstream.html @@ -0,0 +1,2815 @@ + + + + + + +SdFat: ifstream Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

SD file input stream. + More...

+ +

#include <SdStream.h>

+
+Inheritance diagram for ifstream:
+
+
Inheritance graph
+ + +
[legend]
+
+Collaboration diagram for ifstream:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + +

+Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, +cur, +end + }
 
typedef uint32_t streamsize
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
void close ()
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
streamsize gcount () const
 
int get ()
 
istreamget (char &ch)
 
istreamget (char *str, streamsize n, char delim= '\n')
 
istreamgetline (char *str, streamsize count, char delim= '\n')
 
bool good () const
 
 ifstream ()
 
 ifstream (const char *path, openmode mode=in)
 
istreamignore (streamsize n=1, int delim=-1)
 
bool is_open ()
 
void open (const char *path, openmode mode=in)
 
 operator const void * () const
 
bool operator! () const
 
istreamoperator>> (istream &(*pf)(istream &str))
 
istreamoperator>> (ios_base &(*pf)(ios_base &str))
 
istreamoperator>> (ios &(*pf)(ios &str))
 
istreamoperator>> (char *str)
 
istreamoperator>> (char &ch)
 
istreamoperator>> (signed char *str)
 
istreamoperator>> (signed char &ch)
 
istreamoperator>> (unsigned char *str)
 
istreamoperator>> (unsigned char &ch)
 
istreamoperator>> (bool &arg)
 
istreamoperator>> (short &arg)
 
istreamoperator>> (unsigned short &arg)
 
istreamoperator>> (int &arg)
 
istreamoperator>> (unsigned int &arg)
 
istreamoperator>> (long &arg)
 
istreamoperator>> (unsigned long &arg)
 
istreamoperator>> (double &arg)
 
istreamoperator>> (float &arg)
 
istreamoperator>> (void *&arg)
 
int peek ()
 
int precision () const
 
int precision (unsigned int n)
 
iostate rdstate () const
 
istreamseekg (pos_type pos)
 
istreamseekg (off_type off, seekdir way)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
void skipWhite ()
 
pos_type tellg ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
+ + + +

+Protected Member Functions

uint8_t flagsToBase ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Member Functions

uint32_t available ()
 
void clearWriteError ()
 
bool contiguousRange (uint32_t *bgnBlock, uint32_t *endBlock)
 
bool createContiguous (SdBaseFile *dirFile, const char *path, uint32_t size)
 
uint32_t curCluster () const
 
uint32_t curPosition () const
 
bool dirEntry (dir_t *dir)
 
bool exists (const char *name)
 
int16_t fgets (char *str, int16_t num, char *delim=0)
 
uint32_t fileSize () const
 
uint32_t firstCluster () const
 
bool getFilename (char *name)
 
void getpos (FatPos_t *pos)
 
bool getWriteError ()
 
bool isDir () const
 
bool isFile () const
 
bool isOpen () const
 
bool isRoot () const
 
bool isSubDir () const
 
void ls (Print *pr, uint8_t flags=0, uint8_t indent=0)
 
void ls (uint8_t flags=0)
 
bool mkdir (SdBaseFile *dir, const char *path, bool pFlag=true)
 
bool open (SdBaseFile *dirFile, uint16_t index, uint8_t oflag)
 
bool open (SdBaseFile *dirFile, const char *path, uint8_t oflag)
 
bool openNext (SdBaseFile *dirFile, uint8_t oflag)
 
bool openRoot (SdVolume *vol)
 
int peek ()
 
bool printCreateDateTime (Print *pr)
 
int printField (int16_t value, char term)
 
int printField (uint16_t value, char term)
 
int printField (int32_t value, char term)
 
int printField (uint32_t value, char term)
 
size_t printFileSize (Print *pr)
 
bool printModifyDateTime (Print *pr)
 
size_t printName ()
 
size_t printName (Print *pr)
 
int16_t read ()
 
int read (void *buf, size_t nbyte)
 
int8_t readDir (dir_t *dir)
 
bool remove ()
 
bool rename (SdBaseFile *dirFile, const char *newPath)
 
void rewind ()
 
bool rmdir ()
 
bool rmRfStar ()
 
bool seekCur (int32_t offset)
 
bool seekEnd (int32_t offset=0)
 
bool seekSet (uint32_t pos)
 
void setpos (FatPos_t *pos)
 
bool sync ()
 
bool timestamp (SdBaseFile *file)
 
bool timestamp (uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
 
bool truncate (uint32_t size)
 
uint8_t type () const
 
SdVolumevolume () const
 
int write (const void *buf, size_t nbyte)
 
+ + + + + + + + + + + + + + + + + + + +

+Static Private Member Functions

static SdBaseFilecwd ()
 
static void dateTimeCallback (void(*dateTime)(uint16_t *date, uint16_t *time))
 
static void dateTimeCallbackCancel ()
 
static void dirName (const dir_t &dir, char *name)
 
static void printFatDate (uint16_t fatDate)
 
static void printFatDate (Print *pr, uint16_t fatDate)
 
static void printFatTime (uint16_t fatTime)
 
static void printFatTime (Print *pr, uint16_t fatTime)
 
static bool remove (SdBaseFile *dirFile, const char *path)
 
+ + + +

+Private Attributes

bool writeError
 
+

Detailed Description

+

SD file input stream.

+

Member Typedef Documentation

+ +
+
+ + + + + +
+ + + + +
typedef unsigned int ios_base::fmtflags
+
+inherited
+
+

type for format flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef unsigned char ios_base::iostate
+
+inherited
+
+

typedef for iostate bitmask

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef int32_t ios_base::off_type
+
+inherited
+
+

type for relative seek offset

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint8_t ios_base::openmode
+
+inherited
+
+

typedef for iostream open mode

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::pos_type
+
+inherited
+
+

type for absolute seek position

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::streamsize
+
+inherited
+
+

unsigned size that can represent maximum file size. (violates spec - should be signed)

+ +
+
+

Member Enumeration Documentation

+ +
+
+ + + + + +
+ + + + +
enum ios_base::seekdir
+
+inherited
+
+

enumerated type for the direction of relative seeks

+ + + + +
Enumerator
beg  +

seek relative to the beginning of the stream

+
cur  +

seek relative to the current stream position

+
end  +

seek relative to the end of the stream

+
+ +
+
+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + +
ifstream::ifstream ()
+
+inline
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
ifstream::ifstream (const char * path,
openmode mode = in 
)
+
+inlineexplicit
+
+

Constructor with open

+
Parameters
+ + + +
[in]pathfile to open
[in]modeopen mode
+
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
bool ios::bad () const
+
+inlineinherited
+
+
Returns
true if bad bit is set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::clear (iostate state = goodbit)
+
+inlineinherited
+
+

Clear iostate bits.

+
Parameters
+ + +
[in]stateThe flags you want to set after clearing all flags.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void ifstream::close ()
+
+inline
+
+

Close a file and force cached data and directory information to be written to the storage device.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::eof () const
+
+inlineinherited
+
+
Returns
true if end of file has been reached else false.
+

Warning: An empty file returns false before the first read.

+

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::fail () const
+
+inlineinherited
+
+
Returns
true if any iostate bit other than eof are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
char ios_base::fill ()
+
+inlineinherited
+
+
Returns
fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
char ios_base::fill (char c)
+
+inlineinherited
+
+

Set fill character

+
Parameters
+ + +
[in]cnew fill character
+
+
+
Returns
old fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
fmtflags ios_base::flags () const
+
+inlineinherited
+
+
Returns
format flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::flags (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flag
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t ios_base::flagsToBase ()
+
+inlineprotectedinherited
+
+
Returns
current number base
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
streamsize istream::gcount () const
+
+inlineinherited
+
+
Returns
The number of characters extracted by the last unformatted input function.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int istream::get ()
+
+inherited
+
+

Extract a character if one is available.

+
Returns
The character or -1 if a failure occurs. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream & istream::get (char & c)
+
+inherited
+
+

Extract a character if one is available.

+
Parameters
+ + +
[out]clocation to receive the extracted character.
+
+
+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
istream & istream::get (char * str,
streamsize n,
char delim = '\n' 
)
+
+inherited
+
+

Extract characters.

+
Parameters
+ + + + +
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
+
+
+

Characters are extracted until extraction fails, n is less than 1, n-1 characters are extracted, or the next character equals delim (delim is not extracted). If no characters are extracted failbit is set. If end-of-file occurs the eofbit is set.

+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
istream & istream::getline (char * str,
streamsize n,
char delim = '\n' 
)
+
+inherited
+
+

Extract characters

+
Parameters
+ + + + +
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
+
+
+

Characters are extracted until extraction fails, the next character equals delim (delim is extracted), or n-1 characters are extracted.

+

The failbit is set if no characters are extracted or n-1 characters are extracted. If end-of-file occurs the eofbit is set.

+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::good () const
+
+inlineinherited
+
+
Returns
True if no iostate flags are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
istream & istream::ignore (streamsize n = 1,
int delim = -1 
)
+
+inherited
+
+

Extract characters and discard them.

+
Parameters
+ + + +
[in]nmaximum number of characters to ignore.
[in]delimDelimiter.
+
+
+

Characters are extracted until extraction fails, n characters are extracted, or the next input character equals delim (the delimiter is extracted). If end-of-file occurs the eofbit is set.

+

Failures are indicated by the state of the stream.

+
Returns
*this
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ifstream::is_open ()
+
+inline
+
+
Returns
True if stream is open else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void ifstream::open (const char * path,
openmode mode = in 
)
+
+inline
+
+

Open an ifstream

+
Parameters
+ + + +
[in]pathfile to open
[in]modeopen mode
+
+
+

mode See fstream::open() for valid modes.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ios::operator const void * () const
+
+inlineinherited
+
+
Returns
null pointer if fail() is true.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::operator! () const
+
+inlineinherited
+
+
Returns
true if fail() else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (istream &(*)(istream &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (ios_base &(*)(ios_base &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (ios &(*)(ios &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (char * str)
+
+inlineinherited
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (char & ch)
+
+inlineinherited
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (signed char * str)
+
+inlineinherited
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (signed char & ch)
+
+inlineinherited
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned char * str)
+
+inlineinherited
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned char & ch)
+
+inlineinherited
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (bool & arg)
+
+inlineinherited
+
+

Extract a value of type bool.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (short & arg)
+
+inlineinherited
+
+

Extract a value of type short.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned short & arg)
+
+inlineinherited
+
+

Extract a value of type unsigned short.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (int & arg)
+
+inlineinherited
+
+

Extract a value of type int.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned int & arg)
+
+inlineinherited
+
+

Extract a value of type unsigned int.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (long & arg)
+
+inlineinherited
+
+

Extract a value of type long.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned long & arg)
+
+inlineinherited
+
+

Extract a value of type unsigned long.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (double & arg)
+
+inlineinherited
+
+

Extract a value of type double.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (float & arg)
+
+inlineinherited
+
+

Extract a value of type float.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (void *& arg)
+
+inlineinherited
+
+

Extract a value of type void*.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int istream::peek ()
+
+inherited
+
+

Return the next available character without consuming it.

+
Returns
The character if the stream state is good else -1;
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int ios_base::precision () const
+
+inlineinherited
+
+
Returns
precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int ios_base::precision (unsigned int n)
+
+inlineinherited
+
+

set precision

+
Parameters
+ + +
[in]nnew precision
+
+
+
Returns
old precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
iostate ios::rdstate () const
+
+inlineinherited
+
+
Returns
The iostate flags for this file.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::seekg (pos_type pos)
+
+inlineinherited
+
+

Set the stream position

+
Parameters
+ + +
[in]posThe absolute position in which to move the read pointer.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
istream& istream::seekg (off_type off,
seekdir way 
)
+
+inlineinherited
+
+

Set the stream position.

+
Parameters
+ + + +
[in]offAn offset to move the read pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::setf (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flags to be or'ed in
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
+
+inlineinherited
+
+

modify format flags

+
Parameters
+ + + +
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::setstate (iostate state)
+
+inlineinherited
+
+

Set iostate bits.

+
Parameters
+ + +
[in]stateBitts to set.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void istream::skipWhite ()
+
+inherited
+
+

used to implement ws()

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
pos_type istream::tellg ()
+
+inlineinherited
+
+
Returns
the stream position
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios_base::unsetf (fmtflags fl)
+
+inlineinherited
+
+

clear format flags

+
Parameters
+ + +
[in]flflags to be cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
unsigned ios_base::width ()
+
+inlineinherited
+
+
Returns
width
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
unsigned ios_base::width (unsigned n)
+
+inlineinherited
+
+

set width

+
Parameters
+ + +
[in]nnew width
+
+
+
Returns
old width
+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::adjustfield = left | right | internal
+
+staticinherited
+
+

mask for adjustfield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::app = 0X4
+
+staticinherited
+
+

seek to end before each write

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::ate = 0X8
+
+staticinherited
+
+

open and seek to end immediately after opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::badbit = 0X01
+
+staticinherited
+
+

iostate bad bit for a nonrecoverable error.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::basefield = dec | hex | oct
+
+staticinherited
+
+

mask for basefield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::binary = 0X10
+
+staticinherited
+
+

perform input and output in binary mode (as opposed to text mode)

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::boolalpha = 0x0100
+
+staticinherited
+
+

use strings true/false for bool

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::dec = 0x0008
+
+staticinherited
+
+

base 10 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::eofbit = 0x02
+
+staticinherited
+
+

iostate bit for end of file reached

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::failbit = 0X04
+
+staticinherited
+
+

iostate fail bit for nonfatal error

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::goodbit = 0x00
+
+staticinherited
+
+

iostate for no flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::hex = 0x0010
+
+staticinherited
+
+

base 16 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::in = 0X20
+
+staticinherited
+
+

open for input

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::internal = 0x0004
+
+staticinherited
+
+

fill between sign/base prefix and number

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::left = 0x0001
+
+staticinherited
+
+

left adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::oct = 0x0020
+
+staticinherited
+
+

base 8 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::out = 0X40
+
+staticinherited
+
+

open for output

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::right = 0x0002
+
+staticinherited
+
+

right adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showbase = 0x0200
+
+staticinherited
+
+

use prefix 0X for hex and 0 for oct

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpoint = 0x0400
+
+staticinherited
+
+

always show '.' for floating numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpos = 0x0800
+
+staticinherited
+
+

show + sign for nonnegative numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::skipws = 0x1000
+
+staticinherited
+
+

skip initial white space

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::trunc = 0X80
+
+staticinherited
+
+

truncate an existing stream when opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::uppercase = 0x4000
+
+staticinherited
+
+

use uppercase letters in number representations

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/html/classifstream__coll__graph.png b/html/classifstream__coll__graph.png new file mode 100644 index 0000000..686ee5d Binary files /dev/null and b/html/classifstream__coll__graph.png differ diff --git a/html/classifstream__inherit__graph.png b/html/classifstream__inherit__graph.png new file mode 100644 index 0000000..686ee5d Binary files /dev/null and b/html/classifstream__inherit__graph.png differ diff --git a/html/classios-members.html b/html/classios-members.html new file mode 100644 index 0000000..8723ab1 --- /dev/null +++ b/html/classios-members.html @@ -0,0 +1,118 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
ios Member List
+
+
+ +

This is the complete list of members for ios, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
bad() const iosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() const iosinline
eofbitios_basestatic
fail() const iosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() const ios_baseinline
flags(fmtflags fl)ios_baseinline
flagsToBase()ios_baseinlineprotected
fmtflags typedefios_base
good() const iosinline
goodbitios_basestatic
hexios_basestatic
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base()ios_baseinline
iostate typedefios_base
leftios_basestatic
octios_basestatic
off_type typedefios_base
openmode typedefios_base
operator const void *() const iosinline
operator!() const iosinline
outios_basestatic
pos_type typedefios_base
precision() const ios_baseinline
precision(unsigned int n)ios_baseinline
rdstate() const iosinline
rightios_basestatic
seekdir enum nameios_base
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipwsios_basestatic
streamsize typedefios_base
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
+ + + + diff --git a/html/classios.html b/html/classios.html new file mode 100644 index 0000000..852bd94 --- /dev/null +++ b/html/classios.html @@ -0,0 +1,1488 @@ + + + + + + +SdFat: ios Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

Error and state information for all streams. + More...

+ +

#include <ios.h>

+
+Inheritance diagram for ios:
+
+
Inheritance graph
+ + +
[legend]
+
+Collaboration diagram for ios:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + +

+Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, +cur, +end + }
 
typedef uint32_t streamsize
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
bool good () const
 
 ios ()
 
 operator const void * () const
 
bool operator! () const
 
int precision () const
 
int precision (unsigned int n)
 
iostate rdstate () const
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
+ + + +

+Protected Member Functions

uint8_t flagsToBase ()
 
+

Detailed Description

+

Error and state information for all streams.

+

Member Typedef Documentation

+ +
+
+ + + + + +
+ + + + +
typedef unsigned int ios_base::fmtflags
+
+inherited
+
+

type for format flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef unsigned char ios_base::iostate
+
+inherited
+
+

typedef for iostate bitmask

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef int32_t ios_base::off_type
+
+inherited
+
+

type for relative seek offset

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint8_t ios_base::openmode
+
+inherited
+
+

typedef for iostream open mode

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::pos_type
+
+inherited
+
+

type for absolute seek position

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::streamsize
+
+inherited
+
+

unsigned size that can represent maximum file size. (violates spec - should be signed)

+ +
+
+

Member Enumeration Documentation

+ +
+
+ + + + + +
+ + + + +
enum ios_base::seekdir
+
+inherited
+
+

enumerated type for the direction of relative seeks

+ + + + +
Enumerator
beg  +

seek relative to the beginning of the stream

+
cur  +

seek relative to the current stream position

+
end  +

seek relative to the end of the stream

+
+ +
+
+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + +
ios::ios ()
+
+inline
+
+

Create ios with no error flags set

+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
bool ios::bad () const
+
+inline
+
+
Returns
true if bad bit is set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::clear (iostate state = goodbit)
+
+inline
+
+

Clear iostate bits.

+
Parameters
+ + +
[in]stateThe flags you want to set after clearing all flags.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::eof () const
+
+inline
+
+
Returns
true if end of file has been reached else false.
+

Warning: An empty file returns false before the first read.

+

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::fail () const
+
+inline
+
+
Returns
true if any iostate bit other than eof are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
char ios_base::fill ()
+
+inlineinherited
+
+
Returns
fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
char ios_base::fill (char c)
+
+inlineinherited
+
+

Set fill character

+
Parameters
+ + +
[in]cnew fill character
+
+
+
Returns
old fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
fmtflags ios_base::flags () const
+
+inlineinherited
+
+
Returns
format flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::flags (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flag
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t ios_base::flagsToBase ()
+
+inlineprotectedinherited
+
+
Returns
current number base
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::good () const
+
+inline
+
+
Returns
True if no iostate flags are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ios::operator const void * () const
+
+inline
+
+
Returns
null pointer if fail() is true.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::operator! () const
+
+inline
+
+
Returns
true if fail() else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int ios_base::precision () const
+
+inlineinherited
+
+
Returns
precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int ios_base::precision (unsigned int n)
+
+inlineinherited
+
+

set precision

+
Parameters
+ + +
[in]nnew precision
+
+
+
Returns
old precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
iostate ios::rdstate () const
+
+inline
+
+
Returns
The iostate flags for this file.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::setf (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flags to be or'ed in
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
+
+inlineinherited
+
+

modify format flags

+
Parameters
+ + + +
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::setstate (iostate state)
+
+inline
+
+

Set iostate bits.

+
Parameters
+ + +
[in]stateBitts to set.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios_base::unsetf (fmtflags fl)
+
+inlineinherited
+
+

clear format flags

+
Parameters
+ + +
[in]flflags to be cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
unsigned ios_base::width ()
+
+inlineinherited
+
+
Returns
width
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
unsigned ios_base::width (unsigned n)
+
+inlineinherited
+
+

set width

+
Parameters
+ + +
[in]nnew width
+
+
+
Returns
old width
+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::adjustfield = left | right | internal
+
+staticinherited
+
+

mask for adjustfield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::app = 0X4
+
+staticinherited
+
+

seek to end before each write

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::ate = 0X8
+
+staticinherited
+
+

open and seek to end immediately after opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::badbit = 0X01
+
+staticinherited
+
+

iostate bad bit for a nonrecoverable error.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::basefield = dec | hex | oct
+
+staticinherited
+
+

mask for basefield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::binary = 0X10
+
+staticinherited
+
+

perform input and output in binary mode (as opposed to text mode)

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::boolalpha = 0x0100
+
+staticinherited
+
+

use strings true/false for bool

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::dec = 0x0008
+
+staticinherited
+
+

base 10 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::eofbit = 0x02
+
+staticinherited
+
+

iostate bit for end of file reached

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::failbit = 0X04
+
+staticinherited
+
+

iostate fail bit for nonfatal error

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::goodbit = 0x00
+
+staticinherited
+
+

iostate for no flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::hex = 0x0010
+
+staticinherited
+
+

base 16 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::in = 0X20
+
+staticinherited
+
+

open for input

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::internal = 0x0004
+
+staticinherited
+
+

fill between sign/base prefix and number

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::left = 0x0001
+
+staticinherited
+
+

left adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::oct = 0x0020
+
+staticinherited
+
+

base 8 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::out = 0X40
+
+staticinherited
+
+

open for output

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::right = 0x0002
+
+staticinherited
+
+

right adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showbase = 0x0200
+
+staticinherited
+
+

use prefix 0X for hex and 0 for oct

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpoint = 0x0400
+
+staticinherited
+
+

always show '.' for floating numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpos = 0x0800
+
+staticinherited
+
+

show + sign for nonnegative numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::skipws = 0x1000
+
+staticinherited
+
+

skip initial white space

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::trunc = 0X80
+
+staticinherited
+
+

truncate an existing stream when opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::uppercase = 0x4000
+
+staticinherited
+
+

use uppercase letters in number representations

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • Arduino/libraries/SdFat/ios.h
  • +
+
+ + + + diff --git a/html/classios__base-members.html b/html/classios__base-members.html new file mode 100644 index 0000000..0360b60 --- /dev/null +++ b/html/classios__base-members.html @@ -0,0 +1,108 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
ios_base Member List
+
+
+ +

This is the complete list of members for ios_base, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
cur enum valueios_base
decios_basestatic
end enum valueios_base
eofbitios_basestatic
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() const ios_baseinline
flags(fmtflags fl)ios_baseinline
flagsToBase()ios_baseinlineprotected
fmtflags typedefios_base
goodbitios_basestatic
hexios_basestatic
inios_basestatic
internalios_basestatic
ios_base()ios_baseinline
iostate typedefios_base
leftios_basestatic
octios_basestatic
off_type typedefios_base
openmode typedefios_base
outios_basestatic
pos_type typedefios_base
precision() const ios_baseinline
precision(unsigned int n)ios_baseinline
rightios_basestatic
seekdir enum nameios_base
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipwsios_basestatic
streamsize typedefios_base
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
+ + + + diff --git a/html/classios__base.html b/html/classios__base.html new file mode 100644 index 0000000..2a8d482 --- /dev/null +++ b/html/classios__base.html @@ -0,0 +1,1174 @@ + + + + + + +SdFat: ios_base Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

Base class for all streams. + More...

+ +

#include <ios.h>

+
+Inheritance diagram for ios_base:
+
+
Inheritance graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + +

+Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, +cur, +end + }
 
typedef uint32_t streamsize
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
 ios_base ()
 
int precision () const
 
int precision (unsigned int n)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
+ + + +

+Protected Member Functions

uint8_t flagsToBase ()
 
+

Detailed Description

+

Base class for all streams.

+

Member Typedef Documentation

+ +
+
+ + + + +
typedef unsigned int ios_base::fmtflags
+
+

type for format flags

+ +
+
+ +
+
+ + + + +
typedef unsigned char ios_base::iostate
+
+

typedef for iostate bitmask

+ +
+
+ +
+
+ + + + +
typedef int32_t ios_base::off_type
+
+

type for relative seek offset

+ +
+
+ +
+
+ + + + +
typedef uint8_t ios_base::openmode
+
+

typedef for iostream open mode

+ +
+
+ +
+
+ + + + +
typedef uint32_t ios_base::pos_type
+
+

type for absolute seek position

+ +
+
+ +
+
+ + + + +
typedef uint32_t ios_base::streamsize
+
+

unsigned size that can represent maximum file size. (violates spec - should be signed)

+ +
+
+

Member Enumeration Documentation

+ +
+
+ + + + +
enum ios_base::seekdir
+
+

enumerated type for the direction of relative seeks

+ + + + +
Enumerator
beg  +

seek relative to the beginning of the stream

+
cur  +

seek relative to the current stream position

+
end  +

seek relative to the end of the stream

+
+ +
+
+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + +
ios_base::ios_base ()
+
+inline
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
char ios_base::fill ()
+
+inline
+
+
Returns
fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
char ios_base::fill (char c)
+
+inline
+
+

Set fill character

+
Parameters
+ + +
[in]cnew fill character
+
+
+
Returns
old fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
fmtflags ios_base::flags () const
+
+inline
+
+
Returns
format flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::flags (fmtflags fl)
+
+inline
+
+

set format flags

+
Parameters
+ + +
[in]flnew flag
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t ios_base::flagsToBase ()
+
+inlineprotected
+
+
Returns
current number base
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int ios_base::precision () const
+
+inline
+
+
Returns
precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int ios_base::precision (unsigned int n)
+
+inline
+
+

set precision

+
Parameters
+ + +
[in]nnew precision
+
+
+
Returns
old precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::setf (fmtflags fl)
+
+inline
+
+

set format flags

+
Parameters
+ + +
[in]flnew flags to be or'ed in
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
+
+inline
+
+

modify format flags

+
Parameters
+ + + +
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios_base::unsetf (fmtflags fl)
+
+inline
+
+

clear format flags

+
Parameters
+ + +
[in]flflags to be cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
unsigned ios_base::width ()
+
+inline
+
+
Returns
width
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
unsigned ios_base::width (unsigned n)
+
+inline
+
+

set width

+
Parameters
+ + +
[in]nnew width
+
+
+
Returns
old width
+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::adjustfield = left | right | internal
+
+static
+
+

mask for adjustfield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::app = 0X4
+
+static
+
+

seek to end before each write

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::ate = 0X8
+
+static
+
+

open and seek to end immediately after opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::badbit = 0X01
+
+static
+
+

iostate bad bit for a nonrecoverable error.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::basefield = dec | hex | oct
+
+static
+
+

mask for basefield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::binary = 0X10
+
+static
+
+

perform input and output in binary mode (as opposed to text mode)

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::boolalpha = 0x0100
+
+static
+
+

use strings true/false for bool

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::dec = 0x0008
+
+static
+
+

base 10 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::eofbit = 0x02
+
+static
+
+

iostate bit for end of file reached

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::failbit = 0X04
+
+static
+
+

iostate fail bit for nonfatal error

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::goodbit = 0x00
+
+static
+
+

iostate for no flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::hex = 0x0010
+
+static
+
+

base 16 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::in = 0X20
+
+static
+
+

open for input

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::internal = 0x0004
+
+static
+
+

fill between sign/base prefix and number

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::left = 0x0001
+
+static
+
+

left adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::oct = 0x0020
+
+static
+
+

base 8 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::out = 0X40
+
+static
+
+

open for output

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::right = 0x0002
+
+static
+
+

right adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showbase = 0x0200
+
+static
+
+

use prefix 0X for hex and 0 for oct

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpoint = 0x0400
+
+static
+
+

always show '.' for floating numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpos = 0x0800
+
+static
+
+

show + sign for nonnegative numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::skipws = 0x1000
+
+static
+
+

skip initial white space

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::trunc = 0X80
+
+static
+
+

truncate an existing stream when opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::uppercase = 0x4000
+
+static
+
+

use uppercase letters in number representations

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • Arduino/libraries/SdFat/ios.h
  • +
+
+ + + + diff --git a/html/classios__base__inherit__graph.png b/html/classios__base__inherit__graph.png new file mode 100644 index 0000000..0bc3859 Binary files /dev/null and b/html/classios__base__inherit__graph.png differ diff --git a/html/classios__coll__graph.png b/html/classios__coll__graph.png new file mode 100644 index 0000000..003fc52 Binary files /dev/null and b/html/classios__coll__graph.png differ diff --git a/html/classios__inherit__graph.png b/html/classios__inherit__graph.png new file mode 100644 index 0000000..16af89d Binary files /dev/null and b/html/classios__inherit__graph.png differ diff --git a/html/classiostream-members.html b/html/classiostream-members.html new file mode 100644 index 0000000..87a2955 --- /dev/null +++ b/html/classiostream-members.html @@ -0,0 +1,175 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
iostream Member List
+
+
+ +

This is the complete list of members for iostream, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
bad() const iosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() const iosinline
eofbitios_basestatic
fail() const iosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() const ios_baseinline
flags(fmtflags fl)ios_baseinline
flagsToBase()ios_baseinlineprotected
flush()ostreaminline
fmtflags typedefios_base
gcount() const istreaminline
get()istream
get(char &ch)istream
get(char *str, streamsize n, char delim= '\n')istream
getline(char *str, streamsize count, char delim= '\n')istream
good() const iosinline
goodbitios_basestatic
hexios_basestatic
ignore(streamsize n=1, int delim=-1)istream
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base()ios_baseinline
iostate typedefios_base
istream()istreaminline
leftios_basestatic
octios_basestatic
off_type typedefios_base
openmode typedefios_base
operator const void *() const iosinline
operator!() const iosinline
operator<<(ostream &(*pf)(ostream &str))ostreaminline
operator<<(ios_base &(*pf)(ios_base &str))ostreaminline
operator<<(bool arg)ostreaminline
operator<<(const char *arg)ostreaminline
operator<<(const signed char *arg)ostreaminline
operator<<(const unsigned char *arg)ostreaminline
operator<<(char arg)ostreaminline
operator<<(signed char arg)ostreaminline
operator<<(unsigned char arg)ostreaminline
operator<<(double arg)ostreaminline
operator<<(float arg)ostreaminline
operator<<(short arg)ostreaminline
operator<<(unsigned short arg)ostreaminline
operator<<(int arg)ostreaminline
operator<<(unsigned int arg)ostreaminline
operator<<(long arg)ostreaminline
operator<<(unsigned long arg)ostreaminline
operator<<(const void *arg)ostreaminline
operator<<(pgm arg)ostreaminline
operator<<(const __FlashStringHelper *arg)ostreaminline
operator>>(istream &(*pf)(istream &str))istreaminline
operator>>(ios_base &(*pf)(ios_base &str))istreaminline
operator>>(ios &(*pf)(ios &str))istreaminline
operator>>(char *str)istreaminline
operator>>(char &ch)istreaminline
operator>>(signed char *str)istreaminline
operator>>(signed char &ch)istreaminline
operator>>(unsigned char *str)istreaminline
operator>>(unsigned char &ch)istreaminline
operator>>(bool &arg)istreaminline
operator>>(short &arg)istreaminline
operator>>(unsigned short &arg)istreaminline
operator>>(int &arg)istreaminline
operator>>(unsigned int &arg)istreaminline
operator>>(long &arg)istreaminline
operator>>(unsigned long &arg)istreaminline
operator>>(double &arg)istreaminline
operator>>(float &arg)istreaminline
operator>>(void *&arg)istreaminline
ostream()ostreaminline
outios_basestatic
peek()istream
pos_type typedefios_base
precision() const ios_baseinline
precision(unsigned int n)ios_baseinline
put(char ch)ostreaminline
rdstate() const iosinline
rightios_basestatic
seekdir enum nameios_base
seekg(pos_type pos)istreaminline
seekg(off_type off, seekdir way)istreaminline
seekp(pos_type pos)ostreaminline
seekp(off_type off, seekdir way)ostreaminline
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipWhite()istream
skipwsios_basestatic
streamsize typedefios_base
tellg()istreaminline
tellp()ostreaminline
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
+ + + + diff --git a/html/classiostream.html b/html/classiostream.html new file mode 100644 index 0000000..542d04c --- /dev/null +++ b/html/classiostream.html @@ -0,0 +1,3353 @@ + + + + + + +SdFat: iostream Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

Input/Output stream. + More...

+ +

#include <iostream.h>

+
+Inheritance diagram for iostream:
+
+
Inheritance graph
+ + +
[legend]
+
+Collaboration diagram for iostream:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + +

+Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, +cur, +end + }
 
typedef uint32_t streamsize
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
ostreamflush ()
 
streamsize gcount () const
 
int get ()
 
istreamget (char &ch)
 
istreamget (char *str, streamsize n, char delim= '\n')
 
istreamgetline (char *str, streamsize count, char delim= '\n')
 
bool good () const
 
istreamignore (streamsize n=1, int delim=-1)
 
 operator const void * () const
 
bool operator! () const
 
ostreamoperator<< (ostream &(*pf)(ostream &str))
 
ostreamoperator<< (ios_base &(*pf)(ios_base &str))
 
ostreamoperator<< (bool arg)
 
ostreamoperator<< (const char *arg)
 
ostreamoperator<< (const signed char *arg)
 
ostreamoperator<< (const unsigned char *arg)
 
ostreamoperator<< (char arg)
 
ostreamoperator<< (signed char arg)
 
ostreamoperator<< (unsigned char arg)
 
ostreamoperator<< (double arg)
 
ostreamoperator<< (float arg)
 
ostreamoperator<< (short arg)
 
ostreamoperator<< (unsigned short arg)
 
ostreamoperator<< (int arg)
 
ostreamoperator<< (unsigned int arg)
 
ostreamoperator<< (long arg)
 
ostreamoperator<< (unsigned long arg)
 
ostreamoperator<< (const void *arg)
 
ostreamoperator<< (pgm arg)
 
ostreamoperator<< (const __FlashStringHelper *arg)
 
istreamoperator>> (istream &(*pf)(istream &str))
 
istreamoperator>> (ios_base &(*pf)(ios_base &str))
 
istreamoperator>> (ios &(*pf)(ios &str))
 
istreamoperator>> (char *str)
 
istreamoperator>> (char &ch)
 
istreamoperator>> (signed char *str)
 
istreamoperator>> (signed char &ch)
 
istreamoperator>> (unsigned char *str)
 
istreamoperator>> (unsigned char &ch)
 
istreamoperator>> (bool &arg)
 
istreamoperator>> (short &arg)
 
istreamoperator>> (unsigned short &arg)
 
istreamoperator>> (int &arg)
 
istreamoperator>> (unsigned int &arg)
 
istreamoperator>> (long &arg)
 
istreamoperator>> (unsigned long &arg)
 
istreamoperator>> (double &arg)
 
istreamoperator>> (float &arg)
 
istreamoperator>> (void *&arg)
 
int peek ()
 
int precision () const
 
int precision (unsigned int n)
 
ostreamput (char ch)
 
iostate rdstate () const
 
istreamseekg (pos_type pos)
 
istreamseekg (off_type off, seekdir way)
 
ostreamseekp (pos_type pos)
 
ostreamseekp (off_type off, seekdir way)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
void skipWhite ()
 
pos_type tellg ()
 
pos_type tellp ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
+ + + +

+Protected Member Functions

uint8_t flagsToBase ()
 
+

Detailed Description

+

Input/Output stream.

+

Member Typedef Documentation

+ +
+
+ + + + + +
+ + + + +
typedef unsigned int ios_base::fmtflags
+
+inherited
+
+

type for format flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef unsigned char ios_base::iostate
+
+inherited
+
+

typedef for iostate bitmask

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef int32_t ios_base::off_type
+
+inherited
+
+

type for relative seek offset

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint8_t ios_base::openmode
+
+inherited
+
+

typedef for iostream open mode

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::pos_type
+
+inherited
+
+

type for absolute seek position

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::streamsize
+
+inherited
+
+

unsigned size that can represent maximum file size. (violates spec - should be signed)

+ +
+
+

Member Enumeration Documentation

+ +
+
+ + + + + +
+ + + + +
enum ios_base::seekdir
+
+inherited
+
+

enumerated type for the direction of relative seeks

+ + + + +
Enumerator
beg  +

seek relative to the beginning of the stream

+
cur  +

seek relative to the current stream position

+
end  +

seek relative to the end of the stream

+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
bool ios::bad () const
+
+inlineinherited
+
+
Returns
true if bad bit is set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::clear (iostate state = goodbit)
+
+inlineinherited
+
+

Clear iostate bits.

+
Parameters
+ + +
[in]stateThe flags you want to set after clearing all flags.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::eof () const
+
+inlineinherited
+
+
Returns
true if end of file has been reached else false.
+

Warning: An empty file returns false before the first read.

+

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::fail () const
+
+inlineinherited
+
+
Returns
true if any iostate bit other than eof are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
char ios_base::fill ()
+
+inlineinherited
+
+
Returns
fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
char ios_base::fill (char c)
+
+inlineinherited
+
+

Set fill character

+
Parameters
+ + +
[in]cnew fill character
+
+
+
Returns
old fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
fmtflags ios_base::flags () const
+
+inlineinherited
+
+
Returns
format flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::flags (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flag
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t ios_base::flagsToBase ()
+
+inlineprotectedinherited
+
+
Returns
current number base
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ostream& ostream::flush ()
+
+inlineinherited
+
+

Flushes the buffer associated with this stream. The flush function calls the sync function of the associated file.

+
Returns
A reference to the ostream object.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
streamsize istream::gcount () const
+
+inlineinherited
+
+
Returns
The number of characters extracted by the last unformatted input function.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int istream::get ()
+
+inherited
+
+

Extract a character if one is available.

+
Returns
The character or -1 if a failure occurs. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream & istream::get (char & c)
+
+inherited
+
+

Extract a character if one is available.

+
Parameters
+ + +
[out]clocation to receive the extracted character.
+
+
+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
istream & istream::get (char * str,
streamsize n,
char delim = '\n' 
)
+
+inherited
+
+

Extract characters.

+
Parameters
+ + + + +
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
+
+
+

Characters are extracted until extraction fails, n is less than 1, n-1 characters are extracted, or the next character equals delim (delim is not extracted). If no characters are extracted failbit is set. If end-of-file occurs the eofbit is set.

+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
istream & istream::getline (char * str,
streamsize n,
char delim = '\n' 
)
+
+inherited
+
+

Extract characters

+
Parameters
+ + + + +
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
+
+
+

Characters are extracted until extraction fails, the next character equals delim (delim is extracted), or n-1 characters are extracted.

+

The failbit is set if no characters are extracted or n-1 characters are extracted. If end-of-file occurs the eofbit is set.

+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::good () const
+
+inlineinherited
+
+
Returns
True if no iostate flags are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
istream & istream::ignore (streamsize n = 1,
int delim = -1 
)
+
+inherited
+
+

Extract characters and discard them.

+
Parameters
+ + + +
[in]nmaximum number of characters to ignore.
[in]delimDelimiter.
+
+
+

Characters are extracted until extraction fails, n characters are extracted, or the next input character equals delim (the delimiter is extracted). If end-of-file occurs the eofbit is set.

+

Failures are indicated by the state of the stream.

+
Returns
*this
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ios::operator const void * () const
+
+inlineinherited
+
+
Returns
null pointer if fail() is true.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::operator! () const
+
+inlineinherited
+
+
Returns
true if fail() else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (ostream &(*)(ostream &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (ios_base &(*)(ios_base &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (bool arg)
+
+inlineinherited
+
+

Output bool

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const char * arg)
+
+inlineinherited
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const signed char * arg)
+
+inlineinherited
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const unsigned char * arg)
+
+inlineinherited
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (char arg)
+
+inlineinherited
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (signed char arg)
+
+inlineinherited
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned char arg)
+
+inlineinherited
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (double arg)
+
+inlineinherited
+
+

Output double

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (float arg)
+
+inlineinherited
+
+

Output float

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (short arg)
+
+inlineinherited
+
+

Output signed short

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned short arg)
+
+inlineinherited
+
+

Output unsigned short

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (int arg)
+
+inlineinherited
+
+

Output signed int

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned int arg)
+
+inlineinherited
+
+

Output unsigned int

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (long arg)
+
+inlineinherited
+
+

Output signed long

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned long arg)
+
+inlineinherited
+
+

Output unsigned long

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const void * arg)
+
+inlineinherited
+
+

Output pointer

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (pgm arg)
+
+inlineinherited
+
+

Output a string from flash using the pstr() macro

+
Parameters
+ + +
[in]argpgm struct pointing to string
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const __FlashStringHelper * arg)
+
+inlineinherited
+
+

Output a string from flash using the Arduino F() macro.

+
Parameters
+ + +
[in]argpointing to flash string
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (istream &(*)(istream &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (ios_base &(*)(ios_base &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (ios &(*)(ios &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (char * str)
+
+inlineinherited
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (char & ch)
+
+inlineinherited
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (signed char * str)
+
+inlineinherited
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (signed char & ch)
+
+inlineinherited
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned char * str)
+
+inlineinherited
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned char & ch)
+
+inlineinherited
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (bool & arg)
+
+inlineinherited
+
+

Extract a value of type bool.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (short & arg)
+
+inlineinherited
+
+

Extract a value of type short.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned short & arg)
+
+inlineinherited
+
+

Extract a value of type unsigned short.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (int & arg)
+
+inlineinherited
+
+

Extract a value of type int.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned int & arg)
+
+inlineinherited
+
+

Extract a value of type unsigned int.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (long & arg)
+
+inlineinherited
+
+

Extract a value of type long.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned long & arg)
+
+inlineinherited
+
+

Extract a value of type unsigned long.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (double & arg)
+
+inlineinherited
+
+

Extract a value of type double.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (float & arg)
+
+inlineinherited
+
+

Extract a value of type float.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (void *& arg)
+
+inlineinherited
+
+

Extract a value of type void*.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int istream::peek ()
+
+inherited
+
+

Return the next available character without consuming it.

+
Returns
The character if the stream state is good else -1;
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int ios_base::precision () const
+
+inlineinherited
+
+
Returns
precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int ios_base::precision (unsigned int n)
+
+inlineinherited
+
+

set precision

+
Parameters
+ + +
[in]nnew precision
+
+
+
Returns
old precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::put (char ch)
+
+inlineinherited
+
+

Puts a character in a stream.

+

The unformatted output function inserts the element ch. It returns *this.

+
Parameters
+ + +
[in]chThe character
+
+
+
Returns
A reference to the ostream object.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
iostate ios::rdstate () const
+
+inlineinherited
+
+
Returns
The iostate flags for this file.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::seekg (pos_type pos)
+
+inlineinherited
+
+

Set the stream position

+
Parameters
+ + +
[in]posThe absolute position in which to move the read pointer.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
istream& istream::seekg (off_type off,
seekdir way 
)
+
+inlineinherited
+
+

Set the stream position.

+
Parameters
+ + + +
[in]offAn offset to move the read pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::seekp (pos_type pos)
+
+inlineinherited
+
+

Set the stream position

+
Parameters
+ + +
[in]posThe absolute position in which to move the write pointer.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
ostream& ostream::seekp (off_type off,
seekdir way 
)
+
+inlineinherited
+
+

Set the stream position.

+
Parameters
+ + + +
[in]offAn offset to move the write pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::setf (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flags to be or'ed in
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
+
+inlineinherited
+
+

modify format flags

+
Parameters
+ + + +
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::setstate (iostate state)
+
+inlineinherited
+
+

Set iostate bits.

+
Parameters
+ + +
[in]stateBitts to set.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void istream::skipWhite ()
+
+inherited
+
+

used to implement ws()

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
pos_type istream::tellg ()
+
+inlineinherited
+
+
Returns
the stream position
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
pos_type ostream::tellp ()
+
+inlineinherited
+
+
Returns
the stream position
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios_base::unsetf (fmtflags fl)
+
+inlineinherited
+
+

clear format flags

+
Parameters
+ + +
[in]flflags to be cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
unsigned ios_base::width ()
+
+inlineinherited
+
+
Returns
width
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
unsigned ios_base::width (unsigned n)
+
+inlineinherited
+
+

set width

+
Parameters
+ + +
[in]nnew width
+
+
+
Returns
old width
+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::adjustfield = left | right | internal
+
+staticinherited
+
+

mask for adjustfield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::app = 0X4
+
+staticinherited
+
+

seek to end before each write

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::ate = 0X8
+
+staticinherited
+
+

open and seek to end immediately after opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::badbit = 0X01
+
+staticinherited
+
+

iostate bad bit for a nonrecoverable error.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::basefield = dec | hex | oct
+
+staticinherited
+
+

mask for basefield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::binary = 0X10
+
+staticinherited
+
+

perform input and output in binary mode (as opposed to text mode)

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::boolalpha = 0x0100
+
+staticinherited
+
+

use strings true/false for bool

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::dec = 0x0008
+
+staticinherited
+
+

base 10 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::eofbit = 0x02
+
+staticinherited
+
+

iostate bit for end of file reached

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::failbit = 0X04
+
+staticinherited
+
+

iostate fail bit for nonfatal error

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::goodbit = 0x00
+
+staticinherited
+
+

iostate for no flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::hex = 0x0010
+
+staticinherited
+
+

base 16 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::in = 0X20
+
+staticinherited
+
+

open for input

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::internal = 0x0004
+
+staticinherited
+
+

fill between sign/base prefix and number

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::left = 0x0001
+
+staticinherited
+
+

left adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::oct = 0x0020
+
+staticinherited
+
+

base 8 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::out = 0X40
+
+staticinherited
+
+

open for output

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::right = 0x0002
+
+staticinherited
+
+

right adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showbase = 0x0200
+
+staticinherited
+
+

use prefix 0X for hex and 0 for oct

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpoint = 0x0400
+
+staticinherited
+
+

always show '.' for floating numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpos = 0x0800
+
+staticinherited
+
+

show + sign for nonnegative numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::skipws = 0x1000
+
+staticinherited
+
+

skip initial white space

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::trunc = 0X80
+
+staticinherited
+
+

truncate an existing stream when opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::uppercase = 0x4000
+
+staticinherited
+
+

use uppercase letters in number representations

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/html/classiostream__coll__graph.png b/html/classiostream__coll__graph.png new file mode 100644 index 0000000..0b89531 Binary files /dev/null and b/html/classiostream__coll__graph.png differ diff --git a/html/classiostream__inherit__graph.png b/html/classiostream__inherit__graph.png new file mode 100644 index 0000000..2986dd9 Binary files /dev/null and b/html/classiostream__inherit__graph.png differ diff --git a/html/classistream-members.html b/html/classistream-members.html new file mode 100644 index 0000000..7f5b7f7 --- /dev/null +++ b/html/classistream-members.html @@ -0,0 +1,149 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
istream Member List
+
+
+ +

This is the complete list of members for istream, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
bad() const iosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() const iosinline
eofbitios_basestatic
fail() const iosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() const ios_baseinline
flags(fmtflags fl)ios_baseinline
flagsToBase()ios_baseinlineprotected
fmtflags typedefios_base
gcount() const istreaminline
get()istream
get(char &ch)istream
get(char *str, streamsize n, char delim= '\n')istream
getline(char *str, streamsize count, char delim= '\n')istream
good() const iosinline
goodbitios_basestatic
hexios_basestatic
ignore(streamsize n=1, int delim=-1)istream
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base()ios_baseinline
iostate typedefios_base
istream()istreaminline
leftios_basestatic
octios_basestatic
off_type typedefios_base
openmode typedefios_base
operator const void *() const iosinline
operator!() const iosinline
operator>>(istream &(*pf)(istream &str))istreaminline
operator>>(ios_base &(*pf)(ios_base &str))istreaminline
operator>>(ios &(*pf)(ios &str))istreaminline
operator>>(char *str)istreaminline
operator>>(char &ch)istreaminline
operator>>(signed char *str)istreaminline
operator>>(signed char &ch)istreaminline
operator>>(unsigned char *str)istreaminline
operator>>(unsigned char &ch)istreaminline
operator>>(bool &arg)istreaminline
operator>>(short &arg)istreaminline
operator>>(unsigned short &arg)istreaminline
operator>>(int &arg)istreaminline
operator>>(unsigned int &arg)istreaminline
operator>>(long &arg)istreaminline
operator>>(unsigned long &arg)istreaminline
operator>>(double &arg)istreaminline
operator>>(float &arg)istreaminline
operator>>(void *&arg)istreaminline
outios_basestatic
peek()istream
pos_type typedefios_base
precision() const ios_baseinline
precision(unsigned int n)ios_baseinline
rdstate() const iosinline
rightios_basestatic
seekdir enum nameios_base
seekg(pos_type pos)istreaminline
seekg(off_type off, seekdir way)istreaminline
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipWhite()istream
skipwsios_basestatic
streamsize typedefios_base
tellg()istreaminline
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
+ + + + diff --git a/html/classistream.html b/html/classistream.html new file mode 100644 index 0000000..03b88e3 --- /dev/null +++ b/html/classistream.html @@ -0,0 +1,2477 @@ + + + + + + +SdFat: istream Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

Input Stream. + More...

+ +

#include <istream.h>

+
+Inheritance diagram for istream:
+
+
Inheritance graph
+ + +
[legend]
+
+Collaboration diagram for istream:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + +

+Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, +cur, +end + }
 
typedef uint32_t streamsize
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
streamsize gcount () const
 
int get ()
 
istreamget (char &ch)
 
istreamget (char *str, streamsize n, char delim= '\n')
 
istreamgetline (char *str, streamsize count, char delim= '\n')
 
bool good () const
 
istreamignore (streamsize n=1, int delim=-1)
 
 istream ()
 
 operator const void * () const
 
bool operator! () const
 
istreamoperator>> (istream &(*pf)(istream &str))
 
istreamoperator>> (ios_base &(*pf)(ios_base &str))
 
istreamoperator>> (ios &(*pf)(ios &str))
 
istreamoperator>> (char *str)
 
istreamoperator>> (char &ch)
 
istreamoperator>> (signed char *str)
 
istreamoperator>> (signed char &ch)
 
istreamoperator>> (unsigned char *str)
 
istreamoperator>> (unsigned char &ch)
 
istreamoperator>> (bool &arg)
 
istreamoperator>> (short &arg)
 
istreamoperator>> (unsigned short &arg)
 
istreamoperator>> (int &arg)
 
istreamoperator>> (unsigned int &arg)
 
istreamoperator>> (long &arg)
 
istreamoperator>> (unsigned long &arg)
 
istreamoperator>> (double &arg)
 
istreamoperator>> (float &arg)
 
istreamoperator>> (void *&arg)
 
int peek ()
 
int precision () const
 
int precision (unsigned int n)
 
iostate rdstate () const
 
istreamseekg (pos_type pos)
 
istreamseekg (off_type off, seekdir way)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
void skipWhite ()
 
pos_type tellg ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
+ + + +

+Protected Member Functions

uint8_t flagsToBase ()
 
+

Detailed Description

+

Input Stream.

+

Member Typedef Documentation

+ +
+
+ + + + + +
+ + + + +
typedef unsigned int ios_base::fmtflags
+
+inherited
+
+

type for format flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef unsigned char ios_base::iostate
+
+inherited
+
+

typedef for iostate bitmask

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef int32_t ios_base::off_type
+
+inherited
+
+

type for relative seek offset

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint8_t ios_base::openmode
+
+inherited
+
+

typedef for iostream open mode

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::pos_type
+
+inherited
+
+

type for absolute seek position

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::streamsize
+
+inherited
+
+

unsigned size that can represent maximum file size. (violates spec - should be signed)

+ +
+
+

Member Enumeration Documentation

+ +
+
+ + + + + +
+ + + + +
enum ios_base::seekdir
+
+inherited
+
+

enumerated type for the direction of relative seeks

+ + + + +
Enumerator
beg  +

seek relative to the beginning of the stream

+
cur  +

seek relative to the current stream position

+
end  +

seek relative to the end of the stream

+
+ +
+
+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + +
istream::istream ()
+
+inline
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
bool ios::bad () const
+
+inlineinherited
+
+
Returns
true if bad bit is set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::clear (iostate state = goodbit)
+
+inlineinherited
+
+

Clear iostate bits.

+
Parameters
+ + +
[in]stateThe flags you want to set after clearing all flags.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::eof () const
+
+inlineinherited
+
+
Returns
true if end of file has been reached else false.
+

Warning: An empty file returns false before the first read.

+

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::fail () const
+
+inlineinherited
+
+
Returns
true if any iostate bit other than eof are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
char ios_base::fill ()
+
+inlineinherited
+
+
Returns
fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
char ios_base::fill (char c)
+
+inlineinherited
+
+

Set fill character

+
Parameters
+ + +
[in]cnew fill character
+
+
+
Returns
old fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
fmtflags ios_base::flags () const
+
+inlineinherited
+
+
Returns
format flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::flags (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flag
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t ios_base::flagsToBase ()
+
+inlineprotectedinherited
+
+
Returns
current number base
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
streamsize istream::gcount () const
+
+inline
+
+
Returns
The number of characters extracted by the last unformatted input function.
+ +
+
+ +
+
+ + + + + + + +
int istream::get ()
+
+

Extract a character if one is available.

+
Returns
The character or -1 if a failure occurs. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + + + + +
istream & istream::get (char & c)
+
+

Extract a character if one is available.

+
Parameters
+ + +
[out]clocation to receive the extracted character.
+
+
+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
istream & istream::get (char * str,
streamsize n,
char delim = '\n' 
)
+
+

Extract characters.

+
Parameters
+ + + + +
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
+
+
+

Characters are extracted until extraction fails, n is less than 1, n-1 characters are extracted, or the next character equals delim (delim is not extracted). If no characters are extracted failbit is set. If end-of-file occurs the eofbit is set.

+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
istream & istream::getline (char * str,
streamsize n,
char delim = '\n' 
)
+
+

Extract characters

+
Parameters
+ + + + +
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
+
+
+

Characters are extracted until extraction fails, the next character equals delim (delim is extracted), or n-1 characters are extracted.

+

The failbit is set if no characters are extracted or n-1 characters are extracted. If end-of-file occurs the eofbit is set.

+
Returns
always returns *this. A failure is indicated by the stream state.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::good () const
+
+inlineinherited
+
+
Returns
True if no iostate flags are set else false.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
istream & istream::ignore (streamsize n = 1,
int delim = -1 
)
+
+

Extract characters and discard them.

+
Parameters
+ + + +
[in]nmaximum number of characters to ignore.
[in]delimDelimiter.
+
+
+

Characters are extracted until extraction fails, n characters are extracted, or the next input character equals delim (the delimiter is extracted). If end-of-file occurs the eofbit is set.

+

Failures are indicated by the state of the stream.

+
Returns
*this
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ios::operator const void * () const
+
+inlineinherited
+
+
Returns
null pointer if fail() is true.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::operator! () const
+
+inlineinherited
+
+
Returns
true if fail() else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (istream &(*)(istream &str) pf)
+
+inline
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (ios_base &(*)(ios_base &str) pf)
+
+inline
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (ios &(*)(ios &str) pf)
+
+inline
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (char * str)
+
+inline
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (char & ch)
+
+inline
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (signed char * str)
+
+inline
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (signed char & ch)
+
+inline
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned char * str)
+
+inline
+
+

Extract a character string

+
Parameters
+ + +
[out]strlocation to store the string.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned char & ch)
+
+inline
+
+

Extract a character

+
Parameters
+ + +
[out]chlocation to store the character.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (bool & arg)
+
+inline
+
+

Extract a value of type bool.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (short & arg)
+
+inline
+
+

Extract a value of type short.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned short & arg)
+
+inline
+
+

Extract a value of type unsigned short.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (int & arg)
+
+inline
+
+

Extract a value of type int.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned int & arg)
+
+inline
+
+

Extract a value of type unsigned int.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (long & arg)
+
+inline
+
+

Extract a value of type long.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (unsigned long & arg)
+
+inline
+
+

Extract a value of type unsigned long.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (double & arg)
+
+inline
+
+

Extract a value of type double.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (float & arg)
+
+inline
+
+

Extract a value of type float.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::operator>> (void *& arg)
+
+inline
+
+

Extract a value of type void*.

+
Parameters
+ + +
[out]arglocation to store the value.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + + + +
int istream::peek ()
+
+

Return the next available character without consuming it.

+
Returns
The character if the stream state is good else -1;
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int ios_base::precision () const
+
+inlineinherited
+
+
Returns
precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int ios_base::precision (unsigned int n)
+
+inlineinherited
+
+

set precision

+
Parameters
+ + +
[in]nnew precision
+
+
+
Returns
old precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
iostate ios::rdstate () const
+
+inlineinherited
+
+
Returns
The iostate flags for this file.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& istream::seekg (pos_type pos)
+
+inline
+
+

Set the stream position

+
Parameters
+ + +
[in]posThe absolute position in which to move the read pointer.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
istream& istream::seekg (off_type off,
seekdir way 
)
+
+inline
+
+

Set the stream position.

+
Parameters
+ + + +
[in]offAn offset to move the read pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::setf (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flags to be or'ed in
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
+
+inlineinherited
+
+

modify format flags

+
Parameters
+ + + +
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::setstate (iostate state)
+
+inlineinherited
+
+

Set iostate bits.

+
Parameters
+ + +
[in]stateBitts to set.
+
+
+ +
+
+ +
+
+ + + + + + + +
void istream::skipWhite ()
+
+

used to implement ws()

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
pos_type istream::tellg ()
+
+inline
+
+
Returns
the stream position
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios_base::unsetf (fmtflags fl)
+
+inlineinherited
+
+

clear format flags

+
Parameters
+ + +
[in]flflags to be cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
unsigned ios_base::width ()
+
+inlineinherited
+
+
Returns
width
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
unsigned ios_base::width (unsigned n)
+
+inlineinherited
+
+

set width

+
Parameters
+ + +
[in]nnew width
+
+
+
Returns
old width
+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::adjustfield = left | right | internal
+
+staticinherited
+
+

mask for adjustfield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::app = 0X4
+
+staticinherited
+
+

seek to end before each write

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::ate = 0X8
+
+staticinherited
+
+

open and seek to end immediately after opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::badbit = 0X01
+
+staticinherited
+
+

iostate bad bit for a nonrecoverable error.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::basefield = dec | hex | oct
+
+staticinherited
+
+

mask for basefield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::binary = 0X10
+
+staticinherited
+
+

perform input and output in binary mode (as opposed to text mode)

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::boolalpha = 0x0100
+
+staticinherited
+
+

use strings true/false for bool

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::dec = 0x0008
+
+staticinherited
+
+

base 10 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::eofbit = 0x02
+
+staticinherited
+
+

iostate bit for end of file reached

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::failbit = 0X04
+
+staticinherited
+
+

iostate fail bit for nonfatal error

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::goodbit = 0x00
+
+staticinherited
+
+

iostate for no flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::hex = 0x0010
+
+staticinherited
+
+

base 16 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::in = 0X20
+
+staticinherited
+
+

open for input

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::internal = 0x0004
+
+staticinherited
+
+

fill between sign/base prefix and number

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::left = 0x0001
+
+staticinherited
+
+

left adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::oct = 0x0020
+
+staticinherited
+
+

base 8 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::out = 0X40
+
+staticinherited
+
+

open for output

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::right = 0x0002
+
+staticinherited
+
+

right adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showbase = 0x0200
+
+staticinherited
+
+

use prefix 0X for hex and 0 for oct

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpoint = 0x0400
+
+staticinherited
+
+

always show '.' for floating numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpos = 0x0800
+
+staticinherited
+
+

show + sign for nonnegative numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::skipws = 0x1000
+
+staticinherited
+
+

skip initial white space

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::trunc = 0X80
+
+staticinherited
+
+

truncate an existing stream when opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::uppercase = 0x4000
+
+staticinherited
+
+

use uppercase letters in number representations

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/html/classistream__coll__graph.png b/html/classistream__coll__graph.png new file mode 100644 index 0000000..b332637 Binary files /dev/null and b/html/classistream__coll__graph.png differ diff --git a/html/classistream__inherit__graph.png b/html/classistream__inherit__graph.png new file mode 100644 index 0000000..56f088c Binary files /dev/null and b/html/classistream__inherit__graph.png differ diff --git a/html/classobufstream-members.html b/html/classobufstream-members.html new file mode 100644 index 0000000..4a62947 --- /dev/null +++ b/html/classobufstream-members.html @@ -0,0 +1,149 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
obufstream Member List
+
+
+ +

This is the complete list of members for obufstream, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
bad() const iosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
buf()obufstreaminline
clear(iostate state=goodbit)iosinline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() const iosinline
eofbitios_basestatic
fail() const iosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() const ios_baseinline
flags(fmtflags fl)ios_baseinline
flagsToBase()ios_baseinlineprotected
flush()ostreaminline
fmtflags typedefios_base
good() const iosinline
goodbitios_basestatic
hexios_basestatic
inios_basestatic
init(char *buf, size_t size)obufstreaminline
internalios_basestatic
ios()iosinline
ios_base()ios_baseinline
iostate typedefios_base
leftios_basestatic
length()obufstreaminline
obufstream()obufstreaminline
obufstream(char *buf, size_t size)obufstreaminline
octios_basestatic
off_type typedefios_base
openmode typedefios_base
operator const void *() const iosinline
operator!() const iosinline
operator<<(ostream &(*pf)(ostream &str))ostreaminline
operator<<(ios_base &(*pf)(ios_base &str))ostreaminline
operator<<(bool arg)ostreaminline
operator<<(const char *arg)ostreaminline
operator<<(const signed char *arg)ostreaminline
operator<<(const unsigned char *arg)ostreaminline
operator<<(char arg)ostreaminline
operator<<(signed char arg)ostreaminline
operator<<(unsigned char arg)ostreaminline
operator<<(double arg)ostreaminline
operator<<(float arg)ostreaminline
operator<<(short arg)ostreaminline
operator<<(unsigned short arg)ostreaminline
operator<<(int arg)ostreaminline
operator<<(unsigned int arg)ostreaminline
operator<<(long arg)ostreaminline
operator<<(unsigned long arg)ostreaminline
operator<<(const void *arg)ostreaminline
operator<<(pgm arg)ostreaminline
operator<<(const __FlashStringHelper *arg)ostreaminline
ostream()ostreaminline
outios_basestatic
pos_type typedefios_base
precision() const ios_baseinline
precision(unsigned int n)ios_baseinline
put(char ch)ostreaminline
rdstate() const iosinline
rightios_basestatic
seekdir enum nameios_base
seekp(pos_type pos)ostreaminline
seekp(off_type off, seekdir way)ostreaminline
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipwsios_basestatic
streamsize typedefios_base
tellp()ostreaminline
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
+ + + + diff --git a/html/classobufstream.html b/html/classobufstream.html new file mode 100644 index 0000000..ff5f201 --- /dev/null +++ b/html/classobufstream.html @@ -0,0 +1,2475 @@ + + + + + + +SdFat: obufstream Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

format a char string + More...

+ +

#include <bufstream.h>

+
+Inheritance diagram for obufstream:
+
+
Inheritance graph
+ + +
[legend]
+
+Collaboration diagram for obufstream:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + +

+Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, +cur, +end + }
 
typedef uint32_t streamsize
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

bool bad () const
 
char * buf ()
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
ostreamflush ()
 
bool good () const
 
void init (char *buf, size_t size)
 
size_t length ()
 
 obufstream ()
 
 obufstream (char *buf, size_t size)
 
 operator const void * () const
 
bool operator! () const
 
ostreamoperator<< (ostream &(*pf)(ostream &str))
 
ostreamoperator<< (ios_base &(*pf)(ios_base &str))
 
ostreamoperator<< (bool arg)
 
ostreamoperator<< (const char *arg)
 
ostreamoperator<< (const signed char *arg)
 
ostreamoperator<< (const unsigned char *arg)
 
ostreamoperator<< (char arg)
 
ostreamoperator<< (signed char arg)
 
ostreamoperator<< (unsigned char arg)
 
ostreamoperator<< (double arg)
 
ostreamoperator<< (float arg)
 
ostreamoperator<< (short arg)
 
ostreamoperator<< (unsigned short arg)
 
ostreamoperator<< (int arg)
 
ostreamoperator<< (unsigned int arg)
 
ostreamoperator<< (long arg)
 
ostreamoperator<< (unsigned long arg)
 
ostreamoperator<< (const void *arg)
 
ostreamoperator<< (pgm arg)
 
ostreamoperator<< (const __FlashStringHelper *arg)
 
int precision () const
 
int precision (unsigned int n)
 
ostreamput (char ch)
 
iostate rdstate () const
 
ostreamseekp (pos_type pos)
 
ostreamseekp (off_type off, seekdir way)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
pos_type tellp ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
+ + + +

+Protected Member Functions

uint8_t flagsToBase ()
 
+

Detailed Description

+

format a char string

+

Member Typedef Documentation

+ +
+
+ + + + + +
+ + + + +
typedef unsigned int ios_base::fmtflags
+
+inherited
+
+

type for format flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef unsigned char ios_base::iostate
+
+inherited
+
+

typedef for iostate bitmask

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef int32_t ios_base::off_type
+
+inherited
+
+

type for relative seek offset

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint8_t ios_base::openmode
+
+inherited
+
+

typedef for iostream open mode

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::pos_type
+
+inherited
+
+

type for absolute seek position

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::streamsize
+
+inherited
+
+

unsigned size that can represent maximum file size. (violates spec - should be signed)

+ +
+
+

Member Enumeration Documentation

+ +
+
+ + + + + +
+ + + + +
enum ios_base::seekdir
+
+inherited
+
+

enumerated type for the direction of relative seeks

+ + + + +
Enumerator
beg  +

seek relative to the beginning of the stream

+
cur  +

seek relative to the current stream position

+
end  +

seek relative to the end of the stream

+
+ +
+
+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + +
obufstream::obufstream ()
+
+inline
+
+

constructor

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
obufstream::obufstream (char * buf,
size_t size 
)
+
+inline
+
+

Constructor

+
Parameters
+ + + +
[in]bufbuffer for formatted string
[in]sizebuffer size
+
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
bool ios::bad () const
+
+inlineinherited
+
+
Returns
true if bad bit is set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
char* obufstream::buf ()
+
+inline
+
+
Returns
a pointer to the buffer
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::clear (iostate state = goodbit)
+
+inlineinherited
+
+

Clear iostate bits.

+
Parameters
+ + +
[in]stateThe flags you want to set after clearing all flags.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::eof () const
+
+inlineinherited
+
+
Returns
true if end of file has been reached else false.
+

Warning: An empty file returns false before the first read.

+

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::fail () const
+
+inlineinherited
+
+
Returns
true if any iostate bit other than eof are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
char ios_base::fill ()
+
+inlineinherited
+
+
Returns
fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
char ios_base::fill (char c)
+
+inlineinherited
+
+

Set fill character

+
Parameters
+ + +
[in]cnew fill character
+
+
+
Returns
old fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
fmtflags ios_base::flags () const
+
+inlineinherited
+
+
Returns
format flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::flags (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flag
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t ios_base::flagsToBase ()
+
+inlineprotectedinherited
+
+
Returns
current number base
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ostream& ostream::flush ()
+
+inlineinherited
+
+

Flushes the buffer associated with this stream. The flush function calls the sync function of the associated file.

+
Returns
A reference to the ostream object.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::good () const
+
+inlineinherited
+
+
Returns
True if no iostate flags are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void obufstream::init (char * buf,
size_t size 
)
+
+inline
+
+

Initialize an obufstream

+
Parameters
+ + + +
[in]bufbuffer for formatted string
[in]sizebuffer size
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
size_t obufstream::length ()
+
+inline
+
+
Returns
the length of the formatted string
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ios::operator const void * () const
+
+inlineinherited
+
+
Returns
null pointer if fail() is true.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::operator! () const
+
+inlineinherited
+
+
Returns
true if fail() else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (ostream &(*)(ostream &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (ios_base &(*)(ios_base &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (bool arg)
+
+inlineinherited
+
+

Output bool

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const char * arg)
+
+inlineinherited
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const signed char * arg)
+
+inlineinherited
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const unsigned char * arg)
+
+inlineinherited
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (char arg)
+
+inlineinherited
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (signed char arg)
+
+inlineinherited
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned char arg)
+
+inlineinherited
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (double arg)
+
+inlineinherited
+
+

Output double

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (float arg)
+
+inlineinherited
+
+

Output float

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (short arg)
+
+inlineinherited
+
+

Output signed short

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned short arg)
+
+inlineinherited
+
+

Output unsigned short

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (int arg)
+
+inlineinherited
+
+

Output signed int

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned int arg)
+
+inlineinherited
+
+

Output unsigned int

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (long arg)
+
+inlineinherited
+
+

Output signed long

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned long arg)
+
+inlineinherited
+
+

Output unsigned long

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const void * arg)
+
+inlineinherited
+
+

Output pointer

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (pgm arg)
+
+inlineinherited
+
+

Output a string from flash using the pstr() macro

+
Parameters
+ + +
[in]argpgm struct pointing to string
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const __FlashStringHelper * arg)
+
+inlineinherited
+
+

Output a string from flash using the Arduino F() macro.

+
Parameters
+ + +
[in]argpointing to flash string
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int ios_base::precision () const
+
+inlineinherited
+
+
Returns
precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int ios_base::precision (unsigned int n)
+
+inlineinherited
+
+

set precision

+
Parameters
+ + +
[in]nnew precision
+
+
+
Returns
old precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::put (char ch)
+
+inlineinherited
+
+

Puts a character in a stream.

+

The unformatted output function inserts the element ch. It returns *this.

+
Parameters
+ + +
[in]chThe character
+
+
+
Returns
A reference to the ostream object.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
iostate ios::rdstate () const
+
+inlineinherited
+
+
Returns
The iostate flags for this file.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::seekp (pos_type pos)
+
+inlineinherited
+
+

Set the stream position

+
Parameters
+ + +
[in]posThe absolute position in which to move the write pointer.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
ostream& ostream::seekp (off_type off,
seekdir way 
)
+
+inlineinherited
+
+

Set the stream position.

+
Parameters
+ + + +
[in]offAn offset to move the write pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::setf (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flags to be or'ed in
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
+
+inlineinherited
+
+

modify format flags

+
Parameters
+ + + +
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::setstate (iostate state)
+
+inlineinherited
+
+

Set iostate bits.

+
Parameters
+ + +
[in]stateBitts to set.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
pos_type ostream::tellp ()
+
+inlineinherited
+
+
Returns
the stream position
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios_base::unsetf (fmtflags fl)
+
+inlineinherited
+
+

clear format flags

+
Parameters
+ + +
[in]flflags to be cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
unsigned ios_base::width ()
+
+inlineinherited
+
+
Returns
width
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
unsigned ios_base::width (unsigned n)
+
+inlineinherited
+
+

set width

+
Parameters
+ + +
[in]nnew width
+
+
+
Returns
old width
+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::adjustfield = left | right | internal
+
+staticinherited
+
+

mask for adjustfield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::app = 0X4
+
+staticinherited
+
+

seek to end before each write

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::ate = 0X8
+
+staticinherited
+
+

open and seek to end immediately after opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::badbit = 0X01
+
+staticinherited
+
+

iostate bad bit for a nonrecoverable error.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::basefield = dec | hex | oct
+
+staticinherited
+
+

mask for basefield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::binary = 0X10
+
+staticinherited
+
+

perform input and output in binary mode (as opposed to text mode)

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::boolalpha = 0x0100
+
+staticinherited
+
+

use strings true/false for bool

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::dec = 0x0008
+
+staticinherited
+
+

base 10 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::eofbit = 0x02
+
+staticinherited
+
+

iostate bit for end of file reached

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::failbit = 0X04
+
+staticinherited
+
+

iostate fail bit for nonfatal error

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::goodbit = 0x00
+
+staticinherited
+
+

iostate for no flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::hex = 0x0010
+
+staticinherited
+
+

base 16 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::in = 0X20
+
+staticinherited
+
+

open for input

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::internal = 0x0004
+
+staticinherited
+
+

fill between sign/base prefix and number

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::left = 0x0001
+
+staticinherited
+
+

left adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::oct = 0x0020
+
+staticinherited
+
+

base 8 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::out = 0X40
+
+staticinherited
+
+

open for output

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::right = 0x0002
+
+staticinherited
+
+

right adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showbase = 0x0200
+
+staticinherited
+
+

use prefix 0X for hex and 0 for oct

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpoint = 0x0400
+
+staticinherited
+
+

always show '.' for floating numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpos = 0x0800
+
+staticinherited
+
+

show + sign for nonnegative numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::skipws = 0x1000
+
+staticinherited
+
+

skip initial white space

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::trunc = 0X80
+
+staticinherited
+
+

truncate an existing stream when opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::uppercase = 0x4000
+
+staticinherited
+
+

use uppercase letters in number representations

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/html/classobufstream__coll__graph.png b/html/classobufstream__coll__graph.png new file mode 100644 index 0000000..65fb372 Binary files /dev/null and b/html/classobufstream__coll__graph.png differ diff --git a/html/classobufstream__inherit__graph.png b/html/classobufstream__inherit__graph.png new file mode 100644 index 0000000..65fb372 Binary files /dev/null and b/html/classobufstream__inherit__graph.png differ diff --git a/html/classofstream-members.html b/html/classofstream-members.html new file mode 100644 index 0000000..d15fdfd --- /dev/null +++ b/html/classofstream-members.html @@ -0,0 +1,216 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
ofstream Member List
+
+
+ +

This is the complete list of members for ofstream, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
available()SdBaseFileinlineprivate
bad() const iosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)ofstreaminline
clearWriteError()SdBaseFileinlineprivate
close()ofstreaminline
contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock)SdBaseFileprivate
createContiguous(SdBaseFile *dirFile, const char *path, uint32_t size)SdBaseFileprivate
cur enum valueios_base
curCluster() const SdBaseFileinlineprivate
curPosition() const SdBaseFileinlineprivate
cwd()SdBaseFileinlineprivatestatic
dateTimeCallback(void(*dateTime)(uint16_t *date, uint16_t *time))SdBaseFileinlineprivatestatic
dateTimeCallbackCancel()SdBaseFileinlineprivatestatic
decios_basestatic
dirEntry(dir_t *dir)SdBaseFileprivate
dirName(const dir_t &dir, char *name)SdBaseFileprivatestatic
end enum valueios_base
eof() const iosinline
eofbitios_basestatic
exists(const char *name)SdBaseFileprivate
fail() const iosinline
failbitios_basestatic
fgets(char *str, int16_t num, char *delim=0)SdBaseFileprivate
fileSize() const SdBaseFileinlineprivate
fill()ios_baseinline
fill(char c)ios_baseinline
firstCluster() const SdBaseFileinlineprivate
flags() const ios_baseinline
flags(fmtflags fl)ios_baseinline
flagsToBase()ios_baseinlineprotected
flush()ostreaminline
fmtflags typedefios_base
getFilename(char *name)SdBaseFileprivate
getpos(FatPos_t *pos)SdBaseFileprivate
getWriteError()SdBaseFileinlineprivate
good() const iosinline
goodbitios_basestatic
hexios_basestatic
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base()ios_baseinline
iostate typedefios_base
is_open()ofstreaminline
isDir() const SdBaseFileinlineprivate
isFile() const SdBaseFileinlineprivate
isOpen() const SdBaseFileinlineprivate
isRoot() const SdBaseFileinlineprivate
isSubDir() const SdBaseFileinlineprivate
leftios_basestatic
ls(Print *pr, uint8_t flags=0, uint8_t indent=0)SdBaseFileprivate
ls(uint8_t flags=0)SdBaseFileprivate
mkdir(SdBaseFile *dir, const char *path, bool pFlag=true)SdBaseFileprivate
octios_basestatic
off_type typedefios_base
ofstream()ofstreaminline
ofstream(const char *path, ios::openmode mode=out)ofstreaminlineexplicit
open(const char *path, openmode mode=out)ofstreaminline
SdStreamBase::open(SdBaseFile *dirFile, uint16_t index, uint8_t oflag)SdBaseFileprivate
SdStreamBase::open(SdBaseFile *dirFile, const char *path, uint8_t oflag)SdBaseFileprivate
openmode typedefios_base
openNext(SdBaseFile *dirFile, uint8_t oflag)SdBaseFileprivate
openRoot(SdVolume *vol)SdBaseFileprivate
operator const void *() const iosinline
operator!() const iosinline
operator<<(ostream &(*pf)(ostream &str))ostreaminline
operator<<(ios_base &(*pf)(ios_base &str))ostreaminline
operator<<(bool arg)ostreaminline
operator<<(const char *arg)ostreaminline
operator<<(const signed char *arg)ostreaminline
operator<<(const unsigned char *arg)ostreaminline
operator<<(char arg)ostreaminline
operator<<(signed char arg)ostreaminline
operator<<(unsigned char arg)ostreaminline
operator<<(double arg)ostreaminline
operator<<(float arg)ostreaminline
operator<<(short arg)ostreaminline
operator<<(unsigned short arg)ostreaminline
operator<<(int arg)ostreaminline
operator<<(unsigned int arg)ostreaminline
operator<<(long arg)ostreaminline
operator<<(unsigned long arg)ostreaminline
operator<<(const void *arg)ostreaminline
operator<<(pgm arg)ostreaminline
operator<<(const __FlashStringHelper *arg)ostreaminline
ostream()ostreaminline
outios_basestatic
peek()SdBaseFileprivate
pos_type typedefios_base
precision() const ios_baseinline
precision(unsigned int n)ios_baseinline
printCreateDateTime(Print *pr)SdBaseFileprivate
printFatDate(uint16_t fatDate)SdBaseFileprivatestatic
printFatDate(Print *pr, uint16_t fatDate)SdBaseFileprivatestatic
printFatTime(uint16_t fatTime)SdBaseFileprivatestatic
printFatTime(Print *pr, uint16_t fatTime)SdBaseFileprivatestatic
printField(int16_t value, char term)SdBaseFileprivate
printField(uint16_t value, char term)SdBaseFileprivate
printField(int32_t value, char term)SdBaseFileprivate
printField(uint32_t value, char term)SdBaseFileprivate
printFileSize(Print *pr)SdBaseFileprivate
printModifyDateTime(Print *pr)SdBaseFileprivate
printName()SdBaseFileprivate
printName(Print *pr)SdBaseFileprivate
put(char ch)ostreaminline
rdstate() const iosinline
read()SdBaseFileprivate
read(void *buf, size_t nbyte)SdBaseFileprivate
readDir(dir_t *dir)SdBaseFileprivate
remove(SdBaseFile *dirFile, const char *path)SdBaseFileprivatestatic
remove()SdBaseFileprivate
rename(SdBaseFile *dirFile, const char *newPath)SdBaseFileprivate
rewind()SdBaseFileinlineprivate
rightios_basestatic
rmdir()SdBaseFileprivate
rmRfStar()SdBaseFileprivate
SdBaseFile()SdBaseFileinlineprivate
SdBaseFile(const char *path, uint8_t oflag)SdBaseFileprivate
seekCur(int32_t offset)SdBaseFileinlineprivate
seekdir enum nameios_base
seekEnd(int32_t offset=0)SdBaseFileinlineprivate
seekp(pos_type pos)ostreaminline
seekp(off_type off, seekdir way)ostreaminline
seekSet(uint32_t pos)SdBaseFileprivate
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setpos(FatPos_t *pos)SdBaseFileprivate
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipwsios_basestatic
streamsize typedefios_base
sync()SdBaseFileprivate
tellp()ostreaminline
timestamp(SdBaseFile *file)SdBaseFileprivate
timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)SdBaseFileprivate
truncios_basestatic
truncate(uint32_t size)SdBaseFileprivate
type() const SdBaseFileinlineprivate
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
volume() const SdBaseFileinlineprivate
width()ios_baseinline
width(unsigned n)ios_baseinline
write(const void *buf, size_t nbyte)SdBaseFileprivate
writeErrorSdBaseFileprivate
+ + + + diff --git a/html/classofstream.html b/html/classofstream.html new file mode 100644 index 0000000..75bf0d7 --- /dev/null +++ b/html/classofstream.html @@ -0,0 +1,2617 @@ + + + + + + +SdFat: ofstream Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

SD card output stream. + More...

+ +

#include <SdStream.h>

+
+Inheritance diagram for ofstream:
+
+
Inheritance graph
+ + +
[legend]
+
+Collaboration diagram for ofstream:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + +

+Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, +cur, +end + }
 
typedef uint32_t streamsize
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
void close ()
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
ostreamflush ()
 
bool good () const
 
bool is_open ()
 
 ofstream ()
 
 ofstream (const char *path, ios::openmode mode=out)
 
void open (const char *path, openmode mode=out)
 
 operator const void * () const
 
bool operator! () const
 
ostreamoperator<< (ostream &(*pf)(ostream &str))
 
ostreamoperator<< (ios_base &(*pf)(ios_base &str))
 
ostreamoperator<< (bool arg)
 
ostreamoperator<< (const char *arg)
 
ostreamoperator<< (const signed char *arg)
 
ostreamoperator<< (const unsigned char *arg)
 
ostreamoperator<< (char arg)
 
ostreamoperator<< (signed char arg)
 
ostreamoperator<< (unsigned char arg)
 
ostreamoperator<< (double arg)
 
ostreamoperator<< (float arg)
 
ostreamoperator<< (short arg)
 
ostreamoperator<< (unsigned short arg)
 
ostreamoperator<< (int arg)
 
ostreamoperator<< (unsigned int arg)
 
ostreamoperator<< (long arg)
 
ostreamoperator<< (unsigned long arg)
 
ostreamoperator<< (const void *arg)
 
ostreamoperator<< (pgm arg)
 
ostreamoperator<< (const __FlashStringHelper *arg)
 
int precision () const
 
int precision (unsigned int n)
 
ostreamput (char ch)
 
iostate rdstate () const
 
ostreamseekp (pos_type pos)
 
ostreamseekp (off_type off, seekdir way)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
pos_type tellp ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
+ + + +

+Protected Member Functions

uint8_t flagsToBase ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Member Functions

uint32_t available ()
 
void clearWriteError ()
 
bool contiguousRange (uint32_t *bgnBlock, uint32_t *endBlock)
 
bool createContiguous (SdBaseFile *dirFile, const char *path, uint32_t size)
 
uint32_t curCluster () const
 
uint32_t curPosition () const
 
bool dirEntry (dir_t *dir)
 
bool exists (const char *name)
 
int16_t fgets (char *str, int16_t num, char *delim=0)
 
uint32_t fileSize () const
 
uint32_t firstCluster () const
 
bool getFilename (char *name)
 
void getpos (FatPos_t *pos)
 
bool getWriteError ()
 
bool isDir () const
 
bool isFile () const
 
bool isOpen () const
 
bool isRoot () const
 
bool isSubDir () const
 
void ls (Print *pr, uint8_t flags=0, uint8_t indent=0)
 
void ls (uint8_t flags=0)
 
bool mkdir (SdBaseFile *dir, const char *path, bool pFlag=true)
 
bool open (SdBaseFile *dirFile, uint16_t index, uint8_t oflag)
 
bool open (SdBaseFile *dirFile, const char *path, uint8_t oflag)
 
bool openNext (SdBaseFile *dirFile, uint8_t oflag)
 
bool openRoot (SdVolume *vol)
 
int peek ()
 
bool printCreateDateTime (Print *pr)
 
int printField (int16_t value, char term)
 
int printField (uint16_t value, char term)
 
int printField (int32_t value, char term)
 
int printField (uint32_t value, char term)
 
size_t printFileSize (Print *pr)
 
bool printModifyDateTime (Print *pr)
 
size_t printName ()
 
size_t printName (Print *pr)
 
int16_t read ()
 
int read (void *buf, size_t nbyte)
 
int8_t readDir (dir_t *dir)
 
bool remove ()
 
bool rename (SdBaseFile *dirFile, const char *newPath)
 
void rewind ()
 
bool rmdir ()
 
bool rmRfStar ()
 
bool seekCur (int32_t offset)
 
bool seekEnd (int32_t offset=0)
 
bool seekSet (uint32_t pos)
 
void setpos (FatPos_t *pos)
 
bool sync ()
 
bool timestamp (SdBaseFile *file)
 
bool timestamp (uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
 
bool truncate (uint32_t size)
 
uint8_t type () const
 
SdVolumevolume () const
 
int write (const void *buf, size_t nbyte)
 
+ + + + + + + + + + + + + + + + + + + +

+Static Private Member Functions

static SdBaseFilecwd ()
 
static void dateTimeCallback (void(*dateTime)(uint16_t *date, uint16_t *time))
 
static void dateTimeCallbackCancel ()
 
static void dirName (const dir_t &dir, char *name)
 
static void printFatDate (uint16_t fatDate)
 
static void printFatDate (Print *pr, uint16_t fatDate)
 
static void printFatTime (uint16_t fatTime)
 
static void printFatTime (Print *pr, uint16_t fatTime)
 
static bool remove (SdBaseFile *dirFile, const char *path)
 
+ + + +

+Private Attributes

bool writeError
 
+

Detailed Description

+

SD card output stream.

+

Member Typedef Documentation

+ +
+
+ + + + + +
+ + + + +
typedef unsigned int ios_base::fmtflags
+
+inherited
+
+

type for format flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef unsigned char ios_base::iostate
+
+inherited
+
+

typedef for iostate bitmask

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef int32_t ios_base::off_type
+
+inherited
+
+

type for relative seek offset

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint8_t ios_base::openmode
+
+inherited
+
+

typedef for iostream open mode

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::pos_type
+
+inherited
+
+

type for absolute seek position

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::streamsize
+
+inherited
+
+

unsigned size that can represent maximum file size. (violates spec - should be signed)

+ +
+
+

Member Enumeration Documentation

+ +
+
+ + + + + +
+ + + + +
enum ios_base::seekdir
+
+inherited
+
+

enumerated type for the direction of relative seeks

+ + + + +
Enumerator
beg  +

seek relative to the beginning of the stream

+
cur  +

seek relative to the current stream position

+
end  +

seek relative to the end of the stream

+
+ +
+
+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + +
ofstream::ofstream ()
+
+inline
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
ofstream::ofstream (const char * path,
ios::openmode mode = out 
)
+
+inlineexplicit
+
+

Constructor with open

+
Parameters
+ + + +
[in]pathfile to open
[in]modeopen mode
+
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
bool ios::bad () const
+
+inlineinherited
+
+
Returns
true if bad bit is set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ofstream::clear (iostate state = goodbit)
+
+inline
+
+

Clear state and writeError

+
Parameters
+ + +
[in]statenew state for stream
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void ofstream::close ()
+
+inline
+
+

Close a file and force cached data and directory information to be written to the storage device.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::eof () const
+
+inlineinherited
+
+
Returns
true if end of file has been reached else false.
+

Warning: An empty file returns false before the first read.

+

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::fail () const
+
+inlineinherited
+
+
Returns
true if any iostate bit other than eof are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
char ios_base::fill ()
+
+inlineinherited
+
+
Returns
fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
char ios_base::fill (char c)
+
+inlineinherited
+
+

Set fill character

+
Parameters
+ + +
[in]cnew fill character
+
+
+
Returns
old fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
fmtflags ios_base::flags () const
+
+inlineinherited
+
+
Returns
format flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::flags (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flag
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t ios_base::flagsToBase ()
+
+inlineprotectedinherited
+
+
Returns
current number base
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ostream& ostream::flush ()
+
+inlineinherited
+
+

Flushes the buffer associated with this stream. The flush function calls the sync function of the associated file.

+
Returns
A reference to the ostream object.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::good () const
+
+inlineinherited
+
+
Returns
True if no iostate flags are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ofstream::is_open ()
+
+inline
+
+
Returns
True if stream is open else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void ofstream::open (const char * path,
openmode mode = out 
)
+
+inline
+
+

Open an ofstream

+
Parameters
+ + + +
[in]pathfile to open
[in]modeopen mode
+
+
+

mode See fstream::open() for valid modes.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ios::operator const void * () const
+
+inlineinherited
+
+
Returns
null pointer if fail() is true.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::operator! () const
+
+inlineinherited
+
+
Returns
true if fail() else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (ostream &(*)(ostream &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (ios_base &(*)(ios_base &str) pf)
+
+inlineinherited
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (bool arg)
+
+inlineinherited
+
+

Output bool

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const char * arg)
+
+inlineinherited
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const signed char * arg)
+
+inlineinherited
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const unsigned char * arg)
+
+inlineinherited
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (char arg)
+
+inlineinherited
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (signed char arg)
+
+inlineinherited
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned char arg)
+
+inlineinherited
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (double arg)
+
+inlineinherited
+
+

Output double

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (float arg)
+
+inlineinherited
+
+

Output float

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (short arg)
+
+inlineinherited
+
+

Output signed short

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned short arg)
+
+inlineinherited
+
+

Output unsigned short

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (int arg)
+
+inlineinherited
+
+

Output signed int

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned int arg)
+
+inlineinherited
+
+

Output unsigned int

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (long arg)
+
+inlineinherited
+
+

Output signed long

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned long arg)
+
+inlineinherited
+
+

Output unsigned long

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const void * arg)
+
+inlineinherited
+
+

Output pointer

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (pgm arg)
+
+inlineinherited
+
+

Output a string from flash using the pstr() macro

+
Parameters
+ + +
[in]argpgm struct pointing to string
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const __FlashStringHelper * arg)
+
+inlineinherited
+
+

Output a string from flash using the Arduino F() macro.

+
Parameters
+ + +
[in]argpointing to flash string
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int ios_base::precision () const
+
+inlineinherited
+
+
Returns
precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int ios_base::precision (unsigned int n)
+
+inlineinherited
+
+

set precision

+
Parameters
+ + +
[in]nnew precision
+
+
+
Returns
old precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::put (char ch)
+
+inlineinherited
+
+

Puts a character in a stream.

+

The unformatted output function inserts the element ch. It returns *this.

+
Parameters
+ + +
[in]chThe character
+
+
+
Returns
A reference to the ostream object.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
iostate ios::rdstate () const
+
+inlineinherited
+
+
Returns
The iostate flags for this file.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::seekp (pos_type pos)
+
+inlineinherited
+
+

Set the stream position

+
Parameters
+ + +
[in]posThe absolute position in which to move the write pointer.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
ostream& ostream::seekp (off_type off,
seekdir way 
)
+
+inlineinherited
+
+

Set the stream position.

+
Parameters
+ + + +
[in]offAn offset to move the write pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::setf (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flags to be or'ed in
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
+
+inlineinherited
+
+

modify format flags

+
Parameters
+ + + +
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::setstate (iostate state)
+
+inlineinherited
+
+

Set iostate bits.

+
Parameters
+ + +
[in]stateBitts to set.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
pos_type ostream::tellp ()
+
+inlineinherited
+
+
Returns
the stream position
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios_base::unsetf (fmtflags fl)
+
+inlineinherited
+
+

clear format flags

+
Parameters
+ + +
[in]flflags to be cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
unsigned ios_base::width ()
+
+inlineinherited
+
+
Returns
width
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
unsigned ios_base::width (unsigned n)
+
+inlineinherited
+
+

set width

+
Parameters
+ + +
[in]nnew width
+
+
+
Returns
old width
+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::adjustfield = left | right | internal
+
+staticinherited
+
+

mask for adjustfield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::app = 0X4
+
+staticinherited
+
+

seek to end before each write

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::ate = 0X8
+
+staticinherited
+
+

open and seek to end immediately after opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::badbit = 0X01
+
+staticinherited
+
+

iostate bad bit for a nonrecoverable error.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::basefield = dec | hex | oct
+
+staticinherited
+
+

mask for basefield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::binary = 0X10
+
+staticinherited
+
+

perform input and output in binary mode (as opposed to text mode)

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::boolalpha = 0x0100
+
+staticinherited
+
+

use strings true/false for bool

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::dec = 0x0008
+
+staticinherited
+
+

base 10 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::eofbit = 0x02
+
+staticinherited
+
+

iostate bit for end of file reached

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::failbit = 0X04
+
+staticinherited
+
+

iostate fail bit for nonfatal error

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::goodbit = 0x00
+
+staticinherited
+
+

iostate for no flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::hex = 0x0010
+
+staticinherited
+
+

base 16 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::in = 0X20
+
+staticinherited
+
+

open for input

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::internal = 0x0004
+
+staticinherited
+
+

fill between sign/base prefix and number

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::left = 0x0001
+
+staticinherited
+
+

left adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::oct = 0x0020
+
+staticinherited
+
+

base 8 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::out = 0X40
+
+staticinherited
+
+

open for output

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::right = 0x0002
+
+staticinherited
+
+

right adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showbase = 0x0200
+
+staticinherited
+
+

use prefix 0X for hex and 0 for oct

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpoint = 0x0400
+
+staticinherited
+
+

always show '.' for floating numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpos = 0x0800
+
+staticinherited
+
+

show + sign for nonnegative numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::skipws = 0x1000
+
+staticinherited
+
+

skip initial white space

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::trunc = 0X80
+
+staticinherited
+
+

truncate an existing stream when opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::uppercase = 0x4000
+
+staticinherited
+
+

use uppercase letters in number representations

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/html/classofstream__coll__graph.png b/html/classofstream__coll__graph.png new file mode 100644 index 0000000..eaa6cd8 Binary files /dev/null and b/html/classofstream__coll__graph.png differ diff --git a/html/classofstream__inherit__graph.png b/html/classofstream__inherit__graph.png new file mode 100644 index 0000000..eaa6cd8 Binary files /dev/null and b/html/classofstream__inherit__graph.png differ diff --git a/html/classostream-members.html b/html/classostream-members.html new file mode 100644 index 0000000..e8d297e --- /dev/null +++ b/html/classostream-members.html @@ -0,0 +1,144 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
ostream Member List
+
+
+ +

This is the complete list of members for ostream, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
bad() const iosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() const iosinline
eofbitios_basestatic
fail() const iosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() const ios_baseinline
flags(fmtflags fl)ios_baseinline
flagsToBase()ios_baseinlineprotected
flush()ostreaminline
fmtflags typedefios_base
good() const iosinline
goodbitios_basestatic
hexios_basestatic
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base()ios_baseinline
iostate typedefios_base
leftios_basestatic
octios_basestatic
off_type typedefios_base
openmode typedefios_base
operator const void *() const iosinline
operator!() const iosinline
operator<<(ostream &(*pf)(ostream &str))ostreaminline
operator<<(ios_base &(*pf)(ios_base &str))ostreaminline
operator<<(bool arg)ostreaminline
operator<<(const char *arg)ostreaminline
operator<<(const signed char *arg)ostreaminline
operator<<(const unsigned char *arg)ostreaminline
operator<<(char arg)ostreaminline
operator<<(signed char arg)ostreaminline
operator<<(unsigned char arg)ostreaminline
operator<<(double arg)ostreaminline
operator<<(float arg)ostreaminline
operator<<(short arg)ostreaminline
operator<<(unsigned short arg)ostreaminline
operator<<(int arg)ostreaminline
operator<<(unsigned int arg)ostreaminline
operator<<(long arg)ostreaminline
operator<<(unsigned long arg)ostreaminline
operator<<(const void *arg)ostreaminline
operator<<(pgm arg)ostreaminline
operator<<(const __FlashStringHelper *arg)ostreaminline
ostream()ostreaminline
outios_basestatic
pos_type typedefios_base
precision() const ios_baseinline
precision(unsigned int n)ios_baseinline
put(char ch)ostreaminline
rdstate() const iosinline
rightios_basestatic
seekdir enum nameios_base
seekp(pos_type pos)ostreaminline
seekp(off_type off, seekdir way)ostreaminline
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipwsios_basestatic
streamsize typedefios_base
tellp()ostreaminline
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
+ + + + diff --git a/html/classostream.html b/html/classostream.html new file mode 100644 index 0000000..c10fccc --- /dev/null +++ b/html/classostream.html @@ -0,0 +1,2335 @@ + + + + + + +SdFat: ostream Class Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

Output Stream. + More...

+ +

#include <ostream.h>

+
+Inheritance diagram for ostream:
+
+
Inheritance graph
+ + +
[legend]
+
+Collaboration diagram for ostream:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + +

+Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, +cur, +end + }
 
typedef uint32_t streamsize
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
ostreamflush ()
 
bool good () const
 
 operator const void * () const
 
bool operator! () const
 
ostreamoperator<< (ostream &(*pf)(ostream &str))
 
ostreamoperator<< (ios_base &(*pf)(ios_base &str))
 
ostreamoperator<< (bool arg)
 
ostreamoperator<< (const char *arg)
 
ostreamoperator<< (const signed char *arg)
 
ostreamoperator<< (const unsigned char *arg)
 
ostreamoperator<< (char arg)
 
ostreamoperator<< (signed char arg)
 
ostreamoperator<< (unsigned char arg)
 
ostreamoperator<< (double arg)
 
ostreamoperator<< (float arg)
 
ostreamoperator<< (short arg)
 
ostreamoperator<< (unsigned short arg)
 
ostreamoperator<< (int arg)
 
ostreamoperator<< (unsigned int arg)
 
ostreamoperator<< (long arg)
 
ostreamoperator<< (unsigned long arg)
 
ostreamoperator<< (const void *arg)
 
ostreamoperator<< (pgm arg)
 
ostreamoperator<< (const __FlashStringHelper *arg)
 
 ostream ()
 
int precision () const
 
int precision (unsigned int n)
 
ostreamput (char ch)
 
iostate rdstate () const
 
ostreamseekp (pos_type pos)
 
ostreamseekp (off_type off, seekdir way)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
pos_type tellp ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
+ + + +

+Protected Member Functions

uint8_t flagsToBase ()
 
+

Detailed Description

+

Output Stream.

+

Member Typedef Documentation

+ +
+
+ + + + + +
+ + + + +
typedef unsigned int ios_base::fmtflags
+
+inherited
+
+

type for format flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef unsigned char ios_base::iostate
+
+inherited
+
+

typedef for iostate bitmask

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef int32_t ios_base::off_type
+
+inherited
+
+

type for relative seek offset

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint8_t ios_base::openmode
+
+inherited
+
+

typedef for iostream open mode

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::pos_type
+
+inherited
+
+

type for absolute seek position

+ +
+
+ +
+
+ + + + + +
+ + + + +
typedef uint32_t ios_base::streamsize
+
+inherited
+
+

unsigned size that can represent maximum file size. (violates spec - should be signed)

+ +
+
+

Member Enumeration Documentation

+ +
+
+ + + + + +
+ + + + +
enum ios_base::seekdir
+
+inherited
+
+

enumerated type for the direction of relative seeks

+ + + + +
Enumerator
beg  +

seek relative to the beginning of the stream

+
cur  +

seek relative to the current stream position

+
end  +

seek relative to the end of the stream

+
+ +
+
+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + +
ostream::ostream ()
+
+inline
+
+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
bool ios::bad () const
+
+inlineinherited
+
+
Returns
true if bad bit is set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::clear (iostate state = goodbit)
+
+inlineinherited
+
+

Clear iostate bits.

+
Parameters
+ + +
[in]stateThe flags you want to set after clearing all flags.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::eof () const
+
+inlineinherited
+
+
Returns
true if end of file has been reached else false.
+

Warning: An empty file returns false before the first read.

+

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::fail () const
+
+inlineinherited
+
+
Returns
true if any iostate bit other than eof are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
char ios_base::fill ()
+
+inlineinherited
+
+
Returns
fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
char ios_base::fill (char c)
+
+inlineinherited
+
+

Set fill character

+
Parameters
+ + +
[in]cnew fill character
+
+
+
Returns
old fill character
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
fmtflags ios_base::flags () const
+
+inlineinherited
+
+
Returns
format flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::flags (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flag
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t ios_base::flagsToBase ()
+
+inlineprotectedinherited
+
+
Returns
current number base
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ostream& ostream::flush ()
+
+inline
+
+

Flushes the buffer associated with this stream. The flush function calls the sync function of the associated file.

+
Returns
A reference to the ostream object.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::good () const
+
+inlineinherited
+
+
Returns
True if no iostate flags are set else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
ios::operator const void * () const
+
+inlineinherited
+
+
Returns
null pointer if fail() is true.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
bool ios::operator! () const
+
+inlineinherited
+
+
Returns
true if fail() else false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (ostream &(*)(ostream &str) pf)
+
+inline
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (ios_base &(*)(ios_base &str) pf)
+
+inline
+
+

call manipulator

+
Parameters
+ + +
[in]pffunction to call
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (bool arg)
+
+inline
+
+

Output bool

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const char * arg)
+
+inline
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const signed char * arg)
+
+inline
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const unsigned char * arg)
+
+inline
+
+

Output string

+
Parameters
+ + +
[in]argstring to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (char arg)
+
+inline
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (signed char arg)
+
+inline
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned char arg)
+
+inline
+
+

Output character

+
Parameters
+ + +
[in]argcharacter to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (double arg)
+
+inline
+
+

Output double

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (float arg)
+
+inline
+
+

Output float

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (short arg)
+
+inline
+
+

Output signed short

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned short arg)
+
+inline
+
+

Output unsigned short

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (int arg)
+
+inline
+
+

Output signed int

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned int arg)
+
+inline
+
+

Output unsigned int

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (long arg)
+
+inline
+
+

Output signed long

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (unsigned long arg)
+
+inline
+
+

Output unsigned long

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const void * arg)
+
+inline
+
+

Output pointer

+
Parameters
+ + +
[in]argvalue to output
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (pgm arg)
+
+inline
+
+

Output a string from flash using the pstr() macro

+
Parameters
+ + +
[in]argpgm struct pointing to string
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::operator<< (const __FlashStringHelper * arg)
+
+inline
+
+

Output a string from flash using the Arduino F() macro.

+
Parameters
+ + +
[in]argpointing to flash string
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
int ios_base::precision () const
+
+inlineinherited
+
+
Returns
precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
int ios_base::precision (unsigned int n)
+
+inlineinherited
+
+

set precision

+
Parameters
+ + +
[in]nnew precision
+
+
+
Returns
old precision
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::put (char ch)
+
+inline
+
+

Puts a character in a stream.

+

The unformatted output function inserts the element ch. It returns *this.

+
Parameters
+ + +
[in]chThe character
+
+
+
Returns
A reference to the ostream object.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
iostate ios::rdstate () const
+
+inlineinherited
+
+
Returns
The iostate flags for this file.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& ostream::seekp (pos_type pos)
+
+inline
+
+

Set the stream position

+
Parameters
+ + +
[in]posThe absolute position in which to move the write pointer.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
ostream& ostream::seekp (off_type off,
seekdir way 
)
+
+inline
+
+

Set the stream position.

+
Parameters
+ + + +
[in]offAn offset to move the write pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
+
+
+
Returns
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
fmtflags ios_base::setf (fmtflags fl)
+
+inlineinherited
+
+

set format flags

+
Parameters
+ + +
[in]flnew flags to be or'ed in
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
+
+inlineinherited
+
+

modify format flags

+
Parameters
+ + + +
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios::setstate (iostate state)
+
+inlineinherited
+
+

Set iostate bits.

+
Parameters
+ + +
[in]stateBitts to set.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
pos_type ostream::tellp ()
+
+inline
+
+
Returns
the stream position
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void ios_base::unsetf (fmtflags fl)
+
+inlineinherited
+
+

clear format flags

+
Parameters
+ + +
[in]flflags to be cleared
+
+
+
Returns
old flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
unsigned ios_base::width ()
+
+inlineinherited
+
+
Returns
width
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
unsigned ios_base::width (unsigned n)
+
+inlineinherited
+
+

set width

+
Parameters
+ + +
[in]nnew width
+
+
+
Returns
old width
+ +
+
+

Member Data Documentation

+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::adjustfield = left | right | internal
+
+staticinherited
+
+

mask for adjustfield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::app = 0X4
+
+staticinherited
+
+

seek to end before each write

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::ate = 0X8
+
+staticinherited
+
+

open and seek to end immediately after opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::badbit = 0X01
+
+staticinherited
+
+

iostate bad bit for a nonrecoverable error.

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::basefield = dec | hex | oct
+
+staticinherited
+
+

mask for basefield

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::binary = 0X10
+
+staticinherited
+
+

perform input and output in binary mode (as opposed to text mode)

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::boolalpha = 0x0100
+
+staticinherited
+
+

use strings true/false for bool

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::dec = 0x0008
+
+staticinherited
+
+

base 10 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::eofbit = 0x02
+
+staticinherited
+
+

iostate bit for end of file reached

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::failbit = 0X04
+
+staticinherited
+
+

iostate fail bit for nonfatal error

+ +
+
+ +
+
+ + + + + +
+ + + + +
const iostate ios_base::goodbit = 0x00
+
+staticinherited
+
+

iostate for no flags

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::hex = 0x0010
+
+staticinherited
+
+

base 16 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::in = 0X20
+
+staticinherited
+
+

open for input

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::internal = 0x0004
+
+staticinherited
+
+

fill between sign/base prefix and number

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::left = 0x0001
+
+staticinherited
+
+

left adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::oct = 0x0020
+
+staticinherited
+
+

base 8 flag

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::out = 0X40
+
+staticinherited
+
+

open for output

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::right = 0x0002
+
+staticinherited
+
+

right adjust fields

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showbase = 0x0200
+
+staticinherited
+
+

use prefix 0X for hex and 0 for oct

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpoint = 0x0400
+
+staticinherited
+
+

always show '.' for floating numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::showpos = 0x0800
+
+staticinherited
+
+

show + sign for nonnegative numbers

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::skipws = 0x1000
+
+staticinherited
+
+

skip initial white space

+ +
+
+ +
+
+ + + + + +
+ + + + +
const openmode ios_base::trunc = 0X80
+
+staticinherited
+
+

truncate an existing stream when opening

+ +
+
+ +
+
+ + + + + +
+ + + + +
const fmtflags ios_base::uppercase = 0x4000
+
+staticinherited
+
+

use uppercase letters in number representations

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/html/classostream__coll__graph.png b/html/classostream__coll__graph.png new file mode 100644 index 0000000..310a306 Binary files /dev/null and b/html/classostream__coll__graph.png differ diff --git a/html/classostream__inherit__graph.png b/html/classostream__inherit__graph.png new file mode 100644 index 0000000..8e5928f Binary files /dev/null and b/html/classostream__inherit__graph.png differ diff --git a/html/closed.png b/html/closed.png new file mode 100644 index 0000000..98cc2c9 Binary files /dev/null and b/html/closed.png differ diff --git a/html/dir_1281b15c327061056ab3b326e90c50cf.html b/html/dir_1281b15c327061056ab3b326e90c50cf.html new file mode 100644 index 0000000..4141a92 --- /dev/null +++ b/html/dir_1281b15c327061056ab3b326e90c50cf.html @@ -0,0 +1,151 @@ + + + + + + +SdFat: Arduino/libraries/SdFat Directory Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
SdFat Directory Reference
+
+
+
+Directory dependency graph for SdFat:
+
+
Arduino/libraries/SdFat
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  ArduinoStream.h
 ArduinoInStream and ArduinoOutStream classes.
 
file  bufstream.h
 ibufstream and obufstream classes
 
file  ios.h
 ios_base and ios classes
 
file  iostream.h
 iostream class
 
file  istream.cpp
 
file  istream.h
 istream class
 
file  MinimumSerial.cpp
 
file  MinimumSerial.h
 
file  ostream.cpp
 
file  ostream.h
 ostream class
 
file  Sd2Card.cpp
 
file  Sd2Card.h
 Sd2Card class for V2 SD/SDHC cards.
 
file  SdBaseFile.cpp
 
file  SdBaseFile.h
 SdBaseFile class.
 
file  SdBaseFilePrint.cpp
 
file  SdFat.cpp
 
file  SdFat.h
 SdFat class.
 
file  SdFatConfig.h
 configuration definitions
 
file  SdFatErrorPrint.cpp
 
file  SdFatmainpage.h
 
file  SdFatUtil.cpp
 
file  SdFatUtil.h
 Useful utility functions.
 
file  SdFile.cpp
 
file  SdFile.h
 SdFile class.
 
file  SdSpi.h
 SdSpi class for V2 SD/SDHC cards.
 
file  SdSpiArduino.cpp
 
file  SdSpiAVR.cpp
 
file  SdSpiMK20DX128.cpp
 
file  SdSpiSAM3X.cpp
 
file  SdStream.cpp
 
file  SdStream.h
 fstream, ifstream, and ofstream classes
 
file  SdVolume.cpp
 
file  SdVolume.h
 SdVolume class.
 
file  StdioStream.cpp
 
file  StdioStream.h
 
+
+ + + + diff --git a/html/dir_1281b15c327061056ab3b326e90c50cf_dep.png b/html/dir_1281b15c327061056ab3b326e90c50cf_dep.png new file mode 100644 index 0000000..c9c448f Binary files /dev/null and b/html/dir_1281b15c327061056ab3b326e90c50cf_dep.png differ diff --git a/html/dir_481cc946b8a81b8d9363a4aad6201160.html b/html/dir_481cc946b8a81b8d9363a4aad6201160.html new file mode 100644 index 0000000..03a2b5a --- /dev/null +++ b/html/dir_481cc946b8a81b8d9363a4aad6201160.html @@ -0,0 +1,68 @@ + + + + + + +SdFat: Arduino/libraries Directory Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
libraries Directory Reference
+
+
+
+Directory dependency graph for libraries:
+
+
Arduino/libraries
+ + +
+ + + + +

+Directories

directory  SdFat
 
+
+ + + + diff --git a/html/dir_481cc946b8a81b8d9363a4aad6201160_dep.png b/html/dir_481cc946b8a81b8d9363a4aad6201160_dep.png new file mode 100644 index 0000000..423a5e8 Binary files /dev/null and b/html/dir_481cc946b8a81b8d9363a4aad6201160_dep.png differ diff --git a/html/dir_a991eec27578c865874ede3d8ec657c2.html b/html/dir_a991eec27578c865874ede3d8ec657c2.html new file mode 100644 index 0000000..8a8061d --- /dev/null +++ b/html/dir_a991eec27578c865874ede3d8ec657c2.html @@ -0,0 +1,68 @@ + + + + + + +SdFat: Arduino Directory Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
Arduino Directory Reference
+
+
+
+Directory dependency graph for Arduino:
+
+
Arduino
+ + +
+ + + + +

+Directories

directory  libraries
 
+
+ + + + diff --git a/html/dir_a991eec27578c865874ede3d8ec657c2_dep.png b/html/dir_a991eec27578c865874ede3d8ec657c2_dep.png new file mode 100644 index 0000000..5422742 Binary files /dev/null and b/html/dir_a991eec27578c865874ede3d8ec657c2_dep.png differ diff --git a/html/doxygen.css b/html/doxygen.css new file mode 100644 index 0000000..f0f36f8 --- /dev/null +++ b/html/doxygen.css @@ -0,0 +1,1366 @@ +/* The standard CSS for doxygen 1.8.6 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #ffffff; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 4px 6px; + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +div.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: bold; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view when not used as main index */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl +{ + padding: 0 0 0 10px; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ +dl.section +{ + margin-left: 0px; + padding-left: 0px; +} + +dl.note +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00D000; +} + +dl.deprecated +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #505050; +} + +dl.todo +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00C0E0; +} + +dl.test +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #3030E0; +} + +dl.bug +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 20px 10px 10px; + width: 200px; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + diff --git a/html/doxygen.png b/html/doxygen.png new file mode 100644 index 0000000..3ff17d8 Binary files /dev/null and b/html/doxygen.png differ diff --git a/html/dynsections.js b/html/dynsections.js new file mode 100644 index 0000000..ed092c7 --- /dev/null +++ b/html/dynsections.js @@ -0,0 +1,97 @@ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} +function toggleLevel(level) +{ + $('table.directory tr').each(function(){ + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + +SdFat: File List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
File List
+
+ + + + + diff --git a/html/ftv2blank.png b/html/ftv2blank.png new file mode 100644 index 0000000..63c605b Binary files /dev/null and b/html/ftv2blank.png differ diff --git a/html/ftv2cl.png b/html/ftv2cl.png new file mode 100644 index 0000000..132f657 Binary files /dev/null and b/html/ftv2cl.png differ diff --git a/html/ftv2doc.png b/html/ftv2doc.png new file mode 100644 index 0000000..17edabf Binary files /dev/null and b/html/ftv2doc.png differ diff --git a/html/ftv2folderclosed.png b/html/ftv2folderclosed.png new file mode 100644 index 0000000..bb8ab35 Binary files /dev/null and b/html/ftv2folderclosed.png differ diff --git a/html/ftv2folderopen.png b/html/ftv2folderopen.png new file mode 100644 index 0000000..d6c7f67 Binary files /dev/null and b/html/ftv2folderopen.png differ diff --git a/html/ftv2lastnode.png b/html/ftv2lastnode.png new file mode 100644 index 0000000..63c605b Binary files /dev/null and b/html/ftv2lastnode.png differ diff --git a/html/ftv2link.png b/html/ftv2link.png new file mode 100644 index 0000000..17edabf Binary files /dev/null and b/html/ftv2link.png differ diff --git a/html/ftv2mlastnode.png b/html/ftv2mlastnode.png new file mode 100644 index 0000000..0b63f6d Binary files /dev/null and b/html/ftv2mlastnode.png differ diff --git a/html/ftv2mnode.png b/html/ftv2mnode.png new file mode 100644 index 0000000..0b63f6d Binary files /dev/null and b/html/ftv2mnode.png differ diff --git a/html/ftv2mo.png b/html/ftv2mo.png new file mode 100644 index 0000000..4bfb80f Binary files /dev/null and b/html/ftv2mo.png differ diff --git a/html/ftv2node.png b/html/ftv2node.png new file mode 100644 index 0000000..63c605b Binary files /dev/null and b/html/ftv2node.png differ diff --git a/html/ftv2ns.png b/html/ftv2ns.png new file mode 100644 index 0000000..72e3d71 Binary files /dev/null and b/html/ftv2ns.png differ diff --git a/html/ftv2plastnode.png b/html/ftv2plastnode.png new file mode 100644 index 0000000..c6ee22f Binary files /dev/null and b/html/ftv2plastnode.png differ diff --git a/html/ftv2pnode.png b/html/ftv2pnode.png new file mode 100644 index 0000000..c6ee22f Binary files /dev/null and b/html/ftv2pnode.png differ diff --git a/html/ftv2splitbar.png b/html/ftv2splitbar.png new file mode 100644 index 0000000..fe895f2 Binary files /dev/null and b/html/ftv2splitbar.png differ diff --git a/html/ftv2vertline.png b/html/ftv2vertline.png new file mode 100644 index 0000000..63c605b Binary files /dev/null and b/html/ftv2vertline.png differ diff --git a/html/functions.html b/html/functions.html new file mode 100644 index 0000000..8165418 --- /dev/null +++ b/html/functions.html @@ -0,0 +1,110 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- a -

+
+ + + + diff --git a/html/functions_b.html b/html/functions_b.html new file mode 100644 index 0000000..c375171 --- /dev/null +++ b/html/functions_b.html @@ -0,0 +1,125 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- b -

+
+ + + + diff --git a/html/functions_c.html b/html/functions_c.html new file mode 100644 index 0000000..e328ee9 --- /dev/null +++ b/html/functions_c.html @@ -0,0 +1,155 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- c -

+
+ + + + diff --git a/html/functions_d.html b/html/functions_d.html new file mode 100644 index 0000000..927b6e6 --- /dev/null +++ b/html/functions_d.html @@ -0,0 +1,119 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- d -

+
+ + + + diff --git a/html/functions_e.html b/html/functions_e.html new file mode 100644 index 0000000..0378cf1 --- /dev/null +++ b/html/functions_e.html @@ -0,0 +1,132 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- e -

+
+ + + + diff --git a/html/functions_enum.html b/html/functions_enum.html new file mode 100644 index 0000000..7473702 --- /dev/null +++ b/html/functions_enum.html @@ -0,0 +1,70 @@ + + + + + + +SdFat: Class Members - Enumerations + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+
+ + + + diff --git a/html/functions_eval.html b/html/functions_eval.html new file mode 100644 index 0000000..0d961fd --- /dev/null +++ b/html/functions_eval.html @@ -0,0 +1,76 @@ + + + + + + +SdFat: Class Members - Enumerator + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+
+ + + + diff --git a/html/functions_f.html b/html/functions_f.html new file mode 100644 index 0000000..6545034 --- /dev/null +++ b/html/functions_f.html @@ -0,0 +1,195 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- f -

+
+ + + + diff --git a/html/functions_func.html b/html/functions_func.html new file mode 100644 index 0000000..267b954 --- /dev/null +++ b/html/functions_func.html @@ -0,0 +1,100 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- a -

+
+ + + + diff --git a/html/functions_func_b.html b/html/functions_func_b.html new file mode 100644 index 0000000..6ad90fe --- /dev/null +++ b/html/functions_func_b.html @@ -0,0 +1,109 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- b -

+
+ + + + diff --git a/html/functions_func_c.html b/html/functions_func_c.html new file mode 100644 index 0000000..1b14cb8 --- /dev/null +++ b/html/functions_func_c.html @@ -0,0 +1,145 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- c -

+
+ + + + diff --git a/html/functions_func_d.html b/html/functions_func_d.html new file mode 100644 index 0000000..f9abca0 --- /dev/null +++ b/html/functions_func_d.html @@ -0,0 +1,109 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- d -

+
+ + + + diff --git a/html/functions_func_e.html b/html/functions_func_e.html new file mode 100644 index 0000000..7280849 --- /dev/null +++ b/html/functions_func_e.html @@ -0,0 +1,125 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- e -

+
+ + + + diff --git a/html/functions_func_f.html b/html/functions_func_f.html new file mode 100644 index 0000000..52ed927 --- /dev/null +++ b/html/functions_func_f.html @@ -0,0 +1,173 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- f -

+
+ + + + diff --git a/html/functions_func_g.html b/html/functions_func_g.html new file mode 100644 index 0000000..11d4c3a --- /dev/null +++ b/html/functions_func_g.html @@ -0,0 +1,116 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- g -

+
+ + + + diff --git a/html/functions_func_i.html b/html/functions_func_i.html new file mode 100644 index 0000000..9d1afee --- /dev/null +++ b/html/functions_func_i.html @@ -0,0 +1,151 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- i -

+
+ + + + diff --git a/html/functions_func_l.html b/html/functions_func_l.html new file mode 100644 index 0000000..552ab05 --- /dev/null +++ b/html/functions_func_l.html @@ -0,0 +1,98 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- l -

+
+ + + + diff --git a/html/functions_func_m.html b/html/functions_func_m.html new file mode 100644 index 0000000..1d0b18f --- /dev/null +++ b/html/functions_func_m.html @@ -0,0 +1,95 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- m -

+
+ + + + diff --git a/html/functions_func_o.html b/html/functions_func_o.html new file mode 100644 index 0000000..c00289c --- /dev/null +++ b/html/functions_func_o.html @@ -0,0 +1,124 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- o -

+
+ + + + diff --git a/html/functions_func_p.html b/html/functions_func_p.html new file mode 100644 index 0000000..02613ce --- /dev/null +++ b/html/functions_func_p.html @@ -0,0 +1,147 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- p -

+
+ + + + diff --git a/html/functions_func_r.html b/html/functions_func_r.html new file mode 100644 index 0000000..4c7e57b --- /dev/null +++ b/html/functions_func_r.html @@ -0,0 +1,150 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- r -

+
+ + + + diff --git a/html/functions_func_s.html b/html/functions_func_s.html new file mode 100644 index 0000000..f6836be --- /dev/null +++ b/html/functions_func_s.html @@ -0,0 +1,169 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- s -

+
+ + + + diff --git a/html/functions_func_t.html b/html/functions_func_t.html new file mode 100644 index 0000000..0def55a --- /dev/null +++ b/html/functions_func_t.html @@ -0,0 +1,108 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- t -

+
+ + + + diff --git a/html/functions_func_u.html b/html/functions_func_u.html new file mode 100644 index 0000000..348fdd5 --- /dev/null +++ b/html/functions_func_u.html @@ -0,0 +1,97 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- u -

+
+ + + + diff --git a/html/functions_func_v.html b/html/functions_func_v.html new file mode 100644 index 0000000..29727f6 --- /dev/null +++ b/html/functions_func_v.html @@ -0,0 +1,100 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- v -

+
+ + + + diff --git a/html/functions_func_w.html b/html/functions_func_w.html new file mode 100644 index 0000000..5f8309f --- /dev/null +++ b/html/functions_func_w.html @@ -0,0 +1,117 @@ + + + + + + +SdFat: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- w -

+
+ + + + diff --git a/html/functions_g.html b/html/functions_g.html new file mode 100644 index 0000000..0dbd956 --- /dev/null +++ b/html/functions_g.html @@ -0,0 +1,120 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- g -

+
+ + + + diff --git a/html/functions_h.html b/html/functions_h.html new file mode 100644 index 0000000..0b68b7c --- /dev/null +++ b/html/functions_h.html @@ -0,0 +1,95 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- h -

+
+ + + + diff --git a/html/functions_i.html b/html/functions_i.html new file mode 100644 index 0000000..4cf22b7 --- /dev/null +++ b/html/functions_i.html @@ -0,0 +1,161 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- i -

+
+ + + + diff --git a/html/functions_l.html b/html/functions_l.html new file mode 100644 index 0000000..69f035c --- /dev/null +++ b/html/functions_l.html @@ -0,0 +1,102 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- l -

+
+ + + + diff --git a/html/functions_m.html b/html/functions_m.html new file mode 100644 index 0000000..ea7bba1 --- /dev/null +++ b/html/functions_m.html @@ -0,0 +1,99 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- m -

+
+ + + + diff --git a/html/functions_o.html b/html/functions_o.html new file mode 100644 index 0000000..b5af150 --- /dev/null +++ b/html/functions_o.html @@ -0,0 +1,137 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- o -

+
+ + + + diff --git a/html/functions_p.html b/html/functions_p.html new file mode 100644 index 0000000..211f27d --- /dev/null +++ b/html/functions_p.html @@ -0,0 +1,160 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- p -

+
+ + + + diff --git a/html/functions_r.html b/html/functions_r.html new file mode 100644 index 0000000..e9d6d2b --- /dev/null +++ b/html/functions_r.html @@ -0,0 +1,154 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- r -

+
+ + + + diff --git a/html/functions_rela.html b/html/functions_rela.html new file mode 100644 index 0000000..0842b9b --- /dev/null +++ b/html/functions_rela.html @@ -0,0 +1,73 @@ + + + + + + +SdFat: Class Members - Related Functions + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+
+ + + + diff --git a/html/functions_s.html b/html/functions_s.html new file mode 100644 index 0000000..7f440ff --- /dev/null +++ b/html/functions_s.html @@ -0,0 +1,190 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- s -

+
+ + + + diff --git a/html/functions_t.html b/html/functions_t.html new file mode 100644 index 0000000..5bd5457 --- /dev/null +++ b/html/functions_t.html @@ -0,0 +1,112 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- t -

+
+ + + + diff --git a/html/functions_type.html b/html/functions_type.html new file mode 100644 index 0000000..0a1fd56 --- /dev/null +++ b/html/functions_type.html @@ -0,0 +1,85 @@ + + + + + + +SdFat: Class Members - Typedefs + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+
+ + + + diff --git a/html/functions_u.html b/html/functions_u.html new file mode 100644 index 0000000..3862d1e --- /dev/null +++ b/html/functions_u.html @@ -0,0 +1,101 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- u -

+
+ + + + diff --git a/html/functions_v.html b/html/functions_v.html new file mode 100644 index 0000000..f77d332 --- /dev/null +++ b/html/functions_v.html @@ -0,0 +1,101 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- v -

+
+ + + + diff --git a/html/functions_vars.html b/html/functions_vars.html new file mode 100644 index 0000000..c2c05db --- /dev/null +++ b/html/functions_vars.html @@ -0,0 +1,276 @@ + + + + + + +SdFat: Class Members - Variables + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- w -

+
+ + + + diff --git a/html/functions_w.html b/html/functions_w.html new file mode 100644 index 0000000..263d2ec --- /dev/null +++ b/html/functions_w.html @@ -0,0 +1,124 @@ + + + + + + +SdFat: Class Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all class members with links to the classes they belong to:
+ +

- w -

+
+ + + + diff --git a/html/globals.html b/html/globals.html new file mode 100644 index 0000000..880a818 --- /dev/null +++ b/html/globals.html @@ -0,0 +1,486 @@ + + + + + + +SdFat: File Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+
Here is a list of all file members with links to the files they belong to:
+ +

- _ -

+ + +

- b -

    +
  • boolalpha() +: ios.h +
  • +
+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- h -

+ + +

- i -

    +
  • internal() +: ios.h +
  • +
+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- u -

+ + +

- w -

+
+ + + + diff --git a/html/globals_defs.html b/html/globals_defs.html new file mode 100644 index 0000000..ea9c36e --- /dev/null +++ b/html/globals_defs.html @@ -0,0 +1,220 @@ + + + + + + +SdFat: File Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- s -

+ + +

- u -

+
+ + + + diff --git a/html/globals_func.html b/html/globals_func.html new file mode 100644 index 0000000..c30b415 --- /dev/null +++ b/html/globals_func.html @@ -0,0 +1,216 @@ + + + + + + +SdFat: File Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- b -

    +
  • boolalpha() +: ios.h +
  • +
+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- h -

+ + +

- i -

    +
  • internal() +: ios.h +
  • +
+ + +

- l -

+ + +

- n -

    +
  • noboolalpha() +: ios.h +
  • +
  • noshowbase() +: ios.h +
  • +
  • noshowpoint() +: ios.h +
  • +
  • noshowpos() +: ios.h +
  • +
  • noskipws() +: ios.h +
  • +
  • nouppercase() +: ios.h +
  • +
+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- u -

    +
  • uppercase() +: ios.h +
  • +
+ + +

- w -

+
+ + + + diff --git a/html/globals_vars.html b/html/globals_vars.html new file mode 100644 index 0000000..fd4b987 --- /dev/null +++ b/html/globals_vars.html @@ -0,0 +1,245 @@ + + + + + + +SdFat: File Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + + +
+
+  + +

- _ -

+ + +

- e -

+ + +

- f -

+ + +

- m -

+ + +

- s -

+ + +

- u -

+
+ + + + diff --git a/html/graph_legend.html b/html/graph_legend.html new file mode 100644 index 0000000..1649d3b --- /dev/null +++ b/html/graph_legend.html @@ -0,0 +1,115 @@ + + + + + + +SdFat: Graph Legend + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + +
+
+
+
Graph Legend
+
+
+

This page explains how to interpret the graphs that are generated by doxygen.

+

Consider the following example:

+
/*! Invisible class because of truncation */
+
class Invisible { };
+
+
/*! Truncated class, inheritance relation is hidden */
+
class Truncated : public Invisible { };
+
+
/* Class not documented with doxygen comments */
+
class Undocumented { };
+
+
/*! Class that is inherited using public inheritance */
+
class PublicBase : public Truncated { };
+
+
/*! A template class */
+
template<class T> class Templ { };
+
+
/*! Class that is inherited using protected inheritance */
+
class ProtectedBase { };
+
+
/*! Class that is inherited using private inheritance */
+
class PrivateBase { };
+
+
/*! Class that is used by the Inherited class */
+
class Used { };
+
+
/*! Super class that inherits a number of other classes */
+
class Inherited : public PublicBase,
+
protected ProtectedBase,
+
private PrivateBase,
+
public Undocumented,
+
public Templ<int>
+
{
+
private:
+
Used *m_usedClass;
+
};
+

This will result in the following graph:

+
+ +
+

The boxes in the above graph have the following meaning:

+
    +
  • +A filled gray box represents the struct or class for which the graph is generated.
  • +
  • +A box with a black border denotes a documented struct or class.
  • +
  • +A box with a grey border denotes an undocumented struct or class.
  • +
  • +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • +
+

The arrows have the following meaning:

+
    +
  • +A dark blue arrow is used to visualize a public inheritance relation between two classes.
  • +
  • +A dark green arrow is used for protected inheritance.
  • +
  • +A dark red arrow is used for private inheritance.
  • +
  • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
  • +
  • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
  • +
+
+ + + + diff --git a/html/graph_legend.png b/html/graph_legend.png new file mode 100644 index 0000000..40d66df Binary files /dev/null and b/html/graph_legend.png differ diff --git a/html/hierarchy.html b/html/hierarchy.html new file mode 100644 index 0000000..8f12843 --- /dev/null +++ b/html/hierarchy.html @@ -0,0 +1,98 @@ + + + + + + +SdFat: Class Hierarchy + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
Class Hierarchy
+
+
+
+

Go to the graphical class hierarchy

+This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 12345]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
oCcache_tCache for an SD data block
oCFatPos_tInternal type for istream do not use in user apps
oCios_baseBase class for all streams
|\CiosError and state information for all streams
| oCistreamInput Stream
| |oCibufstreamParse a char string
| ||\CArduinoInStreamInput stream for Arduino Stream objects
| |oCifstreamSD file input stream
| |\CiostreamInput/Output stream
| | \CfstreamSD file input/output stream
| oCostreamOutput Stream
| |oCArduinoOutStreamOutput stream for Arduino Print objects
| |oCiostreamInput/Output stream
| |oCobufstreamFormat a char string
| |\CofstreamSD card output stream
| \CSdStreamBaseBase class for SD streams
|  oCfstreamSD file input/output stream
|  oCifstreamSD file input stream
|  \CofstreamSD card output stream
oCpgmType for string in flash
oCPrint
|oCMinimumSerialMini serial class for the SdFat library
|\CSdFileSdBaseFile with Print
oCSd2CardRaw access to SD and SDHC flash memory cards
oCSdBaseFileBase class for SdFile with Print and C++ streams
|oCSdFileSdBaseFile with Print
|oCSdStreamBaseBase class for SD streams
|\CStdioStreamStdioStream implements a minimal stdio stream
oCSdFatIntegration class for the SdFat library
oCSdSpiSPI class for access to SD and SDHC flash memory cards
oCSdVolumeAccess FAT16 and FAT32 volumes on SD and SDHC cards
oCsetfillType for setfill manipulator
oCsetprecisionType for setprecision manipulator
\CsetwType for setw manipulator
+
+
+ + + + diff --git a/html/index.html b/html/index.html new file mode 100644 index 0000000..83aa17d --- /dev/null +++ b/html/index.html @@ -0,0 +1,118 @@ + + + + + + +SdFat: Arduino SdFat Library + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + +
+
+
+
Arduino SdFat Library
+
+
+
Copyright © 2012, 2013, 2014 by William Greiman

+Introduction

+

The Arduino SdFat Library is a minimal implementation of FAT16 and FAT32 file systems on SD flash memory cards. Standard SD and high capacity SDHC cards are supported.

+

Experimental support for FAT12 can be enabled by setting FAT12_SUPPORT nonzero in SdFatConfig.h.

+

The SdFat library only supports short 8.3 names.

+

The main classes in SdFat are SdFat, SdFile, StdioStream, fstream, ifstream, and ofstream.

+

The SdFat class maintains a volume working directories, a current working directory, and simplifies initialization of other classes.

+

The SdFile class provides binary file access functions such as open(), read(), remove(), write(), close() and sync(). This class supports access to the root directory and subdirectories.

+

The StdioStream class implements functions similar to Linux/Unix standard buffered input/output.

+

The fstream class implements C++ iostreams for both reading and writing text files.

+

The ifstream class implements the C++ iostreams for reading text files.

+

The ofstream class implements the C++ iostreams for writing text files.

+

The classes ibufstream and obufstream format and parse character strings in memory buffers.

+

the classes ArduinoInStream and ArduinoOutStream provide iostream functions for Serial, LiquidCrystal, and other devices.

+

The SdVolume class supports FAT16 and FAT32 partitions. Most applications will not need to call SdVolume member function.

+

The Sd2Card class supports access to standard SD cards and SDHC cards. Most applications will not need to call Sd2Card functions. The Sd2Card class can be used for raw access to the SD card.

+

A number of example are provided in the SdFat/examples folder. These were developed to test SdFat and illustrate its use.

+

SdFat was developed for high speed data recording. SdFat was used to implement an audio record/play class, WaveRP, for the Adafruit Wave Shield. This application uses special Sd2Card calls to write to contiguous files in raw mode. These functions reduce write latency so that audio can be recorded with the small amount of RAM in the Arduino.

+

+SD\SDHC Cards

+

Arduinos access SD cards using the cards SPI protocol. PCs, Macs, and most consumer devices use the 4-bit parallel SD protocol. A card that functions well on A PC or Mac may not work well on the Arduino.

+

Most cards have good SPI read performance but cards vary widely in SPI write performance. Write performance is limited by how efficiently the card manages internal erase/remapping operations. The Arduino cannot optimize writes to reduce erase operations because of its limit RAM.

+

SanDisk cards generally have good write performance. They seem to have more internal RAM buffering than other cards and therefore can limit the number of flash erase operations that the Arduino forces due to its limited RAM.

+

+Hardware Configuration

+

SdFat was developed using an Adafruit Industries Data Logging Shield.

+

The hardware interface to the SD card should not use a resistor based level shifter. SdFat sets the SPI bus frequency to 8 MHz which results in signal rise times that are too slow for the edge detectors in many newer SD card controllers when resistor voltage dividers are used.

+

The 5 to 3.3 V level shifter for 5 V Arduinos should be IC based like the 74HC4050N based circuit shown in the file SdLevel.png. The Adafruit Wave Shield uses a 74AHC125N. Gravitech sells SD and MicroSD Card Adapters based on the 74LCX245.

+

If you are using a resistor based level shifter and are having problems try setting the SPI bus frequency to 4 MHz. This can be done by using card.init(SPI_HALF_SPEED) to initialize the SD card.

+

+Bugs and Comments

+

If you wish to report bugs or have comments, send email to fat16.nosp@m.lib@.nosp@m.sbcgl.nosp@m.obal.nosp@m..net.

+

+SdFat Usage

+

SdFat uses a slightly restricted form of short names. Only printable ASCII characters are supported. No characters with code point values greater than 127 are allowed. Space is not allowed even though space was allowed in the API of early versions of DOS.

+

Short names are limited to 8 characters followed by an optional period (.) and extension of up to 3 characters. The characters may be any combination of letters and digits. The following special characters are also allowed:

+

$ % ' - _ @ ~ ` ! ( ) { } ^ # &

+

Short names are always converted to upper case and their original case value is lost.

+
An application which writes to a file using print(), println() or write() must call sync() at the appropriate time to force data and directory information to be written to the SD Card. Data and directory information are also written to the SD card when close() is called.
+
Applications must use care calling sync() since 2048 bytes of I/O is required to update file and directory information. This includes writing the current data block, reading the block that contains the directory entry for update, writing the directory block back and reading back the current data block.
+

It is possible to open a file with two or more instances of SdFile. A file may be corrupted if data is written to the file by more than one instance of SdFile.

+

+How to format SD Cards as FAT Volumes

+

You should use a freshly formatted SD card for best performance. FAT file systems become slower if many files have been created and deleted. This is because the directory entry for a deleted file is marked as deleted, but is not deleted. When a new file is created, these entries must be scanned before creating the file, a flaw in the FAT design. Also files can become fragmented which causes reads and writes to be slower.

+

A formatter sketch, SdFormatter.pde, is included in the SdFat/examples/SdFormatter directory. This sketch attempts to emulate SD Association's SDFormatter.

+

The best way to restore an SD card's format on a PC is to use SDFormatter which can be downloaded from:

+

http://www.sdcard.org/consumers/formatter/

+

SDFormatter aligns flash erase boundaries with file system structures which reduces write latency and file system overhead.

+

SDFormatter does not have an option for FAT type so it may format small cards as FAT12.

+

After the MBR is restored by SDFormatter you may need to reformat small cards that have been formatted FAT12 to force the volume type to be FAT16.

+

If you reformat the SD card with an OS utility, choose a cluster size that will result in:

+

4084 < CountOfClusters && CountOfClusters < 65525

+

The volume will then be FAT16.

+

If you are formatting an SD card on OS X or Linux, be sure to use the first partition. Format this partition with a cluster count in above range for FAT16. SDHC cards should be formatted FAT32 with a cluster size of 32 KB.

+

Microsoft operating systems support removable media formatted with a Master Boot Record, MBR, or formatted as a super floppy with a FAT Boot Sector in block zero.

+

Microsoft operating systems expect MBR formatted removable media to have only one partition. The first partition should be used.

+

Microsoft operating systems do not support partitioning SD flash cards. If you erase an SD card with a program like KillDisk, Most versions of Windows will format the card as a super floppy.

+

+References

+

The Arduino site:

+

http://www.arduino.cc/

+

For more information about FAT file systems see:

+

http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx

+

For information about using SD cards as SPI devices see:

+

http://www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf

+

The ATmega328 datasheet:

+

http://www.atmel.com/dyn/resources/prod_documents/doc8161.pdf

+
+ + + + diff --git a/html/inherit_graph_0.png b/html/inherit_graph_0.png new file mode 100644 index 0000000..4b076b4 Binary files /dev/null and b/html/inherit_graph_0.png differ diff --git a/html/inherit_graph_1.png b/html/inherit_graph_1.png new file mode 100644 index 0000000..add8800 Binary files /dev/null and b/html/inherit_graph_1.png differ diff --git a/html/inherit_graph_10.png b/html/inherit_graph_10.png new file mode 100644 index 0000000..53441c3 Binary files /dev/null and b/html/inherit_graph_10.png differ diff --git a/html/inherit_graph_2.png b/html/inherit_graph_2.png new file mode 100644 index 0000000..b50aad9 Binary files /dev/null and b/html/inherit_graph_2.png differ diff --git a/html/inherit_graph_3.png b/html/inherit_graph_3.png new file mode 100644 index 0000000..248216e Binary files /dev/null and b/html/inherit_graph_3.png differ diff --git a/html/inherit_graph_4.png b/html/inherit_graph_4.png new file mode 100644 index 0000000..54debb3 Binary files /dev/null and b/html/inherit_graph_4.png differ diff --git a/html/inherit_graph_5.png b/html/inherit_graph_5.png new file mode 100644 index 0000000..418bf6f Binary files /dev/null and b/html/inherit_graph_5.png differ diff --git a/html/inherit_graph_6.png b/html/inherit_graph_6.png new file mode 100644 index 0000000..3469a10 Binary files /dev/null and b/html/inherit_graph_6.png differ diff --git a/html/inherit_graph_7.png b/html/inherit_graph_7.png new file mode 100644 index 0000000..792debc Binary files /dev/null and b/html/inherit_graph_7.png differ diff --git a/html/inherit_graph_8.png b/html/inherit_graph_8.png new file mode 100644 index 0000000..b885d43 Binary files /dev/null and b/html/inherit_graph_8.png differ diff --git a/html/inherit_graph_9.png b/html/inherit_graph_9.png new file mode 100644 index 0000000..8a0ddeb Binary files /dev/null and b/html/inherit_graph_9.png differ diff --git a/html/inherits.html b/html/inherits.html new file mode 100644 index 0000000..91f98d6 --- /dev/null +++ b/html/inherits.html @@ -0,0 +1,106 @@ + + + + + + +SdFat: Class Hierarchy + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
Class Hierarchy
+
+
+ + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+ + + + diff --git a/html/ios_8h.html b/html/ios_8h.html new file mode 100644 index 0000000..c6c3cb8 --- /dev/null +++ b/html/ios_8h.html @@ -0,0 +1,710 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/ios.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
ios.h File Reference
+
+
+ +

ios_base and ios classes +More...

+
#include <SdBaseFile.h>
+
+Include dependency graph for ios.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + + + + + +

+Classes

class  ios
 Error and state information for all streams. More...
 
class  ios_base
 Base class for all streams. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

ios_baseboolalpha (ios_base &str)
 
ios_basedec (ios_base &str)
 
ios_basehex (ios_base &str)
 
ios_baseinternal (ios_base &str)
 
ios_baseleft (ios_base &str)
 
ios_basenoboolalpha (ios_base &str)
 
ios_basenoshowbase (ios_base &str)
 
ios_basenoshowpoint (ios_base &str)
 
ios_basenoshowpos (ios_base &str)
 
ios_basenoskipws (ios_base &str)
 
ios_basenouppercase (ios_base &str)
 
ios_baseoct (ios_base &str)
 
ios_baseright (ios_base &str)
 
ios_baseshowbase (ios_base &str)
 
ios_baseshowpoint (ios_base &str)
 
ios_baseshowpos (ios_base &str)
 
ios_baseskipws (ios_base &str)
 
ios_baseuppercase (ios_base &str)
 
+

Detailed Description

+

ios_base and ios classes

+

Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& boolalpha (ios_basestr)
+
+inline
+
+

function for boolalpha manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& dec (ios_basestr)
+
+inline
+
+

function for dec manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& hex (ios_basestr)
+
+inline
+
+

function for hex manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& internal (ios_basestr)
+
+inline
+
+

function for internal manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& left (ios_basestr)
+
+inline
+
+

function for left manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& noboolalpha (ios_basestr)
+
+inline
+
+

function for noboolalpha manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& noshowbase (ios_basestr)
+
+inline
+
+

function for noshowbase manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& noshowpoint (ios_basestr)
+
+inline
+
+

function for noshowpoint manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& noshowpos (ios_basestr)
+
+inline
+
+

function for noshowpos manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& noskipws (ios_basestr)
+
+inline
+
+

function for noskipws manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& nouppercase (ios_basestr)
+
+inline
+
+

function for nouppercase manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& oct (ios_basestr)
+
+inline
+
+

function for oct manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& right (ios_basestr)
+
+inline
+
+

function for right manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& showbase (ios_basestr)
+
+inline
+
+

function for showbase manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& showpoint (ios_basestr)
+
+inline
+
+

function for showpoint manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& showpos (ios_basestr)
+
+inline
+
+

function for showpos manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& skipws (ios_basestr)
+
+inline
+
+

function for skipws manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ios_base& uppercase (ios_basestr)
+
+inline
+
+

function for uppercase manipulator

+
Parameters
+ + +
[in]strThe stream
+
+
+
Returns
The stream
+ +
+
+
+ + + + diff --git a/html/ios_8h__dep__incl.png b/html/ios_8h__dep__incl.png new file mode 100644 index 0000000..439f243 Binary files /dev/null and b/html/ios_8h__dep__incl.png differ diff --git a/html/ios_8h__incl.png b/html/ios_8h__incl.png new file mode 100644 index 0000000..87546e2 Binary files /dev/null and b/html/ios_8h__incl.png differ diff --git a/html/iostream_8h.html b/html/iostream_8h.html new file mode 100644 index 0000000..6355906 --- /dev/null +++ b/html/iostream_8h.html @@ -0,0 +1,477 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/iostream.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
iostream.h File Reference
+
+
+ +

iostream class +More...

+
#include <istream.h>
+#include <ostream.h>
+
+Include dependency graph for iostream.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + + + + + + + + + + + +

+Classes

class  iostream
 Input/Output stream. More...
 
struct  setfill
 type for setfill manipulator More...
 
struct  setprecision
 type for setprecision manipulator More...
 
struct  setw
 type for setw manipulator More...
 
+ + + + + + + + + + + + + + + + + + + +

+Functions

ostreamendl (ostream &os)
 
ostreamflush (ostream &os)
 
ostreamoperator<< (ostream &os, const setfill &arg)
 
ostreamoperator<< (ostream &os, const setprecision &arg)
 
ostreamoperator<< (ostream &os, const setw &arg)
 
istreamoperator>> (istream &obj, const setfill &arg)
 
istreamoperator>> (istream &is, const setprecision &arg)
 
istreamoperator>> (istream &is, const setw &arg)
 
istreamws (istream &is)
 
+

Detailed Description

+

iostream class

+

Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
ostream& endl (ostreamos)
+
+inline
+
+

insert endline

+
Parameters
+ + +
[in]osThe Stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
ostream& flush (ostreamos)
+
+inline
+
+

flush manipulator

+
Parameters
+ + +
[in]osThe stream
+
+
+
Returns
The stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
ostream& operator<< (ostreamos,
const setfillarg 
)
+
+inline
+
+

setfill manipulator

+
Parameters
+ + + +
[in]osthe stream
[in]argset setfill object
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
ostream& operator<< (ostreamos,
const setprecisionarg 
)
+
+inline
+
+

setprecision manipulator

+
Parameters
+ + + +
[in]osthe stream
[in]argset setprecision object
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
ostream& operator<< (ostreamos,
const setwarg 
)
+
+inline
+
+

setw manipulator

+
Parameters
+ + + +
[in]osthe stream
[in]argset setw object
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
istream& operator>> (istreamobj,
const setfillarg 
)
+
+inline
+
+

setfill manipulator

+
Parameters
+ + + +
[in]objthe stream
[in]argset setfill object
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
istream& operator>> (istreamis,
const setprecisionarg 
)
+
+inline
+
+

setprecision manipulator

+
Parameters
+ + + +
[in]isthe stream
[in]argset setprecision object
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
istream& operator>> (istreamis,
const setwarg 
)
+
+inline
+
+

setw manipulator

+
Parameters
+ + + +
[in]isthe stream
[in]argset setw object
+
+
+
Returns
the stream
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
istream& ws (istreamis)
+
+inline
+
+

Skip white space

+
Parameters
+ + +
[in]isthe Stream
+
+
+
Returns
The stream
+ +
+
+
+ + + + diff --git a/html/iostream_8h__dep__incl.png b/html/iostream_8h__dep__incl.png new file mode 100644 index 0000000..b077a1a Binary files /dev/null and b/html/iostream_8h__dep__incl.png differ diff --git a/html/iostream_8h__incl.png b/html/iostream_8h__incl.png new file mode 100644 index 0000000..f93fd36 Binary files /dev/null and b/html/iostream_8h__incl.png differ diff --git a/html/istream_8cpp.html b/html/istream_8cpp.html new file mode 100644 index 0000000..9d6c2b1 --- /dev/null +++ b/html/istream_8cpp.html @@ -0,0 +1,113 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/istream.cpp File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
istream.cpp File Reference
+
+
+
#include <float.h>
+#include <istream.h>
+
+Include dependency graph for istream.cpp:
+
+
+ + +
+
+ + + + + +

+Variables

int16_t const EXP_LIMIT = 100
 
static const uint32_t uint32_max = (uint32_t)-1
 
+

Variable Documentation

+ +
+
+ + + + +
int16_t const EXP_LIMIT = 100
+
+ +
+
+ +
+
+ + + + + +
+ + + + +
const uint32_t uint32_max = (uint32_t)-1
+
+static
+
+ +
+
+
+ + + + diff --git a/html/istream_8cpp__incl.png b/html/istream_8cpp__incl.png new file mode 100644 index 0000000..28c8aec Binary files /dev/null and b/html/istream_8cpp__incl.png differ diff --git a/html/istream_8h.html b/html/istream_8h.html new file mode 100644 index 0000000..5706726 --- /dev/null +++ b/html/istream_8h.html @@ -0,0 +1,90 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/istream.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
istream.h File Reference
+
+
+ +

istream class +More...

+
#include <ios.h>
+
+Include dependency graph for istream.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + + +

+Classes

class  istream
 Input Stream. More...
 
+

Detailed Description

+

istream class

+
+ + + + diff --git a/html/istream_8h__dep__incl.png b/html/istream_8h__dep__incl.png new file mode 100644 index 0000000..b220f20 Binary files /dev/null and b/html/istream_8h__dep__incl.png differ diff --git a/html/istream_8h__incl.png b/html/istream_8h__incl.png new file mode 100644 index 0000000..1e98bc6 Binary files /dev/null and b/html/istream_8h__incl.png differ diff --git a/html/jquery.js b/html/jquery.js new file mode 100644 index 0000000..c197801 --- /dev/null +++ b/html/jquery.js @@ -0,0 +1,31 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
a";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="
";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
t
";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="
";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType; +if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bCbA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1 +},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},ac=a(av); +ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
","
"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1>");try{for(var bw=0,bv=this.length;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===""&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length; +if(bA>0){if(bv!=="border"){for(;bx)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b +})}})(window); diff --git a/html/namespace_sd_fat_util.html b/html/namespace_sd_fat_util.html new file mode 100644 index 0000000..88f9b8a --- /dev/null +++ b/html/namespace_sd_fat_util.html @@ -0,0 +1,205 @@ + + + + + + +SdFat: SdFatUtil Namespace Reference + + + + + + +
+
+
+ + + + + +
+
SdFat +
+
+ + + + + + +
+ +
+
SdFatUtil Namespace Reference
+
+
+ + + + + + + + + + + + +

+Functions

int FreeRam ()
 
void print_P (Print *pr, PGM_P str)
 
void println_P (Print *pr, PGM_P str)
 
void SerialPrint_P (PGM_P str)
 
void SerialPrintln_P (PGM_P str)
 
+

Function Documentation

+ +
+
+ + + + + + + +
int SdFatUtil::FreeRam ()
+
+

Amount of free RAM

+
Returns
The number of free bytes.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void SdFatUtil::print_P (Print * pr,
PGM_P str 
)
+
+

Print a string in flash memory.

+
Parameters
+ + + +
[in]prPrint object for output.
[in]strPointer to string stored in flash memory.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void SdFatUtil::println_P (Print * pr,
PGM_P str 
)
+
+

Print a string in flash memory followed by a CR/LF.

+
Parameters
+ + + +
[in]prPrint object for output.
[in]strPointer to string stored in flash memory.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void SdFatUtil::SerialPrint_P (PGM_P str)
+
+

Print a string in flash memory to Serial.

+
Parameters
+ + +
[in]strPointer to string stored in flash memory.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void SdFatUtil::SerialPrintln_P (PGM_P str)
+
+

Print a string in flash memory to Serial followed by a CR/LF.

+
Parameters
+ + +
[in]strPointer to string stored in flash memory.
+
+
+ +
+
+
+ + + + diff --git a/html/namespacemembers.html b/html/namespacemembers.html new file mode 100644 index 0000000..bb11fc7 --- /dev/null +++ b/html/namespacemembers.html @@ -0,0 +1,76 @@ + + + + + + +SdFat: Namespace Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+
Here is a list of all namespace members with links to the namespace documentation for each member:
+
+ + + + diff --git a/html/namespacemembers_func.html b/html/namespacemembers_func.html new file mode 100644 index 0000000..188498b --- /dev/null +++ b/html/namespacemembers_func.html @@ -0,0 +1,76 @@ + + + + + + +SdFat: Namespace Members + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+
+ + + + diff --git a/html/namespaces.html b/html/namespaces.html new file mode 100644 index 0000000..f0ba1e2 --- /dev/null +++ b/html/namespaces.html @@ -0,0 +1,62 @@ + + + + + + +SdFat: Namespace List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
Namespace List
+
+
+
Here is a list of all namespaces with brief descriptions:
+ + +
\NSdFatUtil
+
+
+ + + + diff --git a/html/nav_f.png b/html/nav_f.png new file mode 100644 index 0000000..72a58a5 Binary files /dev/null and b/html/nav_f.png differ diff --git a/html/nav_g.png b/html/nav_g.png new file mode 100644 index 0000000..2093a23 Binary files /dev/null and b/html/nav_g.png differ diff --git a/html/nav_h.png b/html/nav_h.png new file mode 100644 index 0000000..33389b1 Binary files /dev/null and b/html/nav_h.png differ diff --git a/html/open.png b/html/open.png new file mode 100644 index 0000000..30f75c7 Binary files /dev/null and b/html/open.png differ diff --git a/html/ostream_8cpp.html b/html/ostream_8cpp.html new file mode 100644 index 0000000..9162954 --- /dev/null +++ b/html/ostream_8cpp.html @@ -0,0 +1,94 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/ostream.cpp File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
ostream.cpp File Reference
+
+
+
#include <ostream.h>
+
+Include dependency graph for ostream.cpp:
+
+
+ + +
+
+ + + +

+Macros

#define PSTR(x)   x
 
+

Macro Definition Documentation

+ +
+
+ + + + + + + + +
#define PSTR( x)   x
+
+ +
+
+
+ + + + diff --git a/html/ostream_8cpp__incl.png b/html/ostream_8cpp__incl.png new file mode 100644 index 0000000..5fbe3f9 Binary files /dev/null and b/html/ostream_8cpp__incl.png differ diff --git a/html/ostream_8h.html b/html/ostream_8h.html new file mode 100644 index 0000000..9e7bda3 --- /dev/null +++ b/html/ostream_8h.html @@ -0,0 +1,117 @@ + + + + + + +SdFat: Arduino/libraries/SdFat/ostream.h File Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + + +
+
+ +
+
ostream.h File Reference
+
+
+ +

ostream class +More...

+
#include <ios.h>
+
+Include dependency graph for ostream.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + + + + + +

+Classes

class  ostream
 Output Stream. More...
 
struct  pgm
 type for string in flash More...
 
+ + + +

+Macros

#define pstr(str)   pgm(PSTR(str))
 
+

Detailed Description

+

ostream class

+

Macro Definition Documentation

+ +
+
+ + + + + + + + +
#define pstr( str)   pgm(PSTR(str))
+
+

macro for flash inserter

+ +
+
+
+ + + + diff --git a/html/ostream_8h__dep__incl.png b/html/ostream_8h__dep__incl.png new file mode 100644 index 0000000..616cd56 Binary files /dev/null and b/html/ostream_8h__dep__incl.png differ diff --git a/html/ostream_8h__incl.png b/html/ostream_8h__incl.png new file mode 100644 index 0000000..cbbd840 Binary files /dev/null and b/html/ostream_8h__incl.png differ diff --git a/html/struct_fat_pos__t-members.html b/html/struct_fat_pos__t-members.html new file mode 100644 index 0000000..6f98a9a --- /dev/null +++ b/html/struct_fat_pos__t-members.html @@ -0,0 +1,64 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
FatPos_t Member List
+
+
+ +

This is the complete list of members for FatPos_t, including all inherited members.

+ + + + +
clusterFatPos_t
FatPos_t()FatPos_tinline
positionFatPos_t
+ + + + diff --git a/html/struct_fat_pos__t.html b/html/struct_fat_pos__t.html new file mode 100644 index 0000000..09b081a --- /dev/null +++ b/html/struct_fat_pos__t.html @@ -0,0 +1,136 @@ + + + + + + +SdFat: FatPos_t Struct Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+ +
+
FatPos_t Struct Reference
+
+
+ +

internal type for istream do not use in user apps + More...

+ +

#include <SdBaseFile.h>

+ + + + +

+Public Member Functions

 FatPos_t ()
 
+ + + + + +

+Public Attributes

uint32_t cluster
 
uint32_t position
 
+

Detailed Description

+

internal type for istream do not use in user apps

+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + +
FatPos_t::FatPos_t ()
+
+inline
+
+ +
+
+

Member Data Documentation

+ +
+
+ + + + +
uint32_t FatPos_t::cluster
+
+

cluster for position

+ +
+
+ +
+
+ + + + +
uint32_t FatPos_t::position
+
+

stream position

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/html/structpgm-members.html b/html/structpgm-members.html new file mode 100644 index 0000000..c9bffd3 --- /dev/null +++ b/html/structpgm-members.html @@ -0,0 +1,64 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
pgm Member List
+
+
+ +

This is the complete list of members for pgm, including all inherited members.

+ + + + +
pgm(char *str)pgminlineexplicit
pgm(const char *str)pgminlineexplicit
ptrpgm
+ + + + diff --git a/html/structpgm.html b/html/structpgm.html new file mode 100644 index 0000000..1552a2b --- /dev/null +++ b/html/structpgm.html @@ -0,0 +1,162 @@ + + + + + + +SdFat: pgm Struct Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

type for string in flash + More...

+ +

#include <ostream.h>

+ + + + + + +

+Public Member Functions

 pgm (char *str)
 
 pgm (const char *str)
 
+ + + +

+Public Attributes

char * ptr
 
+

Detailed Description

+

type for string in flash

+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
pgm::pgm (char * str)
+
+inlineexplicit
+
+

constructor

+
Parameters
+ + +
[in]strinitializer for pointer.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
pgm::pgm (const char * str)
+
+inlineexplicit
+
+

constructor

+
Parameters
+ + +
[in]strinitializer for pointer.
+
+
+ +
+
+

Member Data Documentation

+ +
+
+ + + + +
char* pgm::ptr
+
+

Pointer to flash string

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/html/structsetfill-members.html b/html/structsetfill-members.html new file mode 100644 index 0000000..13beefd --- /dev/null +++ b/html/structsetfill-members.html @@ -0,0 +1,63 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
setfill Member List
+
+
+ +

This is the complete list of members for setfill, including all inherited members.

+ + + +
csetfill
setfill(char arg)setfillinlineexplicit
+ + + + diff --git a/html/structsetfill.html b/html/structsetfill.html new file mode 100644 index 0000000..f298c3c --- /dev/null +++ b/html/structsetfill.html @@ -0,0 +1,129 @@ + + + + + + +SdFat: setfill Struct Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+ +
+
setfill Struct Reference
+
+
+ +

type for setfill manipulator + More...

+ +

#include <iostream.h>

+ + + + +

+Public Member Functions

 setfill (char arg)
 
+ + + +

+Public Attributes

char c
 
+

Detailed Description

+

type for setfill manipulator

+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
setfill::setfill (char arg)
+
+inlineexplicit
+
+

constructor

+
Parameters
+ + +
[in]argnew fill character
+
+
+ +
+
+

Member Data Documentation

+ +
+
+ + + + +
char setfill::c
+
+

fill character

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/html/structsetprecision-members.html b/html/structsetprecision-members.html new file mode 100644 index 0000000..724a368 --- /dev/null +++ b/html/structsetprecision-members.html @@ -0,0 +1,63 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
setprecision Member List
+
+
+ +

This is the complete list of members for setprecision, including all inherited members.

+ + + +
psetprecision
setprecision(unsigned int arg)setprecisioninlineexplicit
+ + + + diff --git a/html/structsetprecision.html b/html/structsetprecision.html new file mode 100644 index 0000000..38ef0ae --- /dev/null +++ b/html/structsetprecision.html @@ -0,0 +1,129 @@ + + + + + + +SdFat: setprecision Struct Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+ +
+
setprecision Struct Reference
+
+
+ +

type for setprecision manipulator + More...

+ +

#include <iostream.h>

+ + + + +

+Public Member Functions

 setprecision (unsigned int arg)
 
+ + + +

+Public Attributes

unsigned int p
 
+

Detailed Description

+

type for setprecision manipulator

+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
setprecision::setprecision (unsigned int arg)
+
+inlineexplicit
+
+

constructor

+
Parameters
+ + +
[in]argnew precision
+
+
+ +
+
+

Member Data Documentation

+ +
+
+ + + + +
unsigned int setprecision::p
+
+

precision

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/html/structsetw-members.html b/html/structsetw-members.html new file mode 100644 index 0000000..5595dc1 --- /dev/null +++ b/html/structsetw-members.html @@ -0,0 +1,63 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
setw Member List
+
+
+ +

This is the complete list of members for setw, including all inherited members.

+ + + +
setw(unsigned arg)setwinlineexplicit
wsetw
+ + + + diff --git a/html/structsetw.html b/html/structsetw.html new file mode 100644 index 0000000..dcf3109 --- /dev/null +++ b/html/structsetw.html @@ -0,0 +1,129 @@ + + + + + + +SdFat: setw Struct Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+ +
+ +

type for setw manipulator + More...

+ +

#include <iostream.h>

+ + + + +

+Public Member Functions

 setw (unsigned arg)
 
+ + + +

+Public Attributes

unsigned w
 
+

Detailed Description

+

type for setw manipulator

+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
setw::setw (unsigned arg)
+
+inlineexplicit
+
+

constructor

+
Parameters
+ + +
[in]argnew width
+
+
+ +
+
+

Member Data Documentation

+ +
+
+ + + + +
unsigned setw::w
+
+

width

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/html/sync_off.png b/html/sync_off.png new file mode 100644 index 0000000..3b443fc Binary files /dev/null and b/html/sync_off.png differ diff --git a/html/sync_on.png b/html/sync_on.png new file mode 100644 index 0000000..e08320f Binary files /dev/null and b/html/sync_on.png differ diff --git a/html/tab_a.png b/html/tab_a.png new file mode 100644 index 0000000..3b725c4 Binary files /dev/null and b/html/tab_a.png differ diff --git a/html/tab_b.png b/html/tab_b.png new file mode 100644 index 0000000..e2b4a86 Binary files /dev/null and b/html/tab_b.png differ diff --git a/html/tab_h.png b/html/tab_h.png new file mode 100644 index 0000000..fd5cb70 Binary files /dev/null and b/html/tab_h.png differ diff --git a/html/tab_s.png b/html/tab_s.png new file mode 100644 index 0000000..ab478c9 Binary files /dev/null and b/html/tab_s.png differ diff --git a/html/tabs.css b/html/tabs.css new file mode 100644 index 0000000..9cf578f --- /dev/null +++ b/html/tabs.css @@ -0,0 +1,60 @@ +.tabs, .tabs2, .tabs3 { + background-image: url('tab_b.png'); + width: 100%; + z-index: 101; + font-size: 13px; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +} + +.tabs2 { + font-size: 10px; +} +.tabs3 { + font-size: 9px; +} + +.tablist { + margin: 0; + padding: 0; + display: table; +} + +.tablist li { + float: left; + display: table-cell; + background-image: url('tab_b.png'); + line-height: 36px; + list-style: none; +} + +.tablist a { + display: block; + padding: 0 20px; + font-weight: bold; + background-image:url('tab_s.png'); + background-repeat:no-repeat; + background-position:right; + color: #283A5D; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; + outline: none; +} + +.tabs3 .tablist a { + padding: 0 10px; +} + +.tablist a:hover { + background-image: url('tab_h.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); + text-decoration: none; +} + +.tablist li.current a { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} diff --git a/html/unioncache__t-members.html b/html/unioncache__t-members.html new file mode 100644 index 0000000..912ccb0 --- /dev/null +++ b/html/unioncache__t-members.html @@ -0,0 +1,69 @@ + + + + + + +SdFat: Member List + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+
+
cache_t Member List
+
+
+ +

This is the complete list of members for cache_t, including all inherited members.

+ + + + + + + + + +
datacache_t
dircache_t
fat16cache_t
fat32cache_t
fbscache_t
fbs32cache_t
fsinfocache_t
mbrcache_t
+ + + + diff --git a/html/unioncache__t.html b/html/unioncache__t.html new file mode 100644 index 0000000..be65475 --- /dev/null +++ b/html/unioncache__t.html @@ -0,0 +1,196 @@ + + + + + + +SdFat: cache_t Union Reference + + + + + + +
+
+ + + + + + +
+
SdFat +
+
+
+ + + + +
+
+ +
+
cache_t Union Reference
+
+
+ +

Cache for an SD data block. + More...

+ +

#include <SdVolume.h>

+ + + + + + + + + + + + + + + + + + +

+Public Attributes

uint8_t data [512]
 
dir_t dir [16]
 
uint16_t fat16 [256]
 
uint32_t fat32 [128]
 
fat_boot_t fbs
 
fat32_boot_t fbs32
 
fat32_fsinfo_t fsinfo
 
mbr_t mbr
 
+

Detailed Description

+

Cache for an SD data block.

+

Member Data Documentation

+ +
+
+ + + + +
uint8_t cache_t::data[512]
+
+

Used to access cached file data blocks.

+ +
+
+ +
+
+ + + + +
dir_t cache_t::dir[16]
+
+

Used to access cached directory entries.

+ +
+
+ +
+
+ + + + +
uint16_t cache_t::fat16[256]
+
+

Used to access cached FAT16 entries.

+ +
+
+ +
+
+ + + + +
uint32_t cache_t::fat32[128]
+
+

Used to access cached FAT32 entries.

+ +
+
+ +
+
+ + + + +
fat_boot_t cache_t::fbs
+
+

Used to access to a cached FAT boot sector.

+ +
+
+ +
+
+ + + + +
fat32_boot_t cache_t::fbs32
+
+

Used to access to a cached FAT32 boot sector.

+ +
+
+ +
+
+ + + + +
fat32_fsinfo_t cache_t::fsinfo
+
+

Used to access to a cached FAT32 FSINFO sector.

+ +
+
+ +
+
+ + + + +
mbr_t cache_t::mbr
+
+

Used to access a cached Master Boot Record.

+ +
+
+
The documentation for this union was generated from the following file: +
+ + + + diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..dc9a070 --- /dev/null +++ b/readme.txt @@ -0,0 +1,186 @@ +Please check the changes.txt file! + +For those who don't like too much documentation read QuickStart.txt. + +The Arduino SdFat library provides read/write access to FAT16/FAT32 +file systems on SD/SDHC flash cards. + +SdFat requires Arduino 1.05 or greater. + +To use SdFat, unzip the download file and place the SdFat folder +into the libraries subfolder in your main sketch folder. You may +need to create the libraries folder. Restart the Arduino IDE if +it was open. See the Arduino site for more details om installing libraries. + +The default chip select for the SD card is the hardware SS pin. On a +168/328 Arduino this is pin 10 and on a Mega this is pin 53. If you are +using another pin for chip select you will need call SdFat::begin(chipSelectPin) +or SdFat::begin(chipSelectPin, sckRateID) with second parameter set to the +SPI rate ID. + +If you have a shield like the SparkFun shield that uses pin 8 for chip +select you would change the line: + sd.begin(); +to + sd.begin(8); +or + sd.begin(8, SPI_HALF_SPEED); +to use a slower SPI clock. + +If the example uses + sd.init(); +change it to: + sd.begin(8, SPI_FULL_SPEED); + + +A number of configuration options can be set by editing SdFatConfig.h +#define macros. Options include: + +USE_SD_CRC - enable or disable SD card crc checking. + +USE_MULTIPLE_CARDS - enable or disable use of multiple SD card sockets. + +USE_SERIAL_FOR_STD_OUT - use Serial for the default stdOut. + +ENDL_CALLS_FLUSH - enable a flush() call after endl. + +SPI_SCK_INIT_DIVISOR - set the SPI rate for card initialization. + +LEONARDO_SOFT_SPI - use software SPI on Leonardo Arduinos. + +MEGA_SOFT_SPI - use software SPI on Mega Arduinos. + +USE_SOFTWARE_SPI - always use software SPI. + + +If you wish to report bugs or have comments, send email to +fat16lib@sbcglobal.net + +Read changes.txt if you have used previous releases of this library. + +Read troubleshooting.txt for common hardware problems. + +Please read the html documentation for this library. Start with +html/index.html and read the Main Page. Next go to the Classes tab and +read the documentation for the classes SdFat, SdFile, ifstream, ofstream. + +The SdFile class implements binary files similar to Linux's system calls. + +The StdioStream class implements buffered I/O for similar to Linux stdio.h. +StdioStream is under development so expect changes and bugs. + +The classes ifstream, ofstream, istream, and ostream follow the +C++ iostream standard when possible. + +Many examples are included in the SdFat/examples folder. + +There are many tutorials and much documentation about using C++ iostreams +on the web. + +http://www.cplusplus.com/ is a good C++ site for learning iostreams. + +Arduinos access SD cards using the cards SPI protocol. PCs, Macs, and +most consumer devices use the 4-bit parallel SD protocol. A card that +functions well on A PC or Mac may not work well on the Arduino. + +Most cards have good SPI read performance but cards vary widely in SPI +write performance. Write performance is limited by how efficiently the +card manages internal erase/remapping operations. The Arduino cannot +optimize writes to reduce erase operations because of its limited RAM. + +SanDisk cards generally have good write performance. They seem to have +more internal RAM buffering than other cards and therefore can limit +the number of flash erase operations that the Arduino forces due to its +limited RAM. + +The hardware interface to the SD card should not use a resistor based +level shifter. SdFat sets the SPI bus frequency to 8 MHz which results +in signal rise times that are too slow for the edge detectors in many +newer SD card controllers when resistor voltage dividers are used. + +The 5 to 3.3 V level shifter for 5 V arduinos should be IC based like +the 74HC4050N based circuit shown in the file SdLevel.png. The +Adafruit Wave Shield uses a 74AHC125N. Gravitech sells SD and MicroSD +Card Adapters based on the 74LCX245. + +If you are using a resistor based level shifter and are having problems +try setting the SPI bus frequency to 4 MHz. This can be done by using +card.init(SPI_HALF_SPEED) to initialize the SD card. + +A feature to use software SPI is available. Software SPI is slower +than hardware SPI but allows any digital pins to be used. See +SdFatConfig.h for software SPI definitions. + +An many shields designed for an Uno can be use on an Arduino Mega +by defining MEGA_SOFT_SPI in SdFatConfig.h. + + +The best way to restore an SD card's format is to use SDFormatter +which can be downloaded from: + +http://www.sdcard.org/consumers/formatter/ + +SDFormatter aligns flash erase boundaries with file +system structures which reduces write latency and file system overhead. + +SDFormatter does not have an option for FAT type so it may format +small cards as FAT12. + +The example sketch SdFatFormatter.ino will format smaller cards FAT16 +so they can be used with SdFat. + +The SdFatTestSuite folder contains development tests. + +The SdFat/examples folder has the following sketches. Older examples +and test programs are in the examples/#attic folder. + +AnalogBinLogger - Fast AVR ADC logger - see the AnalogBinLoggerExtras folder. + +bench - A read/write benchmark. + +cin_cout - Demo of ArduinoInStream and ArduinoOutStream. + +dataLogger - A simple modifiable data logger. + +directoryFunctions - Demo of chdir(), ls(), mkdir(), and rmdir(). + +fgets - Demo of the fgets read line/string function. + +formating - Print a table with various formatting options. + +getline - Example of getline from section 27.7.1.3 of the C++ standard. + +LowLatencyLogger - A modifiable data logger for higher data rates. + +OpenNext - Open all files in the root dir and print their filename. + +PrintBenchmark - A simple benchmark for printing to a text file. + +QuickStart - A sketch to quickly test your SD card and SD shield/module. + +RawWrite - A test of raw write functions for contiguous files. + +readCSV - Read a comma-separated value file using iostream extractors. + +ReadWriteSdFat - SdFat version of Arduino SD ReadWrite example. + +rename - A demo of SdFat::rename(old, new) and SdFile::rename(dirFile, newPath). + +SdFormatter - This sketch will format an SD or SDHC card. + +SdInfo - Initialize an SD card and analyze its structure for trouble shooting. + +StressTest - Create and write files until the SD is full. + +Timestamp - Sets file create, modify, and access timestamps. + +TwoCards - Example using two SD cards. + +To access these examples from the Arduino development environment +go to: File -> Examples -> SdFat -> + +Compile, upload to your Arduino and click on Serial Monitor to run +the example. + + +Updated 06 Aug 2014 diff --git a/troubleshooting.txt b/troubleshooting.txt new file mode 100644 index 0000000..a0bb1aa --- /dev/null +++ b/troubleshooting.txt @@ -0,0 +1,34 @@ +The best source of recent information is the Arduino forum + +http://arduino.cc/forum/ + +Also search the Adafruit forum + +http://forums.adafruit.com/ + +If you are using a Teensy try + +http://forum.pjrc.com/forum.php + +Try running the SdInfo sketch in the SdFat/examples folder to get +more information. + + +The most common problems are: + +-------------------------------------------------------------------------------- +Wiring errors with card.init() failure and errorCode == 1. This means the +first command, CMD0 - SPI init, failed. SdFat is not seeing the card. +This is a basic hardware problem. Do not reformat your SD. +-------------------------------------------------------------------------------- +card.init() failures caused by resistor SPI level shifters. Some, mostly older, +SD cards work with resistor level shifters but may be flaky with random errors. + +Many newer SD cards have edge detectors and fail with errorCode() = 1. These +cards will not work with resistor level shifters since SdFat does not see the +card at low SPI clock rate. + +Other cards fail with an errorCode() > 1. These cards see SD commands at low +SPI clock rate but fail at higher SPI clock rate. It may be possible to use +these cards by replacing card.init() with card.init(SPI_HALF_SPEED). +This will slow the the SPI clock by 50%.