From 953381fa430ad1fd41a4508597a19efdff4ffb5a Mon Sep 17 00:00:00 2001 From: Nicholas Sherlock Date: Wed, 7 Jan 2015 13:10:09 +1300 Subject: [PATCH] Initial release of Blackbox OpenLog Firmware --- OpenLog_v3_Blackbox/OpenLog_v3_Blackbox.ino | 399 +++ Readme.md | 22 + libs/SdFatBeta20120108/MegaSoftSpi.txt | 14 + libs/SdFatBeta20120108/MultipleCards.txt | 13 + libs/SdFatBeta20120108/QuickStart.txt | 21 + libs/SdFatBeta20120108/SdFat.html | 10 + libs/SdFatBeta20120108/SdFat/ArduinoStream.h | 116 + libs/SdFatBeta20120108/SdFat/Sd2Card.cpp | 646 ++++ libs/SdFatBeta20120108/SdFat/Sd2Card.h | 245 ++ libs/SdFatBeta20120108/SdFat/Sd2PinMap.h | 360 +++ libs/SdFatBeta20120108/SdFat/SdBaseFile.cpp | 1827 ++++++++++++ libs/SdFatBeta20120108/SdFat/SdBaseFile.h | 489 +++ libs/SdFatBeta20120108/SdFat/SdFat.cpp | 366 +++ libs/SdFatBeta20120108/SdFat/SdFat.h | 87 + libs/SdFatBeta20120108/SdFat/SdFatConfig.h | 121 + libs/SdFatBeta20120108/SdFat/SdFatStructs.h | 604 ++++ libs/SdFatBeta20120108/SdFat/SdFatUtil.cpp | 76 + libs/SdFatBeta20120108/SdFat/SdFatUtil.h | 46 + libs/SdFatBeta20120108/SdFat/SdFatmainpage.h | 228 ++ libs/SdFatBeta20120108/SdFat/SdFile.cpp | 93 + libs/SdFatBeta20120108/SdFat/SdFile.h | 47 + libs/SdFatBeta20120108/SdFat/SdInfo.h | 275 ++ libs/SdFatBeta20120108/SdFat/SdStream.cpp | 157 + libs/SdFatBeta20120108/SdFat/SdStream.h | 253 ++ libs/SdFatBeta20120108/SdFat/SdVolume.cpp | 401 +++ libs/SdFatBeta20120108/SdFat/SdVolume.h | 209 ++ libs/SdFatBeta20120108/SdFat/bufstream.h | 141 + .../examples/AnalogLogger/AnalogLogger.pde | 166 ++ .../SdFat/examples/HelloWorld/HelloWorld.pde | 11 + .../SdFat/examples/OpenNext/OpenNext.pde | 35 + .../SdFat/examples/QuickStart/QuickStart.pde | 127 + .../ReadWriteSdFat/ReadWriteSdFat.pde | 64 + .../SdFat/examples/SD_Size/SD_Size.pde | 23 + .../SdFat/examples/SdFatSize/SdFatSize.pde | 25 + .../examples/SdFormatter/SdFormatter.pde | 478 +++ .../SdFat/examples/SdInfo/SdInfo.pde | 174 ++ .../SdFat/examples/TwoCards/TwoCards.pde | 137 + .../SdFat/examples/append/append.pde | 61 + .../SdFat/examples/average/average.pde | 68 + .../SdFat/examples/bench/bench.pde | 103 + .../SdFat/examples/bufstream/bufstream.pde | 31 + .../SdFat/examples/cin_cout/cin_cout.pde | 33 + .../SdFat/examples/eventlog/eventlog.pde | 51 + .../SdFat/examples/fgets/fgets.pde | 66 + .../SdFat/examples/formatting/formatting.pde | 63 + .../SdFat/examples/getline/getline.pde | 70 + .../SdFat/examples/readCSV/readCSV.pde | 80 + .../SdFat/examples/readlog/readlog.pde | 39 + .../SdFat/examples/rename/rename.pde | 74 + libs/SdFatBeta20120108/SdFat/ios.h | 391 +++ libs/SdFatBeta20120108/SdFat/iostream.h | 153 + libs/SdFatBeta20120108/SdFat/istream.cpp | 413 +++ libs/SdFatBeta20120108/SdFat/istream.h | 304 ++ libs/SdFatBeta20120108/SdFat/ostream.cpp | 176 ++ libs/SdFatBeta20120108/SdFat/ostream.h | 254 ++ libs/SdFatBeta20120108/SdLevel.png | Bin 0 -> 21428 bytes libs/SdFatBeta20120108/WorkingDirectory.txt | 44 + libs/SdFatBeta20120108/changes.txt | 267 ++ .../extra/FridgeLogger/LightTempSdfat.pde | 224 ++ .../extra/FridgeLogger/LightTempStreams.pde | 177 ++ .../extra/FridgeLogger/diff.txt | 25 + .../extra/FridgeLogger/lighttemplogger.pde | 223 ++ .../extra/FridgeLogger/readme.txt | 15 + .../extra/SdFatTestSuite/SdFatTestSuite.cpp | 73 + .../extra/SdFatTestSuite/SdFatTestSuite.h | 32 + .../examples/ATS_SD_File/ATS_SD_File.pde | 105 + .../examples/ATS_SD_Files/ATS_SD_Files.pde | 75 + .../examples/ATS_SD_Seek/ATS_SD_Seek.pde | 108 + .../examples/fstreamTest/fstreamTest.pde | 93 + .../examples/istreamTest/istreamTest.pde | 221 ++ .../examples/ostreamTest/ostreamTest.pde | 165 + .../SdFatAnalogLogger/SdFatAnalogLogger.pde | 109 + .../examplesV1/SdFatAppend/SdFatAppend.pde | 55 + .../examplesV1/SdFatBench/SdFatBench.pde | 85 + .../extra/examplesV1/SdFatCopy/SdFatCopy.pde | 64 + .../SdFatGPSLogger_v3/SdFatGPSLogger_v3.pde | 326 ++ .../SdFatGPS_CSVSensorLogger.pde | 371 +++ .../extra/examplesV1/SdFatLs/SdFatLs.pde | 44 + .../examplesV1/SdFatMakeDir/SdFatMakeDir.pde | 131 + .../examplesV1/SdFatPrint/SdFatPrint.pde | 49 + .../SdFatRawWrite/SdFatRawWrite.pde | 186 ++ .../extra/examplesV1/SdFatRead/SdFatRead.pde | 51 + .../examplesV1/SdFatRemove/SdFatRemove.pde | 39 + .../examplesV1/SdFatRewrite/SdFatRewrite.pde | 53 + .../examplesV1/SdFatRmDir/SdFatRmDir.pde | 93 + .../extra/examplesV1/SdFatTail/SdFatTail.pde | 80 + .../SdFatTimestamp/SdFatTimestamp.pde | 164 + .../SdFatTruncate/SdFatTruncate.pde | 47 + .../examplesV1/SdFatWrite/SdFatWrite.pde | 81 + .../extra/examplesV1/V1readme.txt | 60 + libs/SdFatBeta20120108/extra/extra.txt | 7 + .../extra/makePinInclude/makePinInclude.pde | 353 +++ .../extra/makePinInclude/readme.txt | 1 + .../html/_arduino_stream_8h.html | 77 + .../html/_arduino_stream_8h__dep__incl.png | Bin 0 -> 1875 bytes .../html/_arduino_stream_8h__incl.png | Bin 0 -> 25729 bytes libs/SdFatBeta20120108/html/_sd2_card_8h.html | 696 +++++ .../html/_sd2_card_8h__dep__incl.png | Bin 0 -> 31734 bytes .../html/_sd2_card_8h__incl.png | Bin 0 -> 4376 bytes .../html/_sd_base_file_8h.html | 722 +++++ .../html/_sd_base_file_8h__dep__incl.png | Bin 0 -> 28986 bytes .../html/_sd_base_file_8h__incl.png | Bin 0 -> 17225 bytes libs/SdFatBeta20120108/html/_sd_fat_8h.html | 89 + .../html/_sd_fat_8h__incl.png | Bin 0 -> 37703 bytes .../html/_sd_fat_config_8h.html | 297 ++ .../html/_sd_fat_config_8h__dep__incl.png | Bin 0 -> 40752 bytes .../html/_sd_fat_config_8h__incl.png | Bin 0 -> 1576 bytes .../html/_sd_fat_structs_8h.html | 658 ++++ .../html/_sd_fat_structs_8h__dep__incl.png | Bin 0 -> 31757 bytes .../html/_sd_fat_util_8h.html | 114 + .../html/_sd_fat_util_8h__incl.png | Bin 0 -> 3690 bytes libs/SdFatBeta20120108/html/_sd_file_8h.html | 75 + .../html/_sd_file_8h__dep__incl.png | Bin 0 -> 1755 bytes .../html/_sd_file_8h__incl.png | Bin 0 -> 18257 bytes .../SdFatBeta20120108/html/_sd_stream_8h.html | 82 + .../html/_sd_stream_8h__dep__incl.png | Bin 0 -> 1798 bytes .../html/_sd_stream_8h__incl.png | Bin 0 -> 27731 bytes .../SdFatBeta20120108/html/_sd_volume_8h.html | 79 + .../html/_sd_volume_8h__dep__incl.png | Bin 0 -> 30551 bytes .../html/_sd_volume_8h__incl.png | Bin 0 -> 8596 bytes libs/SdFatBeta20120108/html/annotated.html | 81 + libs/SdFatBeta20120108/html/bc_s.png | Bin 0 -> 705 bytes libs/SdFatBeta20120108/html/bufstream_8h.html | 77 + .../html/bufstream_8h__dep__incl.png | Bin 0 -> 3009 bytes .../html/bufstream_8h__incl.png | Bin 0 -> 24759 bytes .../html/class_arduino_in_stream-members.html | 144 + .../html/class_arduino_in_stream.html | 1992 +++++++++++++ .../class_arduino_in_stream__coll__graph.png | Bin 0 -> 3475 bytes ...lass_arduino_in_stream__inherit__graph.png | Bin 0 -> 3475 bytes .../class_arduino_out_stream-members.html | 129 + .../html/class_arduino_out_stream.html | 1606 ++++++++++ .../class_arduino_out_stream__coll__graph.png | Bin 0 -> 4577 bytes ...ass_arduino_out_stream__inherit__graph.png | Bin 0 -> 2729 bytes .../html/class_print-members.html | 71 + libs/SdFatBeta20120108/html/class_print.html | 788 +++++ .../html/class_print__inherit__graph.png | Bin 0 -> 1013 bytes .../html/class_sd2_card-members.html | 69 + .../html/class_sd2_card.html | 590 ++++ .../html/class_sd_base_file-members.html | 109 + .../html/class_sd_base_file.html | 1758 +++++++++++ .../html/class_sd_base_file__coll__graph.png | Bin 0 -> 14023 bytes .../class_sd_base_file__inherit__graph.png | Bin 0 -> 6300 bytes .../html/class_sd_fat-members.html | 79 + libs/SdFatBeta20120108/html/class_sd_fat.html | 832 ++++++ .../html/class_sd_fat__coll__graph.png | Bin 0 -> 21877 bytes .../html/class_sd_file-members.html | 134 + .../SdFatBeta20120108/html/class_sd_file.html | 2498 ++++++++++++++++ .../html/class_sd_file__coll__graph.png | Bin 0 -> 16734 bytes .../html/class_sd_file__inherit__graph.png | Bin 0 -> 2863 bytes .../html/class_sd_stream_base-members.html | 165 + .../html/class_sd_stream_base.html | 2652 +++++++++++++++++ .../class_sd_stream_base__coll__graph.png | Bin 0 -> 17600 bytes .../class_sd_stream_base__inherit__graph.png | Bin 0 -> 6828 bytes .../html/class_sd_volume-members.html | 67 + .../html/class_sd_volume.html | 436 +++ .../html/class_sd_volume__coll__graph.png | Bin 0 -> 12054 bytes libs/SdFatBeta20120108/html/classes.html | 60 + .../html/classfstream-members.html | 222 ++ libs/SdFatBeta20120108/html/classfstream.html | 2568 ++++++++++++++++ .../html/classfstream__coll__graph.png | Bin 0 -> 25578 bytes .../html/classfstream__inherit__graph.png | Bin 0 -> 10693 bytes .../html/classibufstream-members.html | 140 + .../html/classibufstream.html | 1911 ++++++++++++ .../html/classibufstream__coll__graph.png | Bin 0 -> 2502 bytes .../html/classibufstream__inherit__graph.png | Bin 0 -> 3476 bytes .../html/classifstream-members.html | 200 ++ .../SdFatBeta20120108/html/classifstream.html | 2019 +++++++++++++ .../html/classifstream__coll__graph.png | Bin 0 -> 20663 bytes .../html/classifstream__inherit__graph.png | Bin 0 -> 6674 bytes .../html/classios-members.html | 106 + libs/SdFatBeta20120108/html/classios.html | 1056 +++++++ .../html/classios__base-members.html | 96 + .../html/classios__base.html | 850 ++++++ .../html/classios__base__inherit__graph.png | Bin 0 -> 19521 bytes .../html/classios__coll__graph.png | Bin 0 -> 1080 bytes .../html/classios__inherit__graph.png | Bin 0 -> 19337 bytes .../html/classiostream-members.html | 159 + .../SdFatBeta20120108/html/classiostream.html | 2385 +++++++++++++++ .../html/classiostream__coll__graph.png | Bin 0 -> 5855 bytes .../html/classiostream__inherit__graph.png | Bin 0 -> 6612 bytes .../html/classistream-members.html | 137 + libs/SdFatBeta20120108/html/classistream.html | 1843 ++++++++++++ .../html/classistream__coll__graph.png | Bin 0 -> 1729 bytes .../html/classistream__inherit__graph.png | Bin 0 -> 6799 bytes .../html/classobufstream-members.html | 133 + .../html/classobufstream.html | 1707 +++++++++++ .../html/classobufstream__coll__graph.png | Bin 0 -> 2541 bytes .../html/classobufstream__inherit__graph.png | Bin 0 -> 2541 bytes .../html/classofstream-members.html | 191 ++ .../SdFatBeta20120108/html/classofstream.html | 1757 +++++++++++ .../html/classofstream__coll__graph.png | Bin 0 -> 19755 bytes .../html/classofstream__inherit__graph.png | Bin 0 -> 6425 bytes .../html/classostream-members.html | 128 + libs/SdFatBeta20120108/html/classostream.html | 1581 ++++++++++ .../html/classostream__coll__graph.png | Bin 0 -> 1733 bytes .../html/classostream__inherit__graph.png | Bin 0 -> 8051 bytes libs/SdFatBeta20120108/html/closed.png | Bin 0 -> 126 bytes libs/SdFatBeta20120108/html/doxygen.css | 835 ++++++ libs/SdFatBeta20120108/html/doxygen.png | Bin 0 -> 3942 bytes libs/SdFatBeta20120108/html/files.html | 64 + libs/SdFatBeta20120108/html/functions.html | 101 + .../html/functions_0x62.html | 145 + .../html/functions_0x63.html | 151 + .../html/functions_0x64.html | 117 + .../html/functions_0x65.html | 135 + .../html/functions_0x66.html | 180 ++ .../html/functions_0x67.html | 104 + .../html/functions_0x68.html | 94 + .../html/functions_0x69.html | 143 + .../html/functions_0x6a.html | 87 + .../html/functions_0x6c.html | 106 + .../html/functions_0x6d.html | 100 + .../html/functions_0x6e.html | 89 + .../html/functions_0x6f.html | 129 + .../html/functions_0x70.html | 126 + .../html/functions_0x72.html | 157 + .../html/functions_0x73.html | 188 ++ .../html/functions_0x74.html | 118 + .../html/functions_0x75.html | 92 + .../html/functions_0x76.html | 100 + .../html/functions_0x77.html | 118 + .../html/functions_enum.html | 59 + .../html/functions_eval.html | 65 + .../html/functions_func.html | 86 + .../html/functions_func_0x62.html | 92 + .../html/functions_func_0x63.html | 127 + .../html/functions_func_0x64.html | 98 + .../html/functions_func_0x65.html | 114 + .../html/functions_func_0x66.html | 119 + .../html/functions_func_0x67.html | 98 + .../html/functions_func_0x69.html | 132 + .../html/functions_func_0x6c.html | 87 + .../html/functions_func_0x6d.html | 84 + .../html/functions_func_0x6f.html | 111 + .../html/functions_func_0x70.html | 108 + .../html/functions_func_0x72.html | 134 + .../html/functions_func_0x73.html | 149 + .../html/functions_func_0x74.html | 97 + .../html/functions_func_0x75.html | 83 + .../html/functions_func_0x76.html | 89 + .../html/functions_func_0x77.html | 108 + .../html/functions_type.html | 74 + .../html/functions_vars.html | 502 ++++ libs/SdFatBeta20120108/html/globals.html | 594 ++++ libs/SdFatBeta20120108/html/globals_defs.html | 96 + libs/SdFatBeta20120108/html/globals_func.html | 226 ++ libs/SdFatBeta20120108/html/globals_type.html | 72 + libs/SdFatBeta20120108/html/globals_vars.html | 384 +++ libs/SdFatBeta20120108/html/graph_legend.html | 105 + libs/SdFatBeta20120108/html/graph_legend.png | Bin 0 -> 13683 bytes libs/SdFatBeta20120108/html/hierarchy.html | 107 + libs/SdFatBeta20120108/html/index.html | 111 + .../html/inherit_graph_0.png | Bin 0 -> 376 bytes .../html/inherit_graph_1.png | Bin 0 -> 458 bytes .../html/inherit_graph_10.png | Bin 0 -> 28168 bytes .../html/inherit_graph_11.png | Bin 0 -> 364 bytes .../html/inherit_graph_12.png | Bin 0 -> 402 bytes .../html/inherit_graph_13.png | Bin 0 -> 348 bytes .../html/inherit_graph_14.png | Bin 0 -> 434 bytes .../html/inherit_graph_15.png | Bin 0 -> 327 bytes .../html/inherit_graph_2.png | Bin 0 -> 425 bytes .../html/inherit_graph_3.png | Bin 0 -> 448 bytes .../html/inherit_graph_4.png | Bin 0 -> 388 bytes .../html/inherit_graph_5.png | Bin 0 -> 370 bytes .../html/inherit_graph_6.png | Bin 0 -> 524 bytes .../html/inherit_graph_7.png | Bin 0 -> 455 bytes .../html/inherit_graph_8.png | Bin 0 -> 321 bytes .../html/inherit_graph_9.png | Bin 0 -> 401 bytes libs/SdFatBeta20120108/html/inherits.html | 116 + libs/SdFatBeta20120108/html/ios_8h.html | 549 ++++ .../html/ios_8h__dep__incl.png | Bin 0 -> 17602 bytes libs/SdFatBeta20120108/html/ios_8h__incl.png | Bin 0 -> 18230 bytes libs/SdFatBeta20120108/html/iostream_8h.html | 386 +++ .../html/iostream_8h__dep__incl.png | Bin 0 -> 11184 bytes .../html/iostream_8h__incl.png | Bin 0 -> 23643 bytes libs/SdFatBeta20120108/html/istream_8h.html | 75 + .../html/istream_8h__dep__incl.png | Bin 0 -> 12520 bytes .../html/istream_8h__incl.png | Bin 0 -> 19249 bytes libs/SdFatBeta20120108/html/jquery.js | 54 + libs/SdFatBeta20120108/html/nav_f.png | Bin 0 -> 159 bytes libs/SdFatBeta20120108/html/nav_h.png | Bin 0 -> 97 bytes libs/SdFatBeta20120108/html/open.png | Bin 0 -> 118 bytes libs/SdFatBeta20120108/html/ostream_8h.html | 100 + .../html/ostream_8h__dep__incl.png | Bin 0 -> 12523 bytes .../html/ostream_8h__incl.png | Bin 0 -> 19251 bytes .../html/structdirectory_entry-members.html | 61 + .../html/structdirectory_entry.html | 259 ++ .../html/structfat32__boot-members.html | 79 + .../html/structfat32__boot.html | 517 ++++ .../html/structfat32__fsinfo-members.html | 56 + .../html/structfat32__fsinfo.html | 172 ++ .../html/structfat__boot-members.html | 72 + .../html/structfat__boot.html | 412 +++ .../html/structfpos__t-members.html | 52 + .../SdFatBeta20120108/html/structfpos__t.html | 97 + .../structmaster_boot_record-members.html | 55 + .../html/structmaster_boot_record.html | 165 + .../structmaster_boot_record__coll__graph.png | Bin 0 -> 1517 bytes .../html/structpartition_table-members.html | 61 + .../html/structpartition_table.html | 248 ++ .../html/structpgm-members.html | 52 + libs/SdFatBeta20120108/html/structpgm.html | 136 + .../html/structsetfill-members.html | 51 + .../SdFatBeta20120108/html/structsetfill.html | 111 + .../html/structsetprecision-members.html | 51 + .../html/structsetprecision.html | 111 + .../html/structsetw-members.html | 51 + libs/SdFatBeta20120108/html/structsetw.html | 111 + libs/SdFatBeta20120108/html/tab_a.png | Bin 0 -> 140 bytes libs/SdFatBeta20120108/html/tab_b.png | Bin 0 -> 178 bytes libs/SdFatBeta20120108/html/tab_h.png | Bin 0 -> 192 bytes libs/SdFatBeta20120108/html/tab_s.png | Bin 0 -> 189 bytes libs/SdFatBeta20120108/html/tabs.css | 59 + .../html/unioncache__t-members.html | 57 + .../SdFatBeta20120108/html/unioncache__t.html | 194 ++ .../html/unioncache__t__coll__graph.png | Bin 0 -> 9173 bytes libs/SdFatBeta20120108/readme.txt | 170 ++ libs/SdFatBeta20120108/troubleshooting.txt | 45 + libs/SerialPortBeta20120106/HowTo.txt | 65 + libs/SerialPortBeta20120106/SerialPort.html | 10 + .../SerialPort/SerialPort.cpp | 268 ++ .../SerialPort/SerialPort.h | 669 +++++ .../examples/ArduinoSize/ArduinoSize.pde | 10 + .../SerialPort/examples/ArduinoSize/FreeRam.h | 15 + .../examples/ArduinoTest/ArduinoTest.pde | 20 + .../examples/BufferedSize/BufferedSize.pde | 15 + .../examples/BufferedSize/FreeRam.h | 15 + .../examples/BufferedTest/BufferedTest.pde | 24 + .../examples/HelloWorld/HelloWorld.pde | 11 + .../SerialPort/examples/MegaTest/MegaTest.pde | 41 + .../MegaTestArduino/MegaTestArduino.pde | 27 + .../examples/ReadWriteTest/ReadWriteTest.pde | 32 + .../examples/UnbufferedSize/FreeRam.h | 15 + .../UnbufferedSize/UnbufferedSize.pde | 15 + .../UnbufferedTest/UnbufferedTest.pde | 24 + .../examples/WriteFlash/WriteFlash.pde | 19 + libs/SerialPortBeta20120106/changes.txt | 82 + .../html/_serial_port_8h.html | 636 ++++ .../html/annotated.html | 87 + libs/SerialPortBeta20120106/html/bc_s.png | Bin 0 -> 705 bytes .../html/class_serial_port-members.html | 103 + .../html/class_serial_port.html | 613 ++++ .../class_serial_ring_buffer-members.html | 94 + .../html/class_serial_ring_buffer.html | 393 +++ .../html/class_usart_register-members.html | 89 + libs/SerialPortBeta20120106/html/classes.html | 87 + libs/SerialPortBeta20120106/html/closed.png | Bin 0 -> 126 bytes libs/SerialPortBeta20120106/html/doxygen.css | 835 ++++++ libs/SerialPortBeta20120106/html/doxygen.png | Bin 0 -> 3942 bytes libs/SerialPortBeta20120106/html/files.html | 85 + .../html/functions.html | 223 ++ .../html/functions_func.html | 145 + .../html/functions_type.html | 91 + .../html/functions_vars.html | 106 + libs/SerialPortBeta20120106/html/globals.html | 221 ++ .../html/globals_defs.html | 118 + .../html/globals_func.html | 97 + .../html/globals_vars.html | 145 + libs/SerialPortBeta20120106/html/index.html | 80 + libs/SerialPortBeta20120106/html/installdox | 112 + libs/SerialPortBeta20120106/html/jquery.js | 54 + libs/SerialPortBeta20120106/html/nav_f.png | Bin 0 -> 159 bytes libs/SerialPortBeta20120106/html/nav_h.png | Bin 0 -> 97 bytes libs/SerialPortBeta20120106/html/open.png | Bin 0 -> 118 bytes .../html/search/all_61.html | 35 + .../html/search/all_62.html | 62 + .../html/search/all_63.html | 26 + .../html/search/all_65.html | 38 + .../html/search/all_66.html | 41 + .../html/search/all_67.html | 35 + .../html/search/all_69.html | 26 + .../html/search/all_70.html | 44 + .../html/search/all_72.html | 41 + .../html/search/all_73.html | 131 + .../html/search/all_74.html | 26 + .../html/search/all_75.html | 97 + .../html/search/all_77.html | 47 + .../html/search/classes_73.html | 30 + .../html/search/classes_75.html | 25 + .../html/search/close.png | Bin 0 -> 273 bytes .../html/search/defines_61.html | 26 + .../html/search/defines_62.html | 32 + .../html/search/defines_65.html | 26 + .../html/search/defines_73.html | 26 + .../html/search/defines_75.html | 50 + .../html/search/files_73.html | 25 + .../html/search/functions_61.html | 29 + .../html/search/functions_62.html | 44 + .../html/search/functions_63.html | 26 + .../html/search/functions_65.html | 32 + .../html/search/functions_66.html | 41 + .../html/search/functions_67.html | 35 + .../html/search/functions_69.html | 26 + .../html/search/functions_70.html | 44 + .../html/search/functions_72.html | 29 + .../html/search/functions_77.html | 47 + .../html/search/mag_sel.png | Bin 0 -> 563 bytes .../html/search/nomatches.html | 12 + .../html/search/search.css | 240 ++ .../html/search/search.js | 738 +++++ .../html/search/search_l.png | Bin 0 -> 604 bytes .../html/search/search_m.png | Bin 0 -> 158 bytes .../html/search/search_r.png | Bin 0 -> 612 bytes .../html/search/typedefs_62.html | 26 + .../html/search/variables_72.html | 32 + .../html/search/variables_73.html | 110 + .../html/search/variables_74.html | 26 + .../html/search/variables_75.html | 62 + .../html/struct_usart_register.html | 191 ++ libs/SerialPortBeta20120106/html/tab_a.png | Bin 0 -> 140 bytes libs/SerialPortBeta20120106/html/tab_b.png | Bin 0 -> 178 bytes libs/SerialPortBeta20120106/html/tab_h.png | Bin 0 -> 192 bytes libs/SerialPortBeta20120106/html/tab_s.png | Bin 0 -> 189 bytes libs/SerialPortBeta20120106/html/tabs.css | 59 + libs/SerialPortBeta20120106/readme.txt | 69 + .../SerialPortBeta20120106/serialportdiff.txt | 404 +++ 416 files changed, 73224 insertions(+) create mode 100644 OpenLog_v3_Blackbox/OpenLog_v3_Blackbox.ino create mode 100644 Readme.md create mode 100644 libs/SdFatBeta20120108/MegaSoftSpi.txt create mode 100644 libs/SdFatBeta20120108/MultipleCards.txt create mode 100644 libs/SdFatBeta20120108/QuickStart.txt create mode 100644 libs/SdFatBeta20120108/SdFat.html create mode 100644 libs/SdFatBeta20120108/SdFat/ArduinoStream.h create mode 100644 libs/SdFatBeta20120108/SdFat/Sd2Card.cpp create mode 100644 libs/SdFatBeta20120108/SdFat/Sd2Card.h create mode 100644 libs/SdFatBeta20120108/SdFat/Sd2PinMap.h create mode 100644 libs/SdFatBeta20120108/SdFat/SdBaseFile.cpp create mode 100644 libs/SdFatBeta20120108/SdFat/SdBaseFile.h create mode 100644 libs/SdFatBeta20120108/SdFat/SdFat.cpp create mode 100644 libs/SdFatBeta20120108/SdFat/SdFat.h create mode 100644 libs/SdFatBeta20120108/SdFat/SdFatConfig.h create mode 100644 libs/SdFatBeta20120108/SdFat/SdFatStructs.h create mode 100644 libs/SdFatBeta20120108/SdFat/SdFatUtil.cpp create mode 100644 libs/SdFatBeta20120108/SdFat/SdFatUtil.h create mode 100644 libs/SdFatBeta20120108/SdFat/SdFatmainpage.h create mode 100644 libs/SdFatBeta20120108/SdFat/SdFile.cpp create mode 100644 libs/SdFatBeta20120108/SdFat/SdFile.h create mode 100644 libs/SdFatBeta20120108/SdFat/SdInfo.h create mode 100644 libs/SdFatBeta20120108/SdFat/SdStream.cpp create mode 100644 libs/SdFatBeta20120108/SdFat/SdStream.h create mode 100644 libs/SdFatBeta20120108/SdFat/SdVolume.cpp create mode 100644 libs/SdFatBeta20120108/SdFat/SdVolume.h create mode 100644 libs/SdFatBeta20120108/SdFat/bufstream.h create mode 100644 libs/SdFatBeta20120108/SdFat/examples/AnalogLogger/AnalogLogger.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/HelloWorld/HelloWorld.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/OpenNext/OpenNext.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/QuickStart/QuickStart.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/ReadWriteSdFat/ReadWriteSdFat.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/SD_Size/SD_Size.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/SdFatSize/SdFatSize.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/SdFormatter/SdFormatter.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/SdInfo/SdInfo.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/TwoCards/TwoCards.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/append/append.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/average/average.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/bench/bench.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/bufstream/bufstream.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/cin_cout/cin_cout.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/eventlog/eventlog.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/fgets/fgets.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/formatting/formatting.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/getline/getline.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/readCSV/readCSV.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/readlog/readlog.pde create mode 100644 libs/SdFatBeta20120108/SdFat/examples/rename/rename.pde create mode 100644 libs/SdFatBeta20120108/SdFat/ios.h create mode 100644 libs/SdFatBeta20120108/SdFat/iostream.h create mode 100644 libs/SdFatBeta20120108/SdFat/istream.cpp create mode 100644 libs/SdFatBeta20120108/SdFat/istream.h create mode 100644 libs/SdFatBeta20120108/SdFat/ostream.cpp create mode 100644 libs/SdFatBeta20120108/SdFat/ostream.h create mode 100644 libs/SdFatBeta20120108/SdLevel.png create mode 100644 libs/SdFatBeta20120108/WorkingDirectory.txt create mode 100644 libs/SdFatBeta20120108/changes.txt create mode 100644 libs/SdFatBeta20120108/extra/FridgeLogger/LightTempSdfat.pde create mode 100644 libs/SdFatBeta20120108/extra/FridgeLogger/LightTempStreams.pde create mode 100644 libs/SdFatBeta20120108/extra/FridgeLogger/diff.txt create mode 100644 libs/SdFatBeta20120108/extra/FridgeLogger/lighttemplogger.pde create mode 100644 libs/SdFatBeta20120108/extra/FridgeLogger/readme.txt create mode 100644 libs/SdFatBeta20120108/extra/SdFatTestSuite/SdFatTestSuite.cpp create mode 100644 libs/SdFatBeta20120108/extra/SdFatTestSuite/SdFatTestSuite.h create mode 100644 libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/ATS_SD_File/ATS_SD_File.pde create mode 100644 libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/ATS_SD_Files/ATS_SD_Files.pde create mode 100644 libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/ATS_SD_Seek/ATS_SD_Seek.pde create mode 100644 libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/fstreamTest/fstreamTest.pde create mode 100644 libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/istreamTest/istreamTest.pde create mode 100644 libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/ostreamTest/ostreamTest.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatAnalogLogger/SdFatAnalogLogger.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatAppend/SdFatAppend.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatBench/SdFatBench.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatCopy/SdFatCopy.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatGPSLogger_v3/SdFatGPSLogger_v3.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatGPS_CSVSensorLogger/SdFatGPS_CSVSensorLogger.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatLs/SdFatLs.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatMakeDir/SdFatMakeDir.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatPrint/SdFatPrint.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatRawWrite/SdFatRawWrite.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatRead/SdFatRead.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatRemove/SdFatRemove.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatRewrite/SdFatRewrite.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatRmDir/SdFatRmDir.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatTail/SdFatTail.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatTimestamp/SdFatTimestamp.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatTruncate/SdFatTruncate.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/SdFatWrite/SdFatWrite.pde create mode 100644 libs/SdFatBeta20120108/extra/examplesV1/V1readme.txt create mode 100644 libs/SdFatBeta20120108/extra/extra.txt create mode 100644 libs/SdFatBeta20120108/extra/makePinInclude/makePinInclude.pde create mode 100644 libs/SdFatBeta20120108/extra/makePinInclude/readme.txt create mode 100644 libs/SdFatBeta20120108/html/_arduino_stream_8h.html create mode 100644 libs/SdFatBeta20120108/html/_arduino_stream_8h__dep__incl.png create mode 100644 libs/SdFatBeta20120108/html/_arduino_stream_8h__incl.png create mode 100644 libs/SdFatBeta20120108/html/_sd2_card_8h.html create mode 100644 libs/SdFatBeta20120108/html/_sd2_card_8h__dep__incl.png create mode 100644 libs/SdFatBeta20120108/html/_sd2_card_8h__incl.png create mode 100644 libs/SdFatBeta20120108/html/_sd_base_file_8h.html create mode 100644 libs/SdFatBeta20120108/html/_sd_base_file_8h__dep__incl.png create mode 100644 libs/SdFatBeta20120108/html/_sd_base_file_8h__incl.png create mode 100644 libs/SdFatBeta20120108/html/_sd_fat_8h.html create mode 100644 libs/SdFatBeta20120108/html/_sd_fat_8h__incl.png create mode 100644 libs/SdFatBeta20120108/html/_sd_fat_config_8h.html create mode 100644 libs/SdFatBeta20120108/html/_sd_fat_config_8h__dep__incl.png create mode 100644 libs/SdFatBeta20120108/html/_sd_fat_config_8h__incl.png create mode 100644 libs/SdFatBeta20120108/html/_sd_fat_structs_8h.html create mode 100644 libs/SdFatBeta20120108/html/_sd_fat_structs_8h__dep__incl.png create mode 100644 libs/SdFatBeta20120108/html/_sd_fat_util_8h.html create mode 100644 libs/SdFatBeta20120108/html/_sd_fat_util_8h__incl.png create mode 100644 libs/SdFatBeta20120108/html/_sd_file_8h.html create mode 100644 libs/SdFatBeta20120108/html/_sd_file_8h__dep__incl.png create mode 100644 libs/SdFatBeta20120108/html/_sd_file_8h__incl.png create mode 100644 libs/SdFatBeta20120108/html/_sd_stream_8h.html create mode 100644 libs/SdFatBeta20120108/html/_sd_stream_8h__dep__incl.png create mode 100644 libs/SdFatBeta20120108/html/_sd_stream_8h__incl.png create mode 100644 libs/SdFatBeta20120108/html/_sd_volume_8h.html create mode 100644 libs/SdFatBeta20120108/html/_sd_volume_8h__dep__incl.png create mode 100644 libs/SdFatBeta20120108/html/_sd_volume_8h__incl.png create mode 100644 libs/SdFatBeta20120108/html/annotated.html create mode 100644 libs/SdFatBeta20120108/html/bc_s.png create mode 100644 libs/SdFatBeta20120108/html/bufstream_8h.html create mode 100644 libs/SdFatBeta20120108/html/bufstream_8h__dep__incl.png create mode 100644 libs/SdFatBeta20120108/html/bufstream_8h__incl.png create mode 100644 libs/SdFatBeta20120108/html/class_arduino_in_stream-members.html create mode 100644 libs/SdFatBeta20120108/html/class_arduino_in_stream.html create mode 100644 libs/SdFatBeta20120108/html/class_arduino_in_stream__coll__graph.png create mode 100644 libs/SdFatBeta20120108/html/class_arduino_in_stream__inherit__graph.png create mode 100644 libs/SdFatBeta20120108/html/class_arduino_out_stream-members.html create mode 100644 libs/SdFatBeta20120108/html/class_arduino_out_stream.html create mode 100644 libs/SdFatBeta20120108/html/class_arduino_out_stream__coll__graph.png create mode 100644 libs/SdFatBeta20120108/html/class_arduino_out_stream__inherit__graph.png create mode 100644 libs/SdFatBeta20120108/html/class_print-members.html create mode 100644 libs/SdFatBeta20120108/html/class_print.html create mode 100644 libs/SdFatBeta20120108/html/class_print__inherit__graph.png create mode 100644 libs/SdFatBeta20120108/html/class_sd2_card-members.html create mode 100644 libs/SdFatBeta20120108/html/class_sd2_card.html create mode 100644 libs/SdFatBeta20120108/html/class_sd_base_file-members.html create mode 100644 libs/SdFatBeta20120108/html/class_sd_base_file.html create mode 100644 libs/SdFatBeta20120108/html/class_sd_base_file__coll__graph.png create mode 100644 libs/SdFatBeta20120108/html/class_sd_base_file__inherit__graph.png create mode 100644 libs/SdFatBeta20120108/html/class_sd_fat-members.html create mode 100644 libs/SdFatBeta20120108/html/class_sd_fat.html create mode 100644 libs/SdFatBeta20120108/html/class_sd_fat__coll__graph.png create mode 100644 libs/SdFatBeta20120108/html/class_sd_file-members.html create mode 100644 libs/SdFatBeta20120108/html/class_sd_file.html create mode 100644 libs/SdFatBeta20120108/html/class_sd_file__coll__graph.png create mode 100644 libs/SdFatBeta20120108/html/class_sd_file__inherit__graph.png create mode 100644 libs/SdFatBeta20120108/html/class_sd_stream_base-members.html create mode 100644 libs/SdFatBeta20120108/html/class_sd_stream_base.html create mode 100644 libs/SdFatBeta20120108/html/class_sd_stream_base__coll__graph.png create mode 100644 libs/SdFatBeta20120108/html/class_sd_stream_base__inherit__graph.png create mode 100644 libs/SdFatBeta20120108/html/class_sd_volume-members.html create mode 100644 libs/SdFatBeta20120108/html/class_sd_volume.html create mode 100644 libs/SdFatBeta20120108/html/class_sd_volume__coll__graph.png create mode 100644 libs/SdFatBeta20120108/html/classes.html create mode 100644 libs/SdFatBeta20120108/html/classfstream-members.html create mode 100644 libs/SdFatBeta20120108/html/classfstream.html create mode 100644 libs/SdFatBeta20120108/html/classfstream__coll__graph.png create mode 100644 libs/SdFatBeta20120108/html/classfstream__inherit__graph.png create mode 100644 libs/SdFatBeta20120108/html/classibufstream-members.html create mode 100644 libs/SdFatBeta20120108/html/classibufstream.html create mode 100644 libs/SdFatBeta20120108/html/classibufstream__coll__graph.png create mode 100644 libs/SdFatBeta20120108/html/classibufstream__inherit__graph.png create mode 100644 libs/SdFatBeta20120108/html/classifstream-members.html create mode 100644 libs/SdFatBeta20120108/html/classifstream.html create mode 100644 libs/SdFatBeta20120108/html/classifstream__coll__graph.png create mode 100644 libs/SdFatBeta20120108/html/classifstream__inherit__graph.png create mode 100644 libs/SdFatBeta20120108/html/classios-members.html create mode 100644 libs/SdFatBeta20120108/html/classios.html create mode 100644 libs/SdFatBeta20120108/html/classios__base-members.html create mode 100644 libs/SdFatBeta20120108/html/classios__base.html create mode 100644 libs/SdFatBeta20120108/html/classios__base__inherit__graph.png create mode 100644 libs/SdFatBeta20120108/html/classios__coll__graph.png create mode 100644 libs/SdFatBeta20120108/html/classios__inherit__graph.png create mode 100644 libs/SdFatBeta20120108/html/classiostream-members.html create mode 100644 libs/SdFatBeta20120108/html/classiostream.html create mode 100644 libs/SdFatBeta20120108/html/classiostream__coll__graph.png create mode 100644 libs/SdFatBeta20120108/html/classiostream__inherit__graph.png create mode 100644 libs/SdFatBeta20120108/html/classistream-members.html create mode 100644 libs/SdFatBeta20120108/html/classistream.html create mode 100644 libs/SdFatBeta20120108/html/classistream__coll__graph.png create mode 100644 libs/SdFatBeta20120108/html/classistream__inherit__graph.png create mode 100644 libs/SdFatBeta20120108/html/classobufstream-members.html create mode 100644 libs/SdFatBeta20120108/html/classobufstream.html create mode 100644 libs/SdFatBeta20120108/html/classobufstream__coll__graph.png create mode 100644 libs/SdFatBeta20120108/html/classobufstream__inherit__graph.png create mode 100644 libs/SdFatBeta20120108/html/classofstream-members.html create mode 100644 libs/SdFatBeta20120108/html/classofstream.html create mode 100644 libs/SdFatBeta20120108/html/classofstream__coll__graph.png create mode 100644 libs/SdFatBeta20120108/html/classofstream__inherit__graph.png create mode 100644 libs/SdFatBeta20120108/html/classostream-members.html create mode 100644 libs/SdFatBeta20120108/html/classostream.html create mode 100644 libs/SdFatBeta20120108/html/classostream__coll__graph.png create mode 100644 libs/SdFatBeta20120108/html/classostream__inherit__graph.png create mode 100644 libs/SdFatBeta20120108/html/closed.png create mode 100644 libs/SdFatBeta20120108/html/doxygen.css create mode 100644 libs/SdFatBeta20120108/html/doxygen.png create mode 100644 libs/SdFatBeta20120108/html/files.html create mode 100644 libs/SdFatBeta20120108/html/functions.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x62.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x63.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x64.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x65.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x66.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x67.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x68.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x69.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x6a.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x6c.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x6d.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x6e.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x6f.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x70.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x72.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x73.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x74.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x75.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x76.html create mode 100644 libs/SdFatBeta20120108/html/functions_0x77.html create mode 100644 libs/SdFatBeta20120108/html/functions_enum.html create mode 100644 libs/SdFatBeta20120108/html/functions_eval.html create mode 100644 libs/SdFatBeta20120108/html/functions_func.html create mode 100644 libs/SdFatBeta20120108/html/functions_func_0x62.html create mode 100644 libs/SdFatBeta20120108/html/functions_func_0x63.html create mode 100644 libs/SdFatBeta20120108/html/functions_func_0x64.html create mode 100644 libs/SdFatBeta20120108/html/functions_func_0x65.html create mode 100644 libs/SdFatBeta20120108/html/functions_func_0x66.html create mode 100644 libs/SdFatBeta20120108/html/functions_func_0x67.html create mode 100644 libs/SdFatBeta20120108/html/functions_func_0x69.html create mode 100644 libs/SdFatBeta20120108/html/functions_func_0x6c.html create mode 100644 libs/SdFatBeta20120108/html/functions_func_0x6d.html create mode 100644 libs/SdFatBeta20120108/html/functions_func_0x6f.html create mode 100644 libs/SdFatBeta20120108/html/functions_func_0x70.html create mode 100644 libs/SdFatBeta20120108/html/functions_func_0x72.html create mode 100644 libs/SdFatBeta20120108/html/functions_func_0x73.html create mode 100644 libs/SdFatBeta20120108/html/functions_func_0x74.html create mode 100644 libs/SdFatBeta20120108/html/functions_func_0x75.html create mode 100644 libs/SdFatBeta20120108/html/functions_func_0x76.html create mode 100644 libs/SdFatBeta20120108/html/functions_func_0x77.html create mode 100644 libs/SdFatBeta20120108/html/functions_type.html create mode 100644 libs/SdFatBeta20120108/html/functions_vars.html create mode 100644 libs/SdFatBeta20120108/html/globals.html create mode 100644 libs/SdFatBeta20120108/html/globals_defs.html create mode 100644 libs/SdFatBeta20120108/html/globals_func.html create mode 100644 libs/SdFatBeta20120108/html/globals_type.html create mode 100644 libs/SdFatBeta20120108/html/globals_vars.html create mode 100644 libs/SdFatBeta20120108/html/graph_legend.html create mode 100644 libs/SdFatBeta20120108/html/graph_legend.png create mode 100644 libs/SdFatBeta20120108/html/hierarchy.html create mode 100644 libs/SdFatBeta20120108/html/index.html create mode 100644 libs/SdFatBeta20120108/html/inherit_graph_0.png create mode 100644 libs/SdFatBeta20120108/html/inherit_graph_1.png create mode 100644 libs/SdFatBeta20120108/html/inherit_graph_10.png create mode 100644 libs/SdFatBeta20120108/html/inherit_graph_11.png create mode 100644 libs/SdFatBeta20120108/html/inherit_graph_12.png create mode 100644 libs/SdFatBeta20120108/html/inherit_graph_13.png create mode 100644 libs/SdFatBeta20120108/html/inherit_graph_14.png create mode 100644 libs/SdFatBeta20120108/html/inherit_graph_15.png create mode 100644 libs/SdFatBeta20120108/html/inherit_graph_2.png create mode 100644 libs/SdFatBeta20120108/html/inherit_graph_3.png create mode 100644 libs/SdFatBeta20120108/html/inherit_graph_4.png create mode 100644 libs/SdFatBeta20120108/html/inherit_graph_5.png create mode 100644 libs/SdFatBeta20120108/html/inherit_graph_6.png create mode 100644 libs/SdFatBeta20120108/html/inherit_graph_7.png create mode 100644 libs/SdFatBeta20120108/html/inherit_graph_8.png create mode 100644 libs/SdFatBeta20120108/html/inherit_graph_9.png create mode 100644 libs/SdFatBeta20120108/html/inherits.html create mode 100644 libs/SdFatBeta20120108/html/ios_8h.html create mode 100644 libs/SdFatBeta20120108/html/ios_8h__dep__incl.png create mode 100644 libs/SdFatBeta20120108/html/ios_8h__incl.png create mode 100644 libs/SdFatBeta20120108/html/iostream_8h.html create mode 100644 libs/SdFatBeta20120108/html/iostream_8h__dep__incl.png create mode 100644 libs/SdFatBeta20120108/html/iostream_8h__incl.png create mode 100644 libs/SdFatBeta20120108/html/istream_8h.html create mode 100644 libs/SdFatBeta20120108/html/istream_8h__dep__incl.png create mode 100644 libs/SdFatBeta20120108/html/istream_8h__incl.png create mode 100644 libs/SdFatBeta20120108/html/jquery.js create mode 100644 libs/SdFatBeta20120108/html/nav_f.png create mode 100644 libs/SdFatBeta20120108/html/nav_h.png create mode 100644 libs/SdFatBeta20120108/html/open.png create mode 100644 libs/SdFatBeta20120108/html/ostream_8h.html create mode 100644 libs/SdFatBeta20120108/html/ostream_8h__dep__incl.png create mode 100644 libs/SdFatBeta20120108/html/ostream_8h__incl.png create mode 100644 libs/SdFatBeta20120108/html/structdirectory_entry-members.html create mode 100644 libs/SdFatBeta20120108/html/structdirectory_entry.html create mode 100644 libs/SdFatBeta20120108/html/structfat32__boot-members.html create mode 100644 libs/SdFatBeta20120108/html/structfat32__boot.html create mode 100644 libs/SdFatBeta20120108/html/structfat32__fsinfo-members.html create mode 100644 libs/SdFatBeta20120108/html/structfat32__fsinfo.html create mode 100644 libs/SdFatBeta20120108/html/structfat__boot-members.html create mode 100644 libs/SdFatBeta20120108/html/structfat__boot.html create mode 100644 libs/SdFatBeta20120108/html/structfpos__t-members.html create mode 100644 libs/SdFatBeta20120108/html/structfpos__t.html create mode 100644 libs/SdFatBeta20120108/html/structmaster_boot_record-members.html create mode 100644 libs/SdFatBeta20120108/html/structmaster_boot_record.html create mode 100644 libs/SdFatBeta20120108/html/structmaster_boot_record__coll__graph.png create mode 100644 libs/SdFatBeta20120108/html/structpartition_table-members.html create mode 100644 libs/SdFatBeta20120108/html/structpartition_table.html create mode 100644 libs/SdFatBeta20120108/html/structpgm-members.html create mode 100644 libs/SdFatBeta20120108/html/structpgm.html create mode 100644 libs/SdFatBeta20120108/html/structsetfill-members.html create mode 100644 libs/SdFatBeta20120108/html/structsetfill.html create mode 100644 libs/SdFatBeta20120108/html/structsetprecision-members.html create mode 100644 libs/SdFatBeta20120108/html/structsetprecision.html create mode 100644 libs/SdFatBeta20120108/html/structsetw-members.html create mode 100644 libs/SdFatBeta20120108/html/structsetw.html create mode 100644 libs/SdFatBeta20120108/html/tab_a.png create mode 100644 libs/SdFatBeta20120108/html/tab_b.png create mode 100644 libs/SdFatBeta20120108/html/tab_h.png create mode 100644 libs/SdFatBeta20120108/html/tab_s.png create mode 100644 libs/SdFatBeta20120108/html/tabs.css create mode 100644 libs/SdFatBeta20120108/html/unioncache__t-members.html create mode 100644 libs/SdFatBeta20120108/html/unioncache__t.html create mode 100644 libs/SdFatBeta20120108/html/unioncache__t__coll__graph.png create mode 100644 libs/SdFatBeta20120108/readme.txt create mode 100644 libs/SdFatBeta20120108/troubleshooting.txt create mode 100644 libs/SerialPortBeta20120106/HowTo.txt create mode 100644 libs/SerialPortBeta20120106/SerialPort.html create mode 100644 libs/SerialPortBeta20120106/SerialPort/SerialPort.cpp create mode 100644 libs/SerialPortBeta20120106/SerialPort/SerialPort.h create mode 100644 libs/SerialPortBeta20120106/SerialPort/examples/ArduinoSize/ArduinoSize.pde create mode 100644 libs/SerialPortBeta20120106/SerialPort/examples/ArduinoSize/FreeRam.h create mode 100644 libs/SerialPortBeta20120106/SerialPort/examples/ArduinoTest/ArduinoTest.pde create mode 100644 libs/SerialPortBeta20120106/SerialPort/examples/BufferedSize/BufferedSize.pde create mode 100644 libs/SerialPortBeta20120106/SerialPort/examples/BufferedSize/FreeRam.h create mode 100644 libs/SerialPortBeta20120106/SerialPort/examples/BufferedTest/BufferedTest.pde create mode 100644 libs/SerialPortBeta20120106/SerialPort/examples/HelloWorld/HelloWorld.pde create mode 100644 libs/SerialPortBeta20120106/SerialPort/examples/MegaTest/MegaTest.pde create mode 100644 libs/SerialPortBeta20120106/SerialPort/examples/MegaTestArduino/MegaTestArduino.pde create mode 100644 libs/SerialPortBeta20120106/SerialPort/examples/ReadWriteTest/ReadWriteTest.pde create mode 100644 libs/SerialPortBeta20120106/SerialPort/examples/UnbufferedSize/FreeRam.h create mode 100644 libs/SerialPortBeta20120106/SerialPort/examples/UnbufferedSize/UnbufferedSize.pde create mode 100644 libs/SerialPortBeta20120106/SerialPort/examples/UnbufferedTest/UnbufferedTest.pde create mode 100644 libs/SerialPortBeta20120106/SerialPort/examples/WriteFlash/WriteFlash.pde create mode 100644 libs/SerialPortBeta20120106/changes.txt create mode 100644 libs/SerialPortBeta20120106/html/_serial_port_8h.html create mode 100644 libs/SerialPortBeta20120106/html/annotated.html create mode 100644 libs/SerialPortBeta20120106/html/bc_s.png create mode 100644 libs/SerialPortBeta20120106/html/class_serial_port-members.html create mode 100644 libs/SerialPortBeta20120106/html/class_serial_port.html create mode 100644 libs/SerialPortBeta20120106/html/class_serial_ring_buffer-members.html create mode 100644 libs/SerialPortBeta20120106/html/class_serial_ring_buffer.html create mode 100644 libs/SerialPortBeta20120106/html/class_usart_register-members.html create mode 100644 libs/SerialPortBeta20120106/html/classes.html create mode 100644 libs/SerialPortBeta20120106/html/closed.png create mode 100644 libs/SerialPortBeta20120106/html/doxygen.css create mode 100644 libs/SerialPortBeta20120106/html/doxygen.png create mode 100644 libs/SerialPortBeta20120106/html/files.html create mode 100644 libs/SerialPortBeta20120106/html/functions.html create mode 100644 libs/SerialPortBeta20120106/html/functions_func.html create mode 100644 libs/SerialPortBeta20120106/html/functions_type.html create mode 100644 libs/SerialPortBeta20120106/html/functions_vars.html create mode 100644 libs/SerialPortBeta20120106/html/globals.html create mode 100644 libs/SerialPortBeta20120106/html/globals_defs.html create mode 100644 libs/SerialPortBeta20120106/html/globals_func.html create mode 100644 libs/SerialPortBeta20120106/html/globals_vars.html create mode 100644 libs/SerialPortBeta20120106/html/index.html create mode 100644 libs/SerialPortBeta20120106/html/installdox create mode 100644 libs/SerialPortBeta20120106/html/jquery.js create mode 100644 libs/SerialPortBeta20120106/html/nav_f.png create mode 100644 libs/SerialPortBeta20120106/html/nav_h.png create mode 100644 libs/SerialPortBeta20120106/html/open.png create mode 100644 libs/SerialPortBeta20120106/html/search/all_61.html create mode 100644 libs/SerialPortBeta20120106/html/search/all_62.html create mode 100644 libs/SerialPortBeta20120106/html/search/all_63.html create mode 100644 libs/SerialPortBeta20120106/html/search/all_65.html create mode 100644 libs/SerialPortBeta20120106/html/search/all_66.html create mode 100644 libs/SerialPortBeta20120106/html/search/all_67.html create mode 100644 libs/SerialPortBeta20120106/html/search/all_69.html create mode 100644 libs/SerialPortBeta20120106/html/search/all_70.html create mode 100644 libs/SerialPortBeta20120106/html/search/all_72.html create mode 100644 libs/SerialPortBeta20120106/html/search/all_73.html create mode 100644 libs/SerialPortBeta20120106/html/search/all_74.html create mode 100644 libs/SerialPortBeta20120106/html/search/all_75.html create mode 100644 libs/SerialPortBeta20120106/html/search/all_77.html create mode 100644 libs/SerialPortBeta20120106/html/search/classes_73.html create mode 100644 libs/SerialPortBeta20120106/html/search/classes_75.html create mode 100644 libs/SerialPortBeta20120106/html/search/close.png create mode 100644 libs/SerialPortBeta20120106/html/search/defines_61.html create mode 100644 libs/SerialPortBeta20120106/html/search/defines_62.html create mode 100644 libs/SerialPortBeta20120106/html/search/defines_65.html create mode 100644 libs/SerialPortBeta20120106/html/search/defines_73.html create mode 100644 libs/SerialPortBeta20120106/html/search/defines_75.html create mode 100644 libs/SerialPortBeta20120106/html/search/files_73.html create mode 100644 libs/SerialPortBeta20120106/html/search/functions_61.html create mode 100644 libs/SerialPortBeta20120106/html/search/functions_62.html create mode 100644 libs/SerialPortBeta20120106/html/search/functions_63.html create mode 100644 libs/SerialPortBeta20120106/html/search/functions_65.html create mode 100644 libs/SerialPortBeta20120106/html/search/functions_66.html create mode 100644 libs/SerialPortBeta20120106/html/search/functions_67.html create mode 100644 libs/SerialPortBeta20120106/html/search/functions_69.html create mode 100644 libs/SerialPortBeta20120106/html/search/functions_70.html create mode 100644 libs/SerialPortBeta20120106/html/search/functions_72.html create mode 100644 libs/SerialPortBeta20120106/html/search/functions_77.html create mode 100644 libs/SerialPortBeta20120106/html/search/mag_sel.png create mode 100644 libs/SerialPortBeta20120106/html/search/nomatches.html create mode 100644 libs/SerialPortBeta20120106/html/search/search.css create mode 100644 libs/SerialPortBeta20120106/html/search/search.js create mode 100644 libs/SerialPortBeta20120106/html/search/search_l.png create mode 100644 libs/SerialPortBeta20120106/html/search/search_m.png create mode 100644 libs/SerialPortBeta20120106/html/search/search_r.png create mode 100644 libs/SerialPortBeta20120106/html/search/typedefs_62.html create mode 100644 libs/SerialPortBeta20120106/html/search/variables_72.html create mode 100644 libs/SerialPortBeta20120106/html/search/variables_73.html create mode 100644 libs/SerialPortBeta20120106/html/search/variables_74.html create mode 100644 libs/SerialPortBeta20120106/html/search/variables_75.html create mode 100644 libs/SerialPortBeta20120106/html/struct_usart_register.html create mode 100644 libs/SerialPortBeta20120106/html/tab_a.png create mode 100644 libs/SerialPortBeta20120106/html/tab_b.png create mode 100644 libs/SerialPortBeta20120106/html/tab_h.png create mode 100644 libs/SerialPortBeta20120106/html/tab_s.png create mode 100644 libs/SerialPortBeta20120106/html/tabs.css create mode 100644 libs/SerialPortBeta20120106/readme.txt create mode 100644 libs/SerialPortBeta20120106/serialportdiff.txt diff --git a/OpenLog_v3_Blackbox/OpenLog_v3_Blackbox.ino b/OpenLog_v3_Blackbox/OpenLog_v3_Blackbox.ino new file mode 100644 index 0000000..3cdcd39 --- /dev/null +++ b/OpenLog_v3_Blackbox/OpenLog_v3_Blackbox.ino @@ -0,0 +1,399 @@ +/* + 12-3-09 + Nathan Seidle + SparkFun Electronics 2012 + + OpenLog hardware and firmware are released under the Creative Commons Share Alike v3.0 license. + http://creativecommons.org/licenses/by-sa/3.0/ + Feel free to use, distribute, and sell varients of OpenLog. All we ask is that you include attribution of 'Based on OpenLog by SparkFun'. + + OpenLog is based on the work of Bill Greiman and sdfatlib: http://code.google.com/p/sdfatlib/ + + OpenLog is a simple serial logger based on the ATmega328 running at 16MHz. The ATmega328 + is able to talk to high capacity (larger than 2GB) SD cards. The whole purpose of this + logger was to create a logger that just powered up and worked. OpenLog ships with an Arduino/Optiboot + 115200bps serial bootloader running at 16MHz so you can load new firmware with a simple serial + connection. + + OpenLog automatically works with 512MB, 1GB, 2GB, 4GB, 8GB, and 16GB microSD cards. We recommend FAT16 for 2GB and smaller cards. We + recommend FAT32 for 4GB and larger cards. + + During power up, you will see '12<'. '1' indicates the serial connection is established. '2' indicates + the SD card has been successfully initialized. '<' indicates OpenLog is ready to receive serial characters. + + Recording constant 115200bps datastreams are supported. Throw it everything you've got! To acheive this maximum record rate, please use the + SD card formatter from : http://www.sdcard.org/consumers/formatter/. The fewer files on the card, the faster OpenLog is able to begin logging. + 200 files is ok. 2GB worth of music and pictures is not. + + Please note: The preloaded Optiboot serial bootloader is 0.5k, and begins at 0x7E00 (32,256). If the code is + larger than 32,256 bytes, you will get verification errors during serial bootloading. + + STAT1 LED is sitting on PD5 (Arduino D5) - toggles when character is received + STAT2 LED is sitting on PB5 (Arduino D13) - toggles when SPI writes happen + + LED Flashing errors @ 2Hz: + No SD card - 3 blinks + + OpenLog regularly shuts down to conserve power. If after 0.5 seconds no characters are received, OpenLog will record any unsaved characters + and go to sleep. OpenLog will automatically wake up and continue logging the instant a new character is received. + + 1.55mA idle + 15mA actively writing + + Input voltage on VCC can be 3.3 to 12V. Input voltage on RX-I pin must not exceed 6V. Output voltage on + TX-O pin will not be greater than 3.3V. This may cause problems with some systems - for example if your + attached microcontroller requires 4V minimum for serial communication (this is rare). + + v3 Blackbox edition + + This version has been modified for use with the Blackbox feature for Baseflight / Cleanflight. This version + discards the CONFIG.TXT system and instead hard-codes the correct settings (115200 baud). + + */ + +#include //We do not use the built-in SD.h file because it calls Serial.print +#include //This is a new/beta library written by Bill Greiman. You rock Bill! +#include + +SerialPort<0, 800, 0> NewSerial; +//This is a very important buffer declaration. This sets the . We set +//the TX buffer to zero because we will be spending most of our time needing to buffer the incoming (RX) characters. +//1100 fails on card init and causes FAT table corruption +//1000 works on light, +//900 works on light and is able to create config file + +#include //Needed for sleep_mode +#include //Needed for powering down perihperals such as the ADC/TWI and Timers + +//Debug turns on (1) or off (0) a bunch of verbose debug statements. Normally use (0) +//#define DEBUG 1 +#define DEBUG 0 + +//The bigger the receive buffer, the less likely we are to drop characters at high speed. However, the ATmega has a limited amount of +//RAM. This debug mode allows us to view available RAM at various stages of the program +//#define RAM_TESTING 1 //On +#define RAM_TESTING 0 //Off + +#define SEQ_FILENAME "SEQLOG00.TXT" //This is the name for the file when you're in sequential modeu + +//Internal EEPROM locations for the user settings +#define LOCATION_FILE_NUMBER_LSB 0x03 +#define LOCATION_FILE_NUMBER_MSB 0x04 + +#define BAUD_MIN 300 +#define BAUD_MAX 1000000 + +#define MODE_NEWLOG 0 +#define MODE_SEQLOG 1 + +//STAT1 is a general LED and indicates serial traffic +#define STAT1 5 //On PORTD +#define STAT1_PORT PORTD +#define STAT2 5 //On PORTB +#define STAT2_PORT PORTB +const byte statled1 = 5; //This is the normal status LED +const byte statled2 = 13; //This is the SPI LED, indicating SD traffic + +//Blinking LED error codes +#define ERROR_SD_INIT 3 +#define ERROR_NEW_BAUD 5 +#define ERROR_CARD_INIT 6 +#define ERROR_VOLUME_INIT 7 +#define ERROR_ROOT_INIT 8 +#define ERROR_FILE_OPEN 9 + +#define OFF 0x00 +#define ON 0x01 + +Sd2Card card; +SdVolume volume; +SdFile currentDirectory; + +long setting_uart_speed; //This is the baud rate that the system runs at, default is 9600. Can be 300 to 1,000,000 +byte setting_system_mode; //This is the mode the system runs in, default is MODE_NEWLOG + +//Passes back the available amount of free RAM +int freeRam() { +#if RAM_TESTING + extern int __heap_start, *__brkval; + int v; + return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); +#else + return 0; +#endif +} +void printRam() { +#if RAM_TESTING + NewSerial.print(F(" RAM:")); + NewSerial.println(freeRam()); +#endif +} + +//Handle errors by printing the error type and blinking LEDs in certain way +//The function will never exit - it loops forever inside blink_error +void systemError(byte error_type) { + NewSerial.print(F("Error ")); + switch (error_type) { + case ERROR_CARD_INIT: + NewSerial.print(F("card.init")); + blink_error(ERROR_SD_INIT); + break; + case ERROR_VOLUME_INIT: + NewSerial.print(F("volume.init")); + blink_error(ERROR_SD_INIT); + break; + case ERROR_ROOT_INIT: + NewSerial.print(F("root.init")); + blink_error(ERROR_SD_INIT); + break; + case ERROR_FILE_OPEN: + NewSerial.print(F("file.open")); + blink_error(ERROR_SD_INIT); + break; + } +} + +void setup(void) { + pinMode(statled1, OUTPUT); + + //Power down various bits of hardware to lower power usage + set_sleep_mode (SLEEP_MODE_IDLE); + sleep_enable(); + + //Shut off TWI, Timer2, Timer1, ADC + ADCSRA &= ~(1 << ADEN); //Disable ADC + ACSR = (1 << ACD); //Disable the analog comparator + DIDR0 = 0x3F; //Disable digital input buffers on all ADC0-ADC5 pins + DIDR1 = (1 << AIN1D) | (1 << AIN0D); //Disable digital input buffer on AIN1/0 + + power_twi_disable(); + power_timer1_disable(); + power_timer2_disable(); + power_adc_disable(); + + init_system_settings(); + + //Setup UART + NewSerial.begin(setting_uart_speed); + if (setting_uart_speed < 500) // check for slow baud rates + { + //There is an error in the Serial library for lower than 500bps. + //This fixes it. See issue 163: https://github.com/sparkfun/OpenLog/issues/163 + // redo USART baud rate configuration + UBRR0 = (F_CPU / (16UL * setting_uart_speed)) - 1; + UCSR0A &= ~_BV(U2X0); + } + NewSerial.print(F("1")); + + //Setup SD & FAT + if (!card.init(SPI_FULL_SPEED)) + systemError(ERROR_CARD_INIT); + if (!volume.init(&card)) + systemError(ERROR_VOLUME_INIT); + currentDirectory.close(); //We close the cD before opening root. This comes from QuickStart example. Saves 4 bytes. + if (!currentDirectory.openRoot(&volume)) + systemError(ERROR_ROOT_INIT); + + NewSerial.print(F("2")); + + printRam(); //Print the available RAM +} + +void loop(void) { + //If we are in new log mode, find a new file name to write to + if (setting_system_mode == MODE_NEWLOG) { + //new_file_name = newlog(); + append_file (newlog()); //Append the file name that newlog() returns +} + //If we are in sequential log mode, determine if seqlog.txt has been created or not, and then open it for logging + if(setting_system_mode == MODE_SEQLOG) + seqlog(); + + while(1);//We should never get this far + } + +//Log to a new file everytime the system boots +//Checks the spots in EEPROM for the next available LOG# file name +//Updates EEPROM and then appends to the new log file. +//Limited to 65535 files but this should not always be the case. +char* newlog(void) { + byte msb, lsb; + uint16_t new_file_number; + + SdFile newFile; //This will contain the file for SD writing + + //Combine two 8-bit EEPROM spots into one 16-bit number + lsb = EEPROM.read(LOCATION_FILE_NUMBER_LSB); + msb = EEPROM.read(LOCATION_FILE_NUMBER_MSB); + + new_file_number = msb; + new_file_number = new_file_number << 8; + new_file_number |= lsb; + + //If both EEPROM spots are 255 (0xFF), that means they are un-initialized (first time OpenLog has been turned on) + //Let's init them both to 0 + if ((lsb == 255) && (msb == 255)) { + new_file_number = 0; //By default, unit will start at file number zero + EEPROM.write(LOCATION_FILE_NUMBER_LSB, 0x00); + EEPROM.write(LOCATION_FILE_NUMBER_MSB, 0x00); + } + + //If we made it this far, everything looks good - let's start testing to see if our file number is the next available + + //Search for next available log spot + //char new_file_name[] = "LOG00000.TXT"; + static char new_file_name[13]; + while (1) { + sprintf_P(new_file_name, PSTR("LOG%05d.TXT"), new_file_number); //Splice the new file number into this file name + + //Try to open file, if fail (file doesn't exist), then break + if (newFile.open(¤tDirectory, new_file_name, + O_CREAT | O_EXCL | O_WRITE)) + break; + + //Try to open file and see if it is empty. If so, use it. + if (newFile.open(¤tDirectory, new_file_name, O_READ)) { + if (newFile.fileSize() == 0) { + newFile.close(); // Close this existing file we just opened. + return (new_file_name); // Use existing empty file. + } + newFile.close(); // Close this existing file we just opened. + } + + //Try the next number (wrapping to zero if we overflow) + new_file_number++; + } + newFile.close(); //Close this new file we just opened + + new_file_number++; //Increment so the next power up uses the next file # + + //Record new_file number to EEPROM + lsb = (byte)(new_file_number & 0x00FF); + msb = (byte)((new_file_number & 0xFF00) >> 8); + + EEPROM.write(LOCATION_FILE_NUMBER_LSB, lsb); // LSB + + if (EEPROM.read(LOCATION_FILE_NUMBER_MSB) != msb) + EEPROM.write(LOCATION_FILE_NUMBER_MSB, msb); // MSB + +#if DEBUG + NewSerial.print(F("\nCreated new file: ")); + NewSerial.println(new_file_name); +#endif + + // append_file(new_file_name); + return (new_file_name); +} + +//Log to the same file every time the system boots, sequentially +//Checks to see if the file SEQLOG.txt is available +//If not, create it +//If yes, append to it +//Return 0 on error +//Return anything else on sucess +void seqlog(void) { + SdFile seqFile; + + char sequentialFileName[strlen(SEQ_FILENAME)]; //Limited to 8.3 + strcpy_P(sequentialFileName, PSTR(SEQ_FILENAME)); //This is the name of the config file. 'config.sys' is probably a bad idea. + + //Try to create sequential file + if (!seqFile.open(¤tDirectory, sequentialFileName, + O_CREAT | O_WRITE)) { + NewSerial.print(F("Error creating SEQLOG\n")); + return; + } + + seqFile.close(); //Close this new file we just opened + + append_file(sequentialFileName); +} + +//This is the most important function of the device. These loops have been tweaked as much as possible. +//Modifying this loop may negatively affect how well the device can record at high baud rates. +//Appends a stream of serial data to a given file +//Assumes the currentDirectory variable has been set before entering the routine +void append_file(char* file_name) { + SdFile workingFile; + + // O_CREAT - create the file if it does not exist + // O_APPEND - seek to the end of the file prior to each write + // O_WRITE - open for write + if (!workingFile.open(¤tDirectory, file_name, O_CREAT | O_APPEND | O_WRITE)) + systemError(ERROR_FILE_OPEN); + + if (workingFile.fileSize() == 0) { + //This is a trick to make sure first cluster is allocated - found in Bill's example/beta code + workingFile.rewind(); + workingFile.sync(); + } + + NewSerial.print(F("<")); //give a different prompt to indicate no echoing + digitalWrite(statled1, HIGH); //Turn on indicator LED + + const byte LOCAL_BUFF_SIZE = 128; //This is the 2nd buffer. It pulls from the larger NewSerial buffer as quickly as possible. + byte localBuffer[LOCAL_BUFF_SIZE]; + + const uint16_t MAX_IDLE_TIME_MSEC = 500; //The number of milliseconds before unit goes to sleep + const uint16_t MAX_TIME_BEFORE_SYNC_MSEC = 5000; + uint32_t lastSyncTime = millis(); //Keeps track of the last time the file was synced + + printRam(); //Print the available RAM + + //Start recording incoming characters + while (1) { //Infinite loop + + byte n = NewSerial.read(localBuffer, sizeof(localBuffer)); //Read characters from global buffer into the local buffer + if (n > 0) { + workingFile.write(localBuffer, n); //Record the buffer to the card + + STAT1_PORT ^= (1 << STAT1); //Toggle the STAT1 LED each time we record the buffer + + //This will force a sync approximately every 5 seconds + if ((millis() - lastSyncTime) > MAX_TIME_BEFORE_SYNC_MSEC) { + //This is here to make sure a log is recorded in the instance + //where the user is throwing non-stop data at the unit from power on to forever + workingFile.sync(); //Sync the card + lastSyncTime = millis(); + } + } + //No characters recevied? + else if ((millis() - lastSyncTime) > MAX_IDLE_TIME_MSEC) { //If we haven't received any characters for a while, go to sleep + workingFile.sync(); //Sync the card before we go to sleep + + STAT1_PORT &= ~(1 << STAT1); //Turn off stat LED to save power + + power_timer0_disable(); //Shut down peripherals we don't need + power_spi_disable(); + sleep_mode(); //Stop everything and go to sleep. Wake up if serial character received + + power_spi_enable(); //After wake up, power up peripherals + power_timer0_enable(); + + lastSyncTime = millis(); //Reset the last sync time to now + } + } +} + +//The following are system functions needed for basic operation +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +//Blinks the status LEDs to indicate a type of error +void blink_error(byte ERROR_TYPE) { + while (1) { + for (int x = 0; x < ERROR_TYPE; x++) { + digitalWrite(statled1, HIGH); + delay(200); + digitalWrite(statled1, LOW); + delay(200); + } + + delay(2000); + } +} + +//Set up system settings +void init_system_settings(void) { + setting_uart_speed = 115200; + setting_system_mode = MODE_NEWLOG; +} diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..aa4b77b --- /dev/null +++ b/Readme.md @@ -0,0 +1,22 @@ +# Blackbox firmware for the OpenLog + +This modified version of [OpenLog 3 Light][] discards the "CONFIG.TXT" system that is normally used to configure the +OpenLog. Instead it hard-codes the correct settings for the Blackbox (115200 baud). This makes it more robust to power +glitches during OpenLog startup that might mess with the settings. + +You will find a zip file containing the required libraries, the source-code and the compiled hex file on the "releases" +page above. + +You'll need to copy the required libraries to your Arduino IDE's library path in order to build this from source. Copy +the `libs/SdFatBeta20120108/SdFat` and `libs/SerialPortBeta20120106/SerialPort` folders to your libraries folder directly +(don't copy the outer folders "SdFatBeta20120108" or "SerialPortBeta20120106".) + +To flash the firmware to the OpenLog, you can use an FTDI programmer like the [FTDI Basic Breakout][] along with some +way of switching the Tx and Rx pins over (since the OpenLog has them switched) like the [FTDI crossover][] . + +In the Arduino IDE, choose the "Arduino Uno" as your board and select your serial port (if you use an FTDI cable) or +your programmer if you're using one. Then click Sketch -> Verify/Compile and File -> Upload to send it to the OpenLog. + +[OpenLog 3 Light]: https://github.com/sparkfun/OpenLog/tree/master/firmware/OpenLog_v3_Light +[FTDI Basic Breakout]: https://www.sparkfun.com/products/9716 +[FTDI crossover]: https://www.sparkfun.com/products/10660 diff --git a/libs/SdFatBeta20120108/MegaSoftSpi.txt b/libs/SdFatBeta20120108/MegaSoftSpi.txt new file mode 100644 index 0000000..407723a --- /dev/null +++ b/libs/SdFatBeta20120108/MegaSoftSpi.txt @@ -0,0 +1,14 @@ +Features have been added to support an unmodified Adafruit GPS Shield +or Datalogging Shield on an Arduino Mega. + +Define MEGA_SOFT_SPI to be non-zero in SdFatConfig.h to use software SPI +on Mega Arduinos. Pins used are SS 10, MOSI 11, MISO 12, and SCK 13. + +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. + +Software SPI should work with all Datalogging Shields. + +The examples SdFatGPS_CSVSensorLogger.pde and SdFatGPSLogger_v3.pde +should work on on the Mega when MEGA_SOFT_SPI is defined. \ No newline at end of file diff --git a/libs/SdFatBeta20120108/MultipleCards.txt b/libs/SdFatBeta20120108/MultipleCards.txt new file mode 100644 index 0000000..f1ebf5f --- /dev/null +++ b/libs/SdFatBeta20120108/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/libs/SdFatBeta20120108/QuickStart.txt b/libs/SdFatBeta20120108/QuickStart.txt new file mode 100644 index 0000000..ba5a171 --- /dev/null +++ b/libs/SdFatBeta20120108/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.pde 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.pde runs successfully try more examples. diff --git a/libs/SdFatBeta20120108/SdFat.html b/libs/SdFatBeta20120108/SdFat.html new file mode 100644 index 0000000..bb02e1c --- /dev/null +++ b/libs/SdFatBeta20120108/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/libs/SdFatBeta20120108/SdFat/ArduinoStream.h b/libs/SdFatBeta20120108/SdFat/ArduinoStream.h new file mode 100644 index 0000000..8a22f8f --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/ArduinoStream.h @@ -0,0 +1,116 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 "../../libs/SdFatBeta20120108/SdFat/bufstream.h" +//============================================================================== +/** + * \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, uint16_t size) { + hw_ = &hws; + line_ = buf; + size_ = size; + } + /** read a line. */ + void readline() { + uint16_t i = 0; + uint32_t t; + line_[0] = '\0'; + while (!hw_->available()); + + while (1) { + t = millis(); + while (!hw_->available()) { + if ((millis() - t) > 10) goto done; + } + if (i >= (size_ - 1)) { + setstate(failbit); + return; + } + line_[i++] = hw_->read(); + line_[i] = '\0'; + } + done: + init(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 *line_; + uint16_t size_; + Stream* 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) : pr_(&pr) {} + protected: + /// @cond SHOW_PROTECTED + /** + * Internal do not use + * \param[in] c + */ + void putch(char c) { + if (c == '\n') pr_->write('\r'); + pr_->write(c); + } + void putstr(const char* str) {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* pr_; +}; +#endif // ArduinoStream_h diff --git a/libs/SdFatBeta20120108/SdFat/Sd2Card.cpp b/libs/SdFatBeta20120108/SdFat/Sd2Card.cpp new file mode 100644 index 0000000..ce1d63d --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/Sd2Card.cpp @@ -0,0 +1,646 @@ + +/* Arduino Sd2Card Library + * Copyright (C) 2009 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 + * . + */ +#if ARDUINO < 100 +#include +#else // ARDUINO +#include +#endif // ARDUINO +#include "../../libs/SdFatBeta20120108/SdFat/Sd2Card.h" +#include "../../libs/SdFatBeta20120108/SdFat/Sd2PinMap.h" +//------------------------------------------------------------------------------ +#ifndef SOFTWARE_SPI +// functions for hardware SPI +//------------------------------------------------------------------------------ +// make sure SPCR rate is in expected bits +#if (SPR0 != 0 || SPR1 != 1) +#error unexpected SPCR bits +#endif +/** + * Initialize hardware SPI + * Set SCK rate to F_CPU/pow(2, 1 + spiRate) for spiRate [0,6] + */ +static void spiInit(uint8_t spiRate) { + // See avr processor documentation + SPCR = (1 << SPE) | (1 << MSTR) | (spiRate >> 1); + SPSR = spiRate & 1 || spiRate == 6 ? 0 : 1 << SPI2X; +} +//------------------------------------------------------------------------------ +/** SPI receive a byte */ +static uint8_t spiRec() { + SPDR = 0XFF; + while (!(SPSR & (1 << SPIF))); + return SPDR; +} +//------------------------------------------------------------------------------ +/** SPI read data - only one call so force inline */ +static inline __attribute__((always_inline)) + void spiRead(uint8_t* buf, uint16_t nbyte) { + if (nbyte-- == 0) return; + SPDR = 0XFF; + for (uint16_t i = 0; i < nbyte; i++) { + while (!(SPSR & (1 << SPIF))); + buf[i] = SPDR; + SPDR = 0XFF; + } + while (!(SPSR & (1 << SPIF))); + buf[nbyte] = SPDR; +} +//------------------------------------------------------------------------------ +/** SPI send a byte */ +static void spiSend(uint8_t b) { + SPDR = b; + while (!(SPSR & (1 << SPIF))); +} +//------------------------------------------------------------------------------ +/** SPI send block - only one call so force inline */ +static inline __attribute__((always_inline)) + void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPDR = token; + for (uint16_t i = 0; i < 512; i += 2) { + while (!(SPSR & (1 << SPIF))); + SPDR = buf[i]; + while (!(SPSR & (1 << SPIF))); + SPDR = buf[i + 1]; + } + while (!(SPSR & (1 << SPIF))); +} +//------------------------------------------------------------------------------ +#else // SOFTWARE_SPI +//------------------------------------------------------------------------------ +/** nop to tune soft SPI timing */ +#define nop asm volatile ("nop\n\t") +//------------------------------------------------------------------------------ +/** Soft SPI receive byte */ +static uint8_t spiRec() { + uint8_t data = 0; + // no interrupts during byte receive - about 8 us + cli(); + // output pin high - like sending 0XFF + fastDigitalWrite(SPI_MOSI_PIN, HIGH); + + for (uint8_t i = 0; i < 8; i++) { + fastDigitalWrite(SPI_SCK_PIN, HIGH); + + // adjust so SCK is nice + nop; + nop; + + data <<= 1; + + if (fastDigitalRead(SPI_MISO_PIN)) data |= 1; + + fastDigitalWrite(SPI_SCK_PIN, LOW); + } + // enable interrupts + sei(); + return data; +} +//------------------------------------------------------------------------------ +/** Soft SPI read data */ +static void spiRead(uint8_t* buf, uint16_t nbyte) { + for (uint16_t i = 0; i < nbyte; i++) { + buf[i] = spiRec(); + } +} +//------------------------------------------------------------------------------ +/** Soft SPI send byte */ +static void spiSend(uint8_t data) { + // no interrupts during byte send - about 8 us + cli(); + for (uint8_t i = 0; i < 8; i++) { + fastDigitalWrite(SPI_SCK_PIN, LOW); + + fastDigitalWrite(SPI_MOSI_PIN, data & 0X80); + + data <<= 1; + + fastDigitalWrite(SPI_SCK_PIN, HIGH); + } + // hold SCK high for a few ns + nop; + nop; + nop; + nop; + + fastDigitalWrite(SPI_SCK_PIN, LOW); + // enable interrupts + sei(); +} +//------------------------------------------------------------------------------ +/** Soft SPI send block */ + void spiSendBlock(uint8_t token, const uint8_t* buf) { + spiSend(token); + for (uint16_t i = 0; i < 512; i++) { + spiSend(buf[i]); + } +} +#endif // SOFTWARE_SPI +//------------------------------------------------------------------------------ +// send command and return error code. Return zero for OK +uint8_t Sd2Card::cardCommand(uint8_t cmd, uint32_t arg) { + // select card + chipSelectLow(); + + // wait up to 300 ms if busy + waitNotBusy(300); + + // send command + spiSend(cmd | 0x40); + + // send argument + for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s); + + // send CRC + uint8_t crc = 0XFF; + if (cmd == CMD0) crc = 0X95; // correct crc for CMD0 with arg 0 + if (cmd == CMD8) crc = 0X87; // correct crc for CMD8 with arg 0X1AA + spiSend(crc); + + // skip stuff byte for stop read + if (cmd == CMD12) spiRec(); + + // wait for response + for (uint8_t i = 0; ((status_ = spiRec()) & 0X80) && i != 0XFF; i++); + return 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 = ((uint32_t)csd.v2.c_size_high << 16) + | (csd.v2.c_size_mid << 8) | csd.v2.c_size_low; + return (c_size + 1) << 10; + } else { + error(SD_CARD_ERROR_BAD_CSD); + return 0; + } +} +//------------------------------------------------------------------------------ +void Sd2Card::chipSelectHigh() { + digitalWrite(chipSelectPin_, HIGH); + // insure MISO goes high impedance + spiSend(0XFF); +} +//------------------------------------------------------------------------------ +void Sd2Card::chipSelectLow() { +#ifndef SOFTWARE_SPI + spiInit(spiRate_); +#endif // SOFTWARE_SPI + digitalWrite(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 (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; +} +//------------------------------------------------------------------------------ +/** + * Initialize an SD flash memory card. + * + * \param[in] sckRateID SPI clock rate selector. See setSckRate(). + * \param[in] chipSelectPin SD chip select pin number. + * + * \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::init(uint8_t sckRateID, uint8_t chipSelectPin) { + errorCode_ = type_ = 0; + chipSelectPin_ = chipSelectPin; + // 16-bit init start time allows over a minute + uint16_t t0 = (uint16_t)millis(); + uint32_t arg; + + // set pin modes + pinMode(chipSelectPin_, OUTPUT); + digitalWrite(chipSelectPin_, HIGH); + pinMode(SPI_MISO_PIN, INPUT); + pinMode(SPI_MOSI_PIN, OUTPUT); + pinMode(SPI_SCK_PIN, OUTPUT); + +#ifndef SOFTWARE_SPI + // SS must be in output mode even it is not chip select + pinMode(SS_PIN, OUTPUT); + // set SS high - may be chip select for another SPI device +#if SET_SPI_SS_HIGH + digitalWrite(SS_PIN, HIGH); +#endif // SET_SPI_SS_HIGH + // set SCK rate for initialization commands + spiRate_ = SPI_SD_INIT_RATE; + spiInit(spiRate_); +#endif // SOFTWARE_SPI + + // must supply min of 74 clock cycles with CS high. + for (uint8_t i = 0; i < 10; i++) spiSend(0XFF); + + // command to go idle in SPI mode + while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) { + if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { + error(SD_CARD_ERROR_CMD0); + goto fail; + } + } + // check SD version + if ((cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) { + type(SD_CARD_TYPE_SD1); + } else { + // only need last byte of r7 response + for (uint8_t i = 0; i < 4; i++) status_ = spiRec(); + if (status_ != 0XAA) { + error(SD_CARD_ERROR_CMD8); + goto fail; + } + type(SD_CARD_TYPE_SD2); + } + // initialize card and send host supports SDHC if SD2 + arg = type() == SD_CARD_TYPE_SD2 ? 0X40000000 : 0; + + while ((status_ = 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 ((spiRec() & 0XC0) == 0XC0) type(SD_CARD_TYPE_SDHC); + // discard rest of ocr - contains allowed voltage range + for (uint8_t i = 0; i < 3; i++) spiRec(); + } + chipSelectHigh(); + +#ifndef SOFTWARE_SPI + return setSckRate(sckRateID); +#else // SOFTWARE_SPI + return true; +#endif // SOFTWARE_SPI + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** + * 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) { + // 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, uint16_t count) { + // wait for start block token + uint16_t t0 = millis(); + while ((status_ = spiRec()) == 0XFF) { + if (((uint16_t)millis() - t0) > SD_READ_TIMEOUT) { + error(SD_CARD_ERROR_READ_TIMEOUT); + goto fail; + } + } + if (status_ != DATA_START_BLOCK) { + error(SD_CARD_ERROR_READ); + goto fail; + } + // transfer data + spiRead(dst, count); + + // discard CRC + spiRec(); + spiRec(); + 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) { + 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() { + chipSelectLow(); + if (cardCommand(CMD12, 0)) { + error(SD_CARD_ERROR_CMD12); + goto fail; + } + chipSelectHigh(); + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** + * Set the SPI clock rate. + * + * \param[in] sckRateID A value in the range [0, 6]. + * + * The SPI clock will be set to F_CPU/pow(2, 1 + sckRateID). The maximum + * SPI rate is F_CPU/2 for \a sckRateID = 0 and the minimum rate is F_CPU/128 + * for \a scsRateID = 6. + * + * \return The value one, true, is returned for success and the value zero, + * false, is returned for an invalid value of \a sckRateID. + */ +bool Sd2Card::setSckRate(uint8_t sckRateID) { + if (sckRateID > 6) { + error(SD_CARD_ERROR_SCK_RATE); + return false; + } + spiRate_ = sckRateID; + return true; +} +//------------------------------------------------------------------------------ +// wait for card to go not busy +bool Sd2Card::waitNotBusy(uint16_t timeoutMillis) { + uint16_t t0 = millis(); + while (spiRec() != 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) { + // 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; + + // 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) || spiRec()) { + error(SD_CARD_ERROR_WRITE_PROGRAMMING); + goto fail; + } + 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) { + spiSendBlock(token, src); + + spiSend(0xff); // dummy crc + spiSend(0xff); // dummy crc + + status_ = spiRec(); + if ((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) { + // 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; + spiSend(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/libs/SdFatBeta20120108/SdFat/Sd2Card.h b/libs/SdFatBeta20120108/SdFat/Sd2Card.h new file mode 100644 index 0000000..07a7b4a --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/Sd2Card.h @@ -0,0 +1,245 @@ +/* Arduino Sd2Card Library + * Copyright (C) 2009 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 Sd2Card_h +#define Sd2Card_h +/** + * \file + * \brief Sd2Card class for V2 SD/SDHC cards + */ +#include "../../libs/SdFatBeta20120108/SdFat/SdFatConfig.h" +#include "../../libs/SdFatBeta20120108/SdFat/SdInfo.h" +//------------------------------------------------------------------------------ +// SPI speed is F_CPU/2^(1 + index), 0 <= index <= 6 +/** Set SCK to max rate of F_CPU/2. See Sd2Card::setSckRate(). */ +uint8_t const SPI_FULL_SPEED = 0; +/** Set SCK rate to F_CPU/4. See Sd2Card::setSckRate(). */ +uint8_t const SPI_HALF_SPEED = 1; +/** Set SCK rate to F_CPU/8. See Sd2Card::setSckRate(). */ +uint8_t const SPI_QUARTER_SPEED = 2; +/** Set SCK rate to F_CPU/16. See Sd2Card::setSckRate(). */ +uint8_t const SPI_EIGHTH_SPEED = 3; +/** Set SCK rate to F_CPU/32. See Sd2Card::setSckRate(). */ +uint8_t const SPI_SIXTEENTH_SPEED = 4; +//------------------------------------------------------------------------------ +/** 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 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 (write stop) */ +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 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; +/** + * define SOFTWARE_SPI to use bit-bang SPI + */ +//------------------------------------------------------------------------------ +#if MEGA_SOFT_SPI && (defined(__AVR_ATmega1280__)||defined(__AVR_ATmega2560__)) +#define SOFTWARE_SPI +#elif USE_SOFTWARE_SPI +#define SOFTWARE_SPI +#endif // MEGA_SOFT_SPI +//------------------------------------------------------------------------------ +// SPI pin definitions - do not edit here - change in SdFatConfig.h +// +#ifndef SOFTWARE_SPI +// hardware pin defs +#ifdef SS +/** The default chip select pin for the SD card is SS. */ +uint8_t const SD_CHIP_SELECT_PIN = SS; +// The following three pins must not be redefined for hardware SPI. +/** SPI Master Out Slave In pin */ +uint8_t const SPI_MOSI_PIN = MOSI; +/** SPI Master In Slave Out pin */ +uint8_t const SPI_MISO_PIN = MISO; +/** SPI Clock pin */ +uint8_t const SPI_SCK_PIN = SCK; +#else // SS +// pre 1.0 Arduino +#include "../../libs/SdFatBeta20120108/SdFat/Sd2PinMap.h" +/** The default chip select pin for the SD card is SS. */ +uint8_t const SD_CHIP_SELECT_PIN = SS_PIN; +// The following three pins must not be redefined for hardware SPI. +/** SPI Master Out Slave In pin */ +uint8_t const SPI_MOSI_PIN = MOSI_PIN; +/** SPI Master In Slave Out pin */ +uint8_t const SPI_MISO_PIN = MISO_PIN; +/** SPI Clock pin */ +uint8_t const SPI_SCK_PIN = SCK_PIN; +#endif // SS +#else // SOFTWARE_SPI + +/** SPI chip select pin */ +uint8_t const SD_CHIP_SELECT_PIN = SOFT_SPI_CS_PIN; +/** SPI Master Out Slave In pin */ +uint8_t const SPI_MOSI_PIN = SOFT_SPI_MOSI_PIN; +/** SPI Master In Slave Out pin */ +uint8_t const SPI_MISO_PIN = SOFT_SPI_MISO_PIN; +/** SPI Clock pin */ +uint8_t const SPI_SCK_PIN = SOFT_SPI_SCK_PIN; +#endif // SOFTWARE_SPI +//------------------------------------------------------------------------------ +/** + * \class Sd2Card + * \brief Raw access to SD and SDHC flash memory cards. + */ +class Sd2Card { + public: + /** Construct an instance of Sd2Card. */ + Sd2Card() : errorCode_(SD_CARD_ERROR_INIT_NOT_CALLED), type_(0) {} + 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) {errorCode_ = code;} + /** + * \return error code for last error. See Sd2Card.h for a list of error codes. + */ + int errorCode() const {return errorCode_;} + /** \return error data for last error. */ + int errorData() const {return status_;} + /** + * Initialize an SD flash memory card with default clock rate and chip + * select pin. See sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin). + * + * \return true for success or false for failure. + */ + bool init(uint8_t sckRateID = SPI_FULL_SPEED, + uint8_t chipSelectPin = SD_CHIP_SELECT_PIN); + 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(); + bool setSckRate(uint8_t sckRateID); + /** Return the card type: SD V1, SD V2 or SDHC + * \return 0 - SD V1, 1 - SD V2, or 3 - SDHC. + */ + int type() const {return 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: + //---------------------------------------------------------------------------- + uint8_t chipSelectPin_; + uint8_t errorCode_; + uint8_t spiRate_; + uint8_t status_; + uint8_t type_; + // private functions + uint8_t cardAcmd(uint8_t cmd, uint32_t arg) { + if (!cardCommand(CMD55, 0)) return false; + return cardCommand(cmd, arg); + } + uint8_t cardCommand(uint8_t cmd, uint32_t arg); + bool readData(uint8_t* dst, uint16_t count); + bool readRegister(uint8_t cmd, void* buf); + void chipSelectHigh(); + void chipSelectLow(); + void type(uint8_t value) {type_ = value;} + bool waitNotBusy(uint16_t timeoutMillis); + bool writeData(uint8_t token, const uint8_t* src); +}; +#endif // Sd2Card_h diff --git a/libs/SdFatBeta20120108/SdFat/Sd2PinMap.h b/libs/SdFatBeta20120108/SdFat/Sd2PinMap.h new file mode 100644 index 0000000..847f9f3 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/Sd2PinMap.h @@ -0,0 +1,360 @@ +/* Arduino SdFat Library + * Copyright (C) 2010 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 + * . + */ +// Warning this file was generated by a program. +#ifndef Sd2PinMap_h +#define Sd2PinMap_h +#include +//------------------------------------------------------------------------------ +/** struct for mapping digital pins */ +struct pin_map_t { + volatile uint8_t* ddr; + volatile uint8_t* pin; + volatile uint8_t* port; + uint8_t bit; +}; +//------------------------------------------------------------------------------ +#if defined(__AVR_ATmega1280__)\ +|| defined(__AVR_ATmega2560__) +// Mega + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 20; // D1 +uint8_t const SCL_PIN = 21; // D0 + +// SPI port +uint8_t const SS_PIN = 53; // B0 +uint8_t const MOSI_PIN = 51; // B2 +uint8_t const MISO_PIN = 50; // B3 +uint8_t const SCK_PIN = 52; // B1 + +static const pin_map_t digitalPinMap[] = { + {&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_ATmega644P__)\ +|| defined(__AVR_ATmega644__)\ +|| defined(__AVR_ATmega1284P__) +// Sanguino + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 17; // C1 +uint8_t const SCL_PIN = 18; // C2 + +// SPI port +uint8_t const SS_PIN = 4; // B4 +uint8_t const MOSI_PIN = 5; // B5 +uint8_t const MISO_PIN = 6; // B6 +uint8_t const SCK_PIN = 7; // B7 + +static const pin_map_t digitalPinMap[] = { + {&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, 7}, // A7 24 + {&DDRA, &PINA, &PORTA, 6}, // A6 25 + {&DDRA, &PINA, &PORTA, 5}, // A5 26 + {&DDRA, &PINA, &PORTA, 4}, // A4 27 + {&DDRA, &PINA, &PORTA, 3}, // A3 28 + {&DDRA, &PINA, &PORTA, 2}, // A2 29 + {&DDRA, &PINA, &PORTA, 1}, // A1 30 + {&DDRA, &PINA, &PORTA, 0} // A0 31 +}; +//------------------------------------------------------------------------------ +#elif defined(__AVR_ATmega32U4__) +// Teensy 2.0 + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 6; // D1 +uint8_t const SCL_PIN = 5; // D0 + +// SPI port +uint8_t const SS_PIN = 0; // B0 +uint8_t const MOSI_PIN = 2; // B2 +uint8_t const MISO_PIN = 3; // B3 +uint8_t const SCK_PIN = 1; // B1 + +static const pin_map_t digitalPinMap[] = { + {&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 +}; +//------------------------------------------------------------------------------ +#elif defined(__AVR_AT90USB646__)\ +|| defined(__AVR_AT90USB1286__) +// Teensy++ 1.0 & 2.0 + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 1; // D1 +uint8_t const SCL_PIN = 0; // D0 + +// SPI port +uint8_t const SS_PIN = 20; // B0 +uint8_t const MOSI_PIN = 22; // B2 +uint8_t const MISO_PIN = 23; // B3 +uint8_t const SCK_PIN = 21; // B1 + +static const pin_map_t digitalPinMap[] = { + {&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 +}; +//------------------------------------------------------------------------------ +#elif defined(__AVR_ATmega168__)\ +||defined(__AVR_ATmega168P__)\ +||defined(__AVR_ATmega328P__) +// 168 and 328 Arduinos + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 18; // C4 +uint8_t const SCL_PIN = 19; // C5 + +// SPI port +uint8_t const SS_PIN = 10; // B2 +uint8_t const MOSI_PIN = 11; // B3 +uint8_t const MISO_PIN = 12; // B4 +uint8_t const SCK_PIN = 13; // B5 + +static const pin_map_t digitalPinMap[] = { + {&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 +}; +#else // defined(__AVR_ATmega1280__) +#error unknown chip +#endif // defined(__AVR_ATmega1280__) +//------------------------------------------------------------------------------ +static const uint8_t digitalPinCount = sizeof(digitalPinMap)/sizeof(pin_map_t); + +uint8_t badPinNumber(void) + __attribute__((error("Pin number is too large or not a constant"))); + +static inline __attribute__((always_inline)) + bool getPinMode(uint8_t pin) { + if (__builtin_constant_p(pin) && pin < digitalPinCount) { + return (*digitalPinMap[pin].ddr >> digitalPinMap[pin].bit) & 1; + } else { + return badPinNumber(); + } +} +static inline __attribute__((always_inline)) + void setPinMode(uint8_t pin, uint8_t mode) { + if (__builtin_constant_p(pin) && pin < digitalPinCount) { + if (mode) { + *digitalPinMap[pin].ddr |= 1 << digitalPinMap[pin].bit; + } else { + *digitalPinMap[pin].ddr &= ~(1 << digitalPinMap[pin].bit); + } + } else { + badPinNumber(); + } +} +static inline __attribute__((always_inline)) + bool fastDigitalRead(uint8_t pin) { + if (__builtin_constant_p(pin) && pin < digitalPinCount) { + return (*digitalPinMap[pin].pin >> digitalPinMap[pin].bit) & 1; + } else { + return badPinNumber(); + } +} +static inline __attribute__((always_inline)) + void fastDigitalWrite(uint8_t pin, uint8_t value) { + if (__builtin_constant_p(pin) && pin < digitalPinCount) { + if (value) { + *digitalPinMap[pin].port |= 1 << digitalPinMap[pin].bit; + } else { + *digitalPinMap[pin].port &= ~(1 << digitalPinMap[pin].bit); + } + } else { + badPinNumber(); + } +} +#endif // Sd2PinMap_h diff --git a/libs/SdFatBeta20120108/SdFat/SdBaseFile.cpp b/libs/SdFatBeta20120108/SdFat/SdBaseFile.cpp new file mode 100644 index 0000000..6b3456b --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/SdBaseFile.cpp @@ -0,0 +1,1827 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 "../../libs/SdFatBeta20120108/SdFat/SdFat.h" +//------------------------------------------------------------------------------ +// pointer to cwd directory +SdBaseFile* SdBaseFile::cwd_ = 0; +// callback function for date/time +void (*SdBaseFile::dateTime_)(uint16_t* date, uint16_t* time) = 0; +//------------------------------------------------------------------------------ +// add a cluster to a file +bool SdBaseFile::addCluster() { + if (!vol_->allocContiguous(1, &curCluster_)) goto fail; + + // if first cluster of file link to directory entry + if (firstCluster_ == 0) { + firstCluster_ = curCluster_; + 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 +bool SdBaseFile::addDirCluster() { + uint32_t block; + // max folder size + if (fileSize_/sizeof(dir_t) >= 0XFFFF) goto fail; + + if (!addCluster()) goto fail; + if (!vol_->cacheFlush()) goto fail; + + block = vol_->clusterStartBlock(curCluster_); + + // set cache to first block of cluster + vol_->cacheSetBlockNumber(block, true); + + // zero first block of cluster + memset(vol_->cacheBuffer_.data, 0, 512); + + // zero rest of cluster + for (uint8_t i = 1; i < vol_->blocksPerCluster_; i++) { + if (!vol_->writeBlock(block + i, vol_->cacheBuffer_.data)) goto fail; + } + // Increase directory file size by cluster size + fileSize_ += 512UL << vol_->clusterSizeShift_; + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +// cache a file's directory entry +// return pointer to cached entry or null for failure +dir_t* SdBaseFile::cacheDirEntry(uint8_t action) { + if (!vol_->cacheRawBlock(dirBlock_, action)) goto fail; + return vol_->cache()->dir + 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(); + 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 (firstCluster_ == 0) goto fail; + + for (uint32_t c = firstCluster_; ; c++) { + uint32_t next; + if (!vol_->fatGet(c, &next)) goto fail; + + // check for contiguous + if (next != (c + 1)) { + // error if not end of chain + if (!vol_->isEOC(next)) goto fail; + *bgnBlock = vol_->clusterStartBlock(firstCluster_); + *endBlock = vol_->clusterStartBlock(c) + + 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) goto fail; + if (!open(dirFile, path, O_CREAT | O_EXCL | O_RDWR)) goto fail; + + // calculate number of clusters needed + count = ((size - 1) >> (vol_->clusterSizeShift_ + 9)) + 1; + + // allocate clusters + if (!vol_->allocContiguous(count, &firstCluster_)) { + remove(); + goto fail; + } + fileSize_ = size; + + // insure sync() will update dir entry + 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()) goto fail; + + // read entry + p = cacheDirEntry(SdVolume::CACHE_FOR_READ); + if (!p) 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) { + if (!isOpen()) return false; + + if (isRoot()) { + name[0] = '/'; + name[1] = '\0'; + return true; + } + // cache entry + dir_t* p = cacheDirEntry(SdVolume::CACHE_FOR_READ); + if (!p) return false; + + // format name + dirName(*p, name); + return true; +} +//------------------------------------------------------------------------------ +void SdBaseFile::getpos(fpos_t* pos) { + pos->position = curPosition_; + pos->cluster = curCluster_; +} +//------------------------------------------------------------------------------ +/** 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) { + 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; +} +//------------------------------------------------------------------------------ +// 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) goto fail; // only one dot allowed + n = 10; // max index for full 8.3 name + i = 8; // place for extension + } else { + // illegal FAT characters +#define FLASH_ILLEGAL_CHARS +#ifdef FLASH_ILLEGAL_CHARS + // store chars in flash + PGM_P p = PSTR("|<>^+=?/[];,*\"\\"); + uint8_t b; + while ((b = pgm_read_byte(p++))) if (b == c) goto fail; +#else // FLASH_ILLEGAL_CHARS + // store chars in RAM + if (strchr("|<>^+=?/[];,*\"\\", c)) goto fail; +#endif // FLASH_ILLEGAL_CHARS + + // check size and only allow ASCII printable characters + if (i > n || c < 0X21 || c > 0X7E)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()) goto fail; + + if (*path == '/') { + while (*path == '/') path++; + if (!parent->isRoot()) { + if (!dir2.openRoot(parent->vol_)) goto fail; + parent = &dir2; + } + } + while (1) { + if (!make83Name(path, dname, &path)) goto fail; + while (*path == '/') path++; + if (!*path) break; + if (!sub->open(parent, dname, O_READ)) { + if (!pFlag || !sub->mkdir(parent, dname)) { + 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; + + if (!parent->isDir()) goto fail; + + // create a normal file + if (!open(parent, dname, O_CREAT | O_EXCL | O_RDWR)) goto fail; + + // convert file to directory + flags_ = O_READ; + type_ = FAT_FILE_TYPE_SUBDIR; + + // allocate and zero first cluster + if (!addDirCluster())goto fail; + + // force entry to SD + if (!sync()) goto fail; + + // cache entry - should already be in cache due to sync() call + p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!p) 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 = vol_->clusterStartBlock(firstCluster_); + if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) goto fail; + + // copy '.' to block + memcpy(&vol_->cache()->dir[0], &d, sizeof(d)); + + // make entry for '..' + d.name[1] = '.'; + if (parent->isRoot()) { + d.firstClusterLow = 0; + d.firstClusterHigh = 0; + } else { + d.firstClusterLow = parent->firstCluster_ & 0XFFFF; + d.firstClusterHigh = parent->firstCluster_ >> 16; + } + // copy '..' to block + memcpy(&vol_->cache()->dir[1], &d, sizeof(d)); + + // write first block + return vol_->cacheFlush(); + + 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(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) goto fail; + + // error if already open + if (isOpen()) goto fail; + + if (*path == '/') { + while (*path == '/') path++; + if (!dirFile->isRoot()) { + if (!dir2.openRoot(dirFile->vol_)) goto fail; + parent = &dir2; + } + } + while (1) { + if (!make83Name(path, dname, &path)) goto fail; + while (*path == '/') path++; + if (!*path) break; + if (!sub->open(parent, dname, O_READ)) 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) { + bool emptyFound = false; + bool fileFound = false; + uint8_t index; + dir_t* p; + + vol_ = dirFile->vol_; + + dirFile->rewind(); + // search for file + + while (dirFile->curPosition_ < dirFile->fileSize_) { + index = 0XF & (dirFile->curPosition_ >> 5); + p = dirFile->readDirCache(); + if (!p) goto fail; + + if (p->name[0] == DIR_NAME_FREE || p->name[0] == DIR_NAME_DELETED) { + // remember first empty slot + if (!emptyFound) { + dirBlock_ = dirFile->vol_->cacheBlockNumber(); + dirIndex_ = index; + emptyFound = true; + } + // done if no entries follow + if (p->name[0] == DIR_NAME_FREE) break; + } else if (!memcmp(dname, p->name, 11)) { + fileFound = true; + break; + } + } + if (fileFound) { + // don't open existing file if O_EXCL + if (oflag & O_EXCL) goto fail; + } else { + // don't create unless O_CREAT and O_WRITE + if (!(oflag & O_CREAT) || !(oflag & O_WRITE)) goto fail; + if (emptyFound) { + index = dirIndex_; + p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!p) goto fail; + } else { + if (dirFile->type_ == FAT_FILE_TYPE_ROOT_FIXED) goto fail; + + // add and zero cluster for dirFile - first cluster is in cache for write + if (!dirFile->addDirCluster()) goto fail; + + // use first entry in cluster + p = dirFile->vol_->cache()->dir; + index = 0; + } + // initialize as empty file + memset(p, 0, sizeof(dir_t)); + memcpy(p->name, dname, 11); + + // set timestamps + if (dateTime_) { + // call user date/time function + 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->vol_->cacheFlush()) 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; + + vol_ = dirFile->vol_; + + // error if already open + if (isOpen() || !dirFile) goto fail; + + // don't open existing file if O_EXCL - user call error + if (oflag & O_EXCL) goto fail; + + // seek to location of entry + if (!dirFile->seekSet(32 * index)) goto fail; + + // read entry into cache + p = dirFile->readDirCache(); + if (!p) goto fail; + + // error if empty slot or '.' or '..' + if (p->name[0] == DIR_NAME_FREE || + p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') { + goto fail; + } + // open cached entry + return openCachedEntry(index & 0XF, oflag); + + fail: + return false; +} +//------------------------------------------------------------------------------ +// open a cached directory entry. Assumes vol_ is initialized +bool SdBaseFile::openCachedEntry(uint8_t dirIndex, uint8_t oflag) { + // location of entry in cache + dir_t* p = &vol_->cache()->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)) goto fail; + } + // remember location of directory entry on SD + dirBlock_ = vol_->cacheBlockNumber(); + dirIndex_ = dirIndex; + + // copy first cluster number for directory fields + firstCluster_ = (uint32_t)p->firstClusterHigh << 16; + firstCluster_ |= p->firstClusterLow; + + // make sure it is a normal file or subdirectory + if (DIR_IS_FILE(p)) { + fileSize_ = p->fileSize; + type_ = FAT_FILE_TYPE_NORMAL; + } else if (DIR_IS_SUBDIR(p)) { + if (!vol_->chainSize(firstCluster_, &fileSize_)) goto fail; + type_ = FAT_FILE_TYPE_SUBDIR; + } else { + goto fail; + } + // save open flags for read/write + flags_ = oflag & F_OFLAG; + + // set to start of file + curCluster_ = 0; + curPosition_ = 0; + if ((oflag & O_TRUNC) && !truncate(0)) return false; + return oflag & O_AT_END ? seekEnd(0) : true; + + fail: + 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) goto fail; + + // error if already open + if (isOpen()) goto fail; + + vol_ = dirFile->vol_; + + while (1) { + index = 0XF & (dirFile->curPosition_ >> 5); + + // read entry into cache + p = dirFile->readDirCache(); + if (!p) goto fail; + + // done if last entry + if (p->name[0] == DIR_NAME_FREE) 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; + // error if already open or dir is root or dir is not a directory + if (isOpen() || !dir || dir->isRoot() || !dir->isDir()) goto fail; + vol_ = dir->vol_; + // position to '..' + if (!dir->seekSet(32)) goto fail; + // read '..' entry + if (dir->read(&entry, sizeof(entry)) != 32) goto fail; + // verify it is '..' + if (entry.name[0] != '.' || entry.name[1] != '.') goto fail; + // start cluster for '..' + cluster = entry.firstClusterLow; + cluster |= (uint32_t)entry.firstClusterHigh << 16; + if (cluster == 0) return openRoot(vol_); + // start block for '..' + lbn = vol_->clusterStartBlock(cluster); + // first block of parent dir + if (!vol_->cacheRawBlock(lbn, SdVolume::CACHE_FOR_READ)) { + goto fail; + } + p = &vol_->cacheBuffer_.dir[1]; + // verify name for '../..' + if (p->name[0] != '.' || p->name[1] != '.') 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())) goto fail; + } else { + if (!file.openCachedEntry(1, O_READ)) goto fail; + } + // search for parent in '../..' + do { + if (file.readDir(&entry) != 32) 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()) goto fail; + + if (vol->fatType() == 16 || (FAT12_SUPPORT && vol->fatType() == 12)) { + type_ = FAT_FILE_TYPE_ROOT_FIXED; + firstCluster_ = 0; + fileSize_ = 32 * vol->rootDirEntryCount(); + } else if (vol->fatType() == 32) { + type_ = FAT_FILE_TYPE_ROOT32; + firstCluster_ = vol->rootDirStart(); + if (!vol->chainSize(firstCluster_, &fileSize_)) goto fail; + } else { + // volume is not initialized, invalid, or FAT12 without support + return false; + } + vol_ = vol; + // read only + flags_ = O_READ; + + // set to start of file + curCluster_ = 0; + curPosition_ = 0; + + // root has no directory entry + dirBlock_ = 0; + 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() { + fpos_t pos; + getpos(&pos); + int c = read(); + if (c >= 0) setpos(&pos); + return c; +} +//------------------------------------------------------------------------------ +/** %Print the name field of a directory entry in 8.3 format to stdOut. + * + * \param[in] dir The directory structure containing the name. + * \param[in] width Blank fill name if length is less than \a width. + * \param[in] printSlash Print '/' after directory names if true. + */ +void SdBaseFile::printDirName(const dir_t& dir, + uint8_t width, bool printSlash) { + printDirName(SdFat::stdOut(), dir, width, printSlash); +} +//------------------------------------------------------------------------------ +/** %Print the name field of a directory entry in 8.3 format. + * \param[in] pr Print stream for output. + * \param[in] dir The directory structure containing the name. + * \param[in] width Blank fill name if length is less than \a width. + * \param[in] printSlash Print '/' after directory names if true. + */ +void SdBaseFile::printDirName(Print* pr, const dir_t& dir, + uint8_t width, bool printSlash) { + uint8_t w = 0; + 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) && printSlash) { + pr->write('/'); + w++; + } + while (w < width) { + pr->write(' '); + w++; + } +} +//------------------------------------------------------------------------------ +// 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 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)); +} +//------------------------------------------------------------------------------ +/** 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. + */ +bool SdBaseFile::printName() { + char name[13]; + if (!getFilename(name)) return false; + SdFat::stdOut()->print(name); + return true; +} +//------------------------------------------------------------------------------ +/** 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. + */ +int16_t SdBaseFile::read(void* buf, uint16_t nbyte) { + uint8_t* dst = reinterpret_cast(buf); + uint16_t offset; + uint16_t toRead; + uint32_t block; // raw device block number + + // error if not open or write only + if (!isOpen() || !(flags_ & O_READ)) goto fail; + + // max bytes left in file + if (nbyte >= (fileSize_ - curPosition_)) { + nbyte = fileSize_ - curPosition_; + } + // amount left to read + toRead = nbyte; + while (toRead > 0) { + offset = curPosition_ & 0X1FF; // offset in block + if (type_ == FAT_FILE_TYPE_ROOT_FIXED) { + block = vol_->rootDirStart() + (curPosition_ >> 9); + } else { + uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_); + if (offset == 0 && blockOfCluster == 0) { + // start of new cluster + if (curPosition_ == 0) { + // use first cluster in file + curCluster_ = firstCluster_; + } else { + // get next cluster from FAT + if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail; + } + } + block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; + } + uint16_t n = toRead; + + // amount to be read from current block + if (n > (512 - offset)) n = 512 - offset; + + // no buffering needed if n == 512 + if (n == 512 && block != vol_->cacheBlockNumber()) { + if (!vol_->readBlock(block, dst)) goto fail; + } else { + // read block to cache and copy data to caller + if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_READ)) goto fail; + uint8_t* src = vol_->cache()->data + offset; + memcpy(dst, src, n); + } + dst += n; + 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 & 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()) goto fail; + + // index of entry in cache + i = (curPosition_ >> 5) & 0XF; + + // use read to locate and cache block + if (read() < 0) goto fail; + + // advance to next entry + curPosition_ += 31; + + // return pointer to entry + return vol_->cache()->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)) goto fail; + + // cache directory entry + d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) goto fail; + + // mark entry deleted + d->name[0] = DIR_NAME_DELETED; + + // set this file closed + type_ = FAT_FILE_TYPE_CLOSED; + + // write entry to SD + return vol_->cacheFlush(); + 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)) goto fail; + return file.remove(); + + fail: + // can't set iostate - static function + 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; + dir_t* d; + + // must be an open file or subdirectory + if (!(isFile() || isSubDir())) goto fail; + + // can't move file + if (vol_ != dirFile->vol_) goto fail; + + // sync() and cache directory entry + sync(); + d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) 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.firstCluster_; + } + // change to new directory entry + dirBlock_ = file.dirBlock_; + dirIndex_ = file.dirIndex_; + + // mark closed to avoid possible destructor close call + file.type_ = FAT_FILE_TYPE_CLOSED; + + // cache new directory entry + d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) 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 = vol_->clusterStartBlock(dirCluster); + if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_READ)) goto fail; + memcpy(&entry, &vol_->cache()->dir[1], sizeof(entry)); + + // free unused cluster + if (!vol_->freeChain(dirCluster)) goto fail; + + // store new dot dot + block = vol_->clusterStartBlock(firstCluster_); + if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) goto fail; + memcpy(&vol_->cache()->dir[1], &entry, sizeof(entry)); + } + return vol_->cacheFlush(); + + restore: + d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) goto fail; + // restore entry + d->name[0] = entry.name[0]; + vol_->cacheFlush(); + + 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()) goto fail; + + rewind(); + + // make sure directory is empty + while (curPosition_ < fileSize_) { + dir_t* p = readDirCache(); + if (!p) 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)) goto fail; + } + // convert empty directory to normal file for remove + type_ = FAT_FILE_TYPE_NORMAL; + 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 (curPosition_ < fileSize_) { + // remember position + index = curPosition_/32; + + dir_t* p = readDirCache(); + if (!p) 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)) goto fail; + if (f.isSubDir()) { + // recursively delete + if (!f.rmRfStar()) goto fail; + } else { + // ignore read-only + f.flags_ |= O_WRITE; + if (!f.remove()) goto fail; + } + // position to next entry if required + if (curPosition_ != (32*(index + 1))) { + if (!seekSet(32*(index + 1))) goto fail; + } + } + // don't try to delete root + if (!isRoot()) { + if (!rmdir()) 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) { + 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 > fileSize_) goto fail; + + if (type_ == FAT_FILE_TYPE_ROOT_FIXED) { + curPosition_ = pos; + goto done; + } + if (pos == 0) { + // set position to start of file + curCluster_ = 0; + curPosition_ = 0; + goto done; + } + // calculate cluster index for cur and new position + nCur = (curPosition_ - 1) >> (vol_->clusterSizeShift_ + 9); + nNew = (pos - 1) >> (vol_->clusterSizeShift_ + 9); + + if (nNew < nCur || curPosition_ == 0) { + // must follow chain from first cluster + curCluster_ = firstCluster_; + } else { + // advance from curPosition + nNew -= nCur; + } + while (nNew--) { + if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail; + } + curPosition_ = pos; + + done: + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +void SdBaseFile::setpos(fpos_t* pos) { + curPosition_ = pos->position; + 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()) goto fail; + + if (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) goto fail; + + // do not set filesize for dir files + if (!isDir()) d->fileSize = fileSize_; + + // update first cluster fields + d->firstClusterLow = firstCluster_ & 0XFFFF; + d->firstClusterHigh = firstCluster_ >> 16; + + // set modify time if user supplied a callback date/time function + if (dateTime_) { + dateTime_(&d->lastWriteDate, &d->lastWriteTime); + d->lastAccessDate = d->lastWriteDate; + } + // clear directory dirty + flags_ &= ~F_FILE_DIR_DIRTY; + } + return vol_->cacheFlush(); + + 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)) goto fail; + + // update directory fields + if (!sync()) goto fail; + + d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) 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 vol_->cacheFlush(); + + 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) { + goto fail; + } + // update directory entry + if (!sync()) goto fail; + + d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) 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 vol_->cacheFlush(); + + 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() || !(flags_ & O_WRITE)) goto fail; + + // error if length is greater than current size + if (length > fileSize_) goto fail; + + // fileSize and length are zero - nothing to do + if (fileSize_ == 0) return true; + + // remember position for seek after truncation + newPos = curPosition_ > length ? length : curPosition_; + + // position to last cluster in truncated file + if (!seekSet(length)) goto fail; + + if (length == 0) { + // free all clusters + if (!vol_->freeChain(firstCluster_)) goto fail; + firstCluster_ = 0; + } else { + uint32_t toFree; + if (!vol_->fatGet(curCluster_, &toFree)) goto fail; + + if (!vol_->isEOC(toFree)) { + // free extra clusters + if (!vol_->freeChain(toFree)) goto fail; + + // current cluster is end of chain + if (!vol_->fatPutEOC(curCluster_)) goto fail; + } + } + fileSize_ = length; + + // need to update directory entry + flags_ |= F_FILE_DIR_DIRTY; + + if (!sync()) 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. + * + */ +int16_t SdBaseFile::write(const void* buf, uint16_t nbyte) { + // convert void* to uint8_t* - must be before goto statements + const uint8_t* src = reinterpret_cast(buf); + + // number of bytes left to write - must be before goto statements + uint16_t nToWrite = nbyte; + + // error if not a normal file or is read-only + if (!isFile() || !(flags_ & O_WRITE)) goto fail; + + // seek to end of file if append flag + if ((flags_ & O_APPEND) && curPosition_ != fileSize_) { + if (!seekEnd()) goto fail; + } + + while (nToWrite > 0) { + uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_); + uint16_t blockOffset = curPosition_ & 0X1FF; + if (blockOfCluster == 0 && blockOffset == 0) { + // start of new cluster + if (curCluster_ != 0) { + uint32_t next; + if (!vol_->fatGet(curCluster_, &next)) goto fail; + if (vol_->isEOC(next)) { + // add cluster if at end of chain + if (!addCluster()) goto fail; + } else { + curCluster_ = next; + } + } else { + if (firstCluster_ == 0) { + // allocate first cluster of file + if (!addCluster()) goto fail; + } else { + curCluster_ = firstCluster_; + } + } + } + // max space in block + uint16_t n = 512 - blockOffset; + + // lesser of space and amount to write + if (n > nToWrite) n = nToWrite; + + // block for data write + uint32_t block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; + if (n == 512) { + // full block - don't need to use cache + if (vol_->cacheBlockNumber() == block) { + // invalidate cache if block is in cache + vol_->cacheSetBlockNumber(0XFFFFFFFF, false); + } + if (!vol_->writeBlock(block, src)) goto fail; + } else { + if (blockOffset == 0 && curPosition_ >= fileSize_) { + // start of new block don't need to read into cache + if (!vol_->cacheFlush()) goto fail; + // set cache dirty and SD address of block + vol_->cacheSetBlockNumber(block, true); + } else { + // rewrite part of block + if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) goto fail; + } + uint8_t* dst = vol_->cache()->data + blockOffset; + memcpy(dst, src, n); + } + curPosition_ += n; + src += n; + nToWrite -= n; + } + if (curPosition_ > fileSize_) { + // update fileSize and insure sync will update dir entry + fileSize_ = curPosition_; + flags_ |= F_FILE_DIR_DIRTY; + } else if (dateTime_ && nbyte) { + // insure sync will update modified date and time + flags_ |= F_FILE_DIR_DIRTY; + } + + if (flags_ & O_SYNC) { + if (!sync()) goto fail; + } + return nbyte; + + fail: + // return for write error + writeError = true; + return -1; +} +//------------------------------------------------------------------------------ +// suppress cpplint warnings with NOLINT comment +#if ALLOW_DEPRECATED_FUNCTIONS && !defined(DOXYGEN) +void (*SdBaseFile::oldDateTime_)(uint16_t& date, uint16_t& time) = 0; // NOLINT +#endif // ALLOW_DEPRECATED_FUNCTIONS diff --git a/libs/SdFatBeta20120108/SdFat/SdBaseFile.h b/libs/SdFatBeta20120108/SdFat/SdBaseFile.h new file mode 100644 index 0000000..130c1f7 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/SdBaseFile.h @@ -0,0 +1,489 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 + */ +#include +#if ARDUINO < 100 +#include +#else // ARDUINO +#include +#endif // ARDUINO +#include "../../libs/SdFatBeta20120108/SdFat/SdFatConfig.h" +#include "../../libs/SdFatBeta20120108/SdFat/SdVolume.h" +//------------------------------------------------------------------------------ +/** + * \struct fpos_t + * \brief internal type for istream + * do not use in user apps + */ +struct fpos_t { + /** stream position */ + uint32_t position; + /** cluster for position */ + uint32_t cluster; + fpos_t() : position(0), cluster(0) {} +}; + +// 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; +// values for 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; + +/** 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); +//------------------------------------------------------------------------------ +/** + * \class SdBaseFile + * \brief Base class for SdFile with Print and C++ streams. + */ +class SdBaseFile { + public: + /** Create an instance. */ + SdBaseFile() : writeError(false), type_(FAT_FILE_TYPE_CLOSED) {} + SdBaseFile(const char* path, uint8_t oflag); + ~SdBaseFile() {if(isOpen()) close();} + /** + * 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; + //---------------------------------------------------------------------------- + // helpers for stream classes + /** get position for streams + * \param[out] pos struct to receive position + */ + void getpos(fpos_t* pos); + /** set position for streams + * \param[out] pos struct with value for new position + */ + void setpos(fpos_t* pos); + //---------------------------------------------------------------------------- + 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 curCluster_;} + /** \return The current position for a file or directory. */ + uint32_t curPosition() const {return curPosition_;} + /** \return Current working directory */ + static SdBaseFile* cwd() {return 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)) { + dateTime_ = dateTime; + } + /** Cancel the date/time callback function. */ + static void dateTimeCallbackCancel() {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 fileSize_;} + /** \return The first cluster number for a file or directory. */ + uint32_t firstCluster() const {return firstCluster_;} + bool getFilename(char* name); + /** \return True if this is a directory else false. */ + bool isDir() const {return type_ >= FAT_FILE_TYPE_MIN_DIR;} + /** \return True if this is a normal file else false. */ + bool isFile() const {return type_ == FAT_FILE_TYPE_NORMAL;} + /** \return True if this is an open file/directory else false. */ + bool isOpen() const {return type_ != FAT_FILE_TYPE_CLOSED;} + /** \return True if this is a subdirectory else false. */ + bool isSubDir() const {return type_ == FAT_FILE_TYPE_SUBDIR;} + /** \return True if this is the root directory. */ + bool isRoot() const { + return type_ == FAT_FILE_TYPE_ROOT_FIXED || 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(); + 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); + bool printName(); + int16_t read(); + int16_t read(void* buf, uint16_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(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(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 type_;} + bool truncate(uint32_t size); + /** \return SdVolume that contains this file. */ + SdVolume* volume() const {return vol_;} + int16_t write(const void* buf, uint16_t nbyte); +//------------------------------------------------------------------------------ + private: + // allow SdFat to set cwd_ + friend class SdFat; + // global pointer to cwd dir + static SdBaseFile* cwd_; + // data time callback function + static void (*dateTime_)(uint16_t* date, uint16_t* time); + // bits defined in 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; + + // private data + uint8_t flags_; // See above for definition of flags_ bits + uint8_t fstate_; // error and eof indicator + uint8_t type_; // type of file see above for values + uint32_t curCluster_; // cluster for current file position + uint32_t curPosition_; // current file position in bytes from beginning + uint32_t dirBlock_; // block for this files directory entry + uint8_t dirIndex_; // index of directory entry in dirBlock + uint32_t fileSize_; // file size in bytes + uint32_t firstCluster_; // first cluster of file + SdVolume* vol_; // volume where file is located + + /** experimental don't use */ + bool openParent(SdBaseFile* dir); + // private functions + bool addCluster(); + bool 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(); +//------------------------------------------------------------------------------ +// to be deleted + static void printDirName(const dir_t& dir, + uint8_t width, bool printSlash); + static void printDirName(Print* pr, const dir_t& dir, + uint8_t width, bool printSlash); +//------------------------------------------------------------------------------ +// Deprecated functions - suppress cpplint warnings with NOLINT comment +#if ALLOW_DEPRECATED_FUNCTIONS && !defined(DOXYGEN) + public: + /** \deprecated Use: + * bool contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock); + * \param[out] bgnBlock the first block address for the file. + * \param[out] endBlock the last block address for the file. + * \return true for success or false for failure. + */ + bool contiguousRange(uint32_t& bgnBlock, uint32_t& endBlock) { // NOLINT + return contiguousRange(&bgnBlock, &endBlock); + } + /** \deprecated Use: + * bool createContiguous(SdBaseFile* dirFile, + * const char* path, uint32_t size) + * \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 true for success or false for failure. + */ + bool createContiguous(SdBaseFile& dirFile, // NOLINT + const char* path, uint32_t size) { + return createContiguous(&dirFile, path, size); + } + /** \deprecated Use: + * static void dateTimeCallback( + * void (*dateTime)(uint16_t* date, uint16_t* time)); + * \param[in] dateTime The user's call back function. + */ + static void dateTimeCallback( + void (*dateTime)(uint16_t& date, uint16_t& time)) { // NOLINT + oldDateTime_ = dateTime; + dateTime_ = dateTime ? oldToNew : 0; + } + /** \deprecated Use: bool dirEntry(dir_t* dir); + * \param[out] dir Location for return of the file's directory entry. + * \return true for success or false for failure. + */ + bool dirEntry(dir_t& dir) {return dirEntry(&dir);} // NOLINT + /** \deprecated Use: + * bool mkdir(SdBaseFile* dir, const char* path); + * \param[in] dir 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. + * \return true for success or false for failure. + */ + bool mkdir(SdBaseFile& dir, const char* path) { // NOLINT + return mkdir(&dir, path); + } + /** \deprecated Use: + * bool open(SdBaseFile* dirFile, const char* path, uint8_t oflag); + * \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 the file. + * \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. + * \return true for success or false for failure. + */ + bool open(SdBaseFile& dirFile, // NOLINT + const char* path, uint8_t oflag) { + return open(&dirFile, path, oflag); + } + /** \deprecated Do not use in new apps + * \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. + * \return true for success or false for failure. + */ + bool open(SdBaseFile& dirFile, const char* path) { // NOLINT + return open(dirFile, path, O_RDWR); + } + /** \deprecated Use: + * bool open(SdBaseFile* dirFile, uint16_t index, uint8_t oflag); + * \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. + * \return true for success or false for failure. + */ + bool open(SdBaseFile& dirFile, uint16_t index, uint8_t oflag) { // NOLINT + return open(&dirFile, index, oflag); + } + /** \deprecated Use: bool openRoot(SdVolume* vol); + * \param[in] vol The FAT volume containing the root directory to be opened. + * \return true for success or false for failure. + */ + bool openRoot(SdVolume& vol) {return openRoot(&vol);} // NOLINT + /** \deprecated Use: int8_t readDir(dir_t* dir); + * \param[out] dir The dir_t struct that will receive the data. + * \return bytes read for success zero for eof or -1 for failure. + */ + int8_t readDir(dir_t& dir) {return readDir(&dir);} // NOLINT + /** \deprecated Use: + * static uint8_t remove(SdBaseFile* dirFile, const char* path); + * \param[in] dirFile The directory that contains the file. + * \param[in] path The name of the file to be removed. + * \return true for success or false for failure. + */ + static bool remove(SdBaseFile& dirFile, const char* path) { // NOLINT + return remove(&dirFile, path); + } +//------------------------------------------------------------------------------ +// rest are private + private: + static void (*oldDateTime_)(uint16_t& date, uint16_t& time); // NOLINT + static void oldToNew(uint16_t* date, uint16_t* time) { + uint16_t d; + uint16_t t; + oldDateTime_(d, t); + *date = d; + *time = t; + } +#endif // ALLOW_DEPRECATED_FUNCTIONS +}; + +#endif // SdBaseFile_h diff --git a/libs/SdFatBeta20120108/SdFat/SdFat.cpp b/libs/SdFatBeta20120108/SdFat/SdFat.cpp new file mode 100644 index 0000000..6ffb7ac --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/SdFat.cpp @@ -0,0 +1,366 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 "../../libs/SdFatBeta20120108/SdFat/SdFat.h" + +//------------------------------------------------------------------------------ +#if USE_SERIAL_FOR_STD_OUT || !defined(UDR0) +Print* SdFat::stdOut_ = &Serial; +#else // USE_SERIAL_FOR_STD_OUT +#if ARDUINO < 100 +class DefaultSerial : public Print { + public: + void write(uint8_t b); +}; +void DefaultSerial::write(uint8_t b) { + while (((1 << UDRIE0) & UCSR0B) || !(UCSR0A & (1 << UDRE0))) {} + UDR0 = b; +} +#else // ARDUINO < 100 +class DefaultSerial : public Print { + public: + size_t write(uint8_t b); +}; +size_t DefaultSerial::write(uint8_t b) { + while (((1 << UDRIE0) & UCSR0B) || !(UCSR0A & (1 << UDRE0))) {} + UDR0 = b; + return 1; +} +#endif // ARDUINO < 100 +//------------------------------------------------------------------------------ +static DefaultSerial defaultStdOut; + +Print* SdFat::stdOut_ = &defaultStdOut;//&Serial; +#endif // USE_SERIAL_FOR_STD_OUT +//------------------------------------------------------------------------------ +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(); +} +//------------------------------------------------------------------------------ +/** 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::cwd_ = &vwd_; + vwd_.close(); + return vwd_.openRoot(&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; + if (path[0] == '/' && path[1] == '\0') return chdir(set_cwd); + if (!dir.open(&vwd_, path, O_READ)) goto fail; + if (!dir.isDir()) goto fail; + vwd_ = dir; + if (set_cwd) SdBaseFile::cwd_ = &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::cwd_ = &vwd_; +} +//------------------------------------------------------------------------------ +/** %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 (!card_.errorCode()) return; + pstrPrint(PSTR("SD errorCode: 0X")); + stdOut_->println(card_.errorCode(), HEX); +} +//------------------------------------------------------------------------------ +/** %Print msg, any SD error code. + * + * \param[in] msg Message to print. + */ +void SdFat::errorPrint(char const* msg) { + pstrPrint(PSTR("error: ")); + 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(); +} +//------------------------------------------------------------------------------ +/** + * 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 vwd_.exists(name); +} +//------------------------------------------------------------------------------ +/** + * Initialize an SdFat object. + * + * Initializes the SD card, SD volume, and root directory. + * + * \param[in] sckRateID value for SPI SCK rate. See Sd2Card::init(). + * \param[in] chipSelectPin SD chip select pin. See Sd2Card::init(). + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +bool SdFat::init(uint8_t sckRateID, uint8_t chipSelectPin) { + return card_.init(sckRateID, chipSelectPin) && vol_.init(&card_) && chdir(1); +} +//------------------------------------------------------------------------------ +/** %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) { + 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 (card_.errorCode()) { + pstrPrintln(PSTR("Can't access SD card. Do not reformat.")); + if (card_.errorCode() == SD_CARD_ERROR_CMD0) { + pstrPrintln(PSTR("No card, wrong chip select pin, or SPI problem?")); + } + errorPrint(); + } else if (vol_.fatType() == 0) { + pstrPrintln(PSTR("Invalid format, reformat SD.")); + } else if (!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) { + 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(); +} +//------------------------------------------------------------------------------ +/** 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) { + vwd_.ls(stdOut_, 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) { + vwd_.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(&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(&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(&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/libs/SdFatBeta20120108/SdFat/SdFat.h b/libs/SdFatBeta20120108/SdFat/SdFat.h new file mode 100644 index 0000000..ffac938 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/SdFat.h @@ -0,0 +1,87 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 + */ +#include "../../libs/SdFatBeta20120108/SdFat/ArduinoStream.h" +#include "../../libs/SdFatBeta20120108/SdFat/SdFile.h" +#include "../../libs/SdFatBeta20120108/SdFat/SdStream.h" +//------------------------------------------------------------------------------ +/** SdFat version YYYYMMDD */ +#define SD_FAT_VERSION 20120108 +//------------------------------------------------------------------------------ +/** + * \class SdFat + * \brief Integration class for the %SdFat library. + */ +class SdFat { + public: + SdFat() {} + /** \return a pointer to the Sd2Card object. */ + Sd2Card* card() {return &card_;} + bool chdir(bool set_cwd = false); + bool chdir(const char* path, bool set_cwd = false); + void chvol(); + void errorHalt(); + void errorHalt_P(PGM_P msg); + void errorHalt(char const *msg); + void errorPrint(); + void errorPrint_P(PGM_P msg); + void errorPrint(char const *msg); + bool exists(const char* name); + bool init(uint8_t sckRateID = SPI_FULL_SPEED, + uint8_t chipSelectPin = SD_CHIP_SELECT_PIN); + 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(Print* pr, 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 &vol_;} + /** \return a pointer to the volume working directory. */ + SdBaseFile* vwd() {return &vwd_;} + //---------------------------------------------------------------------------- + // static functions for stdOut + /** + * Set stdOut Print stream for messages. + * \param[in] stream The new Print stream. + */ + static void setStdOut(Print* stream) {stdOut_ = stream;} + /** \return Print stream for messages. */ + static Print* stdOut() {return stdOut_;} + private: + Sd2Card card_; + SdVolume vol_; + SdBaseFile vwd_; + static Print* stdOut_; +}; +#endif // SdFat_h diff --git a/libs/SdFatBeta20120108/SdFat/SdFatConfig.h b/libs/SdFatBeta20120108/SdFat/SdFatConfig.h new file mode 100644 index 0000000..3f03a0d --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/SdFatConfig.h @@ -0,0 +1,121 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 +//------------------------------------------------------------------------------ +/** + * To use multiple SD cards set USE_MULTIPLE_CARDS nonzero. + * + * Using multiple cards costs 400 - 500 bytes of flash. + * + * Each card requires about 550 bytes of SRAM so use of a Mega is recommended. + */ +#define USE_MULTIPLE_CARDS 0 +//------------------------------------------------------------------------------ +/** + * Set 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 use of deprecated functions if ALLOW_DEPRECATED_FUNCTIONS is nonzero + */ +#define ALLOW_DEPRECATED_FUNCTIONS 1 +//------------------------------------------------------------------------------ +/** + * Allow FAT12 volumes if FAT12_SUPPORT is nonzero. + * FAT12 has not been well tested. + */ +#define FAT12_SUPPORT 0 +//------------------------------------------------------------------------------ +/** + * SPI init rate for SD initialization commands. Must be 5 (F_CPU/64) + * or 6 (F_CPU/128). + */ +#define SPI_SD_INIT_RATE 5 +//------------------------------------------------------------------------------ +/** + * Set the SS pin high for hardware SPI. If SS is chip select for another SPI + * device this will disable that device during the SD init phase. + */ +#define SET_SPI_SS_HIGH 1 +//------------------------------------------------------------------------------ +/** + * Define MEGA_SOFT_SPI nonzero to use software SPI on Mega Arduinos. + * Pins used are SS 10, MOSI 11, MISO 12, and SCK 13. + * + * 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. + */ +#define MEGA_SOFT_SPI 0 +//------------------------------------------------------------------------------ +/** + * Set USE_SOFTWARE_SPI nonzero to always use software SPI. + */ +#define USE_SOFTWARE_SPI 0 +// define software SPI pins so Mega can use unmodified 168/328 shields +/** Software SPI chip select pin for the SD */ +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; +//------------------------------------------------------------------------------ +/** + * The __cxa_pure_virtual function is an error handler that is invoked when + * a pure virtual function is called. + */ +#define USE_CXA_PURE_VIRTUAL 1 +#endif // SdFatConfig_h diff --git a/libs/SdFatBeta20120108/SdFat/SdFatStructs.h b/libs/SdFatBeta20120108/SdFat/SdFatStructs.h new file mode 100644 index 0000000..747c65f --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/SdFatStructs.h @@ -0,0 +1,604 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 SdFatStructs_h +#define SdFatStructs_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; +}; +/** 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; +}; +/** 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 nonexecutable 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 nonzero. 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 nonzero. + */ + 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; +}; +/** 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 nonexecutable 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 (nonremovable) 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 nonzero, 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; +}; +/** 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]; +}; +/** 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; +}; +//------------------------------------------------------------------------------ +// 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; +} +#endif // SdFatStructs_h diff --git a/libs/SdFatBeta20120108/SdFat/SdFatUtil.cpp b/libs/SdFatBeta20120108/SdFat/SdFatUtil.cpp new file mode 100644 index 0000000..00c3ae5 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/SdFatUtil.cpp @@ -0,0 +1,76 @@ +/* Arduino SdFat Library + * Copyright (C) 2008 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 "../../libs/SdFatBeta20120108/SdFat/SdFatUtil.h" + +#include "../../libs/SdFatBeta20120108/SdFat/SdFat.h" +//------------------------------------------------------------------------------ +/** Amount of free RAM + * \return The number of free bytes. + */ +int SdFatUtil::FreeRam() { + extern int __bss_end; + extern int* __brkval; + int free_memory; + if (reinterpret_cast(__brkval) == 0) { + // if no heap use from end of bss section + free_memory = reinterpret_cast(&free_memory) + - reinterpret_cast(&__bss_end); + } else { + // use from top of stack to heap + free_memory = reinterpret_cast(&free_memory) + - reinterpret_cast(__brkval); + } + return free_memory; +} +//------------------------------------------------------------------------------ +/** %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/libs/SdFatBeta20120108/SdFat/SdFatUtil.h b/libs/SdFatBeta20120108/SdFat/SdFatUtil.h new file mode 100644 index 0000000..b4112aa --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/SdFatUtil.h @@ -0,0 +1,46 @@ +/* Arduino SdFat Library + * Copyright (C) 2008 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 +#if ARDUINO < 100 +#include +#else // ARDUINO +#include +#endif // ARDUINO +/** 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/libs/SdFatBeta20120108/SdFat/SdFatmainpage.h b/libs/SdFatBeta20120108/SdFat/SdFatmainpage.h new file mode 100644 index 0000000..a9c74a2 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/SdFatmainpage.h @@ -0,0 +1,228 @@ +/* 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 + * . + */ + +/** +\mainpage Arduino %SdFat Library +
Copyright © 2011 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, \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 \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 + Wave 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. + +\note + The Arduino Print class uses character +at a time writes so it was necessary to use a \link SdFile::sync() sync() \endlink +function to control when data is written to the SD card. + +\par +An application which writes to a file using \link Print::print() print()\endlink, +\link Print::println() println() \endlink +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 + +Adafruit Industries: + +http://www.adafruit.com/ + +http://www.ladyada.net/make/waveshield/ + +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/libs/SdFatBeta20120108/SdFat/SdFile.cpp b/libs/SdFatBeta20120108/SdFat/SdFile.cpp new file mode 100644 index 0000000..959aed1 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/SdFile.cpp @@ -0,0 +1,93 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 "../../libs/SdFatBeta20120108/SdFat/SdFile.h" +/** 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. + * + */ +int16_t SdFile::write(const void* buf, uint16_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 writeError to check for errors. + */ +#if ARDUINO < 100 +void SdFile::write(uint8_t b) { + SdBaseFile::write(&b, 1); +} +#else // ARDUINO < 100 +size_t SdFile::write(uint8_t b) { + return SdBaseFile::write(&b, 1) == 1 ? 1 : 0; +} +#endif // ARDUINO < 100 +//------------------------------------------------------------------------------ +/** Write a string to a file. Used by the Arduino Print class. + * \param[in] str Pointer to the string. + * Use writeError to check for errors. + */ +#if ARDUINO < 100 +void SdFile::write(const char* str) { + SdBaseFile::write(str, strlen(str)); +} +#else // ARDUINO < 100 +int16_t SdFile::write(const char* str) { + return SdBaseFile::write(str, strlen(str)); +} +#endif // ARDUINO < 100 +//------------------------------------------------------------------------------ +/** Write a PROGMEM string to a file. + * \param[in] str Pointer to the PROGMEM string. + * Use writeError 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 writeError to check for errors. + */ +void SdFile::writeln_P(PGM_P str) { + write_P(str); + write_P(PSTR("\r\n")); +} diff --git a/libs/SdFatBeta20120108/SdFat/SdFile.h b/libs/SdFatBeta20120108/SdFat/SdFile.h new file mode 100644 index 0000000..f548367 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/SdFile.h @@ -0,0 +1,47 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 "../../libs/SdFatBeta20120108/SdFat/SdBaseFile.h" +#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 ARDUINO < 100 + void write(uint8_t b); + void write(const char* str); +#else // ARDUINO < 100 + size_t write(uint8_t b); + int16_t write(const char* str); +#endif // ARDUINO < 100 + int16_t write(const void* buf, uint16_t nbyte); + void write_P(PGM_P str); + void writeln_P(PGM_P str); +}; +#endif // SdFile_h diff --git a/libs/SdFatBeta20120108/SdFat/SdInfo.h b/libs/SdFatBeta20120108/SdFat/SdInfo.h new file mode 100644 index 0000000..2a58eb7 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/SdInfo.h @@ -0,0 +1,275 @@ +/* Arduino Sd2Card Library + * Copyright (C) 2009 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 +//------------------------------------------------------------------------------ +// 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; +/** 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; +}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; +}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 + /** not used */ + unsigned char reserved3 : 2; + /** high part of card size */ + unsigned char c_size_high : 6; + // 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; +}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/libs/SdFatBeta20120108/SdFat/SdStream.cpp b/libs/SdFatBeta20120108/SdFat/SdStream.cpp new file mode 100644 index 0000000..4b9f626 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/SdStream.cpp @@ -0,0 +1,157 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 "../../libs/SdFatBeta20120108/SdFat/SdFat.h" +// catch pure virtual errors +#if USE_CXA_PURE_VIRTUAL +extern "C" void __cxa_pure_virtual() { + SdFat::stdOut()->println("VIRTUAL"); + exit(1); +} +#endif // USE_CXA_PURE_VIRTUAL +//============================================================================== + /// @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) { + uint16_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); +} +//------------------------------------------------------------------------------ +int16_t SdStreamBase::write(const void* buf, uint16_t n) { + return SdBaseFile::write(buf, n); +} +//------------------------------------------------------------------------------ +void SdStreamBase::write(char c) { + write(&c, 1); +} +/// @endcond diff --git a/libs/SdFatBeta20120108/SdFat/SdStream.h b/libs/SdFatBeta20120108/SdFat/SdStream.h new file mode 100644 index 0000000..bf39e2c --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/SdStream.h @@ -0,0 +1,253 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 "../../libs/SdFatBeta20120108/SdFat/iostream.h" +#include "../../libs/SdFatBeta20120108/SdFat/SdBaseFile.h" +//============================================================================== +/** + * \class SdStreamBase + * \brief Base class for SD streams + */ +class SdStreamBase : protected SdBaseFile, virtual public ios { + public: + + 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 mode_;} + /** Internal do not use + * \param[in] mode + */ + void setmode(ios::openmode mode) {mode_ = mode;} + bool seekoff(off_type off, seekdir way); + bool seekpos(pos_type pos); + int16_t write(const void* buf, uint16_t n); + void write(char c); + /// @endcond + private: + ios::openmode 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); + } + ~fstream() {} + /** 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(fpos_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] pos + */ + bool seekoff(off_type off, seekdir way) { + return SdStreamBase::seekoff(off, way); + } + bool seekpos(pos_type pos) {return SdStreamBase::seekpos(pos);} + void setpos(fpos_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); + } + ~ifstream() {} + /** 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(fpos_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(fpos_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); + } + ~ofstream() {} + /** 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/libs/SdFatBeta20120108/SdFat/SdVolume.cpp b/libs/SdFatBeta20120108/SdFat/SdVolume.cpp new file mode 100644 index 0000000..3aac7c2 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/SdVolume.cpp @@ -0,0 +1,401 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 "../../libs/SdFatBeta20120108/SdFat/SdVolume.h" +//------------------------------------------------------------------------------ +#if !USE_MULTIPLE_CARDS +// raw block cache +uint32_t SdVolume::cacheBlockNumber_; // current block number +cache_t SdVolume::cacheBuffer_; // 512 byte cache for Sd2Card +Sd2Card* SdVolume::sdCard_; // pointer to SD card object +bool SdVolume::cacheDirty_; // cacheFlush() will write block if true +uint32_t SdVolume::cacheMirrorBlock_; // mirror block for second FAT +#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 = 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 = allocSearchStart_; + + // save next search start if one cluster + setStart = count == 1; + } + // 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 >= clusterCount_) goto fail; + + // past end - start from beginning of FAT + if (endCluster > fatEnd) { + bgnCluster = endCluster = 2; + } + uint32_t f; + if (!fatGet(endCluster, &f)) goto fail; + + if (f != 0) { + // cluster in use try next cluster as bgnCluster + bgnCluster = endCluster + 1; + } else if ((endCluster - bgnCluster + 1) == count) { + // done - found space + break; + } + } + // mark end of chain + if (!fatPutEOC(endCluster)) goto fail; + + // link clusters + while (endCluster > bgnCluster) { + if (!fatPut(endCluster - 1, endCluster)) goto fail; + endCluster--; + } + if (*curCluster != 0) { + // connect chains + if (!fatPut(*curCluster, bgnCluster)) goto fail; + } + // return first cluster number to caller + *curCluster = bgnCluster; + + // remember possible next free cluster + if (setStart) allocSearchStart_ = bgnCluster + 1; + + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +bool SdVolume::cacheFlush() { + if (cacheDirty_) { + if (!sdCard_->writeBlock(cacheBlockNumber_, cacheBuffer_.data)) { + goto fail; + } + // mirror FAT tables + if (cacheMirrorBlock_) { + if (!sdCard_->writeBlock(cacheMirrorBlock_, cacheBuffer_.data)) { + goto fail; + } + cacheMirrorBlock_ = 0; + } + cacheDirty_ = 0; + } + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +bool SdVolume::cacheRawBlock(uint32_t blockNumber, bool dirty) { + if (cacheBlockNumber_ != blockNumber) { + if (!cacheFlush()) goto fail; + if (!sdCard_->readBlock(blockNumber, cacheBuffer_.data)) goto fail; + cacheBlockNumber_ = blockNumber; + } + if (dirty) cacheDirty_ = true; + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +// return the size in bytes of a cluster chain +bool SdVolume::chainSize(uint32_t cluster, uint32_t* size) { + uint32_t s = 0; + do { + if (!fatGet(cluster, &cluster)) goto fail; + s += 512UL << clusterSizeShift_; + } while (!isEOC(cluster)); + *size = s; + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +// Fetch a FAT entry +bool SdVolume::fatGet(uint32_t cluster, uint32_t* value) { + uint32_t lba; + if (cluster > (clusterCount_ + 1)) goto fail; + if (FAT12_SUPPORT && fatType_ == 12) { + uint16_t index = cluster; + index += index >> 1; + lba = fatStartBlock_ + (index >> 9); + if (!cacheRawBlock(lba, CACHE_FOR_READ)) goto fail; + index &= 0X1FF; + uint16_t tmp = cacheBuffer_.data[index]; + index++; + if (index == 512) { + if (!cacheRawBlock(lba + 1, CACHE_FOR_READ)) goto fail; + index = 0; + } + tmp |= cacheBuffer_.data[index] << 8; + *value = cluster & 1 ? tmp >> 4 : tmp & 0XFFF; + return true; + } + if (fatType_ == 16) { + lba = fatStartBlock_ + (cluster >> 8); + } else if (fatType_ == 32) { + lba = fatStartBlock_ + (cluster >> 7); + } else { + goto fail; + } + if (lba != cacheBlockNumber_) { + if (!cacheRawBlock(lba, CACHE_FOR_READ)) goto fail; + } + if (fatType_ == 16) { + *value = cacheBuffer_.fat16[cluster & 0XFF]; + } else { + *value = cacheBuffer_.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; + // error if reserved cluster + if (cluster < 2) goto fail; + + // error if not in FAT + if (cluster > (clusterCount_ + 1)) goto fail; + + if (FAT12_SUPPORT && fatType_ == 12) { + uint16_t index = cluster; + index += index >> 1; + lba = fatStartBlock_ + (index >> 9); + if (!cacheRawBlock(lba, CACHE_FOR_WRITE)) goto fail; + // mirror second FAT + if (fatCount_ > 1) cacheMirrorBlock_ = lba + blocksPerFat_; + index &= 0X1FF; + uint8_t tmp = value; + if (cluster & 1) { + tmp = (cacheBuffer_.data[index] & 0XF) | tmp << 4; + } + cacheBuffer_.data[index] = tmp; + index++; + if (index == 512) { + lba++; + index = 0; + if (!cacheRawBlock(lba, CACHE_FOR_WRITE)) goto fail; + // mirror second FAT + if (fatCount_ > 1) cacheMirrorBlock_ = lba + blocksPerFat_; + } + tmp = value >> 4; + if (!(cluster & 1)) { + tmp = ((cacheBuffer_.data[index] & 0XF0)) | tmp >> 4; + } + cacheBuffer_.data[index] = tmp; + return true; + } + if (fatType_ == 16) { + lba = fatStartBlock_ + (cluster >> 8); + } else if (fatType_ == 32) { + lba = fatStartBlock_ + (cluster >> 7); + } else { + goto fail; + } + if (!cacheRawBlock(lba, CACHE_FOR_WRITE)) goto fail; + // store entry + if (fatType_ == 16) { + cacheBuffer_.fat16[cluster & 0XFF] = value; + } else { + cacheBuffer_.fat32[cluster & 0X7F] = value; + } + // mirror second FAT + if (fatCount_ > 1) cacheMirrorBlock_ = lba + blocksPerFat_; + return true; + + fail: + return false; +} +//------------------------------------------------------------------------------ +// free a cluster chain +bool SdVolume::freeChain(uint32_t cluster) { + uint32_t next; + + // clear free cluster location + allocSearchStart_ = 2; + + do { + if (!fatGet(cluster, &next)) goto fail; + + // free cluster + if (!fatPut(cluster, 0)) goto fail; + + 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; + uint16_t n; + uint32_t todo = clusterCount_ + 2; + + if (fatType_ == 16) { + n = 256; + } else if (fatType_ == 32) { + n = 128; + } else { + // put FAT12 here + return -1; + } + + for (uint32_t lba = fatStartBlock_; todo; todo -= n, lba++) { + if (!cacheRawBlock(lba, CACHE_FOR_READ)) return -1; + if (todo < n) n = todo; + if (fatType_ == 16) { + for (uint16_t i = 0; i < n; i++) { + if (cacheBuffer_.fat16[i] == 0) free++; + } + } else { + for (uint16_t i = 0; i < n; i++) { + if (cacheBuffer_.fat32[i] == 0) free++; + } + } + } + return free; +} +//------------------------------------------------------------------------------ +/** 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) { + uint32_t totalBlocks; + uint32_t volumeStartBlock = 0; + fat32_boot_t* fbs; + + sdCard_ = dev; + fatType_ = 0; + allocSearchStart_ = 2; + cacheDirty_ = 0; // cacheFlush() will write block if true + cacheMirrorBlock_ = 0; + cacheBlockNumber_ = 0XFFFFFFFF; + + // 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)goto fail; + if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail; + part_t* p = &cacheBuffer_.mbr.part[part-1]; + if ((p->boot & 0X7F) !=0 || + p->totalSectors < 100 || + p->firstSector == 0) { + // not a valid partition + goto fail; + } + volumeStartBlock = p->firstSector; + } + if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail; + fbs = &cacheBuffer_.fbs32; + if (fbs->bytesPerSector != 512 || + fbs->fatCount == 0 || + fbs->reservedSectorCount == 0 || + fbs->sectorsPerCluster == 0) { + // not valid FAT volume + goto fail; + } + fatCount_ = fbs->fatCount; + blocksPerCluster_ = fbs->sectorsPerCluster; + // determine shift that is same as multiply by blocksPerCluster_ + clusterSizeShift_ = 0; + while (blocksPerCluster_ != (1 << clusterSizeShift_)) { + // error if not power of 2 + if (clusterSizeShift_++ > 7) goto fail; + } + blocksPerFat_ = fbs->sectorsPerFat16 ? + fbs->sectorsPerFat16 : fbs->sectorsPerFat32; + + fatStartBlock_ = volumeStartBlock + fbs->reservedSectorCount; + + // count for FAT16 zero for FAT32 + rootDirEntryCount_ = fbs->rootDirEntryCount; + + // directory start for FAT16 dataStart for FAT32 + rootDirStart_ = fatStartBlock_ + fbs->fatCount * blocksPerFat_; + + // data start for FAT16 and FAT32 + dataStartBlock_ = rootDirStart_ + ((32 * fbs->rootDirEntryCount + 511)/512); + + // total blocks for FAT16 or FAT32 + totalBlocks = fbs->totalSectors16 ? + fbs->totalSectors16 : fbs->totalSectors32; + // total data blocks + clusterCount_ = totalBlocks - (dataStartBlock_ - volumeStartBlock); + + // divide by cluster size to get cluster count + clusterCount_ >>= clusterSizeShift_; + + // FAT type is determined by cluster count + if (clusterCount_ < 4085) { + fatType_ = 12; + if (!FAT12_SUPPORT) goto fail; + } else if (clusterCount_ < 65525) { + fatType_ = 16; + } else { + rootDirStart_ = fbs->fat32RootCluster; + fatType_ = 32; + } + return true; + + fail: + return false; +} diff --git a/libs/SdFatBeta20120108/SdFat/SdVolume.h b/libs/SdFatBeta20120108/SdFat/SdVolume.h new file mode 100644 index 0000000..9e995f3 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/SdVolume.h @@ -0,0 +1,209 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 "../../libs/SdFatBeta20120108/SdFat/Sd2Card.h" +#include "../../libs/SdFatBeta20120108/SdFat/SdFatConfig.h" +#include "../../libs/SdFatBeta20120108/SdFat/SdFatStructs.h" + +//============================================================================== +// 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() : 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 (!cacheFlush()) return 0; + cacheBlockNumber_ = 0XFFFFFFFF; + return &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 blocksPerCluster_;} + /** \return The number of blocks in one FAT. */ + uint32_t blocksPerFat() const {return blocksPerFat_;} + /** \return The total number of clusters in the volume. */ + uint32_t clusterCount() const {return clusterCount_;} + /** \return The shift count required to multiply by blocksPerCluster. */ + uint8_t clusterSizeShift() const {return clusterSizeShift_;} + /** \return The logical block number for the start of file data. */ + uint32_t dataStartBlock() const {return dataStartBlock_;} + /** \return The number of FAT structures on the volume. */ + uint8_t fatCount() const {return fatCount_;} + /** \return The logical block number for the start of the first FAT. */ + uint32_t fatStartBlock() const {return fatStartBlock_;} + /** \return The FAT type of the volume. Values are 12, 16 or 32. */ + uint8_t fatType() const {return fatType_;} + int32_t freeClusterCount(); + /** \return The number of entries in the root directory for FAT16 volumes. */ + uint32_t rootDirEntryCount() const {return 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 rootDirStart_;} + /** Sd2Card object for this volume + * \return pointer to Sd2Card object. + */ + Sd2Card* sdCard() {return 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; + + // value for dirty argument in cacheRawBlock to indicate read from cache + static bool const CACHE_FOR_READ = false; + // value for dirty argument in cacheRawBlock to indicate write to cache + static bool const CACHE_FOR_WRITE = true; + +#if USE_MULTIPLE_CARDS + cache_t cacheBuffer_; // 512 byte cache for device blocks + uint32_t cacheBlockNumber_; // Logical number of block in the cache + Sd2Card* sdCard_; // Sd2Card object for cache + bool cacheDirty_; // cacheFlush() will write block if true + uint32_t cacheMirrorBlock_; // block number for mirror FAT +#else // USE_MULTIPLE_CARDS + static cache_t cacheBuffer_; // 512 byte cache for device blocks + static uint32_t cacheBlockNumber_; // Logical number of block in the cache + static Sd2Card* sdCard_; // Sd2Card object for cache + static bool cacheDirty_; // cacheFlush() will write block if true + static uint32_t cacheMirrorBlock_; // block number for mirror FAT +#endif // USE_MULTIPLE_CARDS + uint32_t allocSearchStart_; // start cluster for alloc search + uint8_t blocksPerCluster_; // cluster size in blocks + uint32_t blocksPerFat_; // FAT size in blocks + uint32_t clusterCount_; // clusters in one FAT + uint8_t clusterSizeShift_; // shift to convert cluster count to block count + uint32_t dataStartBlock_; // first data block number + uint8_t fatCount_; // number of FATs on volume + uint32_t fatStartBlock_; // start block for first FAT + uint8_t fatType_; // volume type (12, 16, OR 32) + uint16_t rootDirEntryCount_; // number of entries in FAT16 root dir + uint32_t rootDirStart_; // root start block for FAT16, cluster for FAT32 + //---------------------------------------------------------------------------- + bool allocContiguous(uint32_t count, uint32_t* curCluster); + uint8_t blockOfCluster(uint32_t position) const { + return (position >> 9) & (blocksPerCluster_ - 1);} + uint32_t clusterStartBlock(uint32_t cluster) const { + return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);} + cache_t *cache() {return &cacheBuffer_;} + uint32_t cacheBlockNumber() {return cacheBlockNumber_;} +#if USE_MULTIPLE_CARDS + bool cacheFlush(); + bool cacheRawBlock(uint32_t blockNumber, bool dirty); +#else // USE_MULTIPLE_CARDS + static bool cacheFlush(); + static bool cacheRawBlock(uint32_t blockNumber, bool dirty); +#endif // USE_MULTIPLE_CARDS + // used by SdBaseFile write to assign cache to SD location + void cacheSetBlockNumber(uint32_t blockNumber, bool dirty) { + cacheDirty_ = dirty; + cacheBlockNumber_ = blockNumber; + } + void cacheSetDirty() {cacheDirty_ |= CACHE_FOR_WRITE;} + bool chainSize(uint32_t beginCluster, uint32_t* size); + 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 && fatType_ == 12) return cluster >= FAT12EOC_MIN; + if (fatType_ == 16) return cluster >= FAT16EOC_MIN; + return cluster >= FAT32EOC_MIN; + } + bool readBlock(uint32_t block, uint8_t* dst) { + return sdCard_->readBlock(block, dst);} + bool writeBlock(uint32_t block, const uint8_t* dst) { + return sdCard_->writeBlock(block, dst); + } +//------------------------------------------------------------------------------ + // Deprecated functions - suppress cpplint warnings with NOLINT comment +#if ALLOW_DEPRECATED_FUNCTIONS && !defined(DOXYGEN) + public: + /** \deprecated Use: bool SdVolume::init(Sd2Card* dev); + * \param[in] dev The SD card where the volume is located. + * \return true for success or false for failure. + */ + bool init(Sd2Card& dev) {return init(&dev);} // NOLINT + /** \deprecated Use: bool SdVolume::init(Sd2Card* dev, uint8_t vol); + * \param[in] dev The SD card where the volume is located. + * \param[in] part The partition to be used. + * \return true for success or false for failure. + */ + bool init(Sd2Card& dev, uint8_t part) { // NOLINT + return init(&dev, part); + } +#endif // ALLOW_DEPRECATED_FUNCTIONS +}; +#endif // SdVolume diff --git a/libs/SdFatBeta20120108/SdFat/bufstream.h b/libs/SdFatBeta20120108/SdFat/bufstream.h new file mode 100644 index 0000000..2c78702 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/bufstream.h @@ -0,0 +1,141 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 "../../libs/SdFatBeta20120108/SdFat/iostream.h" +//============================================================================== +/** + * \class ibufstream + * \brief parse a char string + */ +class ibufstream : public istream { + public: + /** Constructor */ + ibufstream() : buf_(0), 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) { + buf_ = str; + len_ = strlen(buf_); + pos_ = 0; + clear(); + } + protected: + /// @cond SHOW_PROTECTED + int16_t getch() { + if (pos_ < len_) return buf_[pos_++]; + setstate(eofbit); + return -1; + } + void getpos(fpos_t *pos) { + pos->position = pos_; + } + bool seekoff(off_type off, seekdir way) {return false;} + bool seekpos(pos_type pos) { + if (pos < len_) { + pos_ = pos; + return true; + } + return false; + } + void setpos(fpos_t *pos) { + pos_ = pos->position; + } + pos_type tellpos() { + return pos_; + } + /// @endcond + private: + const char* buf_; + uint16_t len_; + uint16_t pos_; +}; +//============================================================================== +/** + * \class obufstream + * \brief format a char string + */ +class obufstream : public ostream { + public: + /** constructor */ + obufstream() : in_(0) {} + /** Constructor + * \param[in] buf buffer for formatted string + * \param[in] size buffer size + */ + obufstream(char *buf, uint16_t size) { + init(buf, size); + } + /** Initialize an obufstream + * \param[in] buf buffer for formatted string + * \param[in] size buffer size + */ + void init(char *buf, uint16_t size) { + buf_ = buf; + buf[0] = '\0'; + size_ = size; + in_ = 0; + } + /** \return a pointer to the buffer */ + char* buf() {return buf_;} + /** \return the length of the formatted string */ + uint16_t length() {return in_;} + protected: + /// @cond SHOW_PROTECTED + void putch(char c) { + if (in_ >= (size_ - 1)) { + setstate(badbit); + return; + } + buf_[in_++] = c; + buf_[in_]= '\0'; + } + bool seekoff(off_type off, seekdir way) {return false;} + bool seekpos(pos_type pos) { + if (pos > in_) return false; + in_ = pos; + buf_[in_] = '\0'; + return true; + } + bool sync() {return true;} + + pos_type tellpos() { + return in_; + } + /// @endcond + private: + char *buf_; + uint16_t size_; + uint16_t in_; +}; +#endif // bufstream_h diff --git a/libs/SdFatBeta20120108/SdFat/examples/AnalogLogger/AnalogLogger.pde b/libs/SdFatBeta20120108/SdFat/examples/AnalogLogger/AnalogLogger.pde new file mode 100644 index 0000000..39e761c --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/AnalogLogger/AnalogLogger.pde @@ -0,0 +1,166 @@ +// 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 CHIP_SELECT SS_PIN // 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); + + // 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) {} +#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 + // breadboards. use SPI_FULL_SPEED for better performance. + // if SD chip select is not SS, the second argument to init is CS pin number + if (!sd.init(SPI_HALF_SPEED, CHIP_SELECT)) 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; + + // 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); +} diff --git a/libs/SdFatBeta20120108/SdFat/examples/HelloWorld/HelloWorld.pde b/libs/SdFatBeta20120108/SdFat/examples/HelloWorld/HelloWorld.pde new file mode 100644 index 0000000..759146e --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/HelloWorld/HelloWorld.pde @@ -0,0 +1,11 @@ +#include + +// create a serial output stream +ArduinoOutStream cout(Serial); + +void setup() { + Serial.begin(9600); + cout << "Hello, World!\n"; +} + +void loop() {} diff --git a/libs/SdFatBeta20120108/SdFat/examples/OpenNext/OpenNext.pde b/libs/SdFatBeta20120108/SdFat/examples/OpenNext/OpenNext.pde new file mode 100644 index 0000000..6c36636 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/OpenNext/OpenNext.pde @@ -0,0 +1,35 @@ +/* + * Open all files in the root dir and print their filename + */ +#include + +// SD chip select pin +const uint8_t chipSelect = SS_PIN; + +// file system object +SdFat sd; + +SdFile file; + +// define a serial output stream +ArduinoOutStream cout(Serial); +//------------------------------------------------------------------------------ +void setup() { + char name[13]; + + Serial.begin(9600); + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.init(SPI_HALF_SPEED, chipSelect)) sd.initErrorHalt(); + + // open next file in root. The volume working directory, vwd, is root + while (file.openNext(sd.vwd(), O_READ)) { + file.getFilename(name); + cout << name << endl; + file.close(); + } + cout << "Done" << endl; +} +//------------------------------------------------------------------------------ +void loop() {} diff --git a/libs/SdFatBeta20120108/SdFat/examples/QuickStart/QuickStart.pde b/libs/SdFatBeta20120108/SdFat/examples/QuickStart/QuickStart.pde new file mode 100644 index 0000000..1827248 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/QuickStart/QuickStart.pde @@ -0,0 +1,127 @@ +// Quick hardware test +#include +// 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 SdFat is used in applications in place +// of Sd2Card, SdVolume, and SdFile for root. +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" + "The current SPI speed is: "); + uint8_t divisor = 1; + for (uint8_t i = 0; i < spiSpeed; i++) divisor *= 2; + cout << F_CPU * 0.5e-6 / divisor << pstr(" MHz\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); + 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 (!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" + "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/libs/SdFatBeta20120108/SdFat/examples/ReadWriteSdFat/ReadWriteSdFat.pde b/libs/SdFatBeta20120108/SdFat/examples/ReadWriteSdFat/ReadWriteSdFat.pde new file mode 100644 index 0000000..e303573 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/ReadWriteSdFat/ReadWriteSdFat.pde @@ -0,0 +1,64 @@ +// 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); + + // 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.init(SPI_HALF_SPEED, chipSelect)) 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/libs/SdFatBeta20120108/SdFat/examples/SD_Size/SD_Size.pde b/libs/SdFatBeta20120108/SdFat/examples/SD_Size/SD_Size.pde new file mode 100644 index 0000000..3865ff2 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/SD_Size/SD_Size.pde @@ -0,0 +1,23 @@ +/* + * Sketch to compare size of Arduino SD library with SdFat V2. + * See SdFatSize.pde for SdFat sketch. + */ +#include + +File file; +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + + if (!SD.begin()) { + Serial.println("begin failed"); + return; + } + file = SD.open("TEST_SD.TXT", FILE_WRITE); + + file.println("Hello"); + + file.close(); +} +//------------------------------------------------------------------------------ +void loop() {} diff --git a/libs/SdFatBeta20120108/SdFat/examples/SdFatSize/SdFatSize.pde b/libs/SdFatBeta20120108/SdFat/examples/SdFatSize/SdFatSize.pde new file mode 100644 index 0000000..e5d1f90 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/SdFatSize/SdFatSize.pde @@ -0,0 +1,25 @@ +/* + * 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); + + if (!sd.init()) { + Serial.println("init failed"); + return; + } + file.open("SIZE_TST.TXT", O_RDWR | O_CREAT | O_AT_END); + + file.println("Hello"); + + file.close(); +} +//------------------------------------------------------------------------------ +void loop() {} diff --git a/libs/SdFatBeta20120108/SdFat/examples/SdFormatter/SdFormatter.pde b/libs/SdFatBeta20120108/SdFat/examples/SdFormatter/SdFormatter.pde new file mode 100644 index 0000000..f01419d --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/SdFormatter/SdFormatter.pde @@ -0,0 +1,478 @@ +/* + * 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_PIN. 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_PIN; + +// 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 { + sectorsPerCluster = 64; + } + + 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); + cout << pstr( + "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()) {} + 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/libs/SdFatBeta20120108/SdFat/examples/SdInfo/SdInfo.pde b/libs/SdFatBeta20120108/SdFat/examples/SdInfo/SdInfo.pde new file mode 100644 index 0000000..c36393e --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/SdInfo/SdInfo.pde @@ -0,0 +1,174 @@ +/* + * 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_PIN; + +Sd2Card card; +SdVolume vol; + +// serial output steam +ArduinoOutStream cout(Serial); + +// 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: ") << cid.psn << 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; + uint32_t cardSize = card.cardSize(); + if (cardSize == 0 || !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: ") << cardSize << pstr(" (512 byte blocks)\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 (!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; + cout << pstr("freeClusters: ") << vol.freeClusterCount() << endl; + 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); + + // 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) {} + + 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; + 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: + cout << pstr("SDHC\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(); +} diff --git a/libs/SdFatBeta20120108/SdFat/examples/TwoCards/TwoCards.pde b/libs/SdFatBeta20120108/SdFat/examples/TwoCards/TwoCards.pde new file mode 100644 index 0000000..5ac4649 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/TwoCards/TwoCards.pde @@ -0,0 +1,137 @@ +/* + * 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); + 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) {} + + // disable sd2 while initializing sd1 + pinMode(SD2_CS, OUTPUT); + digitalWrite(SD2_CS, HIGH); + + // initialize the first card + if (!sd1.init(SPI_FULL_SPEED, 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.init(SPI_FULL_SPEED, 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/libs/SdFatBeta20120108/SdFat/examples/append/append.pde b/libs/SdFatBeta20120108/SdFat/examples/append/append.pde new file mode 100644 index 0000000..3fb3e8e --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/append/append.pde @@ -0,0 +1,61 @@ +/* + * 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_PIN; + +// 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); + + // pstr() stores strings in flash to save RAM + cout << endl << pstr("Type any character to start\n"); + while (Serial.read() < 0) {} + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.init(SPI_HALF_SPEED, chipSelect)) 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/libs/SdFatBeta20120108/SdFat/examples/average/average.pde b/libs/SdFatBeta20120108/SdFat/examples/average/average.pde new file mode 100644 index 0000000..2e18454 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/average/average.pde @@ -0,0 +1,68 @@ +/* + * Calculate the sum and average of a list of floating point numbers + */ +#include + +// SD chip select pin +const uint8_t chipSelect = SS_PIN; + +// 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"); + + // file will be closed by destructor when sdout goes out of scope +} +//------------------------------------------------------------------------------ +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); + + // pstr stores strings in flash to save RAM + cout << pstr("Type any character to start\n"); + while (Serial.read() < 0) {} + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.init(SPI_HALF_SPEED, chipSelect)) sd.initErrorHalt(); + + // write the test file + writeTestFile(); + + // read the test file and calculate the average + calcAverage(); +} +//------------------------------------------------------------------------------ +void loop() {} diff --git a/libs/SdFatBeta20120108/SdFat/examples/bench/bench.pde b/libs/SdFatBeta20120108/SdFat/examples/bench/bench.pde new file mode 100644 index 0000000..d39395a --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/bench/bench.pde @@ -0,0 +1,103 @@ +/* + * This sketch is a simple binary write/read benchmark. + */ +#include +#include + +// SD chip select pin +const uint8_t chipSelect = SS_PIN; + +#define FILE_SIZE_MB 5 +#define FILE_SIZE (1000000UL*FILE_SIZE_MB) +#define BUF_SIZE 100 + +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 setup() { + uint32_t maxLatency; + uint32_t totalLatency; + Serial.begin(9600); + + // pstr stores strings in flash to save RAM + cout << pstr("Type any character to start\n"); + while (Serial.read() < 0) {} + + 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.init(SPI_FULL_SPEED, chipSelect)) sd.initErrorHalt(); + + cout << pstr("Type is FAT") << int(sd.vol()->fatType()) << endl; + + // 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("Starting write test. Please wait up to a minute\n"); + + // do write test + uint32_t n = FILE_SIZE/sizeof(buf); + maxLatency = 0; + 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; + totalLatency += m; + } + file.sync(); + t = millis() - t; + double s = file.fileSize(); + cout << pstr("Write ") << s/t << pstr(" KB/sec\n"); + cout << pstr("Maximum latency: ") << maxLatency; + cout << pstr(" usec, Avg Latency: ") << totalLatency/n << pstr(" usec\n\n"); + cout << pstr("Starting read test. Please wait up to a minute\n"); + // do read test + file.rewind(); + maxLatency = 0; + totalLatency = 0; + t = millis(); + for (uint32_t i = 0; i < n; i++) { + uint32_t m = micros(); + if (file.read(buf, sizeof(buf)) != sizeof(buf)) { + error("read failed"); + } + m = micros() - m; + if (maxLatency < m) maxLatency = m; + totalLatency += m; + } + t = millis() - t; + cout << pstr("Read ") << s/t << pstr(" KB/sec\n"); + cout << pstr("Maximum latency: ") << maxLatency; + cout << pstr(" usec, Avg Latency: ") << totalLatency/n << pstr(" usec\n\n"); + cout << pstr("Done\n"); +} +//------------------------------------------------------------------------------ +void loop() { } diff --git a/libs/SdFatBeta20120108/SdFat/examples/bufstream/bufstream.pde b/libs/SdFatBeta20120108/SdFat/examples/bufstream/bufstream.pde new file mode 100644 index 0000000..4c0cc72 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/bufstream/bufstream.pde @@ -0,0 +1,31 @@ +/* + * 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); + + // 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/libs/SdFatBeta20120108/SdFat/examples/cin_cout/cin_cout.pde b/libs/SdFatBeta20120108/SdFat/examples/cin_cout/cin_cout.pde new file mode 100644 index 0000000..f141e7c --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/cin_cout/cin_cout.pde @@ -0,0 +1,33 @@ +/* + * 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); +} +//------------------------------------------------------------------------------ +void loop() { + int32_t n; + + cout << "enter an integer\n"; + + cin.readline(); + + if (cin >> n) { + cout << "The number is: " << n << endl; + } else { + // will fail if no digits or not in range [-2147483648, 2147483647] + cout << "Invalid input: " << cinBuf << endl; + } + cout << endl; +} diff --git a/libs/SdFatBeta20120108/SdFat/examples/eventlog/eventlog.pde b/libs/SdFatBeta20120108/SdFat/examples/eventlog/eventlog.pde new file mode 100644 index 0000000..3ba0c18 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/eventlog/eventlog.pde @@ -0,0 +1,51 @@ +/* + * Append a line to a file - demo of pathnames and streams + */ +#include + +// SD chip select pin +const uint8_t chipSelect = SS_PIN; + +// 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"); + + // file will be closed when sdlog goes out of scope +} +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + + // pstr stores strings in flash to save RAM + cout << pstr("Type any character to start\n"); + while (Serial.read() < 0) {} + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.init(SPI_HALF_SPEED, chipSelect)) 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/libs/SdFatBeta20120108/SdFat/examples/fgets/fgets.pde b/libs/SdFatBeta20120108/SdFat/examples/fgets/fgets.pde new file mode 100644 index 0000000..4ff3f8f --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/fgets/fgets.pde @@ -0,0 +1,66 @@ +// Demo of fgets function to read lines from a file. +#include +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 is closed when it goes out of scope +} +//------------------------------------------------------------------------------ +void setup(void) { + Serial.begin(9600); + cout << pstr("Type any character to start\n"); + while (Serial.read() < 0) {} + + // initialize the file system + if (!sd.init()) sd.initErrorHalt(); + + makeTestFile(); + + demoFgets(); + + cout << pstr("\nDone\n"); +} +void loop(void) {} diff --git a/libs/SdFatBeta20120108/SdFat/examples/formatting/formatting.pde b/libs/SdFatBeta20120108/SdFat/examples/formatting/formatting.pde new file mode 100644 index 0000000..be63725 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/formatting/formatting.pde @@ -0,0 +1,63 @@ +/* + * 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); + + 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_PIN; + +// 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"); +} +//------------------------------------------------------------------------------ +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); + + // pstr stores strings in flash to save RAM + cout << pstr("Type any character to start\n"); + while (Serial.read() < 0) {} + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.init(SPI_HALF_SPEED, chipSelect)) sd.initErrorHalt(); + + // make the test file + makeTestFile(); + + // run the example + testGetline(); +} +//------------------------------------------------------------------------------ +void loop(void) {} diff --git a/libs/SdFatBeta20120108/SdFat/examples/readCSV/readCSV.pde b/libs/SdFatBeta20120108/SdFat/examples/readCSV/readCSV.pde new file mode 100644 index 0000000..36888dc --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/readCSV/readCSV.pde @@ -0,0 +1,80 @@ +/* + * 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_PIN; + +// file system object +SdFat sd; + +// create Serial stream +ArduinoOutStream cout(Serial); + +char fileName[] = "3V_FILE.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 c1, c2; + + // open input file + ifstream sdin(fileName); + + // check for open error + if (!sdin.is_open()) error("open"); + + // read until input fails + while (sdin >> lg >> c1 >> f1 >> c2 >> f2) { + + // error in line if not commas + if (c1 != ',' || c2 != ',') error("comma"); + + // print in six character wide columns + cout << 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( + "1,2.3,4.5\n" + "6,7.8,9.0\n" + "9,8.7,6.5\n" + "-4,-3.2,-1\n") << flush; + + // check for any errors + if (!sdout) error("writeFile"); + + // file is closed by destructor when it goes out of scope. +} +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance + if (!sd.init(SPI_HALF_SPEED, chipSelect)) sd.initErrorHalt(); + + // create test file + writeFile(); + + // read and print test + readFile(); + + cout << "Done" << endl; +} +void loop() {} diff --git a/libs/SdFatBeta20120108/SdFat/examples/readlog/readlog.pde b/libs/SdFatBeta20120108/SdFat/examples/readlog/readlog.pde new file mode 100644 index 0000000..e26bfe1 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/readlog/readlog.pde @@ -0,0 +1,39 @@ +/* + * 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_PIN; + +// file system object +SdFat sd; + +// define a serial output stream +ArduinoOutStream cout(Serial); +//------------------------------------------------------------------------------ +void setup() { + char c; + Serial.begin(9600); + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.init(SPI_HALF_SPEED, chipSelect)) 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 << c; + + cout << "Done" << endl; +} +//------------------------------------------------------------------------------ +void loop() {} diff --git a/libs/SdFatBeta20120108/SdFat/examples/rename/rename.pde b/libs/SdFatBeta20120108/SdFat/examples/rename/rename.pde new file mode 100644 index 0000000..e7757cb --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/examples/rename/rename.pde @@ -0,0 +1,74 @@ +/* + * This sketch demonstrates use of SdFile::rename() + * and SdFat::rename(). + */ +#include + +// SD chip select pin +const uint8_t chipSelect = SS_PIN; + +// 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); + cout << pstr("Insert an empty SD. Type any character to start.") << endl; + while (Serial.read() < 0) {} + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.init(SPI_HALF_SPEED, chipSelect)) 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/libs/SdFatBeta20120108/SdFat/ios.h b/libs/SdFatBeta20120108/SdFat/ios.h new file mode 100644 index 0000000..88a1282 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/ios.h @@ -0,0 +1,391 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 "../../libs/SdFatBeta20120108/SdFat/SdBaseFile.h" +/** + * \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() : fill_(' '), fmtflags_(dec | right | skipws) + , precision_(2), width_(0) {} + /** \return fill character */ + char fill() {return fill_;} + /** Set fill character + * \param[in] c new fill character + * \return old fill character + */ + char fill(char c) { + char r = fill_; + fill_ = c; + return r; + } + /** \return format flags */ + fmtflags flags() const {return fmtflags_;} + /** set format flags + * \param[in] fl new flag + * \return old flags + */ + fmtflags flags(fmtflags fl) { + fmtflags tmp = fmtflags_; + fmtflags_ = fl; + return tmp; + } + /** \return precision */ + int precision() const {return precision_;} + /** set precision + * \param[in] n new precision + * \return old precision + */ + int precision(unsigned int n) { + int r = precision_; + 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 = fmtflags_; + 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 = fmtflags_; + fmtflags_ &= ~mask; + fmtflags_ |= fl; + return r; + } + /** clear format flags + * \param[in] fl flags to be cleared + * \return old flags + */ + void unsetf(fmtflags fl) { + fmtflags_ &= ~fl; + } + /** \return width */ + unsigned width() {return width_;} + /** set width + * \param[in] n new width + * \return old width + */ + unsigned width(unsigned n) { + unsigned r = width_; + 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 fill_; + fmtflags fmtflags_; + unsigned char precision_; + unsigned int 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() : 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 iostate_;} + /** \return True if no iostate flags are set else false. */ + bool good() const {return 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 iostate_ & eofbit;} + /** \return true if any iostate bit other than eof are set else false. */ + bool fail() const {return iostate_ & (failbit | badbit);} + /** \return true if bad bit is set else false. */ + bool bad() const {return iostate_ & badbit;} + /** Clear iostate bits. + * + * \param[in] state The flags you want to set after clearing all flags. + **/ + void clear(iostate state = goodbit) {iostate_ = state;} + /** Set iostate bits. + * + * \param[in] state Bitts to set. + **/ + void setstate(iostate state) {iostate_ |= state;} + private: + iostate iostate_; +}; +#endif // ios_h diff --git a/libs/SdFatBeta20120108/SdFat/iostream.h b/libs/SdFatBeta20120108/SdFat/iostream.h new file mode 100644 index 0000000..4393a54 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/iostream.h @@ -0,0 +1,153 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 "../../libs/SdFatBeta20120108/SdFat/istream.h" +#include "../../libs/SdFatBeta20120108/SdFat/ostream.h" +/** 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/libs/SdFatBeta20120108/SdFat/istream.cpp b/libs/SdFatBeta20120108/SdFat/istream.cpp new file mode 100644 index 0000000..c3874e4 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/istream.cpp @@ -0,0 +1,413 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 "../../libs/SdFatBeta20120108/SdFat/istream.h" + +#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() { + int16_t c; + gcount_ = 0; + c = getch(); + if (c < 0) { + setstate(failbit); + } else { + 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) { + int16_t 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; + fpos_t pos; + gcount_ = 0; + while ((gcount_ + 1) < n) { + c = getch(&pos); + if (c < 0) { + break; + } + if (c == delim) { + setpos(&pos); + break; + } + str[gcount_++] = c; + } + if (n > 0) str[gcount_] = '\0'; + if (gcount_ == 0) setstate(failbit); + return *this; +} +//------------------------------------------------------------------------------ +void istream::getBool(bool *b) { + if ((flags() & boolalpha) == 0) { + getNumber(b); + return; + } + PGM_P truePtr = PSTR("true"); + const uint8_t true_len = 4; + PGM_P falsePtr = PSTR("false"); + const uint8_t false_len = 5; + bool trueOk = true; + bool falseOk = true; + uint8_t i = 0; + int c = readSkip(); + while (1) { +// if (c < 0) break; // not required + 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::getFloat(float* 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; + fpos_t endPos; + float pow10; + float 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) { + fpos_t pos; + int c; + gcount_ = 0; + if (n > 0) str[0] = '\0'; + while (1) { + c = getch(&pos); + if (c < 0) { + break; + } + if (c == delim) { + gcount_++; + break; + } + if ((gcount_ + 1) >= n) { + setpos(&pos); + setstate(failbit); + break; + } + str[gcount_++] = c; + str[gcount_] = '\0'; + } + if (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; + fpos_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) { + fpos_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; + gcount_ = 0; + while (gcount_ < n) { + c = getch(); + if (c < 0) { + break; + } + 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; + fpos_t pos; + 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; + fpos_t pos; + do { + c = getch(&pos); + } while (isspace(c)); + setpos(&pos); +} diff --git a/libs/SdFatBeta20120108/SdFat/istream.h b/libs/SdFatBeta20120108/SdFat/istream.h new file mode 100644 index 0000000..9d57c87 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/istream.h @@ -0,0 +1,304 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 "../../libs/SdFatBeta20120108/SdFat/ios.h" + +/** + * \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 int16_t. + * \param[out] arg location to store the value. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream &operator>>(int16_t& arg) { + getNumber(&arg); + return *this; + } + /** + * Extract a value of type uint16_t. + * \param[out] arg location to store the value. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream &operator>>(uint16_t& arg) { + getNumber(&arg); + return *this; + } + /** + * Extract a value of type int32_t. + * \param[out] arg location to store the value. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream &operator>>(int32_t& arg) { + getNumber(&arg); + return *this; + } + /** + * Extract a value of type uint32_t. + * \param[out] arg location to store the value. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream &operator>>(uint32_t& arg) { + 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) { + getFloat(reinterpret_cast(&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) { + getFloat(&arg); + 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 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(fpos_t* pos) { + getpos(pos); + return getch(); + } + /** + * Internal - do not use + * \param[out] pos + */ + virtual void getpos(fpos_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(fpos_t* pos) = 0; + virtual pos_type tellpos() = 0; + + /// @endcond + private: + uint16_t gcount_; + void getBool(bool *b); + void getChar(char* ch); + bool getFloat(float* value); + template void getNumber(T* value); + bool getNumber(uint32_t posMax, uint32_t negMax, uint32_t* num); + void getStr(char *str); + int16_t readSkip(); +}; +//------------------------------------------------------------------------------ +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/libs/SdFatBeta20120108/SdFat/ostream.cpp b/libs/SdFatBeta20120108/SdFat/ostream.cpp new file mode 100644 index 0000000..890aff4 --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/ostream.cpp @@ -0,0 +1,176 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 "../../libs/SdFatBeta20120108/SdFat/ostream.h" +//------------------------------------------------------------------------------ +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) { + pgm t(PSTR("true")); + putPgm(t); + } else { + pgm f(PSTR("false")); + putPgm(f); + } + } 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) { + pgm err(PSTR("BIG FLT")); + putPgm(err); + 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 pgm &arg) { + char *str = arg.ptr; + int n = strlen_P(str); + 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/libs/SdFatBeta20120108/SdFat/ostream.h b/libs/SdFatBeta20120108/SdFat/ostream.h new file mode 100644 index 0000000..ea3280d --- /dev/null +++ b/libs/SdFatBeta20120108/SdFat/ostream.h @@ -0,0 +1,254 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 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 "../../libs/SdFatBeta20120108/SdFat/ios.h" +//------------------------------------------------------------------------------ +/** 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 signed int + * \param[in] arg value to output + * \return the stream + */ + ostream &operator<< (int16_t arg) { + putNum((int32_t)arg); + return *this; + } + /** Output unsigned int + * \param[in] arg value to output + * \return the stream + */ + ostream &operator<< (uint16_t arg) { + putNum((uint32_t)arg); + return *this; + } + /** Output signed long + * \param[in] arg value to output + * \return the stream + */ + ostream &operator<< (int32_t arg) { + putNum(arg); + return *this; + } + /** Output uint32_t + * \param[in] arg value to output + * \return the stream + */ + ostream &operator<< (uint32_t arg) { + 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 + * \param[in] arg pgm struct pointing to string + * \return the stream + */ + ostream &operator<< (pgm arg) { + putPgm(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 pgm& arg); + void putStr(const char* str); +}; +#endif // ostream_h diff --git a/libs/SdFatBeta20120108/SdLevel.png b/libs/SdFatBeta20120108/SdLevel.png new file mode 100644 index 0000000000000000000000000000000000000000..f67f0092f672c1b6381eb513864de0815535b74a GIT binary patch literal 21428 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 N!PC{xWt~$(699^IP4fT% literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/WorkingDirectory.txt b/libs/SdFatBeta20120108/WorkingDirectory.txt new file mode 100644 index 0000000..013291d --- /dev/null +++ b/libs/SdFatBeta20120108/WorkingDirectory.txt @@ -0,0 +1,44 @@ +Relative paths in SdFat are resolved in a manner similar to Windows. + +Each instance of SdFat has a current directory. In SdFat this directory +is called the volume working directory, vwd. Initially this directory is +the root directory for the volume. + +The volume working directory is changed by calling SdFat::chdir(path). + +The call sd.chdir("/2011") will change the volume working directory +for sd to "/2011", assuming "/2011" exists. + +Relative paths for SdFat member functions are resolved by starting at +the volume working directory. + +For example, the call sd.mkdir("APRIL") will create the directory +"/2011/APRIL" assuming the volume working directory is "/2011". + +SdFat has a current working directory, cwd, that is used to resolve paths +for file.open() calls. + +For a single SD card the current working directory is always the volume +working directory for that card. + +For multiple SD cards the current working directory is set to the volume +working directory of a card by calling the SdFat::chvol() member function. +The chvol() call is like the Windows : 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/libs/SdFatBeta20120108/changes.txt b/libs/SdFatBeta20120108/changes.txt new file mode 100644 index 0000000..74a4cc9 --- /dev/null +++ b/libs/SdFatBeta20120108/changes.txt @@ -0,0 +1,267 @@ +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/libs/SdFatBeta20120108/extra/FridgeLogger/LightTempSdfat.pde b/libs/SdFatBeta20120108/extra/FridgeLogger/LightTempSdfat.pde new file mode 100644 index 0000000..7108afd --- /dev/null +++ b/libs/SdFatBeta20120108/extra/FridgeLogger/LightTempSdfat.pde @@ -0,0 +1,224 @@ +#include +SdFat SD; +#include +#include "RTClib.h" + +// A simple data logger for the Arduino analog pins + +// how many milliseconds between grabbing data and logging it. 1000 ms is once a second +#define LOG_INTERVAL 1000 // mills between entries (reduce to take more/faster data) + +// how many milliseconds before writing the logged data permanently to disk +// set it to the LOG_INTERVAL to write each time (safest) +// set it to 10*LOG_INTERVAL to write all data every 10 datareads, you could lose up to +// the last 10 reads if power is lost but it uses less power and is much faster! +#define SYNC_INTERVAL 1000 // mills between calls to flush() - to write data to the card +uint32_t syncTime = 0; // time of last sync() + +#define ECHO_TO_SERIAL 1 // echo data to serial port +#define WAIT_TO_START 0 // Wait for serial input in setup() + +// the digital pins that connect to the LEDs +#define redLEDpin 2 +#define greenLEDpin 3 + +// The analog pins that connect to the sensors +#define photocellPin 0 // analog 0 +#define tempPin 1 // analog 1 +#define BANDGAPREF 14 // special indicator that we want to measure the bandgap + +#define aref_voltage 3.3 // we tie 3.3V to ARef and measure it with a multimeter! +#define bandgap_voltage 1.1 // this is not super guaranteed but its not -too- off + +RTC_DS1307 RTC; // define the Real Time Clock object + +// for the data logging shield, we use digital pin 10 for the SD cs line +const int chipSelect = 10; + +// the logging file +SdFile logfile; + +void error(char *str) +{ + Serial.print("error: "); + Serial.println(str); + + // red LED indicates error + digitalWrite(redLEDpin, HIGH); + + while(1); +} + +void setup(void) +{ + Serial.begin(9600); + Serial.println(); + + // use debugging LEDs + pinMode(redLEDpin, OUTPUT); + pinMode(greenLEDpin, OUTPUT); + +#if WAIT_TO_START + Serial.println("Type any character to start"); + while (!Serial.available()); +#endif //WAIT_TO_START + + // initialize the SD card + Serial.print("Initializing SD card..."); + // make sure that the default chip select pin is set to + // output, even if you don't use it: + pinMode(10, OUTPUT); + + // see if the card is present and can be initialized: + if (!SD.init(SPI_HALF_SPEED, chipSelect)) { + error("Card failed, or not present"); + } + Serial.println("card initialized."); + + // create a new file + char filename[] = "LOGGER00.CSV"; + for (uint8_t i = 0; i < 100; i++) { + filename[6] = i/10 + '0'; + filename[7] = i%10 + '0'; + if (! SD.exists(filename)) { + // only open a new file if it doesn't exist + logfile.open(filename, O_WRITE | O_CREAT); + break; // leave the loop! + } + } + + if (! logfile.isOpen()) { + error("couldnt create file"); + } + + Serial.print("Logging to: "); + Serial.println(filename); + + // connect to RTC + Wire.begin(); + if (!RTC.begin()) { + logfile.println("RTC failed"); +#if ECHO_TO_SERIAL + Serial.println("RTC failed"); +#endif //ECHO_TO_SERIAL + } + + + logfile.println("millis,stamp,datetime,light,temp,vcc"); +#if ECHO_TO_SERIAL + Serial.println("millis,stamp,datetime,light,temp,vcc"); +#endif //ECHO_TO_SERIAL + + // If you want to set the aref to something other than 5v + analogReference(EXTERNAL); +} + +void loop(void) +{ + DateTime now; + + // delay for the amount of time we want between readings + delay((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL)); + + digitalWrite(greenLEDpin, HIGH); + + // log milliseconds since starting + uint32_t m = millis(); + logfile.print(m); // milliseconds since start + logfile.print(", "); +#if ECHO_TO_SERIAL + Serial.print(m); // milliseconds since start + Serial.print(", "); +#endif + + // fetch the time + now = RTC.now(); + // log time + logfile.print(now.unixtime()); // seconds since 1/1/1970 + logfile.print(", "); + logfile.write('"'); + logfile.print(now.year(), DEC); + logfile.write('/'); + logfile.print(now.month(), DEC); + logfile.write('/'); + logfile.print(now.day(), DEC); + logfile.write(' '); + logfile.print(now.hour(), DEC); + logfile.write(':'); + logfile.print(now.minute(), DEC); + logfile.write(':'); + logfile.print(now.second(), DEC); + logfile.write('"'); +#if ECHO_TO_SERIAL + Serial.print(now.unixtime()); // seconds since 1/1/1970 + Serial.print(", "); + Serial.write('"'); + Serial.print(now.year(), DEC); + Serial.write('/'); + Serial.print(now.month(), DEC); + Serial.write('/'); + Serial.print(now.day(), DEC); + Serial.write(' '); + Serial.print(now.hour(), DEC); + Serial.write(':'); + Serial.print(now.minute(), DEC); + Serial.write(':'); + Serial.print(now.second(), DEC); + Serial.write('"'); +#endif //ECHO_TO_SERIAL + + analogRead(photocellPin); + delay(10); + int photocellReading = analogRead(photocellPin); + + analogRead(tempPin); + delay(10); + int tempReading = analogRead(tempPin); + + // converting that reading to voltage, for 3.3v arduino use 3.3, for 5.0, use 5.0 + float voltage = tempReading * aref_voltage / 1024; + float temperatureC = (voltage - 0.5) * 100 ; + float temperatureF = (temperatureC * 9 / 5) + 32; + + logfile.print(", "); + logfile.print(photocellReading); + logfile.print(", "); + logfile.print(temperatureF); +#if ECHO_TO_SERIAL + Serial.print(", "); + Serial.print(photocellReading); + Serial.print(", "); + Serial.print(temperatureF); +#endif //ECHO_TO_SERIAL + + // Log the estimated 'VCC' voltage by measuring the internal 1.1v ref + analogRead(BANDGAPREF); + delay(10); + int refReading = analogRead(BANDGAPREF); + float supplyvoltage = (bandgap_voltage * 1024) / refReading; + + logfile.print(", "); + logfile.print(supplyvoltage); +#if ECHO_TO_SERIAL + Serial.print(", "); + Serial.print(supplyvoltage); +#endif // ECHO_TO_SERIAL + + logfile.println(); +#if ECHO_TO_SERIAL + Serial.println(); +#endif // ECHO_TO_SERIAL + + digitalWrite(greenLEDpin, LOW); + + // Now we write data to disk! Don't sync too often - requires 2048 bytes of I/O to SD card + // which uses a bunch of power and takes time + if ((millis() - syncTime) < SYNC_INTERVAL) return; + syncTime = millis(); + + // blink LED to show we are syncing data to the card & updating FAT! + digitalWrite(redLEDpin, HIGH); + logfile.sync(); + digitalWrite(redLEDpin, LOW); + +} \ No newline at end of file diff --git a/libs/SdFatBeta20120108/extra/FridgeLogger/LightTempStreams.pde b/libs/SdFatBeta20120108/extra/FridgeLogger/LightTempStreams.pde new file mode 100644 index 0000000..bc3684a --- /dev/null +++ b/libs/SdFatBeta20120108/extra/FridgeLogger/LightTempStreams.pde @@ -0,0 +1,177 @@ +#include +#include +#include "RTClib.h" + +// A simple data logger for the Arduino analog pins + +// how many milliseconds between grabbing data and logging it. 1000 ms is once a second +#define LOG_INTERVAL 1000 // mills between entries (reduce to take more/faster data) + +// how many milliseconds before writing the logged data permanently to disk +// set it to the LOG_INTERVAL to write each time (safest) +// set it to 10*LOG_INTERVAL to write all data every 10 datareads, you could lose up to +// the last 10 reads if power is lost but it uses less power and is much faster! +#define SYNC_INTERVAL 1000 // mills between calls to flush() - to write data to the card +uint32_t syncTime = 0; // time of last sync() + +#define ECHO_TO_SERIAL 1 // echo data to serial port +#define WAIT_TO_START 0 // Wait for serial input in setup() + +// the digital pins that connect to the LEDs +#define redLEDpin 2 +#define greenLEDpin 3 + +// The analog pins that connect to the sensors +#define photocellPin 0 // analog 0 +#define tempPin 1 // analog 1 +#define BANDGAPREF 14 // special indicator that we want to measure the bandgap +#define aref_voltage 3.3 // we tie 3.3V to ARef and measure it with a multimeter! +#define bandgap_voltage 1.1 // this is not super guaranteed but its not -too- off +//------------------------------------------------------------------------------ +// for the data logging shield, we use digital pin 10 for the sd cs line +const int chipSelect = 10; + +// Serial Stream +ArduinoOutStream cout(Serial); + +// file system +SdFat sd; + +// the logging file +ofstream logfile; + +RTC_DS1307 RTC; // define the Real Time Clock object +//------------------------------------------------------------------------------ +// operator that formats 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; +} +//------------------------------------------------------------------------------ +// 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()); +} +//------------------------------------------------------------------------------ +void error(char *str) { + // red LED indicates error + digitalWrite(redLEDpin, HIGH); + sd.errorHalt(str); +} +//------------------------------------------------------------------------------ +void setup(void) { + Serial.begin(9600); + + // use debugging LEDs + pinMode(redLEDpin, OUTPUT); + pinMode(greenLEDpin, OUTPUT); + +#if WAIT_TO_START + cout << "Type any character to start" << endl; + while (!Serial.available()); +#endif //WAIT_TO_START + + // connect to RTC + Wire.begin(); + if (!RTC.begin()) error("RTC failed"); + + // set date time callback function + SdFile::dateTimeCallback(dateTime); + + // see if the card is present and can be initialized: + if (!sd.init(SPI_HALF_SPEED, chipSelect)) sd.initErrorHalt(); + + // create a new file + char filename[] = "LOGGER00.CSV"; + for (uint8_t i = 0; i < 100; i++) { + filename[6] = i/10 + '0'; + filename[7] = i%10 + '0'; + if (!sd.exists(filename)) { + // only open a new file if it doesn't exist + logfile.open(filename); + break; // leave the loop! + } + } + + if (!logfile.is_open()) error("couldnt create file"); + cout <<"Logging to: " << filename << endl; + + // file header + logfile << "millis,stamp,date,time,light,temp,vcc" << endl; +#if ECHO_TO_SERIAL + cout << "millis,stamp,date,time,light,temp,vcc" << endl; +#endif //ECHO_TO_SERIAL + + // If you want to set the aref to something other than 5v + analogReference(EXTERNAL); +} +//------------------------------------------------------------------------------ +void loop(void) { + // milliseconds since starting + uint32_t m = millis(); + + // wait for time to be a multiple of logging interval + do { + m = millis(); + } while (m % LOG_INTERVAL); + + digitalWrite(greenLEDpin, HIGH); + + // fetch the time + DateTime now = RTC.now(); + + // read the photo cell + analogRead(photocellPin); + delay(10); + int photocellReading = analogRead(photocellPin); + + // read the temperature + analogRead(tempPin); + delay(10); + int tempReading = analogRead(tempPin); + + // converting that reading to voltage, for 3.3v arduino use 3.3, for 5.0, use 5.0 + float voltage = tempReading * aref_voltage / 1024; + float temperatureC = (voltage - 0.5) * 100 ; + float temperatureF = (temperatureC * 9 / 5) + 32; + + // Get the estimated 'VCC' voltage by measuring the internal 1.1v ref + analogRead(BANDGAPREF); + delay(10); + int refReading = analogRead(BANDGAPREF); + float supplyvoltage = (bandgap_voltage * 1024) / refReading; + + // log the data + logfile << m << ',' << now.unixtime() << ',' << now; + logfile << ',' << photocellReading << ',' << temperatureF; + logfile << ',' << supplyvoltage << endl; +#if ECHO_TO_SERIAL + cout << m << ',' << now.unixtime() << ',' << now; + cout << ',' << photocellReading << ',' << temperatureF; + cout << ',' << supplyvoltage << endl; +#endif // ECHO_TO_SERIAL + + digitalWrite(greenLEDpin, LOW); + + // Now we write data to disk! Don't sync too often + // requires 2048 bytes of I/O to sd card + // which uses a bunch of power and takes time + if ((millis() - syncTime) >= SYNC_INTERVAL) { + syncTime = millis(); + + // blink LED to show we are syncing data to the card & updating FAT! + digitalWrite(redLEDpin, HIGH); + logfile.flush(); + digitalWrite(redLEDpin, LOW); + } + // check for errors + if (!logfile.good()) error("write error"); +} diff --git a/libs/SdFatBeta20120108/extra/FridgeLogger/diff.txt b/libs/SdFatBeta20120108/extra/FridgeLogger/diff.txt new file mode 100644 index 0000000..e908188 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/FridgeLogger/diff.txt @@ -0,0 +1,25 @@ +1c1,2 +< #include +--- +> #include +> SdFat SD; +38c39 +< File logfile; +--- +> SdFile logfile; +72c73 +< if (!SD.begin(chipSelect)) { +--- +> if (!SD.init(SPI_HALF_SPEED, chipSelect)) { +84c85 +< logfile = SD.open(filename, FILE_WRITE); +--- +> logfile.open(filename, O_WRITE | O_CREAT); +89c90 +< if (! logfile) { +--- +> if (! logfile.isOpen()) { +220c221 +< logfile.flush(); +--- +> logfile.sync(); diff --git a/libs/SdFatBeta20120108/extra/FridgeLogger/lighttemplogger.pde b/libs/SdFatBeta20120108/extra/FridgeLogger/lighttemplogger.pde new file mode 100644 index 0000000..9f09937 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/FridgeLogger/lighttemplogger.pde @@ -0,0 +1,223 @@ +#include +#include +#include "RTClib.h" + +// A simple data logger for the Arduino analog pins + +// how many milliseconds between grabbing data and logging it. 1000 ms is once a second +#define LOG_INTERVAL 1000 // mills between entries (reduce to take more/faster data) + +// how many milliseconds before writing the logged data permanently to disk +// set it to the LOG_INTERVAL to write each time (safest) +// set it to 10*LOG_INTERVAL to write all data every 10 datareads, you could lose up to +// the last 10 reads if power is lost but it uses less power and is much faster! +#define SYNC_INTERVAL 1000 // mills between calls to flush() - to write data to the card +uint32_t syncTime = 0; // time of last sync() + +#define ECHO_TO_SERIAL 1 // echo data to serial port +#define WAIT_TO_START 0 // Wait for serial input in setup() + +// the digital pins that connect to the LEDs +#define redLEDpin 2 +#define greenLEDpin 3 + +// The analog pins that connect to the sensors +#define photocellPin 0 // analog 0 +#define tempPin 1 // analog 1 +#define BANDGAPREF 14 // special indicator that we want to measure the bandgap + +#define aref_voltage 3.3 // we tie 3.3V to ARef and measure it with a multimeter! +#define bandgap_voltage 1.1 // this is not super guaranteed but its not -too- off + +RTC_DS1307 RTC; // define the Real Time Clock object + +// for the data logging shield, we use digital pin 10 for the SD cs line +const int chipSelect = 10; + +// the logging file +File logfile; + +void error(char *str) +{ + Serial.print("error: "); + Serial.println(str); + + // red LED indicates error + digitalWrite(redLEDpin, HIGH); + + while(1); +} + +void setup(void) +{ + Serial.begin(9600); + Serial.println(); + + // use debugging LEDs + pinMode(redLEDpin, OUTPUT); + pinMode(greenLEDpin, OUTPUT); + +#if WAIT_TO_START + Serial.println("Type any character to start"); + while (!Serial.available()); +#endif //WAIT_TO_START + + // initialize the SD card + Serial.print("Initializing SD card..."); + // make sure that the default chip select pin is set to + // output, even if you don't use it: + pinMode(10, OUTPUT); + + // see if the card is present and can be initialized: + if (!SD.begin(chipSelect)) { + error("Card failed, or not present"); + } + Serial.println("card initialized."); + + // create a new file + char filename[] = "LOGGER00.CSV"; + for (uint8_t i = 0; i < 100; i++) { + filename[6] = i/10 + '0'; + filename[7] = i%10 + '0'; + if (! SD.exists(filename)) { + // only open a new file if it doesn't exist + logfile = SD.open(filename, FILE_WRITE); + break; // leave the loop! + } + } + + if (! logfile) { + error("couldnt create file"); + } + + Serial.print("Logging to: "); + Serial.println(filename); + + // connect to RTC + Wire.begin(); + if (!RTC.begin()) { + logfile.println("RTC failed"); +#if ECHO_TO_SERIAL + Serial.println("RTC failed"); +#endif //ECHO_TO_SERIAL + } + + + logfile.println("millis,stamp,datetime,light,temp,vcc"); +#if ECHO_TO_SERIAL + Serial.println("millis,stamp,datetime,light,temp,vcc"); +#endif //ECHO_TO_SERIAL + + // If you want to set the aref to something other than 5v + analogReference(EXTERNAL); +} + +void loop(void) +{ + DateTime now; + + // delay for the amount of time we want between readings + delay((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL)); + + digitalWrite(greenLEDpin, HIGH); + + // log milliseconds since starting + uint32_t m = millis(); + logfile.print(m); // milliseconds since start + logfile.print(", "); +#if ECHO_TO_SERIAL + Serial.print(m); // milliseconds since start + Serial.print(", "); +#endif + + // fetch the time + now = RTC.now(); + // log time + logfile.print(now.unixtime()); // seconds since 1/1/1970 + logfile.print(", "); + logfile.write('"'); + logfile.print(now.year(), DEC); + logfile.write('/'); + logfile.print(now.month(), DEC); + logfile.write('/'); + logfile.print(now.day(), DEC); + logfile.write(' '); + logfile.print(now.hour(), DEC); + logfile.write(':'); + logfile.print(now.minute(), DEC); + logfile.write(':'); + logfile.print(now.second(), DEC); + logfile.write('"'); +#if ECHO_TO_SERIAL + Serial.print(now.unixtime()); // seconds since 1/1/1970 + Serial.print(", "); + Serial.write('"'); + Serial.print(now.year(), DEC); + Serial.write('/'); + Serial.print(now.month(), DEC); + Serial.write('/'); + Serial.print(now.day(), DEC); + Serial.write(' '); + Serial.print(now.hour(), DEC); + Serial.write(':'); + Serial.print(now.minute(), DEC); + Serial.write(':'); + Serial.print(now.second(), DEC); + Serial.write('"'); +#endif //ECHO_TO_SERIAL + + analogRead(photocellPin); + delay(10); + int photocellReading = analogRead(photocellPin); + + analogRead(tempPin); + delay(10); + int tempReading = analogRead(tempPin); + + // converting that reading to voltage, for 3.3v arduino use 3.3, for 5.0, use 5.0 + float voltage = tempReading * aref_voltage / 1024; + float temperatureC = (voltage - 0.5) * 100 ; + float temperatureF = (temperatureC * 9 / 5) + 32; + + logfile.print(", "); + logfile.print(photocellReading); + logfile.print(", "); + logfile.print(temperatureF); +#if ECHO_TO_SERIAL + Serial.print(", "); + Serial.print(photocellReading); + Serial.print(", "); + Serial.print(temperatureF); +#endif //ECHO_TO_SERIAL + + // Log the estimated 'VCC' voltage by measuring the internal 1.1v ref + analogRead(BANDGAPREF); + delay(10); + int refReading = analogRead(BANDGAPREF); + float supplyvoltage = (bandgap_voltage * 1024) / refReading; + + logfile.print(", "); + logfile.print(supplyvoltage); +#if ECHO_TO_SERIAL + Serial.print(", "); + Serial.print(supplyvoltage); +#endif // ECHO_TO_SERIAL + + logfile.println(); +#if ECHO_TO_SERIAL + Serial.println(); +#endif // ECHO_TO_SERIAL + + digitalWrite(greenLEDpin, LOW); + + // Now we write data to disk! Don't sync too often - requires 2048 bytes of I/O to SD card + // which uses a bunch of power and takes time + if ((millis() - syncTime) < SYNC_INTERVAL) return; + syncTime = millis(); + + // blink LED to show we are syncing data to the card & updating FAT! + digitalWrite(redLEDpin, HIGH); + logfile.flush(); + digitalWrite(redLEDpin, LOW); + +} \ No newline at end of file diff --git a/libs/SdFatBeta20120108/extra/FridgeLogger/readme.txt b/libs/SdFatBeta20120108/extra/FridgeLogger/readme.txt new file mode 100644 index 0000000..2c9b66a --- /dev/null +++ b/libs/SdFatBeta20120108/extra/FridgeLogger/readme.txt @@ -0,0 +1,15 @@ +These three files are versions of the Adafruit Fridge Logger. + +See: + +http://forums.adafruit.com/viewtopic.php?f=31&t=21844 + +http://www.ladyada.net/make/logshield/lighttemp.html + + +lighttemplogger.pde - version for the Arduino SD.h library + +LightTempSdfat.pde - minimal changes to port to SdFat + +LightTempStreams.pde - version using I/O streams + diff --git a/libs/SdFatBeta20120108/extra/SdFatTestSuite/SdFatTestSuite.cpp b/libs/SdFatBeta20120108/extra/SdFatTestSuite/SdFatTestSuite.cpp new file mode 100644 index 0000000..debbd85 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/SdFatTestSuite/SdFatTestSuite.cpp @@ -0,0 +1,73 @@ +/* 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 "../../../libs/SdFatBeta20120108/extra/SdFatTestSuite/SdFatTestSuite.h" +static uint16_t failCount; +static uint16_t testCount; +static Print* testOut = &Serial; +//------------------------------------------------------------------------------ +void testBegin(Print* pr) { + testOut = pr; + SerialPrintln_P(PSTR("Type any character to begin.")); + while (!Serial.available()); + + 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) + strlen_P(expect) + 5; + testResult(!strcmp_P(result, expect), n); +} +//------------------------------------------------------------------------------ +void testVerify_P(bool b, PGM_P msg) { + print_P(testOut, msg); + uint8_t n = strlen_P(msg); + testResult(b, n); +} diff --git a/libs/SdFatBeta20120108/extra/SdFatTestSuite/SdFatTestSuite.h b/libs/SdFatBeta20120108/extra/SdFatTestSuite/SdFatTestSuite.h new file mode 100644 index 0000000..f1c2b8d --- /dev/null +++ b/libs/SdFatBeta20120108/extra/SdFatTestSuite/SdFatTestSuite.h @@ -0,0 +1,32 @@ +/* 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 "../../../libs/SdFatBeta20120108/SdFat/SdFat.h" +#include "../../../libs/SdFatBeta20120108/SdFat/SdFatUtil.h" +#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(Print* pr); +void testEnd(); +void testVerify_P(bool b, PGM_P msg); +void testVerify_P(char* result, PGM_P expect); +#endif // SdFatTestSuite_h diff --git a/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/ATS_SD_File/ATS_SD_File.pde b/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/ATS_SD_File/ATS_SD_File.pde new file mode 100644 index 0000000..bbd2c9f --- /dev/null +++ b/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/ATS_SD_File/ATS_SD_File.pde @@ -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; + Serial.begin(9600); + testBegin(&Serial); + + ATS_PrintTestStatus("SD.init()", b = SD.init()); + 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/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/ATS_SD_Files/ATS_SD_Files.pde b/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/ATS_SD_Files/ATS_SD_Files.pde new file mode 100644 index 0000000..16627e9 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/ATS_SD_Files/ATS_SD_Files.pde @@ -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; + Serial.begin(9600); + testBegin(&Serial); + + ATS_PrintTestStatus("SD.init()", b = SD.init()); + 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/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/ATS_SD_Seek/ATS_SD_Seek.pde b/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/ATS_SD_Seek/ATS_SD_Seek.pde new file mode 100644 index 0000000..1ca2dc2 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/ATS_SD_Seek/ATS_SD_Seek.pde @@ -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; + Serial.begin(9600); + testBegin(&Serial); + + ATS_PrintTestStatus("SD.init()", b = SD.init()); + 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/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/fstreamTest/fstreamTest.pde b/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/fstreamTest/fstreamTest.pde new file mode 100644 index 0000000..728f085 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/fstreamTest/fstreamTest.pde @@ -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() { + Serial.begin(9600); + testBegin(&Serial); + if (!sd.init()) sd.initErrorHalt(); + fstreamOpen(); + testPosition(); + testEnd(); +} +//------------------------------------------------------------------------------ +void loop() {} diff --git a/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/istreamTest/istreamTest.pde b/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/istreamTest/istreamTest.pde new file mode 100644 index 0000000..0e14078 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/istreamTest/istreamTest.pde @@ -0,0 +1,221 @@ +#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 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.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 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()); + + 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()); + + 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() { + Serial.begin(9600); + testBegin(&Serial); + istreamBool(); + istreamChar(); + istreamFloat(); + istreamGet(); + istreamNumber(); + istreamStr(); + testEnd(); +} +//------------------------------------------------------------------------------ +void loop() {} diff --git a/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/ostreamTest/ostreamTest.pde b/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/ostreamTest/ostreamTest.pde new file mode 100644 index 0000000..f8392a7 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/SdFatTestSuite/examples/ostreamTest/ostreamTest.pde @@ -0,0 +1,165 @@ +#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 < + +// file system +SdFat sd; + +// log file +SdFile file; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) +//------------------------------------------------------------------------------ +void setup(void) { + Serial.begin(9600); + Serial.println(); + +#if WAIT_TO_START + Serial.println("Type any character to start"); + while (!Serial.available()); +#endif //WAIT_TO_START + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.init(SPI_HALF_SPEED)) sd.initErrorHalt(); + + // create a new file + char name[] = "LOGGER00.CSV"; + for (uint8_t i = 0; i < 100; i++) { + name[6] = i/10 + '0'; + name[7] = i%10 + '0'; + if (file.open(name, O_CREAT | O_EXCL | O_WRITE)) break; + } + if (!file.isOpen()) error ("file.create"); + Serial.print("Logging to: "); + Serial.println(name); + + // write header + file.writeError = 0; + file.print("millis"); +#if ECHO_TO_SERIAL + Serial.print("millis"); +#endif //ECHO_TO_SERIAL + +#if SENSOR_COUNT > 6 +#error SENSOR_COUNT too large +#endif //SENSOR_COUNT + + for (uint8_t i = 0; i < SENSOR_COUNT; i++) { + file.print(",sens");file.print(i, DEC); +#if ECHO_TO_SERIAL + Serial.print(",sens");Serial.print(i, DEC); +#endif //ECHO_TO_SERIAL + } + file.println(); +#if ECHO_TO_SERIAL + Serial.println(); +#endif //ECHO_TO_SERIAL + + if (file.writeError || !file.sync()) { + error("write header failed"); + } +} +//------------------------------------------------------------------------------ +void loop(void) { + uint32_t m; + + // wait for time to be a multiple of interval + do { + m = millis(); + } while (m % LOG_INTERVAL); + + // log time + file.print(m); +#if ECHO_TO_SERIAL + Serial.print(m); +#endif //ECHO_TO_SERIAL + + // add sensor data + for (uint8_t ia = 0; ia < SENSOR_COUNT; ia++) { + uint16_t data = analogRead(ia); + file.write(','); + file.print(data); +#if ECHO_TO_SERIAL + Serial.write(','); + Serial.print(data); +#endif //ECHO_TO_SERIAL + } + file.println(); +#if ECHO_TO_SERIAL + Serial.println(); +#endif //ECHO_TO_SERIAL + + if (file.writeError) error("write data failed"); + + //don't sync too often - requires 2048 bytes of I/O to SD card + if ((millis() - syncTime) >= SYNC_INTERVAL) { + syncTime = millis(); + if (!file.sync()) error("sync failed"); + } + // don't log two samples in same millisecond + if (m == millis()) delay(1); +} diff --git a/libs/SdFatBeta20120108/extra/examplesV1/SdFatAppend/SdFatAppend.pde b/libs/SdFatBeta20120108/extra/examplesV1/SdFatAppend/SdFatAppend.pde new file mode 100644 index 0000000..4937ad5 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/examplesV1/SdFatAppend/SdFatAppend.pde @@ -0,0 +1,55 @@ +/* + * Append Example + * + * This sketch shows how to use open for append and the Arduino Print class + * with SdFat. + */ +#include +#include // use functions to print strings from flash memory + +SdFat sd; + +SdFile file; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) +//------------------------------------------------------------------------------ +void setup(void) { + Serial.begin(9600); + Serial.println(); + PgmPrintln("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.init(SPI_HALF_SPEED)) sd.initErrorHalt(); + + char name[] = "APPEND.TXT"; + PgmPrint("Appending to: "); + Serial.println(name); + + for (uint8_t i = 0; i < 100; i++) { + // O_CREAT - create the file if it does not exist + // O_APPEND - seek to the end of the file prior to each write + // O_WRITE - open for write + if (!file.open(name, O_CREAT | O_APPEND | O_WRITE)) { + error("open failed"); + } + // print 100 lines to file + for (uint8_t j = 0; j < 100; j++) { + file.print("line "); + file.print(j, DEC); + file.print(" of pass "); + file.print(i, DEC); + file.print(" millis = "); + file.println(millis()); + } + if (file.writeError) error("write failed"); + if (!file.close()) error("close failed"); + if (i > 0 && i%25 == 0) Serial.println(); + Serial.write('.'); + } + Serial.println(); + Serial.println("Done"); +} +void loop(void){} diff --git a/libs/SdFatBeta20120108/extra/examplesV1/SdFatBench/SdFatBench.pde b/libs/SdFatBeta20120108/extra/examplesV1/SdFatBench/SdFatBench.pde new file mode 100644 index 0000000..f18aad8 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/examplesV1/SdFatBench/SdFatBench.pde @@ -0,0 +1,85 @@ +/* + * This sketch is a simple write/read benchmark. + */ +#include +#include + +#define FILE_SIZE_MB 5 +#define FILE_SIZE (1000000UL*FILE_SIZE_MB) +#define BUF_SIZE 100 + +uint8_t buf[BUF_SIZE]; + +SdFat sd; + +SdFile file; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + PgmPrintln("Type any character to start"); + while (!Serial.available()); + + PgmPrint("Free RAM: "); + Serial.println(FreeRam()); + + // initialize the SD card at SPI_FULL_SPEED for best performance. + // try SPI_HALF_SPEED if bus errors occur. + if (!sd.init(SPI_FULL_SPEED)) sd.initErrorHalt(); + + PgmPrint("Type is FAT"); + Serial.println(sd.vol()->fatType(), DEC); + + // 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'; + + PgmPrint("File size "); + Serial.print(FILE_SIZE_MB); + PgmPrintln(" MB"); + PgmPrintln("Starting write test. Please wait up to a minute"); + + // do write test + uint32_t n = FILE_SIZE/sizeof(buf); + uint32_t t = millis(); + for (uint32_t i = 0; i < n; i++) { + if (file.write(buf, sizeof(buf)) != sizeof(buf)) { + error("write failed"); + } + } + t = millis() - t; + file.sync(); + double r = (double)file.fileSize()/t; + PgmPrint("Write "); + Serial.print(r); + PgmPrintln(" KB/sec"); + Serial.println(); + PgmPrintln("Starting read test. Please wait up to a minute"); + + // do read test + file.rewind(); + t = millis(); + for (uint32_t i = 0; i < n; i++) { + if (file.read(buf, sizeof(buf)) != sizeof(buf)) { + error("read failed"); + } + } + t = millis() - t; + r = (double)file.fileSize()/t; + PgmPrint("Read "); + Serial.print(r); + PgmPrintln(" KB/sec"); + PgmPrintln("Done"); +} + +void loop() { } diff --git a/libs/SdFatBeta20120108/extra/examplesV1/SdFatCopy/SdFatCopy.pde b/libs/SdFatBeta20120108/extra/examplesV1/SdFatCopy/SdFatCopy.pde new file mode 100644 index 0000000..05568db --- /dev/null +++ b/libs/SdFatBeta20120108/extra/examplesV1/SdFatCopy/SdFatCopy.pde @@ -0,0 +1,64 @@ +/* + * Copy Example - only runs on chips with 2K or more RAM + * + * This sketch copies the file APPEND.TXT, created by the + * SdFatAppend.pde example, to the file ACOPY.TXT. + */ +#include +#include // use functions to print strings from flash memory + +// file system +SdFat sd; + +SdFile from; // read file +SdFile copy; // write file + +// large buffer to test for bugs. 512 bytes runs much faster. +char buf[600]; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) +//------------------------------------------------------------------------------ +void setup(void) { + Serial.begin(9600); + Serial.println(); + PgmPrintln("Type any character to start"); + while (!Serial.available()); + + PgmPrint("FreeRam: "); + Serial.println(FreeRam()); + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.init(SPI_HALF_SPEED)) sd.initErrorHalt(); + + strcpy_P(buf, PSTR("APPEND.TXT")); + // open for read + if (!from.open(buf, O_READ)) { + PgmPrint("Can't open "); + Serial.println(buf); + PgmPrintln("Run the append example to create the file."); + error("from.open failed"); + } + strcpy_P(buf, PSTR("ACOPY.TXT")); + // create if needed, truncate to zero length, open for write + if (!copy.open(buf, O_CREAT | O_TRUNC | O_WRITE)) { + error("copy.open failed"); + } + // count for printing periods + uint16_t p = 0; + int16_t n; + while ((n = from.read(buf, sizeof(buf))) > 0) { + if (copy.write(buf, n) != n) error("write failed"); + // print progress periods + if (!(p++ % 25)) Serial.write('.'); + if (!(p % 500)) Serial.println(); + } + Serial.println(); + if (n != 0) error ("read"); + // force write of directory entry and last data + if (!copy.close()) error("copy.close failed"); + PgmPrintln("Copy done."); +} + +void loop(void) {} diff --git a/libs/SdFatBeta20120108/extra/examplesV1/SdFatGPSLogger_v3/SdFatGPSLogger_v3.pde b/libs/SdFatBeta20120108/extra/examplesV1/SdFatGPSLogger_v3/SdFatGPSLogger_v3.pde new file mode 100644 index 0000000..7587f33 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/examplesV1/SdFatGPSLogger_v3/SdFatGPSLogger_v3.pde @@ -0,0 +1,326 @@ +// Ladyada's logger modified by Bill Greiman to use the SdFat library + +// this is a generic logger that does checksum testing so the data written should be always good +// Assumes a sirf III chipset logger attached to pin 0 and 1 + +#include +#include +#include + +// macros to use PSTR +#define putstring(str) SerialPrint_P(PSTR(str)) +#define putstring_nl(str) SerialPrintln_P(PSTR(str)) + +// power saving modes +#define SLEEPDELAY 0 +#define TURNOFFGPS 0 +#define LOG_RMC_FIXONLY 1 + +SdFat sd; + +SdFile f; + +#define led1Pin 4 +#define led2Pin 3 +#define powerPin 2 + +#define BUFFSIZE 75 +char buffer[BUFFSIZE]; +uint8_t bufferidx = 0; +uint8_t fix = 0; // current fix data +uint8_t i; + +/* EXAMPLE + +$PSRF103,,,,*CKSUM + + 00=GGA,01=GLL,02=GSA,03=GSV,04=RMC,05=VTG + 00=SetRate,01=Query + Output every seconds, off=00,max=255 + 00=disable Checksum,01=Enable checksum for specified message +Note: checksum is required + +Example 1: Query the GGA message with checksum enabled +$PSRF103,00,01,00,01*25 + +Example 2: Enable VTG message for a 1Hz constant output with checksum enabled +$PSRF103,05,00,01,01*20 + +Example 3: Disable VTG message +$PSRF103,05,00,00,01*21 + +*/ + +#define SERIAL_SET "$PSRF100,01,4800,08,01,00*0E\r\n" + +// GGA-Global Positioning System Fixed Data, message 103,00 +#define LOG_GGA 0 +#define GGA_ON "$PSRF103,00,00,01,01*25\r\n" +#define GGA_OFF "$PSRF103,00,00,00,01*24\r\n" + +// GLL-Geographic Position-Latitude/Longitude, message 103,01 +#define LOG_GLL 0 +#define GLL_ON "$PSRF103,01,00,01,01*26\r\n" +#define GLL_OFF "$PSRF103,01,00,00,01*27\r\n" + +// GSA-GNSS DOP and Active Satellites, message 103,02 +#define LOG_GSA 0 +#define GSA_ON "$PSRF103,02,00,01,01*27\r\n" +#define GSA_OFF "$PSRF103,02,00,00,01*26\r\n" + +// GSV-GNSS Satellites in View, message 103,03 +#define LOG_GSV 0 +#define GSV_ON "$PSRF103,03,00,01,01*26\r\n" +#define GSV_OFF "$PSRF103,03,00,00,01*27\r\n" + +// RMC-Recommended Minimum Specific GNSS Data, message 103,04 +#define LOG_RMC 1 +#define RMC_ON "$PSRF103,04,00,01,01*21\r\n" +#define RMC_OFF "$PSRF103,04,00,00,01*20\r\n" + +// VTG-Course Over Ground and Ground Speed, message 103,05 +#define LOG_VTG 0 +#define VTG_ON "$PSRF103,05,00,01,01*20\r\n" +#define VTG_OFF "$PSRF103,05,00,00,01*21\r\n" + +// Switch Development Data Messages On/Off, message 105 +#define LOG_DDM 1 +#define DDM_ON "$PSRF105,01*3E\r\n" +#define DDM_OFF "$PSRF105,00*3F\r\n" + +#define USE_WAAS 0 // useful in US, but slower fix +#define WAAS_ON "$PSRF151,01*3F\r\n" // the command for turning on WAAS +#define WAAS_OFF "$PSRF151,00*3E\r\n" // the command for turning off WAAS + +// read a Hex value and return the decimal equivalent +uint8_t parseHex(char c) { + if (c < '0') + return 0; + if (c <= '9') + return c - '0'; + if (c < 'A') + return 0; + if (c <= 'F') + return (c - 'A')+10; +} + +// blink out an error code +void error(uint8_t errno) { + while(1) { + for (i=0; i +#include +#include + +#define isdigit(x) ( x >= '0' && x <= '9') + +//extern uint16_t _end; + +SdFat sd; + +SdFile f; + +#define led1Pin 4 // LED1 connected to digital pin 4 +#define led2Pin 3 // LED2 connected to digital pin 3 +#define powerpin 2 // GPS power control + +// set the RX_BUFFER_SIZE to 32! +#define BUFFSIZE 73 // we buffer one NMEA sentence at a time, 83 bytes is longer than the max length +char buffer[BUFFSIZE]; // this is the double buffer +char buffer2[12]; + +uint8_t bufferidx = 0; +uint32_t tmp; +#define LOG_RMC 1 // essential location data +#define RMC_ON "$PSRF103,4,0,1,1*21\r\n" // the command we send to turn RMC on (1 hz rate) +#define RMC_OFF "$PSRF103,4,0,0,1*20\r\n" // the command we send to turn RMC off + +#define LOG_GGA 0 // contains fix, hdop & vdop data +#define GGA_ON "$PSRF103,0,0,1,1*25\r\n" // the command we send to turn GGA on (1 hz rate) +#define GGA_OFF "$PSRF103,0,0,0,1*24\r\n" // the command we send to turn GGA off + +#define LOG_GSA 0 // satellite data +#define GSA_ON "$PSRF103,2,0,1,1*27\r\n" // the command we send to turn GSA on (1 hz rate) +#define GSA_OFF "$PSRF103,2,0,0,1*26\r\n" // the command we send to turn GSA off + +#define LOG_GSV 0 // detailed satellite data +#define GSV_ON "$PSRF103,3,0,1,1*26\r\n" // the command we send to turn GSV on (1 hz rate) +#define GSV_OFF "$PSRF103,3,0,0,1*27\r\n" // the command we send to turn GSV off + +#define LOG_GLL 0 // Loran-compatibility data +// this isnt output by default + +#define USE_WAAS 1 // useful in US, but slower fix +#define WAAS_ON "$PSRF151,1*3F\r\n" // the command for turning on WAAS +#define WAAS_OFF "$PSRF151,0*3E\r\n" // the command for turning off WAAS + +#define LOG_RMC_FIXONLY 1 // log only when we get RMC's with fix? +uint8_t fix = 0; // current fix data + +// macros to use PSTR +#define putstring(str) SerialPrint_P(PSTR(str)) +#define putstring_nl(str) SerialPrintln_P(PSTR(str)) + +// read a Hex value and return the decimal equivalent +uint8_t parseHex(char c) { + if (c < '0') + return 0; + if (c <= '9') + return c - '0'; + if (c < 'A') + return 0; + if (c <= 'F') + return (c - 'A')+10; +} + +uint8_t i; + +// blink out an error code +void error(uint8_t errno) { + while(1) { + for (i=0; i 6) sensorCount = 6; + strncpy_P(buffer, PSTR("time,lat,long,speed,date,sens0,sens1,sens2,sens3,sens4,sens5"), 24 + 6*sensorCount); + Serial.println(buffer); + + f.println(buffer); + if (f.writeError || !f.sync()) { + putstring_nl("can't write header!"); + error(3); + } + + delay(1000); + + putstring("\r\n"); +#if USE_WAAS == 1 + putstring(WAAS_ON); // turn on WAAS +#else + putstring(WAAS_OFF); // turn on WAAS +#endif + +#if LOG_RMC == 1 + putstring(RMC_ON); // turn on RMC +#else + putstring(RMC_OFF); // turn off RMC +#endif + +#if LOG_GSV == 1 + putstring(GSV_ON); // turn on GSV +#else + putstring(GSV_OFF); // turn off GSV +#endif + +#if LOG_GSA == 1 + putstring(GSA_ON); // turn on GSA +#else + putstring(GSA_OFF); // turn off GSA +#endif + +#if LOG_GGA == 1 + putstring(GGA_ON); // turn on GGA +#else + putstring(GGA_OFF); // turn off GGA +#endif +} + +void loop() { // run over and over again + + //Serial.println(Serial.available(), DEC); + char c; + uint8_t sum; + + // read one 'line' + if (Serial.available()) { + c = Serial.read(); + //Serial.write(c); + if (bufferidx == 0) { + while (c != '$') + c = Serial.read(); // wait till we get a $ + } + buffer[bufferidx] = c; + + //Serial.write(c); + if (c == '\n') { + //putstring_nl("EOL"); + //Serial.print(buffer); + buffer[bufferidx+1] = 0; // terminate it + + if (buffer[bufferidx-4] != '*') { + // no checksum? + Serial.write('*'); + bufferidx = 0; + return; + } + // get checksum + sum = parseHex(buffer[bufferidx-3]) * 16; + sum += parseHex(buffer[bufferidx-2]); + + // check checksum + for (i=1; i < (bufferidx-4); i++) { + sum ^= buffer[i]; + } + if (sum != 0) { + //putstring_nl("Cxsum mismatch"); + Serial.write('~'); + bufferidx = 0; + return; + } + // got good data! + + if (strstr(buffer, "GPRMC")) { + // find out if we got a fix + char *p = buffer; + p = strchr(p, ',')+1; + p = strchr(p, ',')+1; // skip to 3rd item + + if (p[0] == 'V') { + digitalWrite(led1Pin, LOW); + fix = 0; + } else { + digitalWrite(led1Pin, HIGH); + fix = 1; + } + } else { + // not GPRMC + bufferidx = 0; + return; + } +#if LOG_RMC_FIXONLY + if (!fix) { + Serial.write('_'); + bufferidx = 0; + return; + } +#endif + // rad. lets print it! + + Serial.print(buffer); + + // time to clean up the string + // find time + char *p = buffer; + p = strchr(p, ',')+1; + buffer[0] = p[0]; + buffer[1] = p[1]; + buffer[2] = ':'; + buffer[3] = p[2]; + buffer[4] = p[3]; + buffer[5] = ':'; + buffer[6] = p[4]; + buffer[7] = p[5]; + // we ignore milliseconds + buffer[8] = ','; + + p = strchr(buffer+8, ',')+1; + // skip past 'active' flag + p = strchr(p, ',')+1; + // find lat + p = strchr(p, ',')+1; + + buffer[9] = '+'; + buffer[10] = p[0]; + buffer[11] = p[1]; + buffer[12] = ' '; + strncpy(buffer+13, p+2, 7); + buffer[20] = ','; + + p = strchr(buffer+21, ',')+1; + if (p[0] == 'S') + buffer[9] = '-'; + + // find long + p = strchr(p, ',')+1; + buffer[21] = '+'; + buffer[22] = p[0]; + buffer[23] = p[1]; + buffer[24] = p[2]; + buffer[25] = ' '; + strncpy(buffer+26, p+3, 7); + buffer[33] = ','; + + p = strchr(buffer+34, ',')+1; + if (p[0] == 'W') + buffer[21] = '-'; + + // find speed + p = strchr(p, ',')+1; + tmp = 0; + if (p[0] != ',') { + // ok there is some sort of speed + while (p[0] != '.' && p[0] != ',') { + tmp *= 10; + tmp += p[0] - '0'; + p++; + } + tmp *= 10; + if (isdigit(p[1])) + tmp += p[1] - '0'; // tenths + tmp *= 10; + if (isdigit(p[2])) + tmp += p[2] - '0'; // hundredths + + // tmp is knots * 100 + // convert to mph (1.15 mph = 1 knot) + tmp *= 115; + // -OR- convert km/h + // tmp *= 185 + } + tmp /= 100; + + buffer[34] = (tmp / 10000) + '0'; + tmp %= 10000; + buffer[35] = (tmp / 1000) + '0'; + tmp %= 1000; + buffer[36] = (tmp / 100) + '0'; + tmp %= 100; + buffer[37] = '.'; + buffer[38] = (tmp / 10) + '0'; + tmp %= 10; + buffer[39] = tmp + '0'; + + buffer[40] = ','; + p = strchr(p, ',')+1; + // skip past bearing + p = strchr(p, ',')+1; + //mod for bug when speed,bearing are missing (bill greiman) + uint8_t date[6]; + for (uint8_t id = 0; id < 6; id++) date[id] = p[id]; + // get date into 2001-01-31 style + buffer[41] = '2'; + buffer[42] = '0'; + buffer[43] = date[4]; + buffer[44] = date[5]; + buffer[45] = '-'; + buffer[46] = date[2]; + buffer[47] = date[3]; + buffer[48] = '-'; + buffer[49] = date[0]; + buffer[50] = date[1]; + buffer[51] = 0; + digitalWrite(led2Pin, HIGH); + if(f.write((uint8_t *) buffer, 51) != 51) { + putstring_nl("can't write fix!"); + return; + } + Serial.print(buffer); + + // add sensor data + for (uint8_t ia = 0; ia < sensorCount; ia++) { + Serial.write(','); + f.write(','); + uint16_t data = analogRead(ia); + Serial.print(data); + f.print(data); + } + Serial.println(); + f.println(); + if (f.writeError || !f.sync()) { + putstring_nl("can't write data!"); + error(4); + } + digitalWrite(led2Pin, LOW); + bufferidx = 0; + return; + } + bufferidx++; + if (bufferidx == BUFFSIZE-1) { + Serial.write('!'); + bufferidx = 0; + } + } +} + diff --git a/libs/SdFatBeta20120108/extra/examplesV1/SdFatLs/SdFatLs.pde b/libs/SdFatBeta20120108/extra/examplesV1/SdFatLs/SdFatLs.pde new file mode 100644 index 0000000..d25a822 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/examplesV1/SdFatLs/SdFatLs.pde @@ -0,0 +1,44 @@ +/* + * This sketch will list all files in the root directory and + * then do a recursive list of all directories on the SD card. + * + */ +#include +#include + +SdFat sd; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) + + +void setup() { + Serial.begin(9600); + PgmPrintln("Type any character to start"); + while (!Serial.available()); + + PgmPrint("Free RAM: "); + Serial.println(FreeRam()); + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.init(SPI_HALF_SPEED)) sd.initErrorHalt(); + + PgmPrint("Volume is FAT"); + Serial.println(sd.vol()->fatType(), DEC); + Serial.println(); + + // list file in root with date and size + PgmPrintln("Files found in root:"); + sd.ls(LS_DATE | LS_SIZE); + Serial.println(); + + // Recursive list of all directories + PgmPrintln("Files found in all dirs:"); + sd.ls(LS_R); + + Serial.println(); + PgmPrintln("Done"); +} + +void loop() { } diff --git a/libs/SdFatBeta20120108/extra/examplesV1/SdFatMakeDir/SdFatMakeDir.pde b/libs/SdFatBeta20120108/extra/examplesV1/SdFatMakeDir/SdFatMakeDir.pde new file mode 100644 index 0000000..d5923c8 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/examplesV1/SdFatMakeDir/SdFatMakeDir.pde @@ -0,0 +1,131 @@ +/* + * 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 + +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); + PgmPrintln("Type any character to start"); + while (!Serial.available()); + + // initialize the SD card at SPI_FULL_SPEED for best performance. + // try SPI_HALF_SPEED if bus errors occur. + if (!sd.init(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/libs/SdFatBeta20120108/extra/examplesV1/SdFatPrint/SdFatPrint.pde b/libs/SdFatBeta20120108/extra/examplesV1/SdFatPrint/SdFatPrint.pde new file mode 100644 index 0000000..8e15454 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/examplesV1/SdFatPrint/SdFatPrint.pde @@ -0,0 +1,49 @@ +/* + * Print Example + * + * This sketch shows how to use the Arduino Print class with SdFat. + */ +#include +#include // use functions to print strings from flash memory + +SdFat sd; + +SdFile file; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) + +void setup(void) { + Serial.begin(9600); + Serial.println(); + PgmPrintln("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.init(SPI_HALF_SPEED)) sd.initErrorHalt(); + + // create a new file + char name[] = "PRINT00.TXT"; + for (uint8_t i = 0; i < 100; i++) { + name[5] = i/10 + '0'; + name[6] = i%10 + '0'; + // only create new file for write + if (file.open(name, O_CREAT | O_EXCL | O_WRITE)) break; + } + if (!file.isOpen()) error ("file.create"); + PgmPrintln("Printing to: "); + Serial.println(name); + + // print 100 line to file + for (uint8_t i = 0; i < 100; i++) { + file.print("line "); + file.print(i, DEC); + file.print(" millis = "); + file.println(millis()); + } + // force write of all data to the SD card + if (file.writeError || !file.sync()) error ("print or sync"); + PgmPrintln("Done"); +} +void loop(void){} diff --git a/libs/SdFatBeta20120108/extra/examplesV1/SdFatRawWrite/SdFatRawWrite.pde b/libs/SdFatBeta20120108/extra/examplesV1/SdFatRawWrite/SdFatRawWrite.pde new file mode 100644 index 0000000..fdf1260 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/examplesV1/SdFatRawWrite/SdFatRawWrite.pde @@ -0,0 +1,186 @@ +/* + * 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 MILLIS_PER_BLOCK. + * + * If a high quality SanDisk card is used with this sketch + * no overruns occur and the maximum block write time is + * 2 millis. + * + * 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 + +// number of blocks in the contiguous file +#define BLOCK_COUNT 10000UL + +// time to produce a block of data +#define MILLIS_PER_BLOCK 10 + +Sd2Card card; +SdVolume volume; +SdFile root; +SdFile file; + +uint32_t bgnBlock, endBlock; + +// store error strings in flash to save RAM +#define error(s) error_P(PSTR(s)) + +void error_P(const char* str) { + PgmPrint("error: "); + SerialPrintln_P(str); + if (card.errorCode()) { + PgmPrint("SD error: "); + Serial.print(card.errorCode(), HEX); + Serial.write(','); + Serial.println(card.errorData(), HEX); + } + while(1); +} + +void setup(void) { + Serial.begin(9600); +} + +void loop(void) { + while (Serial.read() >= 0) {} + PgmPrintln("Type any character to start"); + while (!Serial.available()) {} + + // initialize the SD card + uint32_t t = millis(); + + // initialize the SD card at SPI_FULL_SPEED for best performance. + // try SPI_HALF_SPEED if bus errors occur. + if (!card.init(SPI_FULL_SPEED)) error("card.init failed"); + + t = millis() - t; + + PgmPrint("Card init time: "); + Serial.print(t); + PgmPrintln(" millis"); + + // initialize a FAT volume + if (!volume.init(&card)) error("volume.init failed"); + + // open the root directory + if (!root.openRoot(&volume)) error("openRoot failed"); + + // delete possible existing file + SdFile::remove(&root, "RAW.TXT"); + + // create a contiguous file + if (!file.createContiguous(&root, "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*)volume.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'; + } + + PgmPrint("Start raw write of "); + Serial.print(file.fileSize()); + PgmPrintln(" bytes at"); + + Serial.print(512000UL/MILLIS_PER_BLOCK); + PgmPrintln(" bytes per second"); + + PgmPrint("Please wait "); + Serial.print((BLOCK_COUNT*MILLIS_PER_BLOCK)/1000UL); + PgmPrintln(" seconds"); + + // tell card to setup for multiple block write with pre-erase + if (!card.erase(bgnBlock, endBlock)) error("card.erase failed"); + if (!card.writeStart(bgnBlock, BLOCK_COUNT)) { + error("writeStart failed"); + } + // init stats + uint16_t overruns = 0; + uint16_t maxWriteTime = 0; + t = millis(); + uint32_t tNext = t; + + // write data + for (uint32_t b = 0; b < BLOCK_COUNT; b++) { + // write must be done by this time + tNext += MILLIS_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 (!card.writeData(pCache)) error("writeData failed"); + tw = micros() - tw; + + // check for max write time + if (tw > maxWriteTime) { + maxWriteTime = tw; + } + // check for overrun + if (millis() > tNext) { + overruns++; + // advance time to reflect overrun + tNext = millis(); + } + else { + // wait for time to write next block + while(millis() < tNext); + } + } + // total write time + t = millis() - t; + + // end multiple block write mode + if (!card.writeStop()) error("writeStop failed"); + + PgmPrintln("Done"); + + PgmPrint("Overruns: "); + Serial.println(overruns); + + PgmPrint("Elapsed time: "); + Serial.print(t); + PgmPrintln(" millis"); + + PgmPrint("Max write time: "); + Serial.print(maxWriteTime); + PgmPrintln(" micros"); + + // close files for next pass of loop + root.close(); + file.close(); + Serial.println(); +} diff --git a/libs/SdFatBeta20120108/extra/examplesV1/SdFatRead/SdFatRead.pde b/libs/SdFatBeta20120108/extra/examplesV1/SdFatRead/SdFatRead.pde new file mode 100644 index 0000000..05c56a8 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/examplesV1/SdFatRead/SdFatRead.pde @@ -0,0 +1,51 @@ +/* + * This sketch reads and prints the file + * PRINT00.TXT created by SdFatPrint.pde or + * WRITE00.TXT created by SdFatWrite.pde + */ +#include + +SdFat sd; + +SdFile file; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) + +void setup(void) { + Serial.begin(9600); + Serial.println(); + Serial.println("type any character to start"); + while (!Serial.available()); + Serial.println(); + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.init(SPI_HALF_SPEED)) sd.initErrorHalt(); + + // open a file + if (file.open("PRINT00.TXT", O_READ)) { + Serial.println("Opened PRINT00.TXT"); + } + else if (file.open("WRITE00.TXT", O_READ)) { + Serial.println("Opened WRITE00.TXT"); + } + else{ + error("file.open failed"); + } + Serial.println(); + + // copy file to serial port + int16_t n; + uint8_t buf[7];// nothing special about 7, just a lucky number. + while ((n = file.read(buf, sizeof(buf))) > 0) { + for (uint8_t i = 0; i < n; i++) Serial.write(buf[i]); + } + /* easier way + int16_t c; + while ((c = file.read()) > 0) Serial.write((char)c); + */ + Serial.println("\nDone"); +} + +void loop(void) {} diff --git a/libs/SdFatBeta20120108/extra/examplesV1/SdFatRemove/SdFatRemove.pde b/libs/SdFatBeta20120108/extra/examplesV1/SdFatRemove/SdFatRemove.pde new file mode 100644 index 0000000..e208882 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/examplesV1/SdFatRemove/SdFatRemove.pde @@ -0,0 +1,39 @@ +/* + * Remove Example + * + * This sketch shows how to use remove() to delete + * the file created by the SdFatAppend.pde example. + */ +#include +#include // use functions to print strings from flash memory + +SdFat sd; + +SdFile file; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) + +void setup(void) { + Serial.begin(9600); + Serial.println(); + PgmPrintln("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.init(SPI_HALF_SPEED)) sd.initErrorHalt(); + + char name[] = "APPEND.TXT"; + if (!file.open(name, O_WRITE)) { + PgmPrint("Can't open "); + Serial.println(name); + PgmPrintln("Run the append example to create the file."); + error("file.open failed"); + } + if (!file.remove()) error("file.remove failed"); + Serial.print(name); + PgmPrintln(" deleted."); +} + +void loop(void) {} diff --git a/libs/SdFatBeta20120108/extra/examplesV1/SdFatRewrite/SdFatRewrite.pde b/libs/SdFatBeta20120108/extra/examplesV1/SdFatRewrite/SdFatRewrite.pde new file mode 100644 index 0000000..aa42ae9 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/examplesV1/SdFatRewrite/SdFatRewrite.pde @@ -0,0 +1,53 @@ +/* + * Rewrite Example + * + * This sketch shows how to rewrite part of a line in the middle + * of the file created by the SdFatAppend.pde example. + * + * Check around line 30 of pass 50 of APPEND.TXT after running this sketch. + */ +#include +#include // use functions to print strings from flash memory + +SdFat sd; + +SdFile file; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) + +void setup(void) { + Serial.begin(9600); + Serial.println(); + PgmPrintln("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.init(SPI_HALF_SPEED)) sd.initErrorHalt(); + + char name[] = "APPEND.TXT"; + // open for read and write + if (!file.open(name, O_RDWR)) { + PgmPrint("Can't open "); + Serial.println(name); + PgmPrintln("Run the append example to create the file."); + error("file.open failed"); + } + // seek to middle of file + if (!file.seekSet(file.fileSize()/2)) error("file.seekSet failed"); + // find end of line + int16_t c; + while ((c = file.read()) > 0 && c != '\n'); + if (c < 0) error("file.read failed"); + // clear write error flag + file.writeError = false; + // rewrite the begining of the line at the current position + file.write("**rewrite**"); + if (file.writeError) error("file.write failed"); + if (!file.close()) error("file.close failed"); + Serial.print(name); + PgmPrintln(" rewrite done."); +} + +void loop(void) {} diff --git a/libs/SdFatBeta20120108/extra/examplesV1/SdFatRmDir/SdFatRmDir.pde b/libs/SdFatBeta20120108/extra/examplesV1/SdFatRmDir/SdFatRmDir.pde new file mode 100644 index 0000000..c04d956 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/examplesV1/SdFatRmDir/SdFatRmDir.pde @@ -0,0 +1,93 @@ +/* + * This sketch will remove the files and directories + * created by the SdFatMakeDir.pde sketch. + * + * Performance is erratic due to the large number + * of flash erase operations caused by many random + * writes to file structures. + */ +#include +#include + +SdFat sd; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) + +/* + * remove all files in dir. + */ +void deleteFiles(SdBaseFile* dir) { + char name[13]; + SdFile file; + + // open and delete files + for (uint16_t n = 0; ; n++){ + sprintf(name, "%u.TXT", n); + + // open start time + uint32_t t0 = millis(); + + // assume done if open fails + if (!file.open(dir, name, O_WRITE)) return; + + // open end time and remove start time + uint32_t t1 = millis(); + if (!file.remove()) error("file.remove failed"); + + // remove end time + uint32_t t2 = millis(); + + PgmPrint("RM "); + Serial.print(n); + Serial.write(' '); + + // open time + Serial.print(t1 - t0); + Serial.write(' '); + + // remove time + Serial.println(t2 - t1); + } +} + +void setup() { + Serial.begin(9600); + PgmPrintln("Type any character to start"); + while (!Serial.available()); + + // initialize the SD card at SPI_FULL_SPEED for best performance. + // try SPI_HALF_SPEED if bus errors occur. + if (!sd.init(SPI_FULL_SPEED)) sd.initErrorHalt(); + + + // delete files in root if FAT32 + if (sd.vol()->fatType() == 32) { + PgmPrintln("Remove files in root"); + deleteFiles(sd.vwd()); + } + + // open SUB1 and delete files + SdFile sub1; + if (!sub1.open("SUB1", O_READ)) error("open SUB1 failed"); + PgmPrintln("Remove files in SUB1"); + deleteFiles(&sub1); + + // open SUB2 and delete files + SdFile sub2; + if (!sub2.open(&sub1, "SUB2", O_READ)) error("open SUB2 failed"); + PgmPrintln("Remove files in SUB2"); + deleteFiles(&sub2); + + // remove SUB2 + if (!sub2.rmDir()) error("sub2.rmDir failed"); + PgmPrintln("SUB2 removed"); + + // remove SUB1 + if (!sub1.rmDir()) error("sub1.rmDir failed"); + PgmPrintln("SUB1 removed"); + + PgmPrintln("Done"); +} + +void loop() { } diff --git a/libs/SdFatBeta20120108/extra/examplesV1/SdFatTail/SdFatTail.pde b/libs/SdFatBeta20120108/extra/examplesV1/SdFatTail/SdFatTail.pde new file mode 100644 index 0000000..dd92246 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/examplesV1/SdFatTail/SdFatTail.pde @@ -0,0 +1,80 @@ +/* + * This sketch reads and prints the tail of all files + * created by SdFatAppend.pde, SdFatPrint.pde, and + * SdFatWrite.pde. + */ +#include + +SdFat sd; + +SdFile file; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) + +void setup(void) { + Serial.begin(9600); + Serial.println(); + Serial.println("type any character to start"); + while (!Serial.available()); + Serial.println(); + + // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with + // breadboards. use SPI_FULL_SPEED for better performance. + if (!sd.init(SPI_HALF_SPEED)) sd.initErrorHalt(); + + // start at beginning of root directory + sd.vwd()->rewind(); +} +/* + * Print tail of all SdFat example files + */ +void loop(void) { + dir_t dir; + char name[13]; + + // read next directory entry in current working directory + if (sd.vwd()->readDir(&dir) != sizeof(dir)) { + Serial.println("End of Directory"); + while(1); + } + + // check for file name "APPEND.TXT", "PRINT*.TXT" + // or "WRITE*.TXT" + // first 8 bytes are blank filled name + // last three bytes are blank filled extension + if ((strncmp((char *)dir.name, "APPEND ", 8) && + strncmp((char *)dir.name, "PRINT", 5) && + strncmp((char *)dir.name, "WRITE", 5)) || + strncmp((char *)&dir.name[8], "TXT", 3)) { + return; + } + // format file name + SdFile::dirName(dir, name); + + // remember position in directory + uint32_t pos = sd.vwd()->curPosition(); + + // open file + if (!file.open(name, O_READ)) error("file.open failed"); + + // restore root position + if (!sd.vwd()->seekSet(pos)) error("seekSet failed"); + + // print file name message + Serial.print("Tail of: "); + Serial.println(name); + + // position to tail of file + if (file.fileSize() > 100) { + if (!file.seekSet(file.fileSize() - 100)) error("file.seekSet failed"); + } + int16_t c; + // find end of line + while ((c = file.read()) > 0 && c != '\n'); + + // print rest of file + while ((c = file.read()) > 0) Serial.write((char)c); + file.close(); + Serial.println(); +} diff --git a/libs/SdFatBeta20120108/extra/examplesV1/SdFatTimestamp/SdFatTimestamp.pde b/libs/SdFatBeta20120108/extra/examplesV1/SdFatTimestamp/SdFatTimestamp.pde new file mode 100644 index 0000000..7d9bb60 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/examplesV1/SdFatTimestamp/SdFatTimestamp.pde @@ -0,0 +1,164 @@ +/* + * This sketch tests the dateTimeCallback() function + * and the timestamp() function. + */ +#include +#include // use PgmPrint +/* + * date/time values for debug + * normally supplied by a real-time clock or GPS + */ +// date 2009-10-01 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); +} + +SdFat sd; + +SdFile file; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) + +/* + * Function to print all timestamps. + */ +void printTimestamps(SdFile& f) { + dir_t d; + if (!f.dirEntry(&d)) error("f.dirEntry failed"); + + PgmPrint("Creation: "); + f.printFatDate(d.creationDate); + Serial.write(' '); + f.printFatTime(d.creationTime); + Serial.println(); + + PgmPrint("Modify: "); + f.printFatDate(d.lastWriteDate); + Serial.write(' '); + f.printFatTime(d.lastWriteTime); + Serial.println(); + + PgmPrint("Access: "); + f.printFatDate(d.lastAccessDate); + Serial.println(); +} + +void setup(void) { + Serial.begin(9600); + Serial.println(); + PgmPrintln("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.init(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"); + } + Serial.println(); + PgmPrintln("Open with default times"); + 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"); + } + Serial.println(); + PgmPrintln("Open with callback times"); + 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(); + + Serial.println(); + PgmPrintln("Times after write"); + 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"); + } + Serial.println(); + PgmPrintln("Times after timestamp() calls"); + printTimestamps(file); + + file.close(); + Serial.println(); + PgmPrintln("Done"); +} + +void loop(void){} diff --git a/libs/SdFatBeta20120108/extra/examplesV1/SdFatTruncate/SdFatTruncate.pde b/libs/SdFatBeta20120108/extra/examplesV1/SdFatTruncate/SdFatTruncate.pde new file mode 100644 index 0000000..fa501e9 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/examplesV1/SdFatTruncate/SdFatTruncate.pde @@ -0,0 +1,47 @@ +/* + * Truncate Example + * + * This sketch shows how to use truncate() to remove the last + * half of the file created by the SdFatAppend.pde example. + */ +#include +#include // use functions to print strings from flash memory + +SdFat sd; + +SdFile file; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) + +void setup(void) { + Serial.begin(9600); + Serial.println(); + PgmPrintln("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.init(SPI_HALF_SPEED)) sd.initErrorHalt(); + + char name[] = "APPEND.TXT"; + // open for read and write + if (!file.open(name, O_RDWR)) { + PgmPrint("Can't open "); + Serial.println(name); + PgmPrintln("Run the append example to create the file."); + error("file.open failed"); + } + // seek to middle of file + if (!file.seekSet(file.fileSize()/2)) error("file.seekSet failed"); + // find end of line + int16_t c; + while ((c = file.read()) > 0 && c != '\n'); + if (c < 0) error("file.read failed"); + // truncate at current position + if (!file.truncate(file.curPosition())) error("file.truncate failed"); + Serial.print(name); + PgmPrintln(" truncated."); +} + +void loop(void) {} diff --git a/libs/SdFatBeta20120108/extra/examplesV1/SdFatWrite/SdFatWrite.pde b/libs/SdFatBeta20120108/extra/examplesV1/SdFatWrite/SdFatWrite.pde new file mode 100644 index 0000000..818577a --- /dev/null +++ b/libs/SdFatBeta20120108/extra/examplesV1/SdFatWrite/SdFatWrite.pde @@ -0,0 +1,81 @@ +// This example is really out of date so best to ignore it +// It is still here to create files for other tests. +/* + * Write Example + * + * This sketch creates a new file and writes 100 lines to the file. + * No error checks on write in this example. + */ + +#include + +SdFat sd; + +SdFile file; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt_P(PSTR(s)) + +/* + * Write CR LF to a file + */ +void writeCRLF(SdFile& f) { + f.write((uint8_t*)"\r\n", 2); +} +/* + * Write an unsigned number to a file + */ +void writeNumber(SdFile& f, uint32_t n) { + uint8_t buf[10]; + uint8_t i = 0; + do { + i++; + buf[sizeof(buf) - i] = n % 10 + '0'; + n /= 10; + } while (n); + f.write(&buf[sizeof(buf) - i], i); +} +/* + * Write a string to a file + */ +void writeString(SdFile& f, char *str) { + uint8_t n; + for (n = 0; str[n]; n++); + f.write((uint8_t *)str, n); +} + +void setup(void) { + Serial.begin(9600); + Serial.println(); + Serial.println("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.init(SPI_HALF_SPEED)) sd.initErrorHalt(); + + // create a new file + char name[] = "WRITE00.TXT"; + for (uint8_t i = 0; i < 100; i++) { + name[5] = i/10 + '0'; + name[6] = i%10 + '0'; + if (file.open(name, O_CREAT | O_EXCL | O_WRITE)) break; + } + if (!file.isOpen()) error ("file.create"); + Serial.print("Writing to: "); + Serial.println(name); + + // write 100 line to file + for (uint8_t i = 0; i < 100; i++) { + writeString(file, "line "); + writeNumber(file, i); + writeString(file, " millis = "); + writeNumber(file, millis()); + writeCRLF(file); + } + // close file and force write of all data to the SD card + file.close(); + Serial.println("Done"); +} + +void loop(void) {} diff --git a/libs/SdFatBeta20120108/extra/examplesV1/V1readme.txt b/libs/SdFatBeta20120108/extra/examplesV1/V1readme.txt new file mode 100644 index 0000000..1b1d6e3 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/examplesV1/V1readme.txt @@ -0,0 +1,60 @@ +These are examples from SdFat V1. + + +These examples have been simplified by using new features of SdFat. + + +SdFatAnalogLogger.pde - A simple data logger for one or more analog + pins. + +SdFatAppend.pde - This sketch creates a large file by successive + open/write/close operations using O_APPEND. + +SdFatBench.pde - A read/write benchmark. + +SdFatCopy.pde - Copy the file created by SdFatAppend.pde to the file + ACOPY.TXT. + +SdFatGPS_CSVSensorLogger.pde - Ladyada's GPS logger modified to use the + SdFat library. + +SdFatGPSLogger_v3.pde - Ladyada's GPS logger modified to use the SdFat + library. + +SdFatLs.pde - A test of the ls() file list function. + +SdFatMakeDir.pde - A debug sketch to verify subdirectory creation and + access. + +SdFatPrint.pde - This sketch shows how to use the Arduino Print class + with SdFat. + +SdFatRawWrite.pde - A test of raw write functions for contiguous files. + +SdFatRead.pde - This sketch reads and prints the file PRINT00.TXT + created by SdFatPrint.pde or WRITE00.TXT created by + SdFatWrite.pde. + +SdFatRemove.pde - This sketch shows how to use remove() to delete the + file created by the SdFatAppend.pde example. + +SdFatRewrite.pde - This sketch shows how to rewrite part of a line in + the middle of the file created by the + SdFatAppend.pde example. + +SdFatRmDir.pde - A sketch to test file and directory deletion. + + +SdFatTail.pde - This sketch reads and prints the tail of all files + created by SdFatAppend.pde, SdFatPrint.pde, and + SdFatWrite.pde. + +SdFAtTimestamp.pde - This sketch shows how to set file access, create, + and write/modify timestamps. + +SdFatTruncate.pde - This sketch shows how to use truncate() to remove + the last half of the file created by the + SdFatAppend.pde example. + +SdFatWrite.pde - This sketch creates a new file and writes 100 lines + to the file. diff --git a/libs/SdFatBeta20120108/extra/extra.txt b/libs/SdFatBeta20120108/extra/extra.txt new file mode 100644 index 0000000..0fcbad1 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/extra.txt @@ -0,0 +1,7 @@ +examplesV1 - Examples from earlier versions of SdFat. + +FridgeLogger - Example versions of Adafruit light temperature logger + +makePinInclude - Sketch used to make Sd2PinMap.h + +SdFatTestSuite - Development tests. \ No newline at end of file diff --git a/libs/SdFatBeta20120108/extra/makePinInclude/makePinInclude.pde b/libs/SdFatBeta20120108/extra/makePinInclude/makePinInclude.pde new file mode 100644 index 0000000..00c526d --- /dev/null +++ b/libs/SdFatBeta20120108/extra/makePinInclude/makePinInclude.pde @@ -0,0 +1,353 @@ +#include +#include +SdFat sd; +SdFile file; +#define INCLUDE_GUARD "Sd2PinMap_h" +//------------------------------------------------------------------------------ +// 168 - 328 Arduino +uint8_t i2c328[] = { + 18, // SDA + 19 // SCL +}; +uint8_t spi328[] = { + 10, // SS + 11, // MOSI + 12, // MISO + 13 // SCK +}; +char pins328[][3] PROGMEM = { + // 0 1 2 3 4 5 6 7 8 9 + "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "B0", "B1", // 0 - 9 + "B2", "B3", "B4", "B5", "C0", "C1", "C2", "C3", "C4", "C5" // 10 - 19 +}; +uint8_t const nPin328 = sizeof(pins328)/sizeof(char[3]); +//------------------------------------------------------------------------------ +// Mega Arduino +uint8_t i2c1280[] = { + 20, // SDA + 21 // SCL +}; +uint8_t spi1280[] = { + 53, // SS + 51, // MOSI + 50, // MISO + 52 // SCK +}; +char pins1280[][3] PROGMEM = { +// 0 1 2 3 4 5 6 7 8 9 + "E0", "E1", "E4", "E5", "G5", "E3", "H3", "H4", "H5", "H6", // 0 - 9 + "B4", "B5", "B6", "B7", "J1", "J0", "H1", "H0", "D3", "D2", // 10 - 19 + "D1", "D0", "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", // 20 - 29 + "C7", "C6", "C5", "C4", "C3", "C2", "C1", "C0", "D7", "G2", // 30 - 39 + "G1", "G0", "L7", "L6", "L5", "L4", "L3", "L2", "L1", "L0", // 40 - 49 + "B3", "B2", "B1", "B0", "F0", "F1", "F2", "F3", "F4", "F5", // 50 - 59 + "F6", "F7", "K0", "K1", "K2", "K3", "K4", "K5", "K6", "K7", // 60 - 69 +}; +uint8_t const nPin1280 = sizeof(pins1280)/sizeof(char[3]); +//------------------------------------------------------------------------------ +// Sanguino +uint8_t i2c644[] = { + 17, // SDA + 18 // SCL +}; +uint8_t spi644[] = { + 4, // SS + 5, // MOSI + 6, // MISO + 7 // SCK +}; +char pins644[][3] PROGMEM = { // +// 0 1 2 3 4 5 6 7 8 9 + "B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "D0", "D1", // 0 - 9 + "D2", "D3", "D4", "D5", "D6", "D7", "C0", "C1", "C2", "C3", // 10 - 19 + "C4", "C5", "C6", "C7", "A7", "A6", "A5", "A4", "A3", "A2", // 20 - 29 + "A1", "A0" // 30 - 31 +}; +uint8_t const nPin644 = sizeof(pins644)/sizeof(char[3]); +//------------------------------------------------------------------------------ +// Teensy 2.0 +uint8_t i2c32U4[] = { + 6, // SDA + 5 // SCL +}; +uint8_t spi32U4[] = { + 0, // SS + 2, // MOSI + 3, // MISO + 1 // SCK +}; +char pins32U4[][3] PROGMEM = { +// 0 1 2 3 4 5 6 7 8 9 + "B0", "B1", "B2", "B3", "B7", "D0", "D1", "D2", "D3", "C6", // 0 - 9 + "C7", "D6", "D7", "B4", "B5", "B6", "F7", "F6", "F5", "F4", // 10 - 19 + "F1", "F0", "D4", "D5", "E6" // 20 - 24 +}; +uint8_t const nPin32U4 = sizeof(pins32U4)/sizeof(char[3]); +//------------------------------------------------------------------------------ +// Teensy++ 1.0 & 2.0 +uint8_t i2c1286[] = { + 1, // SDA + 0 // SCL +}; +uint8_t spi1286[] = { + 20, // SS + 22, // MOSI + 23, // MISO + 21 // SCK +}; +char pins1286[][3] PROGMEM = { +// 0 1 2 3 4 5 6 7 8 9 + "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "E0", "E1", // 0 - 9 + "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "E6", "E7", // 10 - 19 + "B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "A0", "A1", // 20 - 29 + "A2", "A3", "A4", "A5", "A6", "A7", "E4", "E5", "F0", "F1", // 30 - 39 + "F2", "F3", "F4", "F5", "F6", "F7" // 40 - 45 +}; +uint8_t const nPin1286 = sizeof(pins1286)/sizeof(char[3]); +//------------------------------------------------------------------------------ +#define print_P(stream, str) printPGM(stream, PSTR(str)) +#define println_P(stream, str) printlnPGM(stream, PSTR(str)) +//------------------------------------------------------------------------------ +void printPGM(Print* stream, PGM_P str) { + for (uint8_t c; (c = pgm_read_byte(str)); str++) stream->write(c); +} +//------------------------------------------------------------------------------ +void printlnPGM(Print* stream, PGM_P str) { + printPGM(stream, str); + stream->println(); +} +//------------------------------------------------------------------------------ +void printFunctions(Print* stream) { + print_P(stream, + "static const uint8_t digitalPinCount = sizeof(digitalPinMap)/sizeof(pin_map_t);\r\n" + "\r\n" + "uint8_t badPinNumber(void)\r\n" + " __attribute__((error(\"Pin number is too large or not a constant\")));\r\n" + "\r\n" + "static inline __attribute__((always_inline))\r\n" + " bool getPinMode(uint8_t pin) {\r\n" + " if (__builtin_constant_p(pin) && pin < digitalPinCount) {\r\n" + " return (*digitalPinMap[pin].ddr >> digitalPinMap[pin].bit) & 1;\r\n" + " } else {\r\n" + " return badPinNumber();\r\n" + " }\r\n" + "}\r\n" + "static inline __attribute__((always_inline))\r\n" + " void setPinMode(uint8_t pin, uint8_t mode) {\r\n" + " if (__builtin_constant_p(pin) && pin < digitalPinCount) {\r\n" + " if (mode) {\r\n" + " *digitalPinMap[pin].ddr |= 1 << digitalPinMap[pin].bit;\r\n" + " } else {\r\n" + " *digitalPinMap[pin].ddr &= ~(1 << digitalPinMap[pin].bit);\r\n" + " }\r\n" + " } else {\r\n" + " badPinNumber();\r\n" + " }\r\n" + "}\r\n" + "static inline __attribute__((always_inline))\r\n" + " bool fastDigitalRead(uint8_t pin) {\r\n" + " if (__builtin_constant_p(pin) && pin < digitalPinCount) {\r\n" + " return (*digitalPinMap[pin].pin >> digitalPinMap[pin].bit) & 1;\r\n" + " } else {\r\n" + " return badPinNumber();\r\n" + " }\r\n" + "}\r\n" + "static inline __attribute__((always_inline))\r\n" + " void fastDigitalWrite(uint8_t pin, uint8_t value) {\r\n" + " if (__builtin_constant_p(pin) && pin < digitalPinCount) {\r\n" + " if (value) {\r\n" + " *digitalPinMap[pin].port |= 1 << digitalPinMap[pin].bit;\r\n" + " } else {\r\n" + " *digitalPinMap[pin].port &= ~(1 << digitalPinMap[pin].bit);\r\n" + " }\r\n" + " } else {\r\n" + " badPinNumber();\r\n" + " }\r\n" + "}\r\n"); +} +//------------------------------------------------------------------------------ +void printGNU(Print* stream) { + println_P(stream, + "/* Arduino SdFat Library\r\n" + " * Copyright (C) 2010 by William Greiman\r\n" + " *\r\n" + " * This file is part of the Arduino SdFat Library\r\n" + " *\r\n" + " * This Library is free software: you can redistribute it and/or modify\r\n" + " * it under the terms of the GNU General Public License as published by\r\n" + " * the Free Software Foundation, either version 3 of the License, or\r\n" + " * (at your option) any later version.\r\n" + " *\r\n" + " * This Library is distributed in the hope that it will be useful,\r\n" + " * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n" + " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\n" + " * GNU General Public License for more details.\r\n" + " *\r\n" + " * You should have received a copy of the GNU General Public License\r\n" + " * along with the Arduino SdFat Library. If not, see\r\n" + " * .\r\n" + " */\r\n" + "// Warning this file was generated by a program."); +} +//---------------------------------------------------------------- +void printMap(Print* stream, char (*list)[3], uint8_t nPin) { + println_P(stream, "static const pin_map_t digitalPinMap[] = {"); + for (uint8_t i = 0; i < nPin; i++) { + char cPort = pgm_read_byte(&list[i][0]); + char cBit = pgm_read_byte(&list[i][1]); + print_P(stream, " {&DDR"); + stream->write(cPort); + print_P(stream, ", &PIN"); + stream->write(cPort); + print_P(stream, ", &PORT"); + stream->write(cPort); + print_P(stream, ", "); + stream->write(cBit); + if ((i+1) != nPin) { + print_P(stream, "}, // "); + } else { + print_P(stream, "} // "); + } + stream->write(cPort); + stream->write(cBit); + stream->write(' '); + if (i < 10) stream->write(' '); + stream->println(i, DEC); + } + println_P(stream, "};"); +} +//------------------------------------------------------------------------------ +void printLine(Print* stream) { + print_P(stream, "//"); + for (uint8_t i = 0; i < 78; i++) stream->write('-'); + stream->println(); +} +//------------------------------------------------------------------------------ +void printI2C(Print* stream, char (*list)[3], uint8_t* i2c) { + println_P(stream, "// Two Wire (aka I2C) ports"); + print_P(stream, "uint8_t const SDA_PIN = "); + stream->print(i2c[0], DEC); + print_P(stream, "; // "); + printlnPGM(stream, list[i2c[0]]); + print_P(stream, "uint8_t const SCL_PIN = "); + stream->print(i2c[1], DEC); + print_P(stream, "; // "); + printlnPGM(stream, list[i2c[1]]); + stream->println(); +} +//------------------------------------------------------------------------------ +void printSPI(Print* stream, char (*list)[3], uint8_t* spi) { + println_P(stream, "// SPI port"); + print_P(stream, "uint8_t const SS_PIN = "); + stream->print(spi[0], DEC); + print_P(stream, "; // "); + printlnPGM(stream, list[spi[0]]); + print_P(stream, "uint8_t const MOSI_PIN = "); + stream->print(spi[1], DEC); + print_P(stream, "; // "); + printlnPGM(stream, list[spi[1]]); + print_P(stream, "uint8_t const MISO_PIN = "); + stream->print(spi[2], DEC); + print_P(stream, "; // "); + printlnPGM(stream, list[spi[2]]); + print_P(stream, "uint8_t const SCK_PIN = "); + stream->print(spi[3], DEC); + print_P(stream, "; // "); + printlnPGM(stream, list[spi[3]]); + stream->println(); +} +//----------------------------------------------- +void printType(Print* stream) { + printLine(stream); + print_P(stream, + "/** struct for mapping digital pins */\r\n" + "struct pin_map_t {\r\n" + " volatile uint8_t* ddr;\r\n" + " volatile uint8_t* pin;\r\n" + " volatile uint8_t* port;\r\n" + " uint8_t bit;\r\n" + "};\r\n"); +} +//------------------------------------------------------------------------------ +void printSection(Print* stream, uint8_t* i2c, + uint8_t* spi, char (*list)[3], uint8_t digitalPinCount) { + stream->println(); + printI2C(stream, list, i2c); + printSPI(stream, list, spi); + printMap(stream, list, digitalPinCount); +} +//------------------------------------------------------------------------------ +void printFile(Print* stream) { + printGNU(stream); + println_P(stream, "#ifndef " INCLUDE_GUARD); + println_P(stream, "#define " INCLUDE_GUARD); + println_P(stream, "#include "); + + printType(stream); + printLine(stream); + print_P(stream, + "#if defined(__AVR_ATmega1280__)\\\r\n" + "|| defined(__AVR_ATmega2560__)\r\n"); + println_P(stream, "// Mega"); + printSection(stream, i2c1280, spi1280, pins1280, nPin1280); + + printLine(stream); + print_P(stream, + "#elif defined(__AVR_ATmega644P__)\\\r\n" + "|| defined(__AVR_ATmega644__)\\\r\n" + "|| defined(__AVR_ATmega1284P__)\r\n"); + println_P(stream, "// Sanguino"); + printSection(stream, i2c644, spi644, pins644, nPin644); + + printLine(stream); + println_P(stream, "#elif defined(__AVR_ATmega32U4__)"); + println_P(stream, "// Teensy 2.0"); + printSection(stream, i2c32U4, spi32U4, pins32U4, nPin32U4); + + printLine(stream); + print_P(stream, + "#elif defined(__AVR_AT90USB646__)\\\r\n" + "|| defined(__AVR_AT90USB1286__)\r\n"); + println_P(stream, "// Teensy++ 1.0 & 2.0"); + printSection(stream, i2c1286, spi1286, pins1286, nPin1286); + + printLine(stream); + print_P(stream, + "#elif defined(__AVR_ATmega168__)\\\r\n" + "||defined(__AVR_ATmega168P__)\\\r\n" + "||defined(__AVR_ATmega328P__)\r\n"); + println_P(stream, "// 168 and 328 Arduinos"); + printSection(stream, i2c328, spi328, pins328, nPin328); + + print_P(stream, + "#else // defined(__AVR_ATmega1280__)\r\n" + "#error unknown chip\r\n" + "#endif // defined(__AVR_ATmega1280__)\r\n"); + printLine(stream); + printFunctions(stream); + println_P(stream, "#endif // " INCLUDE_GUARD); +} +//------------------------------------------------------------------------------ +#define error(x) errorPGM(PSTR(x)) +void errorPGM(PGM_P msg) { + print_P(&Serial, "Error: "); + printlnPGM(&Serial, msg); + while (1); +} +//------------------------------------------------------------------------------ +void setup(void) { + Serial.begin(9600); + Serial.println(FreeRam()); +// printFile(&Serial); + println_P(&Serial, "Type any character to make PIN_MAP.H"); + while (!Serial.available()); + if (!sd.init()) sd.initErrorHalt(); + if (!file.open("PIN_MAP.H", O_WRITE | O_CREAT | O_TRUNC)) { + error("file.open"); + } + printFile(&file); + file.close(); + println_P(&Serial, "Done"); +} +//------------------------------------------------------------------------------ +void loop(void) {} diff --git a/libs/SdFatBeta20120108/extra/makePinInclude/readme.txt b/libs/SdFatBeta20120108/extra/makePinInclude/readme.txt new file mode 100644 index 0000000..c62f291 --- /dev/null +++ b/libs/SdFatBeta20120108/extra/makePinInclude/readme.txt @@ -0,0 +1 @@ +This sketch is used to make Sd2PinMap.h \ No newline at end of file diff --git a/libs/SdFatBeta20120108/html/_arduino_stream_8h.html b/libs/SdFatBeta20120108/html/_arduino_stream_8h.html new file mode 100644 index 0000000..6a30729 --- /dev/null +++ b/libs/SdFatBeta20120108/html/_arduino_stream_8h.html @@ -0,0 +1,77 @@ + + + + +SdFat: Arduino/libraries/SdFat/ArduinoStream.h File Reference + + + + + +

+
+ +
+
Arduino/libraries/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/libs/SdFatBeta20120108/html/_arduino_stream_8h__dep__incl.png b/libs/SdFatBeta20120108/html/_arduino_stream_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..ae149dbd69ea7fa901363f568162789348104774 GIT binary patch literal 1875 zcmcIlX*Ao568~F^NKvHJ9`Dd4<*GKSs4ZHmH&sg$G}KmG!^O?@EU~oc5?iY+Cq-0M zt+7;)gm_m8rAlofQMpBmMCwVOed*)A5AU7({mq;+GiT<*%$emk4_%O#!E(ps0000x zIU-yEKn%2R{~{y3FJ*f?=Ju7ezw>1T@Z*3>+TY{>z#$nYgsuDE3x%IMav%s6ZVp*Oq~iv+fVc7$yK_3Uo>iXJm?^@bQ$vjcc!nuO89i$4ck&PAp6_u zOPUV0G>lF!$m)3G@gOlf2bNUo~H2Z1Kqti@?79;T<2t+IEG4kUt#=g&+H!4i9!dX3}P8SVX_9#8lGmSjW$Q(l+y%dLToTU z-YWPyBl7f*(2*4nXYOkTg>LZ4u0=hp(d}&#ayGCc3T5V}5l^yL+l6=GJTb-pSZN=} z{pb(EG)-P3u?1lfF&e|a)_tZh%Y`>h*YVw&hD38hIh<2GqB*Tr)G;_C;`N`}yf)fH zyQ5=Yg?FMDEm&?xc3oQA?YCoG~8Jzb%p%FKsn*t3agviO3^)+CRNOy+S%3$ zA8>|3$B`dN7jQhsC1UR3PVsB%0fQR)ImLjfxiN$V>iRm`7HgB2no4t3I>n(-SCu>vbo_a~=c(_T zJ5&Y#v9u;dNN!Ql?knh;m6B;~TVUU0WhC3#^Nif`e{n z#`$#ZEyt>;q+4osz=8MdsVVD&{=w@W;@)9p0M-9FN;@>*qW70k{a?e%4MH=AxuZ(v zM;fHvuNoNlChk45Ox#FVa{XnZ4l0VTVFouGgFI%To4XRWxzwu{ZjuLcKr| zjQgj(!pCN86V`e(ssdETAG^V6-o7JXqaNYXr!Tux)1`_RP2c&LJ!XA%jjN!hGDzBG zUa0Z?Oohk^mwX~VvaShb!uEcV%U(M@M!SJT4thRaR_IS=7uJ{C=2tT)EGvm4RRayh zsgAG7g*|z0*(eCM)u_65hC<%

B#ByElQpkiKda?7cy5;{|yO=ea8R* literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/_arduino_stream_8h__incl.png b/libs/SdFatBeta20120108/html/_arduino_stream_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..3f1b8b643cca59f79088a38fbea9e8a88cc3c358 GIT binary patch literal 25729 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 + + + +SdFat: Arduino/libraries/SdFat/Sd2Card.h File Reference + + + + + + +
+ +
+
Arduino/libraries/SdFat/Sd2Card.h File Reference
+
+
+ +

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

+
#include <SdFatConfig.h>
+#include <SdInfo.h>
+#include <Sd2PinMap.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_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_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_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
uint8_t const SD_CHIP_SELECT_PIN = SS_PIN
uint16_t const SD_ERASE_TIMEOUT = 10000
uint16_t const SD_INIT_TIMEOUT = 2000
uint16_t const SD_READ_TIMEOUT = 300
uint16_t const SD_WRITE_TIMEOUT = 600
uint8_t const SPI_EIGHTH_SPEED = 3
uint8_t const SPI_FULL_SPEED = 0
uint8_t const SPI_HALF_SPEED = 1
uint8_t const SPI_MISO_PIN = MISO_PIN
uint8_t const SPI_MOSI_PIN = MOSI_PIN
uint8_t const SPI_QUARTER_SPEED = 2
uint8_t const SPI_SCK_PIN = SCK_PIN
uint8_t const SPI_SIXTEENTH_SPEED = 4
+

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 (write stop)

+ +
+
+ +
+
+ + + + +
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_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_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_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

+ +
+
+ +
+
+ + + + +
uint8_t const SD_CHIP_SELECT_PIN = SS_PIN
+
+
+

define SOFTWARE_SPI to use bit-bang SPI The default chip select pin for the SD card is SS.

+ +
+
+ +
+
+ + + + +
uint16_t const SD_ERASE_TIMEOUT = 10000
+
+
+

erase timeout ms

+ +
+
+ +
+
+ + + + +
uint16_t const SD_INIT_TIMEOUT = 2000
+
+
+

init timeout ms

+ +
+
+ +
+
+ + + + +
uint16_t const SD_READ_TIMEOUT = 300
+
+
+

read timeout ms

+ +
+
+ +
+
+ + + + +
uint16_t const SD_WRITE_TIMEOUT = 600
+
+
+

write time out ms

+ +
+
+ +
+
+ + + + +
uint8_t const SPI_EIGHTH_SPEED = 3
+
+
+

Set SCK rate to F_CPU/16. See Sd2Card::setSckRate().

+ +
+
+ +
+
+ + + + +
uint8_t const SPI_FULL_SPEED = 0
+
+
+

Set SCK to max rate of F_CPU/2. See Sd2Card::setSckRate().

+ +
+
+ +
+
+ + + + +
uint8_t const SPI_HALF_SPEED = 1
+
+
+

Set SCK rate to F_CPU/4. See Sd2Card::setSckRate().

+ +
+
+ +
+
+ + + + +
uint8_t const SPI_MISO_PIN = MISO_PIN
+
+
+

SPI Master In Slave Out pin

+ +
+
+ +
+
+ + + + +
uint8_t const SPI_MOSI_PIN = MOSI_PIN
+
+
+

SPI Master Out Slave In pin

+ +
+
+ +
+
+ + + + +
uint8_t const SPI_QUARTER_SPEED = 2
+
+
+

Set SCK rate to F_CPU/8. See Sd2Card::setSckRate().

+ +
+
+ +
+
+ + + + +
uint8_t const SPI_SCK_PIN = SCK_PIN
+
+
+

SPI Clock pin

+ +
+
+ +
+
+ + + + +
uint8_t const SPI_SIXTEENTH_SPEED = 4
+
+
+

Set SCK rate to F_CPU/32. See Sd2Card::setSckRate().

+ +
+
+
+ + + diff --git a/libs/SdFatBeta20120108/html/_sd2_card_8h__dep__incl.png b/libs/SdFatBeta20120108/html/_sd2_card_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..586a59acc712cefdeb86dbd0ae607cd9c15b9130 GIT binary patch literal 31734 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 Cga9o7 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/_sd2_card_8h__incl.png b/libs/SdFatBeta20120108/html/_sd2_card_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e7cbeb7cf863761b3f1fd639e72fd454240789 GIT binary patch literal 4376 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 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/_sd_base_file_8h.html b/libs/SdFatBeta20120108/html/_sd_base_file_8h.html new file mode 100644 index 0000000..10bd151 --- /dev/null +++ b/libs/SdFatBeta20120108/html/_sd_base_file_8h.html @@ -0,0 +1,722 @@ + + + + +SdFat: Arduino/libraries/SdFat/SdBaseFile.h File Reference + + + + + +
+
+ + + + + + +
+
SdFat
+
+
+ + +
+
+ +
+
Arduino/libraries/SdFat/SdBaseFile.h File Reference
+
+
+ +

SdBaseFile class. +More...

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

+Classes

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

+Functions

static uint16_t FAT_DATE (uint16_t year, uint8_t month, uint8_t day)
static uint8_t FAT_DAY (uint16_t fatDate)
static uint8_t FAT_HOUR (uint16_t fatTime)
static uint8_t FAT_MINUTE (uint16_t fatTime)
static uint8_t FAT_MONTH (uint16_t fatDate)
static uint8_t FAT_SECOND (uint16_t fatTime)
static uint16_t FAT_TIME (uint8_t hour, uint8_t minute, uint8_t second)
static uint16_t FAT_YEAR (uint16_t fatDate)

+Variables

uint16_t const FAT_DEFAULT_DATE = ((2000 - 1980) << 9) | (1 << 5) | 1
uint16_t const FAT_DEFAULT_TIME = (1 << 11)
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
uint8_t const LS_DATE = 1
uint8_t const LS_R = 4
uint8_t const LS_SIZE = 2
uint8_t const O_ACCMODE = (O_READ | O_WRITE)
uint8_t const O_APPEND = 0X04
uint8_t const O_AT_END = 0X20
uint8_t const O_CREAT = 0X40
uint8_t const O_EXCL = 0X80
uint8_t const O_RDONLY = O_READ
uint8_t const O_RDWR = (O_READ | O_WRITE)
uint8_t const O_READ = 0X01
uint8_t const O_SYNC = 0X08
uint8_t const O_TRUNC = 0X10
uint8_t const O_WRITE = 0X02
uint8_t const O_WRONLY = O_WRITE
uint8_t const T_ACCESS = 1
uint8_t const T_CREATE = 2
uint8_t const T_WRITE = 4
+

Detailed Description

+

SdBaseFile class.

+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
static uint16_t FAT_DATE (uint16_t year,
uint8_t month,
uint8_t day 
) [inline, static]
+
+
+

date field for FAT directory entry

+
Parameters:
+ + + + +
[in]year[1980,2107]
[in]month[1,12]
[in]day[1,31]
+
+
+
Returns:
Packed date for dir_t entry.
+ +
+
+ +
+
+ + + + + + + + +
static uint8_t FAT_DAY (uint16_t fatDate) [inline, static]
+
+
+

day part of FAT directory date field

+
Parameters:
+ + +
[in]fatDateDate in packed dir format.
+
+
+
Returns:
Extracted day [1,31]
+ +
+
+ +
+
+ + + + + + + + +
static uint8_t FAT_HOUR (uint16_t fatTime) [inline, static]
+
+
+

hour part of FAT directory time field

+
Parameters:
+ + +
[in]fatTimeTime in packed dir format.
+
+
+
Returns:
Extracted hour [0,23]
+ +
+
+ +
+
+ + + + + + + + +
static uint8_t FAT_MINUTE (uint16_t fatTime) [inline, static]
+
+
+

minute part of FAT directory time field

+
Parameters:
+ + +
[in]fatTimeTime in packed dir format.
+
+
+
Returns:
Extracted minute [0,59]
+ +
+
+ +
+
+ + + + + + + + +
static uint8_t FAT_MONTH (uint16_t fatDate) [inline, static]
+
+
+

month part of FAT directory date field

+
Parameters:
+ + +
[in]fatDateDate in packed dir format.
+
+
+
Returns:
Extracted month [1,12]
+ +
+
+ +
+
+ + + + + + + + +
static uint8_t FAT_SECOND (uint16_t fatTime) [inline, static]
+
+
+

second part of FAT directory time field Note second/2 is stored in packed time.

+
Parameters:
+ + +
[in]fatTimeTime in packed dir format.
+
+
+
Returns:
Extracted second [0,58]
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
static uint16_t FAT_TIME (uint8_t hour,
uint8_t minute,
uint8_t second 
) [inline, static]
+
+
+

time field for FAT directory entry

+
Parameters:
+ + + + +
[in]hour[0,23]
[in]minute[0,59]
[in]second[0,59]
+
+
+
Returns:
Packed time for dir_t entry.
+ +
+
+ +
+
+ + + + + + + + +
static uint16_t FAT_YEAR (uint16_t fatDate) [inline, static]
+
+
+

year part of FAT directory date field

+
Parameters:
+ + +
[in]fatDateDate in packed dir format.
+
+
+
Returns:
Extracted year [1980,2107]
+ +
+
+

Variable Documentation

+ +
+
+ + + + +
uint16_t const FAT_DEFAULT_DATE = ((2000 - 1980) << 9) | (1 << 5) | 1
+
+
+

Default date for file timestamps is 1 Jan 2000

+ +
+
+ +
+
+ + + + +
uint16_t const FAT_DEFAULT_TIME = (1 << 11)
+
+
+

Default time for file timestamp is 1 am

+ +
+
+ +
+
+ + + + +
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

+ +
+
+ +
+
+ + + + +
uint8_t const LS_DATE = 1
+
+
+

ls() flag to print modify date

+ +
+
+ +
+
+ + + + +
uint8_t const LS_R = 4
+
+
+

ls() flag for recursive list of subdirectories

+ +
+
+ +
+
+ + + + +
uint8_t const LS_SIZE = 2
+
+
+

ls() flag to print file size

+ +
+
+ +
+
+ + + + +
uint8_t const O_ACCMODE = (O_READ | O_WRITE)
+
+
+

open() oflag mask for access modes

+ +
+
+ +
+
+ + + + +
uint8_t const O_APPEND = 0X04
+
+
+

The file offset shall be set to the end of the file prior to each write.

+ +
+
+ +
+
+ + + + +
uint8_t const O_AT_END = 0X20
+
+
+

set the initial position at the end of the file

+ +
+
+ +
+
+ + + + +
uint8_t const O_CREAT = 0X40
+
+
+

create the file if nonexistent

+ +
+
+ +
+
+ + + + +
uint8_t const O_EXCL = 0X80
+
+
+

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

+ +
+
+ +
+
+ + + + +
uint8_t const O_RDONLY = O_READ
+
+
+

open() oflag - same as O_IN

+ +
+
+ +
+
+ + + + +
uint8_t const O_RDWR = (O_READ | O_WRITE)
+
+
+

open() oflag for reading and writing

+ +
+
+ +
+
+ + + + +
uint8_t const O_READ = 0X01
+
+
+

open() oflag for reading

+ +
+
+ +
+
+ + + + +
uint8_t const O_SYNC = 0X08
+
+
+

synchronous writes - call sync() after each write

+ +
+
+ +
+
+ + + + +
uint8_t const O_TRUNC = 0X10
+
+
+

truncate the file to zero length

+ +
+
+ +
+
+ + + + +
uint8_t const O_WRITE = 0X02
+
+
+

open() oflag for write

+ +
+
+ +
+
+ + + + +
uint8_t const O_WRONLY = O_WRITE
+
+
+

open() oflag - same as O_WRITE

+ +
+
+ +
+
+ + + + +
uint8_t const T_ACCESS = 1
+
+
+

set the file's last access date

+ +
+
+ +
+
+ + + + +
uint8_t const T_CREATE = 2
+
+
+

set the file's creation date and time

+ +
+
+ +
+
+ + + + +
uint8_t const T_WRITE = 4
+
+
+

Set the file's write date and time

+ +
+
+
+ + + diff --git a/libs/SdFatBeta20120108/html/_sd_base_file_8h__dep__incl.png b/libs/SdFatBeta20120108/html/_sd_base_file_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..1a0a56f0bfde540fd4664a689be2a6fc62181e31 GIT binary patch literal 28986 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 MhAx_N?OxFT0tUassQ>@~ literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/_sd_base_file_8h__incl.png b/libs/SdFatBeta20120108/html/_sd_base_file_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..dea7d07aa8b21dcb558042660ed4a20ed083c0d5 GIT binary patch literal 17225 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 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/_sd_fat_8h.html b/libs/SdFatBeta20120108/html/_sd_fat_8h.html new file mode 100644 index 0000000..47a0405 --- /dev/null +++ b/libs/SdFatBeta20120108/html/_sd_fat_8h.html @@ -0,0 +1,89 @@ + + + + +SdFat: Arduino/libraries/SdFat/SdFat.h File Reference + + + + + +
+
+ + + + + + +
+
SdFat
+
+
+ + +
+
+ +
+
Arduino/libraries/SdFat/SdFat.h File Reference
+
+
+ +

SdFat class. +More...

+
#include <SdFile.h>
+#include <SdStream.h>
+#include <ArduinoStream.h>
+
+Include dependency graph for SdFat.h:
+
+
+ + +
+
+ + + + + +

+Classes

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

+Defines

#define SD_FAT_VERSION   20120108
+

Detailed Description

+

SdFat class.

+

Define Documentation

+ +
+
+ + + + +
#define SD_FAT_VERSION   20120108
+
+
+

SdFat version YYYYMMDD

+ +
+
+
+ + + diff --git a/libs/SdFatBeta20120108/html/_sd_fat_8h__incl.png b/libs/SdFatBeta20120108/html/_sd_fat_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..a1cd04a28cadeb00499f1eadf2ead9bd7e674203 GIT binary patch literal 37703 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 ge9k6__Q6Qj@*UsDC%KgQUDK~nNSh($ literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/_sd_fat_config_8h.html b/libs/SdFatBeta20120108/html/_sd_fat_config_8h.html new file mode 100644 index 0000000..5ad1916 --- /dev/null +++ b/libs/SdFatBeta20120108/html/_sd_fat_config_8h.html @@ -0,0 +1,297 @@ + + + + +SdFat: Arduino/libraries/SdFat/SdFatConfig.h File Reference + + + + + + +
+ +
+
Arduino/libraries/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:
+
+
+ + +
+
+ + + + + + + + + + + + + + + + +

+Defines

#define ALLOW_DEPRECATED_FUNCTIONS   1
#define ENDL_CALLS_FLUSH   0
#define FAT12_SUPPORT   0
#define MEGA_SOFT_SPI   1
#define SET_SPI_SS_HIGH   1
#define SPI_SD_INIT_RATE   5
#define USE_CXA_PURE_VIRTUAL   1
#define USE_MULTIPLE_CARDS   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
+

Detailed Description

+

configuration definitions

+

Define Documentation

+ +
+
+ + + + +
#define ALLOW_DEPRECATED_FUNCTIONS   1
+
+
+

Allow use of deprecated functions if ALLOW_DEPRECATED_FUNCTIONS is nonzero

+ +
+
+ +
+
+ + + + +
#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 MEGA_SOFT_SPI   1
+
+
+

Define MEGA_SOFT_SPI nonzero to use software SPI on Mega Arduinos. Pins used are SS 10, MOSI 11, MISO 12, and SCK 13.

+

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.

+ +
+
+ +
+
+ + + + +
#define SET_SPI_SS_HIGH   1
+
+
+

Set the SS pin high for hardware SPI. If SS is chip select for another SPI device this will disable that device during the SD init phase.

+ +
+
+ +
+
+ + + + +
#define SPI_SD_INIT_RATE   5
+
+
+

SPI init rate for SD initialization commands. Must be 5 (F_CPU/64) or 6 (F_CPU/128).

+ +
+
+ +
+
+ + + + +
#define USE_CXA_PURE_VIRTUAL   1
+
+
+

The __cxa_pure_virtual function is an error handler that is invoked when a pure virtual function is called.

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

To use multiple SD cards set USE_MULTIPLE_CARDS nonzero.

+

Using multiple cards costs 400 - 500 bytes of flash.

+

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

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

Set 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.

+ +
+
+

Variable Documentation

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

Software SPI chip select pin for the SD

+ +
+
+ +
+
+ + + + +
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

+ +
+
+
+ + + diff --git a/libs/SdFatBeta20120108/html/_sd_fat_config_8h__dep__incl.png b/libs/SdFatBeta20120108/html/_sd_fat_config_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..83f7060832466c1a5f593258f1f7f6e6792bc23e GIT binary patch literal 40752 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 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/_sd_fat_config_8h__incl.png b/libs/SdFatBeta20120108/html/_sd_fat_config_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..7d2ac665153fb493e6cba8e581e45640b07ffafb GIT binary patch literal 1576 zcmcIkZ8Q@K7+xvl<|0B^s-cswRJ14`X+D-nAL7sqAzYTQ`B+ktT_tsWbr);Nu4Fb} zG28C!M!1V8!=!z5nPxU5%*Uo(oqNtb_x`v)@B5zjdCqy?AJ32HId7i7pO>bFkp=(& z(1dzJ&aSh3eG=7G*KuUCDr22gBYeCd0OhxS!gy8$0Bq(#A;-_Bl~41Sb$S7YU2`I7 z(v|#sz(nIqlko_TirXw+R`zRGcO!H?=%sfINn6i7B7b*qSdfPAt^*BjI+nV=`WrV@ zUdZ7&UkL1CVc%nMheW+I@-;KCuqh*=u+alh{K*WPt2ThK zW#|BABCnzzUzjre@#B-(Yydp4BQElRSPTfi=dw-SrU8qc3BkVtzN&w zw8>m}A2|6WcED@sjo=+)we!b0xS$9e zLlURe{9XtdBH(G$;w1B_##!PNk)EXWoE$Liz<66b^{fZAn0{2-T-urKZp`OAu#mkR zYPsLC);+3)REu1hVzUX<`h4TXB0>> z$Y9&OqK!&LH3_kxt~ryt)VkIxqtGh5!Gs-guoLe@U;nTo1EkLP1XWgj{*R(%}yn)9{?u91Y?0?$fL zbC9BhuD1|*Y^Sm%$l6axR>1;YudfdB`D!kyK=1oRaM-4BwftSu8#*~ayX<-u&wr$7 zUEzN^=Jdb-tId?uRS=7L?&pPE0@$2qWh*Lo1((5Eu`iC8AAG6 zHs$>U8KD?B90XY6eu9t{mF6x4muA6P`AUnkr4~b4^>AEP|g4$T_AiFD-l1 z=lVd=UwAF1Z3!{Mpcl7VN4kw@ehz*3D`$^=zoRRv4-SRt4uGVp`JUs%zLl$C!vpBG zBW18<=kzn)1@*>uWtj@h(o6v%Dz?=0-mw#DAayzrzb{eHcG0#js(SMdZ4}6}a&B>K zmM_0e5RZ2o;G-?K9&;_;Q}f znt;A^K9H<<+H_gKo`wpYnz}g)$A@C99C-Om3A=tpO?1zWrjJ!5pxv6K!Vs-q+3 wR}^v_4o56(TuZgauI&?-aXtR}wE(xX%8h%}zINcRL#@B9pdNk@vU^zepGlMuNB{r; literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/_sd_fat_structs_8h.html b/libs/SdFatBeta20120108/html/_sd_fat_structs_8h.html new file mode 100644 index 0000000..1471306 --- /dev/null +++ b/libs/SdFatBeta20120108/html/_sd_fat_structs_8h.html @@ -0,0 +1,658 @@ + + + + +SdFat: Arduino/libraries/SdFat/SdFatStructs.h File Reference + + + + + +
+
+ + + + + + +
+
SdFat
+
+
+ + +
+
+ +
+
Arduino/libraries/SdFat/SdFatStructs.h File Reference
+
+
+ +

FAT file structures. +More...

+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Classes

struct  directoryEntry
 FAT short directory entry. More...
struct  fat32_boot
 Boot sector for a FAT32 volume. More...
struct  fat32_fsinfo
 FSINFO sector for a FAT32 volume. More...
struct  fat_boot
 Boot sector for a FAT12/FAT16 volume. More...
struct  masterBootRecord
 Master Boot Record. More...
struct  partitionTable
 MBR partition table entry. More...

+Typedefs

typedef struct directoryEntry dir_t
typedef struct fat32_boot fat32_boot_t
typedef struct fat32_fsinfo fat32_fsinfo_t
typedef struct fat_boot fat_boot_t
typedef struct masterBootRecord mbr_t
typedef struct partitionTable part_t

+Functions

static uint8_t DIR_IS_FILE (const dir_t *dir)
static uint8_t DIR_IS_FILE_OR_SUBDIR (const dir_t *dir)
static uint8_t DIR_IS_LONG_NAME (const dir_t *dir)
static uint8_t DIR_IS_SUBDIR (const dir_t *dir)

+Variables

uint8_t const BOOTSIG0 = 0X55
uint8_t const BOOTSIG1 = 0XAA
uint8_t const DIR_ATT_ARCHIVE = 0X20
uint8_t const DIR_ATT_DEFINED_BITS = 0X3F
uint8_t const DIR_ATT_DIRECTORY = 0X10
uint8_t const DIR_ATT_FILE_TYPE_MASK = (DIR_ATT_VOLUME_ID | DIR_ATT_DIRECTORY)
uint8_t const DIR_ATT_HIDDEN = 0X02
uint8_t const DIR_ATT_LONG_NAME = 0X0F
uint8_t const DIR_ATT_LONG_NAME_MASK = 0X3F
uint8_t const DIR_ATT_READ_ONLY = 0X01
uint8_t const DIR_ATT_SYSTEM = 0X04
uint8_t const DIR_ATT_VOLUME_ID = 0X08
uint8_t const DIR_NAME_0XE5 = 0X05
uint8_t const DIR_NAME_DELETED = 0XE5
uint8_t const DIR_NAME_FREE = 0X00
uint8_t const EXTENDED_BOOT_SIG = 0X29
uint16_t const FAT12EOC = 0XFFF
uint16_t const FAT12EOC_MIN = 0XFF8
uint16_t const FAT16EOC = 0XFFFF
uint16_t const FAT16EOC_MIN = 0XFFF8
uint32_t const FAT32EOC = 0X0FFFFFFF
uint32_t const FAT32EOC_MIN = 0X0FFFFFF8
uint32_t const FAT32MASK = 0X0FFFFFFF
uint32_t const FSINFO_LEAD_SIG = 0x41615252
uint32_t const FSINFO_STRUCT_SIG = 0x61417272
+

Detailed Description

+

FAT file structures.

+

Typedef Documentation

+ +
+
+ + + + +
typedef struct directoryEntry dir_t
+
+
+

Type name for directoryEntry

+ +
+
+ +
+
+ + + + +
typedef struct fat32_boot fat32_boot_t
+
+
+

Type name for FAT32 Boot Sector

+ +
+
+ +
+
+ + + + +
typedef struct fat32_fsinfo fat32_fsinfo_t
+
+
+

Type name for FAT32 FSINFO Sector

+ +
+
+ +
+
+ + + + +
typedef struct fat_boot fat_boot_t
+
+
+

Type name for FAT Boot Sector

+ +
+
+ +
+
+ + + + +
typedef struct masterBootRecord mbr_t
+
+
+

Type name for masterBootRecord

+ +
+
+ +
+
+ + + + +
typedef struct partitionTable part_t
+
+
+

Type name for partitionTable

+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + +
static uint8_t DIR_IS_FILE (const dir_tdir) [inline, static]
+
+
+

Directory entry is for a file

+
Parameters:
+ + +
[in]dirPointer to a directory entry.
+
+
+
Returns:
true if the entry is for a normal file else false.
+ +
+
+ +
+
+ + + + + + + + +
static uint8_t DIR_IS_FILE_OR_SUBDIR (const dir_tdir) [inline, static]
+
+
+

Directory entry is for a file or subdirectory

+
Parameters:
+ + +
[in]dirPointer to a directory entry.
+
+
+
Returns:
true if the entry is for a normal file or subdirectory else false.
+ +
+
+ +
+
+ + + + + + + + +
static uint8_t DIR_IS_LONG_NAME (const dir_tdir) [inline, static]
+
+
+

Directory entry is part of a long name

+
Parameters:
+ + +
[in]dirPointer to a directory entry.
+
+
+
Returns:
true if the entry is for part of a long name else false.
+ +
+
+ +
+
+ + + + + + + + +
static uint8_t DIR_IS_SUBDIR (const dir_tdir) [inline, static]
+
+
+

Directory entry is for a subdirectory

+
Parameters:
+ + +
[in]dirPointer to a directory entry.
+
+
+
Returns:
true if the entry is for a subdirectory else false.
+ +
+
+

Variable Documentation

+ +
+
+ + + + +
uint8_t const BOOTSIG0 = 0X55
+
+
+

Value for byte 510 of boot block or MBR

+ +
+
+ +
+
+ + + + +
uint8_t const BOOTSIG1 = 0XAA
+
+
+

Value for byte 511 of boot block or MBR

+ +
+
+ +
+
+ + + + +
uint8_t const DIR_ATT_ARCHIVE = 0X20
+
+
+

Old DOS archive bit for backup support

+ +
+
+ +
+
+ + + + +
uint8_t const DIR_ATT_DEFINED_BITS = 0X3F
+
+
+

defined attribute bits

+ +
+
+ +
+
+ + + + +
uint8_t const DIR_ATT_DIRECTORY = 0X10
+
+
+

Entry is for a directory

+ +
+
+ +
+ +
+

Mask for file/subdirectory tests

+ +
+
+ +
+
+ + + + +
uint8_t const DIR_ATT_HIDDEN = 0X02
+
+
+

File should hidden in directory listings

+ +
+
+ +
+
+ + + + +
uint8_t const DIR_ATT_LONG_NAME = 0X0F
+
+
+

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_MASK = 0X3F
+
+
+

Test mask for long name entry

+ +
+
+ +
+
+ + + + +
uint8_t const DIR_ATT_READ_ONLY = 0X01
+
+
+

file is read-only

+ +
+
+ +
+
+ + + + +
uint8_t const DIR_ATT_SYSTEM = 0X04
+
+
+

Entry is for a system file

+ +
+
+ +
+
+ + + + +
uint8_t const DIR_ATT_VOLUME_ID = 0X08
+
+
+

Directory entry contains the volume label

+ +
+
+ +
+
+ + + + +
uint8_t const DIR_NAME_0XE5 = 0X05
+
+
+

escape for name[0] = 0XE5

+ +
+
+ +
+
+ + + + +
uint8_t const DIR_NAME_DELETED = 0XE5
+
+
+

name[0] value for entry that is free after being "deleted"

+ +
+
+ +
+
+ + + + +
uint8_t const DIR_NAME_FREE = 0X00
+
+
+

name[0] value for entry that is free and no allocated entries follow

+ +
+
+ +
+
+ + + + +
uint8_t const EXTENDED_BOOT_SIG = 0X29
+
+
+

Value for bootSignature field int FAT/FAT32 boot sector

+ +
+
+ +
+
+ + + + +
uint16_t const FAT12EOC = 0XFFF
+
+
+

FAT12 end of chain value used by Microsoft.

+ +
+
+ +
+
+ + + + +
uint16_t const FAT12EOC_MIN = 0XFF8
+
+
+

Minimum value for FAT12 EOC. Use to test for EOC.

+ +
+
+ +
+
+ + + + +
uint16_t const FAT16EOC = 0XFFFF
+
+
+

FAT16 end of chain value used by Microsoft.

+ +
+
+ +
+
+ + + + +
uint16_t const FAT16EOC_MIN = 0XFFF8
+
+
+

Minimum value for FAT16 EOC. Use to test for EOC.

+ +
+
+ +
+
+ + + + +
uint32_t const FAT32EOC = 0X0FFFFFFF
+
+
+

FAT32 end of chain value used by Microsoft.

+ +
+
+ +
+
+ + + + +
uint32_t const FAT32EOC_MIN = 0X0FFFFFF8
+
+
+

Minimum value for FAT32 EOC. Use to test for EOC.

+ +
+
+ +
+
+ + + + +
uint32_t const FAT32MASK = 0X0FFFFFFF
+
+
+

Mask a for FAT32 entry. Entries are 28 bits.

+ +
+
+ +
+
+ + + + +
uint32_t const FSINFO_LEAD_SIG = 0x41615252
+
+
+

Lead signature for a FSINFO sector

+ +
+
+ +
+
+ + + + +
uint32_t const FSINFO_STRUCT_SIG = 0x61417272
+
+
+

Struct signature for a FSINFO sector

+ +
+
+
+ + + diff --git a/libs/SdFatBeta20120108/html/_sd_fat_structs_8h__dep__incl.png b/libs/SdFatBeta20120108/html/_sd_fat_structs_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..c36cd1bd6ce5a8b4b6259ba1ad760a4ff8030c56 GIT binary patch literal 31757 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

)%jtR&^d2U=TY#ieqM%b?b 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 P23^ + + + +SdFat: Arduino/libraries/SdFat/SdFatUtil.h File Reference + + + + + +

+
+ + + + + + +
+
SdFat
+
+
+ + +
+
+ +
+
Arduino/libraries/SdFat/SdFatUtil.h File Reference
+
+
+ +

Useful utility functions. +More...

+
#include <avr/pgmspace.h>
+#include <WProgram.h>
+
+Include dependency graph for SdFatUtil.h:
+
+
+ + +
+
+ + + + + + + + + +

+Defines

#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.

+

Define 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/libs/SdFatBeta20120108/html/_sd_fat_util_8h__incl.png b/libs/SdFatBeta20120108/html/_sd_fat_util_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..f948a842521eddb4e6556a0290393fd8540e7c3a GIT binary patch literal 3690 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 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/_sd_file_8h.html b/libs/SdFatBeta20120108/html/_sd_file_8h.html new file mode 100644 index 0000000..1272d84 --- /dev/null +++ b/libs/SdFatBeta20120108/html/_sd_file_8h.html @@ -0,0 +1,75 @@ + + + + +SdFat: Arduino/libraries/SdFat/SdFile.h File Reference + + + + + +
+
+ + + + + + +
+
SdFat
+
+
+ + +
+
+ +
+
Arduino/libraries/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/libs/SdFatBeta20120108/html/_sd_file_8h__dep__incl.png b/libs/SdFatBeta20120108/html/_sd_file_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..d154486ee3b38d1a0e958a6c106640c909cc3950 GIT binary patch literal 1755 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 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/_sd_stream_8h.html b/libs/SdFatBeta20120108/html/_sd_stream_8h.html new file mode 100644 index 0000000..6db25f6 --- /dev/null +++ b/libs/SdFatBeta20120108/html/_sd_stream_8h.html @@ -0,0 +1,82 @@ + + + + +SdFat: Arduino/libraries/SdFat/SdStream.h File Reference + + + + + +
+
+ + + + + + +
+
SdFat
+
+
+ + +
+
+ +
+
Arduino/libraries/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/libs/SdFatBeta20120108/html/_sd_stream_8h__dep__incl.png b/libs/SdFatBeta20120108/html/_sd_stream_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..c203ea75c1a0140332c5b20579ba0ad0096e12e8 GIT binary patch literal 1798 zcmcIldo&wp7RR)ep-fxTV2Y8dN0$c2qNSoz)&xZnL7Fi$skbDW5sy@uZ9Uqk(wM`p zN|7o>9vgYkkm`0#ty1rVcy>_Fh6<7n5*ssTchBtqd%ttPd(OS*+S2LqkIk_LX;t+Dg@$0yv_+Wjw_RwK?*gzpuB({=umh)|aXsZ7^@Iu#8ISq_EHw zZt`kladN7)`Yhk!TLtt?BDv(XUni7P-3bL8LVz5@6G48oguDnHAW&tvQT&yg&)9e$ zH2B!92s@B{`Z_y>)pvgrAG^@o`^%eb&tnwov+w)XdwZQ&=@y#m;%fOMf7 z8n=l3N4aLTE>zd(a=a!QaPFIc6E#y3i7{`6rs`^JVDPu)9(`e}E6A#CLx=|!9T(@D zzCK+fnylSj;;?8`%i7{*s$Hr?(9dJoUYCGcB6VnaX#hvp07h^z zWO7L$77+qMKeyz@oU(RD?cnNd+#3xsciwZeJSAx|WvsKL)d&6076UhCN&o0MWcXzR z_^MTyXskKMwSnc2iczu_@~{s}GT~C^XD{y%N|u!YNZ|Zl+;=>r;hqucN1ieM#iz^l zi5F3Q4k$4xk_3+%s#$r>S{xu@of+7ivu>??36ss#cPnu5{FwDE3H7pb8df16cTmBM7`m7dZrxo?_N`|756w+psF@{M(9GaH&82`C397M6U>i80Lh-mEuQX zzHRk98cW*R!EoEb${($ofFX5Pd zL16SplcoW!&`ZBf_h`-Gdm!!)j(O3{v5ARcl}a_h(*S(vut(4t3?)7#<-?xQPv*e- zH*fsMXZB%*KUJX(Z)3|SUzc%R(?Cmua(U4xzXi9$V4RvMLg~)VJxZ%!`VA%5B@H3= zcHVU!8^3!YeT}2H9*3~(zS;7Ow>|n0J(}AJkak|oaA=#a^gIjeOZd5xS%fl}JhW0%u7P9K3^5#!JHIHFZB`Dy-$0{` zAA=7Pyxe`~PU)$NK~yRPka({py&5WDU8zm6pLpcd-I2Y}Tfga52(<@D5A`laSKjFB zppm7^LZltgI!)V7*8{{gc&o%C@IL#Tg^tQi>oXglXKH=?dgV~Yx>;YWs^xL$6l`62 zd69d5FLHWS^+BWwkoDt!$x^M25zHar;$IQ=?-}F*9r6dXULA{iVf0`4{Xc@&a$T~^ zQXx?HJMrkb3m%#H=$?1C+5UgOT5Ku&Ljnu)$?9?PdHZD~%+otw_rXQt*6NsL^_VHl zK5>4)Z>X5^ym$oogU;me?|P-@i;E|5SNGAPk?;xPuG!+q3K=XOo^xrRZMTN#leQ#? z!9JrQUrC^eAbDyrgprhr&OacAOOhj|c#HoKL%W(7Lg=<<(Ruvjx$E_|POSG!k=)~) zVVUy!M7N@el1U)HD#2N&UISIJkbHW+RipUI(?)j8J~kv;hd@BJP@iPfozumuoY>A6DNm1{?cqufIVI-(GJ_5OQ{$|MYh3G*?6sdMAPo0FP)^v-tmfqfTPb?vvW$ z)4apg(0g6dXn!II>i*(JiurO`?MxT=&~K~c>6WWm@M$e`izclD2h1nXn+g5q*1rJm CSB6Fa literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/_sd_stream_8h__incl.png b/libs/SdFatBeta20120108/html/_sd_stream_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..51c7b930e7f9231b54eab290b9b9edd5bcb5db7c GIT binary patch literal 27731 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 MHC;66n$@HK0aNhkfdBvi literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/_sd_volume_8h.html b/libs/SdFatBeta20120108/html/_sd_volume_8h.html new file mode 100644 index 0000000..3e00b17 --- /dev/null +++ b/libs/SdFatBeta20120108/html/_sd_volume_8h.html @@ -0,0 +1,79 @@ + + + + +SdFat: Arduino/libraries/SdFat/SdVolume.h File Reference + + + + + +
+
+ + + + + + +
+
SdFat
+
+
+ + +
+
+ +
+
Arduino/libraries/SdFat/SdVolume.h File Reference
+
+
+ +

SdVolume class. +More...

+
#include <SdFatConfig.h>
+#include <Sd2Card.h>
+#include <SdFatStructs.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/libs/SdFatBeta20120108/html/_sd_volume_8h__dep__incl.png b/libs/SdFatBeta20120108/html/_sd_volume_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..85b0ee40fa24487dafe7070b2c28d56b41f905c6 GIT binary patch literal 30551 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 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/_sd_volume_8h__incl.png b/libs/SdFatBeta20120108/html/_sd_volume_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..7bbc630fb2ca8679144039a397a695a6873c2e04 GIT binary patch literal 8596 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 F_z%t~u{r<% literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/annotated.html b/libs/SdFatBeta20120108/html/annotated.html new file mode 100644 index 0000000..f2a684c --- /dev/null +++ b/libs/SdFatBeta20120108/html/annotated.html @@ -0,0 +1,81 @@ + + + + +SdFat: Class List + + + + + +
+
+ + + + + + +
+
SdFat
+
+
+ + +
+
+
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ArduinoInStreamInput stream for Arduino Stream objects
ArduinoOutStreamOutput stream for Arduino Print objects
cache_tCache for an SD data block
directoryEntryFAT short directory entry
fat32_bootBoot sector for a FAT32 volume
fat32_fsinfoFSINFO sector for a FAT32 volume
fat_bootBoot sector for a FAT12/FAT16 volume
fpos_tInternal type for istream do not use in user apps
fstreamSD file input/output stream
ibufstreamParse a char string
ifstreamSD file input stream
iosError and state information for all streams
ios_baseBase class for all streams
iostreamInput/Output stream
istreamInput Stream
masterBootRecordMaster Boot Record
obufstreamFormat a char string
ofstreamSD card output stream
ostreamOutput Stream
partitionTableMBR partition table entry
pgmType for string in flash
PrintThe Arduino core Print class
Sd2CardRaw access to SD and SDHC flash memory cards
SdBaseFileBase class for SdFile with Print and C++ streams
SdFatIntegration class for the SdFat library
SdFileSdBaseFile with Print
SdStreamBaseBase class for SD streams
SdVolumeAccess FAT16 and FAT32 volumes on SD and SDHC cards
setfillType for setfill manipulator
setprecisionType for setprecision manipulator
setwType for setw manipulator
+
+ + + diff --git a/libs/SdFatBeta20120108/html/bc_s.png b/libs/SdFatBeta20120108/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..51ba0066debbeac813d4014d805dc95ebd5b532e GIT binary patch literal 705 zcmV;y0zUnTP)rF$rQRw6Q(&UpP1C2j9>6opbR!_oV&F*Ar#jFVPDcrqyulXW;j+8j#k`kzKrw^%mxu{{V1|%gWybaP{#p01Ow~ zB}u2{E{(}bUp!#{_s(CTu-lqpI0GO7kSiTS0H7s=EN*pJI7&&m$E!@mK+B_{Xx(nj zH0-yS_)(8nX^er(4+o=lHsk1YNuDJFz~=EOD_HN~zW*iu%I90GV!oc&bWQk_4geq* z?tP92Q)0;sZ>cqtNr zOitc-rw&Cz$YQa>g0&|*N&WS=YH&7966!J}!88AdX)_x%jMh)j1wW9Z z*IvhmrFxz{vu`%7PR#}L0f5_4b|fCOXQid+8KYfFC_DlHq_*W{G_-J(_zH3*04SWE z4=w=!x2-hRp+Pe7IRei{XXZoQv3aO*zlhc|&K$GAain(EABqhLSF-2uT86!Xj#Z0B zU3k_Xawp7W)%kt^=&@!R3-to)mi?gz3E*IJe>$ba=d_9I2l8b9axei@p6k1qW)^BJ zqHa=NSguR@Srtva-n?v)XN=T%7nVoVfN2cYfePZIbCZQi`9_mavc00000NkvXXu0mjfn{!2m literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/bufstream_8h.html b/libs/SdFatBeta20120108/html/bufstream_8h.html new file mode 100644 index 0000000..ad271f7 --- /dev/null +++ b/libs/SdFatBeta20120108/html/bufstream_8h.html @@ -0,0 +1,77 @@ + + + + +SdFat: Arduino/libraries/SdFat/bufstream.h File Reference + + + + + +
+
+ + + + + + +
+
SdFat
+
+
+ + +
+
+ +
+
Arduino/libraries/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/libs/SdFatBeta20120108/html/bufstream_8h__dep__incl.png b/libs/SdFatBeta20120108/html/bufstream_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..52feee97de1026c765f760bb93dd8eed11b9cf5d GIT binary patch literal 3009 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 + + + +SdFat: Member List + + + + + +
+
+ + + + + + +
+
SdFat
+
+
+ + +
+
+
+
ArduinoInStream Member List
+
+
+This is the complete list of members for ArduinoInStream, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
adjustfieldios_base [static]
appios_base [static]
ArduinoInStream(Stream &hws, char *buf, uint16_t size)ArduinoInStream [inline]
ateios_base [static]
bad() const ios [inline]
badbitios_base [static]
basefieldios_base [static]
beg enum valueios_base
binaryios_base [static]
boolalphaios_base [static]
clear(iostate state=goodbit)ios [inline]
cur enum valueios_base
decios_base [static]
end enum valueios_base
eof() const ios [inline]
eofbitios_base [static]
fail() const ios [inline]
failbitios_base [static]
fill()ios_base [inline]
fill(char c)ios_base [inline]
flags() const ios_base [inline]
flags(fmtflags fl)ios_base [inline]
flagsToBase()ios_base [inline, protected]
fmtflags typedefios_base
gcount() const istream [inline]
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 ios [inline]
goodbitios_base [static]
hexios_base [static]
ibufstream()ibufstream [inline]
ibufstream(const char *str)ibufstream [inline, explicit]
ignore(streamsize n=1, int delim=-1)istream
inios_base [static]
init(const char *str)ibufstream [inline]
internalios_base [static]
ios()ios [inline]
ios_base() (defined in ios_base)ios_base [inline]
iostate typedefios_base
istream() (defined in istream)istream [inline]
leftios_base [static]
octios_base [static]
off_type typedefios_base
openmode typedefios_base
operator const void *() const ios [inline]
operator!() const ios [inline]
operator>>(istream &(*pf)(istream &str))istream [inline]
operator>>(ios_base &(*pf)(ios_base &str))istream [inline]
operator>>(ios &(*pf)(ios &str))istream [inline]
operator>>(char *str)istream [inline]
operator>>(char &ch)istream [inline]
operator>>(signed char *str)istream [inline]
operator>>(signed char &ch)istream [inline]
operator>>(unsigned char *str)istream [inline]
operator>>(unsigned char &ch)istream [inline]
operator>>(bool &arg)istream [inline]
operator>>(short &arg)istream [inline]
operator>>(unsigned short &arg)istream [inline]
operator>>(int16_t &arg)istream [inline]
operator>>(uint16_t &arg)istream [inline]
operator>>(int32_t &arg)istream [inline]
operator>>(uint32_t &arg)istream [inline]
operator>>(double &arg)istream [inline]
operator>>(float &arg)istream [inline]
operator>>(void *&arg)istream [inline]
outios_base [static]
peek()istream
pos_type typedefios_base
precision() const ios_base [inline]
precision(unsigned int n)ios_base [inline]
rdstate() const ios [inline]
readline()ArduinoInStream [inline]
rightios_base [static]
seekdir enum nameios_base
seekg(pos_type pos)istream [inline]
seekg(off_type off, seekdir way)istream [inline]
seekoff(off_type off, seekdir way)ArduinoInStream [inline, protected]
seekpos(pos_type pos)ArduinoInStream [inline, protected]
setf(fmtflags fl)ios_base [inline]
setf(fmtflags fl, fmtflags mask)ios_base [inline]
setstate(iostate state)ios [inline]
showbaseios_base [static]
showpointios_base [static]
showposios_base [static]
skipWhite()istream
skipwsios_base [static]
streamsize typedefios_base
tellg()istream [inline]
truncios_base [static]
unsetf(fmtflags fl)ios_base [inline]
uppercaseios_base [static]
width()ios_base [inline]
width(unsigned n)ios_base [inline]
+ + + diff --git a/libs/SdFatBeta20120108/html/class_arduino_in_stream.html b/libs/SdFatBeta20120108/html/class_arduino_in_stream.html new file mode 100644 index 0000000..b2fda64 --- /dev/null +++ b/libs/SdFatBeta20120108/html/class_arduino_in_stream.html @@ -0,0 +1,1992 @@ + + + + +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]
+ +

List of all members.

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

+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, uint16_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>> (char &ch)
istreamoperator>> (uint16_t &arg)
istreamoperator>> (int16_t &arg)
istreamoperator>> (signed char *str)
istreamoperator>> (int32_t &arg)
istreamoperator>> (uint32_t &arg)
istreamoperator>> (istream &(*pf)(istream &str))
istreamoperator>> (double &arg)
istreamoperator>> (signed char &ch)
istreamoperator>> (float &arg)
istreamoperator>> (void *&arg)
istreamoperator>> (ios_base &(*pf)(ios_base &str))
istreamoperator>> (unsigned char *str)
istreamoperator>> (unsigned char &ch)
istreamoperator>> (ios &(*pf)(ios &str))
istreamoperator>> (bool &arg)
istreamoperator>> (char *str)
istreamoperator>> (short &arg)
istreamoperator>> (unsigned short &arg)
int peek ()
int precision (unsigned int n)
int precision () const
iostate rdstate () const
void readline ()
istreamseekg (off_type off, seekdir way)
istreamseekg (pos_type pos)
fmtflags setf (fmtflags fl, fmtflags mask)
fmtflags setf (fmtflags fl)
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,
uint16_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 [inline, inherited]
+
+
+
Returns:
true if bad bit is set else false.
+ +
+
+ +
+
+ + + + + + + + +
void ios::clear (iostate state = goodbit) [inline, inherited]
+
+
+

Clear iostate bits.

+
Parameters:
+ + +
[in]stateThe flags you want to set after clearing all flags.
+
+
+ +

Reimplemented in fstream, and ofstream.

+ +
+
+ +
+
+ + + + + + + +
bool ios::eof () const [inline, inherited]
+
+
+
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, inherited]
+
+
+
Returns:
true if any iostate bit other than eof are set else false.
+ +
+
+ +
+
+ + + + + + + +
char ios_base::fill () [inline, inherited]
+
+
+
Returns:
fill character
+ +
+
+ +
+
+ + + + + + + + +
char ios_base::fill (char c) [inline, inherited]
+
+
+

Set fill character

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

set format flags

+
Parameters:
+ + +
[in]flnew flag
+
+
+
Returns:
old flags
+ +
+
+ +
+
+ + + + + + + +
uint8_t ios_base::flagsToBase () [inline, protected, inherited]
+
+
+
Returns:
current number base
+ +
+
+ +
+
+ + + + + + + +
streamsize istream::gcount () const [inline, inherited]
+
+
+
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 [inline, inherited]
+
+
+
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, inherited]
+
+
+

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 [inline, inherited]
+
+
+
Returns:
null pointer if fail() is true.
+ +
+
+ +
+
+ + + + + + + +
bool ios::operator! () const [inline, inherited]
+
+
+
Returns:
true if fail() else false.
+ +
+
+ +
+
+ + + + + + + + +
istream& istream::operator>> (istream &(*)(istream &str) pf) [inline, inherited]
+
+
+

call manipulator

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

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 short & arg) [inline, inherited]
+
+
+

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>> (int16_t & arg) [inline, inherited]
+
+
+

Extract a value of type int16_t.

+
Parameters:
+ + +
[out]arglocation to store the value.
+
+
+
Returns:
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + + + + +
istream& istream::operator>> (char & ch) [inline, inherited]
+
+
+

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>> (uint16_t & arg) [inline, inherited]
+
+
+

Extract a value of type uint16_t.

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

Extract a value of type int32_t.

+
Parameters:
+ + +
[out]arglocation to store the value.
+
+
+
Returns:
Is always *this. Failure is indicated by the state of *this.
+ +
+
+ +
+
+ + + + + + + + +
istream& istream::operator>> (signed char * str) [inline, inherited]
+
+
+

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>> (uint32_t & arg) [inline, inherited]
+
+
+

Extract a value of type uint32_t.

+
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, inherited]
+
+
+

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, inherited]
+
+
+

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>> (signed char & ch) [inline, inherited]
+
+
+

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>> (void *& arg) [inline, inherited]
+
+
+

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.
+ +
+
+ +
+
+ + + + + + + + +
istream& istream::operator>> (ios_base &(*)(ios_base &str) pf) [inline, inherited]
+
+
+

call manipulator

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

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, inherited]
+
+
+

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, inherited]
+
+
+

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>> (ios &(*)(ios &str) pf) [inline, inherited]
+
+
+

call manipulator

+
Parameters:
+ + +
[in]pffunction to call
+
+
+
Returns:
the stream
+ +
+
+ +
+
+ + + + + + + + +
istream& istream::operator>> (short & arg) [inline, inherited]
+
+
+

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.
+ +
+
+ +
+
+ + + + + + + +
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 (unsigned int n) [inline, inherited]
+
+
+

set precision

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

read a line.

+ +
+
+ +
+
+ + + + + + + + +
istream& istream::seekg (pos_type pos) [inline, inherited]
+
+
+

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, inherited]
+
+
+

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 
) [inline, protected]
+
+
+

Internal - do not use.

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

Internal - do not use.

+
Parameters:
+ + +
[in]pos
+
+
+
Returns:
true/false.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
) [inline, inherited]
+
+
+

modify format flags

+
Parameters:
+ + + +
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
+
+
+
Returns:
old flags
+ +
+
+ +
+
+ + + + + + + + +
fmtflags ios_base::setf (fmtflags fl) [inline, inherited]
+
+
+

set format flags

+
Parameters:
+ + +
[in]flnew flags to be or'ed in
+
+
+
Returns:
old flags
+ +
+
+ +
+
+ + + + + + + + +
void ios::setstate (iostate state) [inline, inherited]
+
+
+

Set iostate bits.

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

used to implement ws()

+ +
+
+ +
+
+ + + + + + + +
pos_type istream::tellg () [inline, inherited]
+
+
+
Returns:
the stream position
+ +
+
+ +
+
+ + + + + + + + +
void ios_base::unsetf (fmtflags fl) [inline, inherited]
+
+
+

clear format flags

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

set width

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

Member Data Documentation

+ +
+
+ + + + +
const fmtflags ios_base::adjustfield = left | right | internal [static, inherited]
+
+
+

mask for adjustfield

+ +
+
+ +
+
+ + + + +
const openmode ios_base::app = 0X4 [static, inherited]
+
+
+

seek to end before each write

+ +
+
+ +
+
+ + + + +
const openmode ios_base::ate = 0X8 [static, inherited]
+
+
+

open and seek to end immediately after opening

+ +
+
+ +
+
+ + + + +
const iostate ios_base::badbit = 0X01 [static, inherited]
+
+
+

iostate bad bit for a nonrecoverable error.

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::basefield = dec | hex | oct [static, inherited]
+
+
+

mask for basefield

+ +
+
+ +
+
+ + + + +
const openmode ios_base::binary = 0X10 [static, inherited]
+
+
+

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

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::boolalpha = 0x0100 [static, inherited]
+
+
+

use strings true/false for bool

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::dec = 0x0008 [static, inherited]
+
+
+

base 10 flag

+ +
+
+ +
+
+ + + + +
const iostate ios_base::eofbit = 0x02 [static, inherited]
+
+
+

iostate bit for end of file reached

+ +
+
+ +
+
+ + + + +
const iostate ios_base::failbit = 0X04 [static, inherited]
+
+
+

iostate fail bit for nonfatal error

+ +
+
+ +
+
+ + + + +
const iostate ios_base::goodbit = 0x00 [static, inherited]
+
+
+

iostate for no flags

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::hex = 0x0010 [static, inherited]
+
+
+

base 16 flag

+ +
+
+ +
+
+ + + + +
const openmode ios_base::in = 0X20 [static, inherited]
+
+
+

open for input

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::internal = 0x0004 [static, inherited]
+
+
+

fill between sign/base prefix and number

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::left = 0x0001 [static, inherited]
+
+
+

left adjust fields

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::oct = 0x0020 [static, inherited]
+
+
+

base 8 flag

+ +
+
+ +
+
+ + + + +
const openmode ios_base::out = 0X40 [static, inherited]
+
+
+

open for output

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::right = 0x0002 [static, inherited]
+
+
+

right adjust fields

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::showbase = 0x0200 [static, inherited]
+
+
+

use prefix 0X for hex and 0 for oct

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::showpoint = 0x0400 [static, inherited]
+
+
+

always show '.' for floating numbers

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::showpos = 0x0800 [static, inherited]
+
+
+

show + sign for nonnegative numbers

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::skipws = 0x1000 [static, inherited]
+
+
+

skip initial white space

+ +
+
+ +
+
+ + + + +
const openmode ios_base::trunc = 0X80 [static, inherited]
+
+
+

truncate an existing stream when opening

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::uppercase = 0x4000 [static, inherited]
+
+
+

use uppercase letters in number representations

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + diff --git a/libs/SdFatBeta20120108/html/class_arduino_in_stream__coll__graph.png b/libs/SdFatBeta20120108/html/class_arduino_in_stream__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..3fdb2d35a6c785120452ae8c49b83dbcf590fc24 GIT binary patch literal 3475 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 FzW_MQ9cusp literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/class_arduino_in_stream__inherit__graph.png b/libs/SdFatBeta20120108/html/class_arduino_in_stream__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..3fdb2d35a6c785120452ae8c49b83dbcf590fc24 GIT binary patch literal 3475 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 FzW_MQ9cusp literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/class_arduino_out_stream-members.html b/libs/SdFatBeta20120108/html/class_arduino_out_stream-members.html new file mode 100644 index 0000000..731d2cb --- /dev/null +++ b/libs/SdFatBeta20120108/html/class_arduino_out_stream-members.html @@ -0,0 +1,129 @@ + + + + +SdFat: Member List + + + + + +
+
+ + + + + + +
+
SdFat
+
+
+ + +
+
+
+
ArduinoOutStream Member List
+
+
+This is the complete list of members for ArduinoOutStream, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
adjustfieldios_base [static]
appios_base [static]
ArduinoOutStream(Print &pr)ArduinoOutStream [inline, explicit]
ateios_base [static]
bad() const ios [inline]
badbitios_base [static]
basefieldios_base [static]
beg enum valueios_base
binaryios_base [static]
boolalphaios_base [static]
clear(iostate state=goodbit)ios [inline]
cur enum valueios_base
decios_base [static]
end enum valueios_base
eof() const ios [inline]
eofbitios_base [static]
fail() const ios [inline]
failbitios_base [static]
fill()ios_base [inline]
fill(char c)ios_base [inline]
flags() const ios_base [inline]
flags(fmtflags fl)ios_base [inline]
flagsToBase()ios_base [inline, protected]
flush()ostream [inline]
fmtflags typedefios_base
good() const ios [inline]
goodbitios_base [static]
hexios_base [static]
inios_base [static]
internalios_base [static]
ios()ios [inline]
ios_base() (defined in ios_base)ios_base [inline]
iostate typedefios_base
leftios_base [static]
octios_base [static]
off_type typedefios_base
openmode typedefios_base
operator const void *() const ios [inline]
operator!() const ios [inline]
operator<<(ostream &(*pf)(ostream &str))ostream [inline]
operator<<(ios_base &(*pf)(ios_base &str))ostream [inline]
operator<<(bool arg)ostream [inline]
operator<<(const char *arg)ostream [inline]
operator<<(const signed char *arg)ostream [inline]
operator<<(const unsigned char *arg)ostream [inline]
operator<<(char arg)ostream [inline]
operator<<(signed char arg)ostream [inline]
operator<<(unsigned char arg)ostream [inline]
operator<<(double arg)ostream [inline]
operator<<(int16_t arg)ostream [inline]
operator<<(uint16_t arg)ostream [inline]
operator<<(int32_t arg)ostream [inline]
operator<<(uint32_t arg)ostream [inline]
operator<<(const void *arg)ostream [inline]
operator<<(pgm arg)ostream [inline]
ostream() (defined in ostream)ostream [inline]
outios_base [static]
pos_type typedefios_base
precision() const ios_base [inline]
precision(unsigned int n)ios_base [inline]
put(char ch)ostream [inline]
rdstate() const ios [inline]
rightios_base [static]
seekdir enum nameios_base
seekp(pos_type pos)ostream [inline]
seekp(off_type off, seekdir way)ostream [inline]
setf(fmtflags fl)ios_base [inline]
setf(fmtflags fl, fmtflags mask)ios_base [inline]
setstate(iostate state)ios [inline]
showbaseios_base [static]
showpointios_base [static]
showposios_base [static]
skipwsios_base [static]
streamsize typedefios_base
tellp()ostream [inline]
truncios_base [static]
unsetf(fmtflags fl)ios_base [inline]
uppercaseios_base [static]
width()ios_base [inline]
width(unsigned n)ios_base [inline]
+ + + diff --git a/libs/SdFatBeta20120108/html/class_arduino_out_stream.html b/libs/SdFatBeta20120108/html/class_arduino_out_stream.html new file mode 100644 index 0000000..2683bfb --- /dev/null +++ b/libs/SdFatBeta20120108/html/class_arduino_out_stream.html @@ -0,0 +1,1606 @@ + + + + +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]
+ +

List of all members.

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

+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<< (const void *arg)
ostreamoperator<< (char arg)
ostreamoperator<< (ios_base &(*pf)(ios_base &str))
ostreamoperator<< (pgm arg)
ostreamoperator<< (bool arg)
ostreamoperator<< (signed char arg)
ostreamoperator<< (unsigned char arg)
ostreamoperator<< (const char *arg)
ostreamoperator<< (double arg)
ostreamoperator<< (const signed char *arg)
ostreamoperator<< (int16_t arg)
ostreamoperator<< (uint16_t arg)
ostreamoperator<< (int32_t arg)
ostreamoperator<< (const unsigned char *arg)
ostreamoperator<< (uint32_t 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 mask)
fmtflags setf (fmtflags fl)
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 (Printpr) [inline, explicit]
+
+
+

constructor

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

Member Function Documentation

+ +
+
+ + + + + + + +
bool ios::bad () const [inline, inherited]
+
+
+
Returns:
true if bad bit is set else false.
+ +
+
+ +
+
+ + + + + + + + +
void ios::clear (iostate state = goodbit) [inline, inherited]
+
+
+

Clear iostate bits.

+
Parameters:
+ + +
[in]stateThe flags you want to set after clearing all flags.
+
+
+ +

Reimplemented in fstream, and ofstream.

+ +
+
+ +
+
+ + + + + + + +
bool ios::eof () const [inline, inherited]
+
+
+
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, inherited]
+
+
+
Returns:
true if any iostate bit other than eof are set else false.
+ +
+
+ +
+
+ + + + + + + + +
char ios_base::fill (char c) [inline, inherited]
+
+
+

Set fill character

+
Parameters:
+ + +
[in]cnew fill character
+
+
+
Returns:
old fill character
+ +
+
+ +
+
+ + + + + + + +
char ios_base::fill () [inline, inherited]
+
+
+
Returns:
fill character
+ +
+
+ +
+
+ + + + + + + +
fmtflags ios_base::flags () const [inline, inherited]
+
+
+
Returns:
format flags
+ +
+
+ +
+
+ + + + + + + + +
fmtflags ios_base::flags (fmtflags fl) [inline, inherited]
+
+
+

set format flags

+
Parameters:
+ + +
[in]flnew flag
+
+
+
Returns:
old flags
+ +
+
+ +
+
+ + + + + + + +
uint8_t ios_base::flagsToBase () [inline, protected, inherited]
+
+
+
Returns:
current number base
+ +
+
+ +
+
+ + + + + + + +
ostream& ostream::flush () [inline, inherited]
+
+
+

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 [inline, inherited]
+
+
+
Returns:
True if no iostate flags are set else false.
+ +
+
+ +
+
+ + + + + + + +
ios::operator const void * () const [inline, inherited]
+
+
+
Returns:
null pointer if fail() is true.
+ +
+
+ +
+
+ + + + + + + +
bool ios::operator! () const [inline, inherited]
+
+
+
Returns:
true if fail() else false.
+ +
+
+ +
+
+ + + + + + + + +
ostream& ostream::operator<< (ios_base &(*)(ios_base &str) pf) [inline, inherited]
+
+
+

call manipulator

+
Parameters:
+ + +
[in]pffunction to call
+
+
+
Returns:
the stream
+ +
+
+ +
+
+ + + + + + + + +
ostream& ostream::operator<< (pgm arg) [inline, inherited]
+
+
+

Output a string from flash

+
Parameters:
+ + +
[in]argpgm struct pointing to string
+
+
+
Returns:
the stream
+ +
+
+ +
+
+ + + + + + + + +
ostream& ostream::operator<< (signed char arg) [inline, inherited]
+
+
+

Output character

+
Parameters:
+ + +
[in]argcharacter to output
+
+
+
Returns:
the stream
+ +
+
+ +
+
+ + + + + + + + +
ostream& ostream::operator<< (bool arg) [inline, inherited]
+
+
+

Output bool

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

Output string

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

Output character

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

Output double

+
Parameters:
+ + +
[in]argvalue to output
+
+
+
Returns:
the stream
+ +
+
+ +
+
+ + + + + + + + +
ostream& ostream::operator<< (ostream &(*)(ostream &str) pf) [inline, inherited]
+
+
+

call manipulator

+
Parameters:
+ + +
[in]pffunction to call
+
+
+
Returns:
the stream
+ +
+
+ +
+
+ + + + + + + + +
ostream& ostream::operator<< (int16_t arg) [inline, inherited]
+
+
+

Output signed int

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

Output string

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

Output string

+
Parameters:
+ + +
[in]argstring to output
+
+
+
Returns:
the stream
+ +
+
+ +
+
+ + + + + + + + +
ostream& ostream::operator<< (uint16_t arg) [inline, inherited]
+
+
+

Output unsigned int

+
Parameters:
+ + +
[in]argvalue to output
+
+
+
Returns:
the stream
+ +
+
+ +
+
+ + + + + + + + +
ostream& ostream::operator<< (int32_t arg) [inline, inherited]
+
+
+

Output signed long

+
Parameters:
+ + +
[in]argvalue to output
+
+
+
Returns:
the stream
+ +
+
+ +
+
+ + + + + + + + +
ostream& ostream::operator<< (uint32_t arg) [inline, inherited]
+
+
+

Output uint32_t

+
Parameters:
+ + +
[in]argvalue to output
+
+
+
Returns:
the stream
+ +
+
+ +
+
+ + + + + + + + +
ostream& ostream::operator<< (char arg) [inline, inherited]
+
+
+

Output character

+
Parameters:
+ + +
[in]argcharacter to output
+
+
+
Returns:
the stream
+ +
+
+ +
+
+ + + + + + + + +
ostream& ostream::operator<< (const void * arg) [inline, inherited]
+
+
+

Output pointer

+
Parameters:
+ + +
[in]argvalue to output
+
+
+
Returns:
the stream
+ +
+
+ +
+
+ + + + + + + +
int ios_base::precision () const [inline, inherited]
+
+
+
Returns:
precision
+ +
+
+ +
+
+ + + + + + + + +
int ios_base::precision (unsigned int n) [inline, inherited]
+
+
+

set precision

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

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 [inline, inherited]
+
+
+
Returns:
The iostate flags for this file.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
ostream& ostream::seekp (off_type off,
seekdir way 
) [inline, inherited]
+
+
+

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.
+ +
+
+ +
+
+ + + + + + + + +
ostream& ostream::seekp (pos_type pos) [inline, inherited]
+
+
+

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.
+ +
+
+ +
+
+ + + + + + + + +
fmtflags ios_base::setf (fmtflags fl) [inline, inherited]
+
+
+

set format flags

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

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, inherited]
+
+
+

Set iostate bits.

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

clear format flags

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

set width

+
Parameters:
+ + +
[in]nnew width
+
+
+
Returns:
old width
+ +
+
+ +
+
+ + + + + + + +
unsigned ios_base::width () [inline, inherited]
+
+
+
Returns:
width
+ +
+
+

Member Data Documentation

+ +
+
+ + + + +
const fmtflags ios_base::adjustfield = left | right | internal [static, inherited]
+
+
+

mask for adjustfield

+ +
+
+ +
+
+ + + + +
const openmode ios_base::app = 0X4 [static, inherited]
+
+
+

seek to end before each write

+ +
+
+ +
+
+ + + + +
const openmode ios_base::ate = 0X8 [static, inherited]
+
+
+

open and seek to end immediately after opening

+ +
+
+ +
+
+ + + + +
const iostate ios_base::badbit = 0X01 [static, inherited]
+
+
+

iostate bad bit for a nonrecoverable error.

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::basefield = dec | hex | oct [static, inherited]
+
+
+

mask for basefield

+ +
+
+ +
+
+ + + + +
const openmode ios_base::binary = 0X10 [static, inherited]
+
+
+

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

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::boolalpha = 0x0100 [static, inherited]
+
+
+

use strings true/false for bool

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::dec = 0x0008 [static, inherited]
+
+
+

base 10 flag

+ +
+
+ +
+
+ + + + +
const iostate ios_base::eofbit = 0x02 [static, inherited]
+
+
+

iostate bit for end of file reached

+ +
+
+ +
+
+ + + + +
const iostate ios_base::failbit = 0X04 [static, inherited]
+
+
+

iostate fail bit for nonfatal error

+ +
+
+ +
+
+ + + + +
const iostate ios_base::goodbit = 0x00 [static, inherited]
+
+
+

iostate for no flags

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::hex = 0x0010 [static, inherited]
+
+
+

base 16 flag

+ +
+
+ +
+
+ + + + +
const openmode ios_base::in = 0X20 [static, inherited]
+
+
+

open for input

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::internal = 0x0004 [static, inherited]
+
+
+

fill between sign/base prefix and number

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::left = 0x0001 [static, inherited]
+
+
+

left adjust fields

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::oct = 0x0020 [static, inherited]
+
+
+

base 8 flag

+ +
+
+ +
+
+ + + + +
const openmode ios_base::out = 0X40 [static, inherited]
+
+
+

open for output

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::right = 0x0002 [static, inherited]
+
+
+

right adjust fields

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::showbase = 0x0200 [static, inherited]
+
+
+

use prefix 0X for hex and 0 for oct

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::showpoint = 0x0400 [static, inherited]
+
+
+

always show '.' for floating numbers

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::showpos = 0x0800 [static, inherited]
+
+
+

show + sign for nonnegative numbers

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::skipws = 0x1000 [static, inherited]
+
+
+

skip initial white space

+ +
+
+ +
+
+ + + + +
const openmode ios_base::trunc = 0X80 [static, inherited]
+
+
+

truncate an existing stream when opening

+ +
+
+ +
+
+ + + + +
const fmtflags ios_base::uppercase = 0x4000 [static, inherited]
+
+
+

use uppercase letters in number representations

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + diff --git a/libs/SdFatBeta20120108/html/class_arduino_out_stream__coll__graph.png b/libs/SdFatBeta20120108/html/class_arduino_out_stream__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..25187aefa3b02ae8878ee91b82cbbb6ee1b50ade GIT binary patch literal 4577 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 Z>5o=O<8l|>gFhR<#K^+1?2=pb-vL*ZpgjNp literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/class_arduino_out_stream__inherit__graph.png b/libs/SdFatBeta20120108/html/class_arduino_out_stream__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..44307795b280ddabeb102e721cc0edf42b586ac2 GIT binary patch literal 2729 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 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/class_print-members.html b/libs/SdFatBeta20120108/html/class_print-members.html new file mode 100644 index 0000000..7516395 --- /dev/null +++ b/libs/SdFatBeta20120108/html/class_print-members.html @@ -0,0 +1,71 @@ + + + + +SdFat: Member List + + + + + +
+
+ + + + + + +
+
SdFat
+
+
+ + +
+
+
+
Print Member List
+
+
+This is the complete list of members for Print, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + +
print(const String &)Print
print(const char[])Print
print(char, int=BYTE)Print
print(unsigned char, int=BYTE)Print
print(int, int=DEC)Print
print(unsigned int, int=DEC)Print
print(long, int=DEC)Print
print(unsigned long, int=DEC)Print
print(double, int=2)Print
println(const String &s)Print
println(const char[])Print
println(char, int=BYTE)Print
println(unsigned char, int=BYTE)Print
println(int, int=DEC)Print
println(unsigned int, int=DEC)Print
println(long, int=DEC)Print
println(unsigned long, int=DEC)Print
println(double, int=2)Print
println(void)Print
write(uint8_t b)=0Print [pure virtual]
write(const char *str)Print [virtual]
write(const uint8_t *buffer, size_t size)Print [virtual]
+ + + diff --git a/libs/SdFatBeta20120108/html/class_print.html b/libs/SdFatBeta20120108/html/class_print.html new file mode 100644 index 0000000..49a70d6 --- /dev/null +++ b/libs/SdFatBeta20120108/html/class_print.html @@ -0,0 +1,788 @@ + + + + +SdFat: Print Class Reference + + + + + +
+
+ + + + + + +
+
SdFat
+
+
+ + +
+
+ +
+
Print Class Reference
+
+
+ +

The Arduino core Print class. + More...

+ +

#include <Print.h>

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

List of all members.

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

+Public Member Functions

void print (const String &)
void print (const char[])
void print (int, int=DEC)
void print (unsigned int, int=DEC)
void print (long, int=DEC)
void print (unsigned long, int=DEC)
void print (char, int=BYTE)
void print (double, int=2)
void print (unsigned char, int=BYTE)
void println (unsigned int, int=DEC)
void println (const String &s)
void println (double, int=2)
void println (unsigned char, int=BYTE)
void println (unsigned long, int=DEC)
void println (void)
void println (long, int=DEC)
void println (const char[])
void println (int, int=DEC)
void println (char, int=BYTE)
virtual void write (uint8_t b)=0
virtual void write (const uint8_t *buffer, size_t size)
virtual void write (const char *str)
+

Detailed Description

+

The Arduino core Print class.

+

Member Function Documentation

+ +
+
+ + + + + + + + +
void Print::print (const String & s)
+
+
+

Write a string to the associated device.

+
Parameters:
+ + +
[in]sthe string to be printed
+
+
+ +
+
+ +
+
+ + + + + + + + +
void Print::print (const char str[])
+
+
+

Write a string to the associated device.

+
Parameters:
+ + +
[in]strthe string to be printed
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void Print::print (int n,
int base = DEC 
)
+
+
+

Write an signed number to the associated device in ASCII.

+
Parameters:
+ + + +
[in]nthe number to be printed
[in]baseformat to be used
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void Print::print (unsigned int n,
int base = DEC 
)
+
+
+

Write an unsigned number to the associated device in ASCII.

+
Parameters:
+ + + +
[in]nthe number to be printed
[in]baseformat to be used
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void Print::print (long n,
int base = DEC 
)
+
+
+

Write an signed number to the associated device in ASCII.

+
Parameters:
+ + + +
[in]nthe number to be printed
[in]baseformat to be used
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void Print::print (unsigned long n,
int base = DEC 
)
+
+
+

Write an unsigned number to the associated device in ASCII.

+
Parameters:
+ + + +
[in]nthe number to be printed
[in]baseformat to be used
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void Print::print (char c,
int base = BYTE 
)
+
+
+

Write an signed byte to the associated device in ASCII.

+
Parameters:
+ + + +
[in]cthe byte to be printed
[in]baseformat to be used
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void Print::print (double n,
int digits = 2 
)
+
+
+

Write the decimal representation of an float or double to the associated device in ASCII.

+
Parameters:
+ + + +
[in]nthe number to be printed
[in]digitsthe digits in ftraction to be printed
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void Print::print (unsigned char b,
int base = BYTE 
)
+
+
+

Write an unsigned byte to the associated device in ASCII.

+
Parameters:
+ + + +
[in]bthe byte to be printed
[in]baseformat to be used
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void Print::println (unsigned int n,
int base = DEC 
)
+
+
+

Write an unsigned number to the associated device in ASCII followed by CR LF.

+
Parameters:
+ + + +
[in]nthe number to be printed
[in]baseformat to be used
+
+
+ +
+
+ +
+
+ + + + + + + + +
void Print::println (const String & s)
+
+
+

Write a string to the associated device followed by CR LF.

+
Parameters:
+ + +
[in]sthe string to be printed
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void Print::println (double n,
int digits = 2 
)
+
+
+

Write the decimal representation of an float or double to the associated device in ASCII followed by CR LF.

+
Parameters:
+ + + +
[in]nthe number to be printed
[in]digitsthe digits in ftraction to be printed
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void Print::println (unsigned char b,
int base = BYTE 
)
+
+
+

Write an unsigned byte to the associated device in ASCII followed by CR LF.

+
Parameters:
+ + + +
[in]bthe byte to be printed
[in]baseformat to be used
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void Print::println (unsigned long n,
int base = DEC 
)
+
+
+

Write an unsigned number to the associated device in ASCII followed by CR LF.

+
Parameters:
+ + + +
[in]nthe number to be printed
[in]baseformat to be used
+
+
+ +
+
+ +
+
+ + + + + + + + +
void Print::println (void )
+
+
+

Print CR LF

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void Print::println (long n,
int base = DEC 
)
+
+
+

Write an signed number to the associated device in ASCII followed by CR LF.

+
Parameters:
+ + + +
[in]nthe number to be printed
[in]baseformat to be used
+
+
+ +
+
+ +
+
+ + + + + + + + +
void Print::println (const char c[])
+
+
+

Write a string to the associated device followed by CR LF.

+
Parameters:
+ + +
[in]cthe string to be printed
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void Print::println (int n,
int base = DEC 
)
+
+
+

Write an signed number to the associated device in ASCII followed by CR LF.

+
Parameters:
+ + + +
[in]nthe number to be printed
[in]baseformat to be used
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void Print::println (char c,
int base = BYTE 
)
+
+
+

Write an signed byte to the associated device in ASCII followed by CR LF.

+
Parameters:
+ + + +
[in]cthe byte to be printed
[in]baseformat to be used
+
+
+ +
+
+ +
+
+ + + + + + + + +
virtual void Print::write (uint8_t b) [pure virtual]
+
+
+

Virtual function to be implemented by the derived class for the hardware device.

+
Parameters:
+ + +
[in]bThe byte to be sent to the device.
+
+
+ +

Implemented in SdFile.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void Print::write (const uint8_t * buffer,
size_t size 
) [virtual]
+
+
+

default implementation: may be overridden

+
Parameters:
+ + + +
[in]bufferpointer to data
[in]sizecount of bytes to be written
+
+
+ +
+
+ +
+
+ + + + + + + + +
void Print::write (const char * str) [virtual]
+
+
+

default implementation: may be overridden

+
Parameters:
+ + +
[in]strstring to be written
+
+
+ +

Reimplemented in SdFile.

+ +
+
+
The documentation for this class was generated from the following files:
    +
  • SdFatDoc/Print/Print.h
  • +
  • SdFatDoc/Print/Print.cpp
  • +
+
+ + + diff --git a/libs/SdFatBeta20120108/html/class_print__inherit__graph.png b/libs/SdFatBeta20120108/html/class_print__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4825be294b4bb6960441a7259448fe6ca7ccaaa5 GIT binary patch literal 1013 zcmeAS@N?(olHy`uVBq!ia0vp^&Olti!3HEg9tw>TMGjt^TI!ju2UziN>aOP zRr>PAR_Cjxzg=}U7%H%)Ca$y+P+SUZVHPdDGcdH?&z zPs?w%>;g_4hT>t1&u}%wGtA+bqpH%+cxSa%i2E^LhW%^Ttuy1D(z182?VC4m7))P9 zMIWoM$(yCkdHeS58+Y!oWL+`kmQOF7z~f}ZaZ*90`Ng)q2W`&x>#p7<^t3WA@>%Vv zv)-?b8Xiwwzv@VP(apZ9Su$H^*_{7>xv9c(y}q{b+OJz3CrmT!UKM7v^WTfl6*h5a zE~k7tQOLSVYx1WlotM&exOQz3n&hZ6rDw69$(5@v+dmv}+S+r$gH2JgB}HJ8BZ%Sh zwtDi~wQDC>Hf`L!`}V7E`&c&cA8_`$`%W`HZl6TTZTH~imn*NWni%lq_iKB8w%2wN zIdi<{sus>K+&??D?sdYx9aGJ`lO+HCyZ`)dt|Y^q&0CGr-_=hs@(+?s+n3g6-u_uV ze&3(hPN!^6rmR_0^Pe*yrr7;`!Nt13A5p7p9GoQQp0l6M@c8ng>^AM?{`JL1q03T? zx|DYF?)Yp}{-tW~($g!AR3{or<<4RHqm(eWGxS|t&0Hnn2_9~NBH?HM+?cFxT*B}> z%VN*(%&r*ElpVKa%e5zdyfCUYwn#&QO1J zX&2M_$LZca`}Y?X8$^76HR<8S$$HR;gU2A5j2^CeN)NgXCI?TeedFyt-}Sb0Wvweu z{^;M1({`G5%HYiX^aT&gqnGzi6I^v(L;1#3)q|(adpWNa&H6X@<34xIBZ0ZOvlssE zIr%m9>FhV}n|I9$X`LC9uX;MYc74vi(2{&7)TDK@_NXw!dFAxZlj00=3y!^4vuFBY oFVdQ&MBb@0I3btegFUf literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/class_sd2_card-members.html b/libs/SdFatBeta20120108/html/class_sd2_card-members.html new file mode 100644 index 0000000..feae245 --- /dev/null +++ b/libs/SdFatBeta20120108/html/class_sd2_card-members.html @@ -0,0 +1,69 @@ + + + + +SdFat: Member List + + + + + +
+
+ + + + + + +
+
SdFat
+
+
+ + +
+
+
+
Sd2Card Member List
+
+
+This is the complete list of members for Sd2Card, including all inherited members. + + + + + + + + + + + + + + + + + + + + +
cardSize()Sd2Card
erase(uint32_t firstBlock, uint32_t lastBlock)Sd2Card
eraseSingleBlockEnable()Sd2Card
error(uint8_t code)Sd2Card [inline]
errorCode() const Sd2Card [inline]
errorData() const Sd2Card [inline]
init(uint8_t sckRateID=SPI_FULL_SPEED, uint8_t chipSelectPin=SD_CHIP_SELECT_PIN)Sd2Card
readBlock(uint32_t block, uint8_t *dst)Sd2Card
readCID(cid_t *cid)Sd2Card [inline]
readCSD(csd_t *csd)Sd2Card [inline]
readData(uint8_t *dst)Sd2Card
readStart(uint32_t blockNumber)Sd2Card
readStop()Sd2Card
Sd2Card()Sd2Card [inline]
setSckRate(uint8_t sckRateID)Sd2Card
type() const Sd2Card [inline]
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/libs/SdFatBeta20120108/html/class_sd2_card.html b/libs/SdFatBeta20120108/html/class_sd2_card.html new file mode 100644 index 0000000..b34d807 --- /dev/null +++ b/libs/SdFatBeta20120108/html/class_sd2_card.html @@ -0,0 +1,590 @@ + + + + +SdFat: Sd2Card Class Reference + + + + + +
+
+ + + + + + +
+
SdFat
+
+
+ + +
+
+ +
+
Sd2Card Class Reference
+
+
+ +

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

+ +

#include <Sd2Card.h>

+ +

List of all members.

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

+Public Member Functions

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 sckRateID=SPI_FULL_SPEED, uint8_t chipSelectPin=SD_CHIP_SELECT_PIN)
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 ()
 Sd2Card ()
bool setSckRate (uint8_t sckRateID)
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

+ +
+
+ + + + + + + +
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 sckRateID = SPI_FULL_SPEED,
uint8_t chipSelectPin = SD_CHIP_SELECT_PIN 
)
+
+
+

Initialize an SD flash memory card with default clock rate and chip select pin. See sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin).

+
Returns:
true for success or false for failure.
+

Initialize an SD flash memory card.

+
Parameters:
+ + + +
[in]sckRateIDSPI clock rate selector. See setSckRate().
[in]chipSelectPinSD chip select pin number.
+
+
+
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::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.
+ +
+
+ +
+
+ + + + + + + + +
bool Sd2Card::setSckRate (uint8_t sckRateID)
+
+
+

Set the SPI clock rate.

+
Parameters:
+ + +
[in]sckRateIDA value in the range [0, 6].
+
+
+

The SPI clock will be set to F_CPU/pow(2, 1 + sckRateID). The maximum SPI rate is F_CPU/2 for sckRateID = 0 and the minimum rate is F_CPU/128 for scsRateID = 6.

+
Returns:
The value one, true, is returned for success and the value zero, false, is returned for an invalid value of sckRateID.
+ +
+
+ +
+
+ + + + + + + +
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:
    +
  • Arduino/libraries/SdFat/Sd2Card.h
  • +
  • Arduino/libraries/SdFat/Sd2Card.cpp
  • +
+
+ + + diff --git a/libs/SdFatBeta20120108/html/class_sd_base_file-members.html b/libs/SdFatBeta20120108/html/class_sd_base_file-members.html new file mode 100644 index 0000000..af46f87 --- /dev/null +++ b/libs/SdFatBeta20120108/html/class_sd_base_file-members.html @@ -0,0 +1,109 @@ + + + + +SdFat: Member List + + + + + +
+
+ + + + + + +
+
SdFat
+
+
+ + +
+
+
+
SdBaseFile Member List
+
+
+This is the complete list of members for SdBaseFile, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
close()SdBaseFile
contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock)SdBaseFile
createContiguous(SdBaseFile *dirFile, const char *path, uint32_t size)SdBaseFile
curCluster() const SdBaseFile [inline]
curPosition() const SdBaseFile [inline]
cwd()SdBaseFile [inline, static]
dateTimeCallback(void(*dateTime)(uint16_t *date, uint16_t *time))SdBaseFile [inline, static]
dateTimeCallbackCancel()SdBaseFile [inline, static]
dirEntry(dir_t *dir)SdBaseFile
dirName(const dir_t &dir, char *name)SdBaseFile [static]
exists(const char *name)SdBaseFile
fgets(char *str, int16_t num, char *delim=0)SdBaseFile
fileSize() const SdBaseFile [inline]
firstCluster() const SdBaseFile [inline]
getFilename(char *name)SdBaseFile
getpos(fpos_t *pos)SdBaseFile
isDir() const SdBaseFile [inline]
isFile() const SdBaseFile [inline]
isOpen() const SdBaseFile [inline]
isRoot() const SdBaseFile [inline]
isSubDir() const SdBaseFile [inline]
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
printFatDate(uint16_t fatDate)SdBaseFile [static]
printFatDate(Print *pr, uint16_t fatDate)SdBaseFile [static]
printFatTime(uint16_t fatTime)SdBaseFile [static]
printFatTime(Print *pr, uint16_t fatTime)SdBaseFile [static]
printName()SdBaseFile
read()SdBaseFile
read(void *buf, uint16_t nbyte)SdBaseFile
readDir(dir_t *dir)SdBaseFile
remove(SdBaseFile *dirFile, const char *path)SdBaseFile [static]
remove()SdBaseFile
rename(SdBaseFile *dirFile, const char *newPath)SdBaseFile
rewind()SdBaseFile [inline]
rmdir()SdBaseFile
rmRfStar()SdBaseFile
SdBaseFile()SdBaseFile [inline]
SdBaseFile(const char *path, uint8_t oflag)SdBaseFile
SdFat (defined in SdBaseFile)SdBaseFile [friend]
seekCur(int32_t offset)SdBaseFile [inline]
seekEnd(int32_t offset=0)SdBaseFile [inline]
seekSet(uint32_t pos)SdBaseFile
setpos(fpos_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 SdBaseFile [inline]
volume() const SdBaseFile [inline]
write(const void *buf, uint16_t nbyte)SdBaseFile
writeErrorSdBaseFile
~SdBaseFile() (defined in SdBaseFile)SdBaseFile [inline]
+ + + diff --git a/libs/SdFatBeta20120108/html/class_sd_base_file.html b/libs/SdFatBeta20120108/html/class_sd_base_file.html new file mode 100644 index 0000000..be6027f --- /dev/null +++ b/libs/SdFatBeta20120108/html/class_sd_base_file.html @@ -0,0 +1,1758 @@ + + + + +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]
+
+Collaboration diagram for SdBaseFile:
+
+
Collaboration graph
+ + +
[legend]
+ +

List of all members.

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

+Public Member Functions

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 (fpos_t *pos)
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 printName ()
int16_t read ()
int16_t read (void *buf, uint16_t nbyte)
int8_t readDir (dir_t *dir)
bool remove ()
bool rename (SdBaseFile *dirFile, const char *newPath)
void rewind ()
bool rmdir ()
bool rmRfStar ()
 SdBaseFile (const char *path, uint8_t oflag)
 SdBaseFile ()
bool seekCur (int32_t offset)
bool seekEnd (int32_t offset=0)
bool seekSet (uint32_t pos)
void setpos (fpos_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
int16_t write (const void *buf, uint16_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 (Print *pr, uint16_t fatTime)
static void printFatTime (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

+ +
+
+ + + + + + + +
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.
+ +

Reimplemented in fstream, ifstream, and ofstream.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 () [inline, static]
+
+
+
Returns:
Current working directory
+ +
+
+ +
+
+ + + + + + + + +
static void SdBaseFile::dateTimeCallback (void(*)(uint16_t *date, uint16_t *time) dateTime) [inline, static]
+
+
+

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 () [inline, static]
+
+
+

Cancel the date/time callback function.

+ +
+
+ +
+
+ + + + + + + + +
bool SdBaseFile::dirEntry (dir_tdir)
+
+
+

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_tdir,
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 (fpos_tpos)
+
+
+

get position for streams

+
Parameters:
+ + +
[out]posstruct to receive position
+
+
+ +
+
+ +
+
+ + + + + + + +
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 (Printpr,
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.
+ +

Reimplemented in fstream, ifstream, and ofstream.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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;
+ +
+
+ +
+
+ + + + + + + + +
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 (Printpr,
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 (Printpr,
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.
+
+
+ +
+
+ +
+
+ + + + + + + + +
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.
+
+
+ +
+
+ +
+
+ + + + + + + +
bool 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.
+ +
+
+ +
+
+ + + + + + + +
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.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int16_t SdBaseFile::read (void * buf,
uint16_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_tdir)
+
+
+

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 (fpos_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.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int16_t SdBaseFile::write (const void * buf,
uint16_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.
+ +

Reimplemented in SdFile.

+ +
+
+

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:
    +
  • Arduino/libraries/SdFat/SdBaseFile.h
  • +
  • Arduino/libraries/SdFat/SdBaseFile.cpp
  • +
+
+ + + diff --git a/libs/SdFatBeta20120108/html/class_sd_base_file__coll__graph.png b/libs/SdFatBeta20120108/html/class_sd_base_file__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..98312f927d722cc2ad7813182b294044721c8c0a GIT binary patch literal 14023 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 ZTs~h~eowB9tC2rfSJ6=}fAsA2{{ctVWD@`Y literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/class_sd_base_file__inherit__graph.png b/libs/SdFatBeta20120108/html/class_sd_base_file__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..db2f5cb5af98e562a246956022d0d22d9b6a0ed7 GIT binary patch literal 6300 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 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/class_sd_fat-members.html b/libs/SdFatBeta20120108/html/class_sd_fat-members.html new file mode 100644 index 0000000..999fe77 --- /dev/null +++ b/libs/SdFatBeta20120108/html/class_sd_fat-members.html @@ -0,0 +1,79 @@ + + + + +SdFat: Member List + + + + + +
+
+ + + + + + +
+
SdFat
+
+
+ + +
+
+
+
SdFat Member List
+
+
+This is the complete list of members for SdFat, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
card()SdFat [inline]
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
init(uint8_t sckRateID=SPI_FULL_SPEED, uint8_t chipSelectPin=SD_CHIP_SELECT_PIN)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(Print *pr, 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() (defined in SdFat)SdFat [inline]
setStdOut(Print *stream)SdFat [inline, static]
stdOut()SdFat [inline, static]
truncate(const char *path, uint32_t length)SdFat
vol()SdFat [inline]
vwd()SdFat [inline]
+ + + diff --git a/libs/SdFatBeta20120108/html/class_sd_fat.html b/libs/SdFatBeta20120108/html/class_sd_fat.html new file mode 100644 index 0000000..46cbbdb --- /dev/null +++ b/libs/SdFatBeta20120108/html/class_sd_fat.html @@ -0,0 +1,832 @@ + + + + +SdFat: SdFat Class Reference + + + + + +
+
+ + + + + + +
+
SdFat
+
+
+ + +
+ +
+ +

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

+ +

#include <SdFat.h>

+
+Collaboration diagram for SdFat:
+
+
Collaboration graph
+ + +
[legend]
+ +

List of all members.

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

+Public Member Functions

Sd2Cardcard ()
bool chdir (const char *path, bool set_cwd=false)
bool chdir (bool set_cwd=false)
void chvol ()
void errorHalt (char const *msg)
void errorHalt ()
void errorHalt_P (PGM_P msg)
void errorPrint ()
void errorPrint (char const *msg)
void errorPrint_P (PGM_P msg)
bool exists (const char *name)
bool init (uint8_t sckRateID=SPI_FULL_SPEED, uint8_t chipSelectPin=SD_CHIP_SELECT_PIN)
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 (Print *pr, uint8_t flags=0)
void ls (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)
SdVolumevol ()
SdBaseFilevwd ()

+Static Public Member Functions

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

Detailed Description

+

Integration class for the SdFat library.

+

Member Function Documentation

+ +
+
+ + + + + + + +
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.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool SdFat::init (uint8_t sckRateID = SPI_FULL_SPEED,
uint8_t chipSelectPin = SD_CHIP_SELECT_PIN 
)
+
+
+

Initialize an SdFat object.

+

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

+
Parameters:
+ + + +
[in]sckRateIDvalue for SPI SCK rate. See Sd2Card::init().
[in]chipSelectPinSD chip select pin. See Sd2Card::init().
+
+
+
Returns:
The value one, true, is returned for success and the value zero, false, is returned for failure.
+ +
+
+ +
+
+ + + + + + + +
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 (Printpr,
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 (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.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
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 (Printstream) [inline, static]
+
+
+

Set stdOut Print stream for messages.

+
Parameters:
+ + +
[in]streamThe new Print stream.
+
+
+ +
+
+ +
+
+ + + + + + + +
static Print* SdFat::stdOut () [inline, static]
+
+
+
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:
    +
  • Arduino/libraries/SdFat/SdFat.h
  • +
  • Arduino/libraries/SdFat/SdFat.cpp
  • +
+
+ + + diff --git a/libs/SdFatBeta20120108/html/class_sd_fat__coll__graph.png b/libs/SdFatBeta20120108/html/class_sd_fat__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..248d3af284eed1e74bbce518b1b4d02ee6211c0f GIT binary patch literal 21877 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 aI|74GiZ#%a9ywr+D#X&<4qkoHJMsTMt2Mv? literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/class_sd_file-members.html b/libs/SdFatBeta20120108/html/class_sd_file-members.html new file mode 100644 index 0000000..57d9db6 --- /dev/null +++ b/libs/SdFatBeta20120108/html/class_sd_file-members.html @@ -0,0 +1,134 @@ + + + + +SdFat: Member List + + + + + +

    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    SdFile Member List
    +
    +
    +This is the complete list of members for SdFile, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    close()SdBaseFile
    contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock)SdBaseFile
    createContiguous(SdBaseFile *dirFile, const char *path, uint32_t size)SdBaseFile
    curCluster() const SdBaseFile [inline]
    curPosition() const SdBaseFile [inline]
    cwd()SdBaseFile [inline, static]
    dateTimeCallback(void(*dateTime)(uint16_t *date, uint16_t *time))SdBaseFile [inline, static]
    dateTimeCallbackCancel()SdBaseFile [inline, static]
    dirEntry(dir_t *dir)SdBaseFile
    dirName(const dir_t &dir, char *name)SdBaseFile [static]
    exists(const char *name)SdBaseFile
    fgets(char *str, int16_t num, char *delim=0)SdBaseFile
    fileSize() const SdBaseFile [inline]
    firstCluster() const SdBaseFile [inline]
    getFilename(char *name)SdBaseFile
    getpos(fpos_t *pos)SdBaseFile
    isDir() const SdBaseFile [inline]
    isFile() const SdBaseFile [inline]
    isOpen() const SdBaseFile [inline]
    isRoot() const SdBaseFile [inline]
    isSubDir() const SdBaseFile [inline]
    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
    print(const String &)Print
    print(const char[])Print
    print(char, int=BYTE)Print
    print(unsigned char, int=BYTE)Print
    print(int, int=DEC)Print
    print(unsigned int, int=DEC)Print
    print(long, int=DEC)Print
    print(unsigned long, int=DEC)Print
    print(double, int=2)Print
    printFatDate(uint16_t fatDate)SdBaseFile [static]
    printFatDate(Print *pr, uint16_t fatDate)SdBaseFile [static]
    printFatTime(uint16_t fatTime)SdBaseFile [static]
    printFatTime(Print *pr, uint16_t fatTime)SdBaseFile [static]
    println(const String &s)Print
    println(const char[])Print
    println(char, int=BYTE)Print
    println(unsigned char, int=BYTE)Print
    println(int, int=DEC)Print
    println(unsigned int, int=DEC)Print
    println(long, int=DEC)Print
    println(unsigned long, int=DEC)Print
    println(double, int=2)Print
    println(void)Print
    printName()SdBaseFile
    read()SdBaseFile
    read(void *buf, uint16_t nbyte)SdBaseFile
    readDir(dir_t *dir)SdBaseFile
    remove(SdBaseFile *dirFile, const char *path)SdBaseFile [static]
    remove()SdBaseFile
    rename(SdBaseFile *dirFile, const char *newPath)SdBaseFile
    rewind()SdBaseFile [inline]
    rmdir()SdBaseFile
    rmRfStar()SdBaseFile
    SdBaseFile()SdBaseFile [inline]
    SdBaseFile(const char *path, uint8_t oflag)SdBaseFile
    SdFile() (defined in SdFile)SdFile [inline]
    SdFile(const char *name, uint8_t oflag)SdFile
    seekCur(int32_t offset)SdBaseFile [inline]
    seekEnd(int32_t offset=0)SdBaseFile [inline]
    seekSet(uint32_t pos)SdBaseFile
    setpos(fpos_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 SdBaseFile [inline]
    volume() const SdBaseFile [inline]
    write(uint8_t b)SdFile [virtual]
    write(const char *str)SdFile [virtual]
    write(const void *buf, uint16_t nbyte)SdFile
    Print::write(const uint8_t *buffer, size_t size)Print [virtual]
    write_P(PGM_P str)SdFile
    writeErrorSdBaseFile
    writeln_P(PGM_P str)SdFile
    ~SdBaseFile() (defined in SdBaseFile)SdBaseFile [inline]
    + + + diff --git a/libs/SdFatBeta20120108/html/class_sd_file.html b/libs/SdFatBeta20120108/html/class_sd_file.html new file mode 100644 index 0000000..bf3bc55 --- /dev/null +++ b/libs/SdFatBeta20120108/html/class_sd_file.html @@ -0,0 +1,2498 @@ + + + + +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]
    + +

    List of all members.

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

    +Public Member Functions

    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 (fpos_t *pos)
    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 ()
    void print (unsigned int, int=DEC)
    void print (unsigned long, int=DEC)
    void print (double, int=2)
    void print (unsigned char, int=BYTE)
    void print (const String &)
    void print (const char[])
    void print (char, int=BYTE)
    void print (int, int=DEC)
    void print (long, int=DEC)
    void println (char, int=BYTE)
    void println (const char[])
    void println (unsigned char, int=BYTE)
    void println (unsigned int, int=DEC)
    void println (unsigned long, int=DEC)
    void println (void)
    void println (int, int=DEC)
    void println (const String &s)
    void println (double, int=2)
    void println (long, int=DEC)
    bool printName ()
    int16_t read (void *buf, uint16_t nbyte)
    int16_t read ()
    int8_t readDir (dir_t *dir)
    bool remove ()
    bool rename (SdBaseFile *dirFile, const char *newPath)
    void rewind ()
    bool rmdir ()
    bool rmRfStar ()
     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 (fpos_t *pos)
    bool sync ()
    bool timestamp (uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
    bool timestamp (SdBaseFile *file)
    bool truncate (uint32_t size)
    uint8_t type () const
    SdVolumevolume () const
    void write (const char *str)
    virtual void write (const uint8_t *buffer, size_t size)
    void write (uint8_t b)
    int16_t write (const void *buf, uint16_t nbyte)
    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 (Print *pr, uint16_t fatTime)
    static void printFatTime (uint16_t fatTime)
    static bool remove (SdBaseFile *dirFile, const char *path)

    +Public Attributes

    bool writeError
    +

    Detailed Description

    +

    Constructor & Destructor Documentation

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    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

    + +
    +
    + + + + + + + +
    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.
    + +

    Reimplemented in fstream, ifstream, and ofstream.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    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 [inline, inherited]
    +
    +
    +
    Returns:
    The current cluster number for a file or directory.
    + +
    +
    + +
    +
    + + + + + + + +
    uint32_t SdBaseFile::curPosition () const [inline, inherited]
    +
    +
    +
    Returns:
    The current position for a file or directory.
    + +
    +
    + +
    +
    + + + + + + + +
    static SdBaseFile* SdBaseFile::cwd () [inline, static, inherited]
    +
    +
    +
    Returns:
    Current working directory
    + +
    +
    + +
    +
    + + + + + + + + +
    static void SdBaseFile::dateTimeCallback (void(*)(uint16_t *date, uint16_t *time) dateTime) [inline, static, inherited]
    +
    +
    +

    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 () [inline, static, inherited]
    +
    +
    +

    Cancel the date/time callback function.

    + +
    +
    + +
    +
    + + + + + + + + +
    bool SdBaseFile::dirEntry (dir_tdir) [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_tdir,
    char * name 
    ) [static, inherited]
    +
    +
    +

    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 [inline, inherited]
    +
    +
    +
    Returns:
    The total number of bytes in a file or directory.
    + +
    +
    + +
    +
    + + + + + + + +
    uint32_t SdBaseFile::firstCluster () const [inline, inherited]
    +
    +
    +
    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 (fpos_tpos) [inherited]
    +
    +
    +

    get position for streams

    +
    Parameters:
    + + +
    [out]posstruct to receive position
    +
    +
    + +
    +
    + +
    +
    + + + + + + + +
    bool SdBaseFile::isDir () const [inline, inherited]
    +
    +
    +
    Returns:
    True if this is a directory else false.
    + +
    +
    + +
    +
    + + + + + + + +
    bool SdBaseFile::isFile () const [inline, inherited]
    +
    +
    +
    Returns:
    True if this is a normal file else false.
    + +
    +
    + +
    +
    + + + + + + + +
    bool SdBaseFile::isOpen () const [inline, inherited]
    +
    +
    +
    Returns:
    True if this is an open file/directory else false.
    + +
    +
    + +
    +
    + + + + + + + +
    bool SdBaseFile::isRoot () const [inline, inherited]
    +
    +
    +
    Returns:
    True if this is the root directory.
    + +
    +
    + +
    +
    + + + + + + + +
    bool SdBaseFile::isSubDir () const [inline, inherited]
    +
    +
    +
    Returns:
    True if this is a subdirectory else false.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void SdBaseFile::ls (Printpr,
    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,
    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.
    + +

    Reimplemented in fstream, ifstream, and ofstream.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    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::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;
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void Print::print (unsigned char b,
    int base = BYTE 
    ) [inherited]
    +
    +
    +

    Write an unsigned byte to the associated device in ASCII.

    +
    Parameters:
    + + + +
    [in]bthe byte to be printed
    [in]baseformat to be used
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void Print::print (int n,
    int base = DEC 
    ) [inherited]
    +
    +
    +

    Write an signed number to the associated device in ASCII.

    +
    Parameters:
    + + + +
    [in]nthe number to be printed
    [in]baseformat to be used
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void Print::print (unsigned int n,
    int base = DEC 
    ) [inherited]
    +
    +
    +

    Write an unsigned number to the associated device in ASCII.

    +
    Parameters:
    + + + +
    [in]nthe number to be printed
    [in]baseformat to be used
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void Print::print (unsigned long n,
    int base = DEC 
    ) [inherited]
    +
    +
    +

    Write an unsigned number to the associated device in ASCII.

    +
    Parameters:
    + + + +
    [in]nthe number to be printed
    [in]baseformat to be used
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void Print::print (double n,
    int digits = 2 
    ) [inherited]
    +
    +
    +

    Write the decimal representation of an float or double to the associated device in ASCII.

    +
    Parameters:
    + + + +
    [in]nthe number to be printed
    [in]digitsthe digits in ftraction to be printed
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void Print::print (long n,
    int base = DEC 
    ) [inherited]
    +
    +
    +

    Write an signed number to the associated device in ASCII.

    +
    Parameters:
    + + + +
    [in]nthe number to be printed
    [in]baseformat to be used
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void Print::print (const char str[]) [inherited]
    +
    +
    +

    Write a string to the associated device.

    +
    Parameters:
    + + +
    [in]strthe string to be printed
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void Print::print (char c,
    int base = BYTE 
    ) [inherited]
    +
    +
    +

    Write an signed byte to the associated device in ASCII.

    +
    Parameters:
    + + + +
    [in]cthe byte to be printed
    [in]baseformat to be used
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void Print::print (const String & s) [inherited]
    +
    +
    +

    Write a string to the associated device.

    +
    Parameters:
    + + +
    [in]sthe string to be printed
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void SdBaseFile::printFatDate (uint16_t fatDate) [static, inherited]
    +
    +
    +

    Print a directory date field to stdOut.

    +

    Format is yyyy-mm-dd.

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

    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, inherited]
    +
    +
    +

    Print a directory time field to stdOut.

    +

    Format is hh:mm:ss.

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

    Print a directory time field.

    +

    Format is hh:mm:ss.

    +
    Parameters:
    + + + +
    [in]prPrint stream for output.
    [in]fatTimeThe time field from a directory entry.
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void Print::println (char c,
    int base = BYTE 
    ) [inherited]
    +
    +
    +

    Write an signed byte to the associated device in ASCII followed by CR LF.

    +
    Parameters:
    + + + +
    [in]cthe byte to be printed
    [in]baseformat to be used
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void Print::println (const char c[]) [inherited]
    +
    +
    +

    Write a string to the associated device followed by CR LF.

    +
    Parameters:
    + + +
    [in]cthe string to be printed
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void Print::println (const String & s) [inherited]
    +
    +
    +

    Write a string to the associated device followed by CR LF.

    +
    Parameters:
    + + +
    [in]sthe string to be printed
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void Print::println (double n,
    int digits = 2 
    ) [inherited]
    +
    +
    +

    Write the decimal representation of an float or double to the associated device in ASCII followed by CR LF.

    +
    Parameters:
    + + + +
    [in]nthe number to be printed
    [in]digitsthe digits in ftraction to be printed
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void Print::println (void ) [inherited]
    +
    +
    +

    Print CR LF

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void Print::println (unsigned long n,
    int base = DEC 
    ) [inherited]
    +
    +
    +

    Write an unsigned number to the associated device in ASCII followed by CR LF.

    +
    Parameters:
    + + + +
    [in]nthe number to be printed
    [in]baseformat to be used
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void Print::println (unsigned char b,
    int base = BYTE 
    ) [inherited]
    +
    +
    +

    Write an unsigned byte to the associated device in ASCII followed by CR LF.

    +
    Parameters:
    + + + +
    [in]bthe byte to be printed
    [in]baseformat to be used
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void Print::println (long n,
    int base = DEC 
    ) [inherited]
    +
    +
    +

    Write an signed number to the associated device in ASCII followed by CR LF.

    +
    Parameters:
    + + + +
    [in]nthe number to be printed
    [in]baseformat to be used
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void Print::println (unsigned int n,
    int base = DEC 
    ) [inherited]
    +
    +
    +

    Write an unsigned number to the associated device in ASCII followed by CR LF.

    +
    Parameters:
    + + + +
    [in]nthe number to be printed
    [in]baseformat to be used
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void Print::println (int n,
    int base = DEC 
    ) [inherited]
    +
    +
    +

    Write an signed number to the associated device in ASCII followed by CR LF.

    +
    Parameters:
    + + + +
    [in]nthe number to be printed
    [in]baseformat to be used
    +
    +
    + +
    +
    + +
    +
    + + + + + + + +
    bool 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.
    + +
    +
    + +
    +
    + + + + + + + +
    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.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int16_t SdBaseFile::read (void * buf,
    uint16_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_tdir) [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 () [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::remove (SdBaseFiledirFile,
    const char * path 
    ) [static, inherited]
    +
    +
    +

    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::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 () [inline, inherited]
    +
    +
    +

    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) [inline, inherited]
    +
    +
    +

    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, inherited]
    +
    +
    +

    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 (fpos_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 [inline, inherited]
    +
    +
    +

    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, inherited]
    +
    +
    +
    Returns:
    SdVolume that contains this file.
    + +
    +
    + +
    +
    + + + + + + + + +
    void SdFile::write (uint8_t b) [virtual]
    +
    +
    +

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

    +
    Parameters:
    + + +
    [in]bthe byte to be written. Use writeError to check for errors.
    +
    +
    + +

    Implements Print.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int16_t SdFile::write (const void * buf,
    uint16_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.
    + +

    Reimplemented from SdBaseFile.

    + +
    +
    + +
    +
    + + + + + + + + +
    void SdFile::write (const char * str) [virtual]
    +
    +
    +

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

    +
    Parameters:
    + + +
    [in]strPointer to the string. Use writeError to check for errors.
    +
    +
    + +

    Reimplemented from Print.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void Print::write (const uint8_t * buffer,
    size_t size 
    ) [virtual, inherited]
    +
    +
    +

    default implementation: may be overridden

    +
    Parameters:
    + + + +
    [in]bufferpointer to data
    [in]sizecount of bytes to be written
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    void SdFile::write_P (PGM_P str)
    +
    +
    +

    Write a PROGMEM string to a file.

    +
    Parameters:
    + + +
    [in]strPointer to the PROGMEM string. Use writeError 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 writeError 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:
      +
    • Arduino/libraries/SdFat/SdFile.h
    • +
    • Arduino/libraries/SdFat/SdFile.cpp
    • +
    +
    + + + diff --git a/libs/SdFatBeta20120108/html/class_sd_file__coll__graph.png b/libs/SdFatBeta20120108/html/class_sd_file__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..c3f6d6718747ad602a701ca7b10ab90ef6abcf4b GIT binary patch literal 16734 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 z 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 L1IMspB}-%%lKcqSw|Uvuls!Ts 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 + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    SdStreamBase Member List
    +
    +
    +This is the complete list of members for SdStreamBase, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    adjustfieldios_base [static]
    appios_base [static]
    ateios_base [static]
    bad() const ios [inline]
    badbitios_base [static]
    basefieldios_base [static]
    beg enum valueios_base
    binaryios_base [static]
    boolalphaios_base [static]
    clear(iostate state=goodbit)ios [inline]
    close()SdBaseFile [protected]
    contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock)SdBaseFile [protected]
    createContiguous(SdBaseFile *dirFile, const char *path, uint32_t size)SdBaseFile [protected]
    cur enum valueios_base
    curCluster() const SdBaseFile [inline, protected]
    curPosition() const SdBaseFile [inline, protected]
    cwd()SdBaseFile [inline, protected, static]
    dateTimeCallback(void(*dateTime)(uint16_t *date, uint16_t *time))SdBaseFile [inline, protected, static]
    dateTimeCallbackCancel()SdBaseFile [inline, protected, static]
    decios_base [static]
    dirEntry(dir_t *dir)SdBaseFile [protected]
    dirName(const dir_t &dir, char *name)SdBaseFile [protected, static]
    end enum valueios_base
    eof() const ios [inline]
    eofbitios_base [static]
    exists(const char *name)SdBaseFile [protected]
    fail() const ios [inline]
    failbitios_base [static]
    fgets(char *str, int16_t num, char *delim=0)SdBaseFile [protected]
    fileSize() const SdBaseFile [inline, protected]
    fill()ios_base [inline]
    fill(char c)ios_base [inline]
    firstCluster() const SdBaseFile [inline, protected]
    flags() const ios_base [inline]
    flags(fmtflags fl)ios_base [inline]
    flagsToBase()ios_base [inline, protected]
    fmtflags typedefios_base
    getFilename(char *name)SdBaseFile [protected]
    getpos(fpos_t *pos)SdBaseFile [protected]
    good() const ios [inline]
    goodbitios_base [static]
    hexios_base [static]
    inios_base [static]
    internalios_base [static]
    ios()ios [inline]
    ios_base() (defined in ios_base)ios_base [inline]
    iostate typedefios_base
    isDir() const SdBaseFile [inline, protected]
    isFile() const SdBaseFile [inline, protected]
    isOpen() const SdBaseFile [inline, protected]
    isRoot() const SdBaseFile [inline, protected]
    isSubDir() const SdBaseFile [inline, protected]
    leftios_base [static]
    ls(Print *pr, uint8_t flags=0, uint8_t indent=0)SdBaseFile [protected]
    ls(uint8_t flags=0)SdBaseFile [protected]
    mkdir(SdBaseFile *dir, const char *path, bool pFlag=true)SdBaseFile [protected]
    octios_base [static]
    off_type typedefios_base
    open(SdBaseFile *dirFile, uint16_t index, uint8_t oflag)SdBaseFile [protected]
    open(SdBaseFile *dirFile, const char *path, uint8_t oflag)SdBaseFile [protected]
    open(const char *path, uint8_t oflag=O_READ)SdBaseFile [protected]
    openmode typedefios_base
    openNext(SdBaseFile *dirFile, uint8_t oflag)SdBaseFile [protected]
    openRoot(SdVolume *vol)SdBaseFile [protected]
    operator const void *() const ios [inline]
    operator!() const ios [inline]
    outios_base [static]
    peek()SdBaseFile [protected]
    pos_type typedefios_base
    precision() const ios_base [inline]
    precision(unsigned int n)ios_base [inline]
    printFatDate(uint16_t fatDate)SdBaseFile [protected, static]
    printFatDate(Print *pr, uint16_t fatDate)SdBaseFile [protected, static]
    printFatTime(uint16_t fatTime)SdBaseFile [protected, static]
    printFatTime(Print *pr, uint16_t fatTime)SdBaseFile [protected, static]
    printName()SdBaseFile [protected]
    rdstate() const ios [inline]
    read()SdBaseFile [protected]
    read(void *buf, uint16_t nbyte)SdBaseFile [protected]
    readDir(dir_t *dir)SdBaseFile [protected]
    remove(SdBaseFile *dirFile, const char *path)SdBaseFile [protected, static]
    remove()SdBaseFile [protected]
    rename(SdBaseFile *dirFile, const char *newPath)SdBaseFile [protected]
    rewind()SdBaseFile [inline, protected]
    rightios_base [static]
    rmdir()SdBaseFile [protected]
    rmRfStar()SdBaseFile [protected]
    SdBaseFile()SdBaseFile [inline, protected]
    SdBaseFile(const char *path, uint8_t oflag)SdBaseFile [protected]
    seekCur(int32_t offset)SdBaseFile [inline, protected]
    seekdir enum nameios_base
    seekEnd(int32_t offset=0)SdBaseFile [inline, protected]
    seekSet(uint32_t pos)SdBaseFile [protected]
    setf(fmtflags fl)ios_base [inline]
    setf(fmtflags fl, fmtflags mask)ios_base [inline]
    setpos(fpos_t *pos)SdBaseFile [protected]
    setstate(iostate state)ios [inline]
    showbaseios_base [static]
    showpointios_base [static]
    showposios_base [static]
    skipwsios_base [static]
    streamsize typedefios_base
    sync()SdBaseFile [protected]
    timestamp(SdBaseFile *file)SdBaseFile [protected]
    timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)SdBaseFile [protected]
    truncios_base [static]
    truncate(uint32_t size)SdBaseFile [protected]
    type() const SdBaseFile [inline, protected]
    unsetf(fmtflags fl)ios_base [inline]
    uppercaseios_base [static]
    volume() const SdBaseFile [inline, protected]
    width()ios_base [inline]
    width(unsigned n)ios_base [inline]
    write(const void *buf, uint16_t nbyte)SdBaseFile [protected]
    writeErrorSdBaseFile [protected]
    ~SdBaseFile() (defined in SdBaseFile)SdBaseFile [inline, protected]
    + + + diff --git a/libs/SdFatBeta20120108/html/class_sd_stream_base.html b/libs/SdFatBeta20120108/html/class_sd_stream_base.html new file mode 100644 index 0000000..9dca56b --- /dev/null +++ b/libs/SdFatBeta20120108/html/class_sd_stream_base.html @@ -0,0 +1,2652 @@ + + + + +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]
    + +

    List of all members.

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

    +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 (unsigned int n)
    int precision () const
    iostate rdstate () const
    fmtflags setf (fmtflags fl)
    fmtflags setf (fmtflags fl, fmtflags mask)
    void setstate (iostate state)
    void unsetf (fmtflags fl)
    unsigned width (unsigned n)
    unsigned width ()

    +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

    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 (fpos_t *pos)
    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, const char *path, uint8_t oflag)
    bool open (SdBaseFile *dirFile, uint16_t index, 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 printName ()
    int16_t read ()
    int16_t read (void *buf, uint16_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 (fpos_t *pos)
    bool sync ()
    bool timestamp (uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
    bool timestamp (SdBaseFile *file)
    bool truncate (uint32_t size)
    uint8_t type () const
    SdVolumevolume () const
    int16_t write (const void *buf, uint16_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 (Print *pr, uint16_t fatTime)
    static void printFatTime (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

    + +
    +
    + + + + + + + +
    bool ios::bad () const [inline, inherited]
    +
    +
    +
    Returns:
    true if bad bit is set else false.
    + +
    +
    + +
    +
    + + + + + + + + +
    void ios::clear (iostate state = goodbit) [inline, inherited]
    +
    +
    +

    Clear iostate bits.

    +
    Parameters:
    + + +
    [in]stateThe flags you want to set after clearing all flags.
    +
    +
    + +

    Reimplemented in fstream, and ofstream.

    + +
    +
    + +
    +
    + + + + + + + +
    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.
    + +

    Reimplemented in fstream, ifstream, and ofstream.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    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 [inline, inherited]
    +
    +
    +
    Returns:
    The current cluster number for a file or directory.
    + +
    +
    + +
    +
    + + + + + + + +
    uint32_t SdBaseFile::curPosition () const [inline, inherited]
    +
    +
    +
    Returns:
    The current position for a file or directory.
    + +
    +
    + +
    +
    + + + + + + + +
    static SdBaseFile* SdBaseFile::cwd () [inline, static, inherited]
    +
    +
    +
    Returns:
    Current working directory
    + +
    +
    + +
    +
    + + + + + + + + +
    static void SdBaseFile::dateTimeCallback (void(*)(uint16_t *date, uint16_t *time) dateTime) [inline, static, inherited]
    +
    +
    +

    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 () [inline, static, inherited]
    +
    +
    +

    Cancel the date/time callback function.

    + +
    +
    + +
    +
    + + + + + + + + +
    bool SdBaseFile::dirEntry (dir_tdir) [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_tdir,
    char * name 
    ) [static, inherited]
    +
    +
    +

    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 [inline, inherited]
    +
    +
    +
    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 [inline, inherited]
    +
    +
    +
    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 [inline, inherited]
    +
    +
    +
    Returns:
    The total number of bytes in a file or directory.
    + +
    +
    + +
    +
    + + + + + + + +
    char ios_base::fill () [inline, inherited]
    +
    +
    +
    Returns:
    fill character
    + +
    +
    + +
    +
    + + + + + + + + +
    char ios_base::fill (char c) [inline, inherited]
    +
    +
    +

    Set fill character

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

    set format flags

    +
    Parameters:
    + + +
    [in]flnew flag
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + +
    uint8_t ios_base::flagsToBase () [inline, protected, inherited]
    +
    +
    +
    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 (fpos_tpos) [inherited]
    +
    +
    +

    get position for streams

    +
    Parameters:
    + + +
    [out]posstruct to receive position
    +
    +
    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::good () const [inline, inherited]
    +
    +
    +
    Returns:
    True if no iostate flags are set else false.
    + +
    +
    + +
    +
    + + + + + + + +
    bool SdBaseFile::isDir () const [inline, inherited]
    +
    +
    +
    Returns:
    True if this is a directory else false.
    + +
    +
    + +
    +
    + + + + + + + +
    bool SdBaseFile::isFile () const [inline, inherited]
    +
    +
    +
    Returns:
    True if this is a normal file else false.
    + +
    +
    + +
    +
    + + + + + + + +
    bool SdBaseFile::isOpen () const [inline, inherited]
    +
    +
    +
    Returns:
    True if this is an open file/directory else false.
    + +
    +
    + +
    +
    + + + + + + + +
    bool SdBaseFile::isRoot () const [inline, inherited]
    +
    +
    +
    Returns:
    True if this is the root directory.
    + +
    +
    + +
    +
    + + + + + + + +
    bool SdBaseFile::isSubDir () const [inline, inherited]
    +
    +
    +
    Returns:
    True if this is a subdirectory else false.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void SdBaseFile::ls (Printpr,
    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.
    + +

    Reimplemented in fstream, ifstream, and ofstream.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    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 [inline, inherited]
    +
    +
    +
    Returns:
    null pointer if fail() is true.
    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::operator! () const [inline, inherited]
    +
    +
    +
    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 (unsigned int n) [inline, inherited]
    +
    +
    +

    set precision

    +
    Parameters:
    + + +
    [in]nnew precision
    +
    +
    +
    Returns:
    old precision
    + +
    +
    + +
    +
    + + + + + + + +
    int ios_base::precision () const [inline, inherited]
    +
    +
    +
    Returns:
    precision
    + +
    +
    + +
    +
    + + + + + + + + +
    void SdBaseFile::printFatDate (uint16_t fatDate) [static, inherited]
    +
    +
    +

    Print a directory date field to stdOut.

    +

    Format is yyyy-mm-dd.

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

    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, inherited]
    +
    +
    +

    Print a directory time field to stdOut.

    +

    Format is hh:mm:ss.

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

    Print a directory time field.

    +

    Format is hh:mm:ss.

    +
    Parameters:
    + + + +
    [in]prPrint stream for output.
    [in]fatTimeThe time field from a directory entry.
    +
    +
    + +
    +
    + +
    +
    + + + + + + + +
    bool 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.
    + +
    +
    + +
    +
    + + + + + + + +
    iostate ios::rdstate () const [inline, inherited]
    +
    +
    +
    Returns:
    The iostate flags for this file.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int16_t SdBaseFile::read (void * buf,
    uint16_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.
    + +
    +
    + +
    +
    + + + + + + + +
    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.
    + +
    +
    + +
    +
    + + + + + + + + +
    int8_t SdBaseFile::readDir (dir_tdir) [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 
    ) [static, inherited]
    +
    +
    +

    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 () [inline, inherited]
    +
    +
    +

    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) [inline, inherited]
    +
    +
    +

    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, inherited]
    +
    +
    +

    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,
    fmtflags mask 
    ) [inline, inherited]
    +
    +
    +

    modify format flags

    +
    Parameters:
    + + + +
    [in]maskflags to be removed
    [in]flflags to be set after mask bits have been cleared
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + + +
    fmtflags ios_base::setf (fmtflags fl) [inline, inherited]
    +
    +
    +

    set format flags

    +
    Parameters:
    + + +
    [in]flnew flags to be or'ed in
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + + +
    void SdBaseFile::setpos (fpos_tpos) [inherited]
    +
    +
    +

    set position for streams

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

    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 [inline, inherited]
    +
    +
    +

    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) [inline, inherited]
    +
    +
    +

    clear format flags

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

    set width

    +
    Parameters:
    + + +
    [in]nnew width
    +
    +
    +
    Returns:
    old width
    + +
    +
    + +
    +
    + + + + + + + +
    unsigned ios_base::width () [inline, inherited]
    +
    +
    +
    Returns:
    width
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int16_t SdBaseFile::write (const void * buf,
    uint16_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.
    + +

    Reimplemented in SdFile.

    + +
    +
    +

    Member Data Documentation

    + +
    +
    + + + + +
    const fmtflags ios_base::adjustfield = left | right | internal [static, inherited]
    +
    +
    +

    mask for adjustfield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::app = 0X4 [static, inherited]
    +
    +
    +

    seek to end before each write

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::ate = 0X8 [static, inherited]
    +
    +
    +

    open and seek to end immediately after opening

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::badbit = 0X01 [static, inherited]
    +
    +
    +

    iostate bad bit for a nonrecoverable error.

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::basefield = dec | hex | oct [static, inherited]
    +
    +
    +

    mask for basefield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::binary = 0X10 [static, inherited]
    +
    +
    +

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

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::boolalpha = 0x0100 [static, inherited]
    +
    +
    +

    use strings true/false for bool

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::dec = 0x0008 [static, inherited]
    +
    +
    +

    base 10 flag

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::eofbit = 0x02 [static, inherited]
    +
    +
    +

    iostate bit for end of file reached

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::failbit = 0X04 [static, inherited]
    +
    +
    +

    iostate fail bit for nonfatal error

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::goodbit = 0x00 [static, inherited]
    +
    +
    +

    iostate for no flags

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::hex = 0x0010 [static, inherited]
    +
    +
    +

    base 16 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::in = 0X20 [static, inherited]
    +
    +
    +

    open for input

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::internal = 0x0004 [static, inherited]
    +
    +
    +

    fill between sign/base prefix and number

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::left = 0x0001 [static, inherited]
    +
    +
    +

    left adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::oct = 0x0020 [static, inherited]
    +
    +
    +

    base 8 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::out = 0X40 [static, inherited]
    +
    +
    +

    open for output

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::right = 0x0002 [static, inherited]
    +
    +
    +

    right adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showbase = 0x0200 [static, inherited]
    +
    +
    +

    use prefix 0X for hex and 0 for oct

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpoint = 0x0400 [static, inherited]
    +
    +
    +

    always show '.' for floating numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpos = 0x0800 [static, inherited]
    +
    +
    +

    show + sign for nonnegative numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::skipws = 0x1000 [static, inherited]
    +
    +
    +

    skip initial white space

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::trunc = 0X80 [static, inherited]
    +
    +
    +

    truncate an existing stream when opening

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::uppercase = 0x4000 [static, inherited]
    +
    +
    +

    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/libs/SdFatBeta20120108/html/class_sd_stream_base__coll__graph.png b/libs/SdFatBeta20120108/html/class_sd_stream_base__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..03761a3ca0042e3026af49b31b1fd285a8345d88 GIT binary patch literal 17600 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 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/class_sd_stream_base__inherit__graph.png b/libs/SdFatBeta20120108/html/class_sd_stream_base__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..fa32e2ba61fb8d2a35b22f774db2994a593f4204 GIT binary patch literal 6828 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 + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    SdVolume Member List
    +
    +
    +This is the complete list of members for SdVolume, including all inherited members. + + + + + + + + + + + + + + + + + + +
    blocksPerCluster() const SdVolume [inline]
    blocksPerFat() const SdVolume [inline]
    cacheClear()SdVolume [inline]
    clusterCount() const SdVolume [inline]
    clusterSizeShift() const SdVolume [inline]
    dataStartBlock() const SdVolume [inline]
    dbgFat(uint32_t n, uint32_t *v)SdVolume [inline]
    fatCount() const SdVolume [inline]
    fatStartBlock() const SdVolume [inline]
    fatType() const SdVolume [inline]
    freeClusterCount()SdVolume
    init(Sd2Card *dev)SdVolume [inline]
    init(Sd2Card *dev, uint8_t part)SdVolume
    rootDirEntryCount() const SdVolume [inline]
    rootDirStart() const SdVolume [inline]
    SdBaseFile (defined in SdVolume)SdVolume [friend]
    sdCard()SdVolume [inline]
    SdVolume()SdVolume [inline]
    + + + diff --git a/libs/SdFatBeta20120108/html/class_sd_volume.html b/libs/SdFatBeta20120108/html/class_sd_volume.html new file mode 100644 index 0000000..386fe2e --- /dev/null +++ b/libs/SdFatBeta20120108/html/class_sd_volume.html @@ -0,0 +1,436 @@ + + + + +SdFat: SdVolume Class Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    + +
    +
    SdVolume Class Reference
    +
    +
    + +

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

    + +

    #include <SdVolume.h>

    +
    +Collaboration diagram for SdVolume:
    +
    +
    Collaboration graph
    + + +
    [legend]
    + +

    List of all members.

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

    +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, uint8_t part)
    bool init (Sd2Card *dev)
    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.
    + +
    +
    +
    The documentation for this class was generated from the following files:
      +
    • Arduino/libraries/SdFat/SdVolume.h
    • +
    • Arduino/libraries/SdFat/SdVolume.cpp
    • +
    +
    + + + diff --git a/libs/SdFatBeta20120108/html/class_sd_volume__coll__graph.png b/libs/SdFatBeta20120108/html/class_sd_volume__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..d4ed1b6b31f9ac43855c114b3980f4526fa665ae GIT binary patch literal 12054 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 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/classes.html b/libs/SdFatBeta20120108/html/classes.html new file mode 100644 index 0000000..4bedcf4 --- /dev/null +++ b/libs/SdFatBeta20120108/html/classes.html @@ -0,0 +1,60 @@ + + + + +SdFat: Class Index + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    Class Index
    +
    +
    +
    A | C | D | F | I | M | O | P | S
    + +
      A  
    +
    fat32_boot   ios   ofstream   SdBaseFile   
    ArduinoInStream   fat32_fsinfo   ios_base   ostream   SdFat   
    ArduinoOutStream   fat_boot   iostream   
      P  
    +
    SdFile   
      C  
    +
    fpos_t   istream   partitionTable   SdStreamBase   
    cache_t   fstream   
      M  
    +
    pgm   SdVolume   
      D  
    +
      I  
    +
    masterBootRecord   Print   setfill   
    directoryEntry   ibufstream   
      O  
    +
      S  
    +
    setprecision   
      F  
    +
    ifstream   obufstream   Sd2Card   setw   
    A | C | D | F | I | M | O | P | S
    +
    + + + diff --git a/libs/SdFatBeta20120108/html/classfstream-members.html b/libs/SdFatBeta20120108/html/classfstream-members.html new file mode 100644 index 0000000..837ff92 --- /dev/null +++ b/libs/SdFatBeta20120108/html/classfstream-members.html @@ -0,0 +1,222 @@ + + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    fstream Member List
    +
    +
    +This is the complete list of members for fstream, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    adjustfieldios_base [static]
    appios_base [static]
    ateios_base [static]
    bad() const ios [inline]
    badbitios_base [static]
    basefieldios_base [static]
    beg enum valueios_base
    binaryios_base [static]
    boolalphaios_base [static]
    clear(iostate state=goodbit)fstream [inline]
    close()fstream [inline]
    contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock)SdBaseFile [private]
    createContiguous(SdBaseFile *dirFile, const char *path, uint32_t size)SdBaseFile [private]
    cur enum valueios_base
    curCluster() const SdBaseFile [inline, private]
    curPosition() const SdBaseFile [inline, private]
    cwd()SdBaseFile [inline, private, static]
    dateTimeCallback(void(*dateTime)(uint16_t *date, uint16_t *time))SdBaseFile [inline, private, static]
    dateTimeCallbackCancel()SdBaseFile [inline, private, static]
    decios_base [static]
    dirEntry(dir_t *dir)SdBaseFile [private]
    dirName(const dir_t &dir, char *name)SdBaseFile [private, static]
    end enum valueios_base
    eof() const ios [inline]
    eofbitios_base [static]
    exists(const char *name)SdBaseFile [private]
    fail() const ios [inline]
    failbitios_base [static]
    fgets(char *str, int16_t num, char *delim=0)SdBaseFile [private]
    fileSize() const SdBaseFile [inline, private]
    fill()ios_base [inline]
    fill(char c)ios_base [inline]
    firstCluster() const SdBaseFile [inline, private]
    flags() const ios_base [inline]
    flags(fmtflags fl)ios_base [inline]
    flagsToBase()ios_base [inline, protected]
    flush()ostream [inline]
    fmtflags typedefios_base
    fstream() (defined in fstream)fstream [inline]
    fstream(const char *path, openmode mode=in|out)fstream [inline, explicit]
    gcount() const istream [inline]
    get()istream
    get(char &ch)istream
    get(char *str, streamsize n, char delim= '\n')istream
    getFilename(char *name)SdBaseFile [private]
    getline(char *str, streamsize count, char delim= '\n')istream
    getpos(fpos_t *pos)SdBaseFile [private]
    good() const ios [inline]
    goodbitios_base [static]
    hexios_base [static]
    ignore(streamsize n=1, int delim=-1)istream
    inios_base [static]
    internalios_base [static]
    ios()ios [inline]
    ios_base() (defined in ios_base)ios_base [inline]
    iostate typedefios_base
    is_open()fstream [inline]
    isDir() const SdBaseFile [inline, private]
    isFile() const SdBaseFile [inline, private]
    isOpen() const SdBaseFile [inline, private]
    isRoot() const SdBaseFile [inline, private]
    isSubDir() const SdBaseFile [inline, private]
    istream() (defined in istream)istream [inline]
    leftios_base [static]
    ls(Print *pr, uint8_t flags=0, uint8_t indent=0)SdBaseFile [private]
    ls(uint8_t flags=0)SdBaseFile [private]
    mkdir(SdBaseFile *dir, const char *path, bool pFlag=true)SdBaseFile [private]
    octios_base [static]
    off_type typedefios_base
    open(const char *path, openmode mode=in|out)fstream [inline]
    SdStreamBase::open(SdBaseFile *dirFile, uint16_t index, uint8_t oflag)SdBaseFile [private]
    SdStreamBase::open(SdBaseFile *dirFile, const char *path, uint8_t oflag)SdBaseFile [private]
    openmode typedefios_base
    openNext(SdBaseFile *dirFile, uint8_t oflag)SdBaseFile [private]
    openRoot(SdVolume *vol)SdBaseFile [private]
    operator const void *() const ios [inline]
    operator!() const ios [inline]
    operator<<(ostream &(*pf)(ostream &str))ostream [inline]
    operator<<(ios_base &(*pf)(ios_base &str))ostream [inline]
    operator<<(bool arg)ostream [inline]
    operator<<(const char *arg)ostream [inline]
    operator<<(const signed char *arg)ostream [inline]
    operator<<(const unsigned char *arg)ostream [inline]
    operator<<(char arg)ostream [inline]
    operator<<(signed char arg)ostream [inline]
    operator<<(unsigned char arg)ostream [inline]
    operator<<(double arg)ostream [inline]
    operator<<(int16_t arg)ostream [inline]
    operator<<(uint16_t arg)ostream [inline]
    operator<<(int32_t arg)ostream [inline]
    operator<<(uint32_t arg)ostream [inline]
    operator<<(const void *arg)ostream [inline]
    operator<<(pgm arg)ostream [inline]
    operator>>(istream &(*pf)(istream &str))istream [inline]
    operator>>(ios_base &(*pf)(ios_base &str))istream [inline]
    operator>>(ios &(*pf)(ios &str))istream [inline]
    operator>>(char *str)istream [inline]
    operator>>(char &ch)istream [inline]
    operator>>(signed char *str)istream [inline]
    operator>>(signed char &ch)istream [inline]
    operator>>(unsigned char *str)istream [inline]
    operator>>(unsigned char &ch)istream [inline]
    operator>>(bool &arg)istream [inline]
    operator>>(short &arg)istream [inline]
    operator>>(unsigned short &arg)istream [inline]
    operator>>(int16_t &arg)istream [inline]
    operator>>(uint16_t &arg)istream [inline]
    operator>>(int32_t &arg)istream [inline]
    operator>>(uint32_t &arg)istream [inline]
    operator>>(double &arg)istream [inline]
    operator>>(float &arg)istream [inline]
    operator>>(void *&arg)istream [inline]
    ostream() (defined in ostream)ostream [inline]
    outios_base [static]
    iostream::peek()istream
    SdStreamBase::peek()SdBaseFile [private]
    pos_type typedefios_base
    precision() const ios_base [inline]
    precision(unsigned int n)ios_base [inline]
    printFatDate(uint16_t fatDate)SdBaseFile [private, static]
    printFatDate(Print *pr, uint16_t fatDate)SdBaseFile [private, static]
    printFatTime(uint16_t fatTime)SdBaseFile [private, static]
    printFatTime(Print *pr, uint16_t fatTime)SdBaseFile [private, static]
    printName()SdBaseFile [private]
    put(char ch)ostream [inline]
    rdstate() const ios [inline]
    read()SdBaseFile [private]
    read(void *buf, uint16_t nbyte)SdBaseFile [private]
    readDir(dir_t *dir)SdBaseFile [private]
    remove(SdBaseFile *dirFile, const char *path)SdBaseFile [private, static]
    remove()SdBaseFile [private]
    rename(SdBaseFile *dirFile, const char *newPath)SdBaseFile [private]
    rewind()SdBaseFile [inline, private]
    rightios_base [static]
    rmdir()SdBaseFile [private]
    rmRfStar()SdBaseFile [private]
    SdBaseFile()SdBaseFile [inline, private]
    SdBaseFile(const char *path, uint8_t oflag)SdBaseFile [private]
    seekCur(int32_t offset)SdBaseFile [inline, private]
    seekdir enum nameios_base
    seekEnd(int32_t offset=0)SdBaseFile [inline, private]
    seekg(pos_type pos)istream [inline]
    seekg(off_type off, seekdir way)istream [inline]
    seekp(pos_type pos)ostream [inline]
    seekp(off_type off, seekdir way)ostream [inline]
    seekSet(uint32_t pos)SdBaseFile [private]
    setf(fmtflags fl)ios_base [inline]
    setf(fmtflags fl, fmtflags mask)ios_base [inline]
    setpos(fpos_t *pos)SdBaseFile [private]
    setstate(iostate state)ios [inline]
    showbaseios_base [static]
    showpointios_base [static]
    showposios_base [static]
    skipWhite()istream
    skipwsios_base [static]
    streamsize typedefios_base
    sync()SdBaseFile [private]
    tellg()istream [inline]
    tellp()ostream [inline]
    timestamp(SdBaseFile *file)SdBaseFile [private]
    timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)SdBaseFile [private]
    truncios_base [static]
    truncate(uint32_t size)SdBaseFile [private]
    type() const SdBaseFile [inline, private]
    unsetf(fmtflags fl)ios_base [inline]
    uppercaseios_base [static]
    volume() const SdBaseFile [inline, private]
    width()ios_base [inline]
    width(unsigned n)ios_base [inline]
    write(const void *buf, uint16_t nbyte)SdBaseFile [private]
    writeErrorSdBaseFile [private]
    ~fstream() (defined in fstream)fstream [inline]
    ~SdBaseFile() (defined in SdBaseFile)SdBaseFile [inline, private]
    + + + diff --git a/libs/SdFatBeta20120108/html/classfstream.html b/libs/SdFatBeta20120108/html/classfstream.html new file mode 100644 index 0000000..06a83b6 --- /dev/null +++ b/libs/SdFatBeta20120108/html/classfstream.html @@ -0,0 +1,2568 @@ + + + + +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]
    + +

    List of all members.

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

    +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 (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<< (signed char arg)
    ostreamoperator<< (unsigned char arg)
    ostreamoperator<< (double arg)
    ostreamoperator<< (uint16_t arg)
    ostreamoperator<< (int32_t arg)
    ostreamoperator<< (uint32_t arg)
    ostreamoperator<< (pgm arg)
    ostreamoperator<< (int16_t arg)
    ostreamoperator<< (const void *arg)
    ostreamoperator<< (bool arg)
    ostreamoperator<< (char arg)
    ostreamoperator<< (ostream &(*pf)(ostream &str))
    ostreamoperator<< (ios_base &(*pf)(ios_base &str))
    ostreamoperator<< (const char *arg)
    ostreamoperator<< (const signed char *arg)
    ostreamoperator<< (const unsigned char *arg)
    istreamoperator>> (ios_base &(*pf)(ios_base &str))
    istreamoperator>> (unsigned short &arg)
    istreamoperator>> (bool &arg)
    istreamoperator>> (signed char &ch)
    istreamoperator>> (unsigned char *str)
    istreamoperator>> (short &arg)
    istreamoperator>> (unsigned char &ch)
    istreamoperator>> (ios &(*pf)(ios &str))
    istreamoperator>> (int16_t &arg)
    istreamoperator>> (uint16_t &arg)
    istreamoperator>> (char *str)
    istreamoperator>> (int32_t &arg)
    istreamoperator>> (signed char *str)
    istreamoperator>> (void *&arg)
    istreamoperator>> (uint32_t &arg)
    istreamoperator>> (istream &(*pf)(istream &str))
    istreamoperator>> (double &arg)
    istreamoperator>> (float &arg)
    istreamoperator>> (char &ch)
    int peek ()
    int precision () const
    int precision (unsigned int n)
    ostreamput (char ch)
    iostate rdstate () const
    istreamseekg (off_type off, seekdir way)
    istreamseekg (pos_type pos)
    ostreamseekp (off_type off, seekdir way)
    ostreamseekp (pos_type pos)
    fmtflags setf (fmtflags fl, fmtflags mask)
    fmtflags setf (fmtflags fl)
    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

    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 (fpos_t *pos)
    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 printName ()
    int16_t read ()
    int16_t read (void *buf, uint16_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 (fpos_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
    int16_t write (const void *buf, uint16_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 (Print *pr, uint16_t fatTime)
    static void printFatTime (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 (const char * path,
    openmode mode = in | out 
    ) [inline, explicit]
    +
    +
    +

    Constructor with open

    +
    Parameters:
    + + + +
    [in]pathpath to open
    [in]modeopen mode
    +
    +
    + +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + +
    bool ios::bad () const [inline, inherited]
    +
    +
    +
    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
    +
    +
    + +

    Reimplemented from ios.

    + +
    +
    + +
    +
    + + + + + + + +
    void fstream::close () [inline]
    +
    +
    +

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

    + +

    Reimplemented from SdBaseFile.

    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::eof () const [inline, inherited]
    +
    +
    +
    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, inherited]
    +
    +
    +
    Returns:
    true if any iostate bit other than eof are set else false.
    + +
    +
    + +
    +
    + + + + + + + +
    char ios_base::fill () [inline, inherited]
    +
    +
    +
    Returns:
    fill character
    + +
    +
    + +
    +
    + + + + + + + + +
    char ios_base::fill (char c) [inline, inherited]
    +
    +
    +

    Set fill character

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

    set format flags

    +
    Parameters:
    + + +
    [in]flnew flag
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + +
    uint8_t ios_base::flagsToBase () [inline, protected, inherited]
    +
    +
    +
    Returns:
    current number base
    + +
    +
    + +
    +
    + + + + + + + +
    ostream& ostream::flush () [inline, inherited]
    +
    +
    +

    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 [inline, inherited]
    +
    +
    +
    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 [inline, inherited]
    +
    +
    +
    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.

    + +

    Reimplemented from SdBaseFile.

    + +
    +
    + +
    +
    + + + + + + + +
    ios::operator const void * () const [inline, inherited]
    +
    +
    +
    Returns:
    null pointer if fail() is true.
    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::operator! () const [inline, inherited]
    +
    +
    +
    Returns:
    true if fail() else false.
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (double arg) [inline, inherited]
    +
    +
    +

    Output double

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (int16_t arg) [inline, inherited]
    +
    +
    +

    Output signed int

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (uint16_t arg) [inline, inherited]
    +
    +
    +

    Output unsigned int

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (uint32_t arg) [inline, inherited]
    +
    +
    +

    Output uint32_t

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

    Output pointer

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

    Output a string from flash

    +
    Parameters:
    + + +
    [in]argpgm struct pointing to string
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (const signed char * arg) [inline, inherited]
    +
    +
    +

    Output string

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

    Output character

    +
    Parameters:
    + + +
    [in]argcharacter to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (int32_t arg) [inline, inherited]
    +
    +
    +

    Output signed long

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (ostream &(*)(ostream &str) pf) [inline, inherited]
    +
    +
    +

    call manipulator

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

    call manipulator

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

    Output bool

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

    Output string

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

    Output string

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

    Output character

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

    Output character

    +
    Parameters:
    + + +
    [in]argcharacter to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (bool & arg) [inline, inherited]
    +
    +
    +

    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>> (unsigned short & arg) [inline, inherited]
    +
    +
    +

    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>> (ios &(*)(ios &str) pf) [inline, inherited]
    +
    +
    +

    call manipulator

    +
    Parameters:
    + + +
    [in]pffunction to call
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (char & ch) [inline, inherited]
    +
    +
    +

    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>> (uint16_t & arg) [inline, inherited]
    +
    +
    +

    Extract a value of type uint16_t.

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

    Extract a value of type int32_t.

    +
    Parameters:
    + + +
    [out]arglocation to store the value.
    +
    +
    +
    Returns:
    Is always *this. Failure is indicated by the state of *this.
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (char * str) [inline, inherited]
    +
    +
    +

    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>> (istream &(*)(istream &str) pf) [inline, inherited]
    +
    +
    +

    call manipulator

    +
    Parameters:
    + + +
    [in]pffunction to call
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (uint32_t & arg) [inline, inherited]
    +
    +
    +

    Extract a value of type uint32_t.

    +
    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, inherited]
    +
    +
    +

    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>> (int16_t & arg) [inline, inherited]
    +
    +
    +

    Extract a value of type int16_t.

    +
    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, inherited]
    +
    +
    +

    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, inherited]
    +
    +
    +

    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.
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (unsigned char * str) [inline, inherited]
    +
    +
    +

    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>> (ios_base &(*)(ios_base &str) pf) [inline, inherited]
    +
    +
    +

    call manipulator

    +
    Parameters:
    + + +
    [in]pffunction to call
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (unsigned char & ch) [inline, inherited]
    +
    +
    +

    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>> (short & arg) [inline, inherited]
    +
    +
    +

    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>> (signed char & ch) [inline, inherited]
    +
    +
    +

    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, inherited]
    +
    +
    +

    Extract a character string

    +
    Parameters:
    + + +
    [out]strlocation to store the string.
    +
    +
    +
    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 [inline, inherited]
    +
    +
    +
    Returns:
    precision
    + +
    +
    + +
    +
    + + + + + + + + +
    int ios_base::precision (unsigned int n) [inline, inherited]
    +
    +
    +

    set precision

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

    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 [inline, inherited]
    +
    +
    +
    Returns:
    The iostate flags for this file.
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::seekg (pos_type pos) [inline, inherited]
    +
    +
    +

    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, inherited]
    +
    +
    +

    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) [inline, inherited]
    +
    +
    +

    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, inherited]
    +
    +
    +

    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) [inline, inherited]
    +
    +
    +

    set format flags

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

    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, inherited]
    +
    +
    +

    Set iostate bits.

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

    used to implement ws()

    + +
    +
    + +
    +
    + + + + + + + +
    pos_type istream::tellg () [inline, inherited]
    +
    +
    +
    Returns:
    the stream position
    + +
    +
    + +
    +
    + + + + + + + +
    pos_type ostream::tellp () [inline, inherited]
    +
    +
    +
    Returns:
    the stream position
    + +
    +
    + +
    +
    + + + + + + + + +
    void ios_base::unsetf (fmtflags fl) [inline, inherited]
    +
    +
    +

    clear format flags

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

    set width

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

    Member Data Documentation

    + +
    +
    + + + + +
    const fmtflags ios_base::adjustfield = left | right | internal [static, inherited]
    +
    +
    +

    mask for adjustfield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::app = 0X4 [static, inherited]
    +
    +
    +

    seek to end before each write

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::ate = 0X8 [static, inherited]
    +
    +
    +

    open and seek to end immediately after opening

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::badbit = 0X01 [static, inherited]
    +
    +
    +

    iostate bad bit for a nonrecoverable error.

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::basefield = dec | hex | oct [static, inherited]
    +
    +
    +

    mask for basefield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::binary = 0X10 [static, inherited]
    +
    +
    +

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

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::boolalpha = 0x0100 [static, inherited]
    +
    +
    +

    use strings true/false for bool

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::dec = 0x0008 [static, inherited]
    +
    +
    +

    base 10 flag

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::eofbit = 0x02 [static, inherited]
    +
    +
    +

    iostate bit for end of file reached

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::failbit = 0X04 [static, inherited]
    +
    +
    +

    iostate fail bit for nonfatal error

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::goodbit = 0x00 [static, inherited]
    +
    +
    +

    iostate for no flags

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::hex = 0x0010 [static, inherited]
    +
    +
    +

    base 16 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::in = 0X20 [static, inherited]
    +
    +
    +

    open for input

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::internal = 0x0004 [static, inherited]
    +
    +
    +

    fill between sign/base prefix and number

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::left = 0x0001 [static, inherited]
    +
    +
    +

    left adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::oct = 0x0020 [static, inherited]
    +
    +
    +

    base 8 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::out = 0X40 [static, inherited]
    +
    +
    +

    open for output

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::right = 0x0002 [static, inherited]
    +
    +
    +

    right adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showbase = 0x0200 [static, inherited]
    +
    +
    +

    use prefix 0X for hex and 0 for oct

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpoint = 0x0400 [static, inherited]
    +
    +
    +

    always show '.' for floating numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpos = 0x0800 [static, inherited]
    +
    +
    +

    show + sign for nonnegative numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::skipws = 0x1000 [static, inherited]
    +
    +
    +

    skip initial white space

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::trunc = 0X80 [static, inherited]
    +
    +
    +

    truncate an existing stream when opening

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::uppercase = 0x4000 [static, inherited]
    +
    +
    +

    use uppercase letters in number representations

    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + diff --git a/libs/SdFatBeta20120108/html/classfstream__coll__graph.png b/libs/SdFatBeta20120108/html/classfstream__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce48aa5eaa16a0b9eda1a7111647d23bab2a838 GIT binary patch literal 25578 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 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/classfstream__inherit__graph.png b/libs/SdFatBeta20120108/html/classfstream__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..972da52644dfd53faee5d8721f09258e4e148c97 GIT binary patch literal 10693 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 z + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    ibufstream Member List
    +
    +
    +This is the complete list of members for ibufstream, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    adjustfieldios_base [static]
    appios_base [static]
    ateios_base [static]
    bad() const ios [inline]
    badbitios_base [static]
    basefieldios_base [static]
    beg enum valueios_base
    binaryios_base [static]
    boolalphaios_base [static]
    clear(iostate state=goodbit)ios [inline]
    cur enum valueios_base
    decios_base [static]
    end enum valueios_base
    eof() const ios [inline]
    eofbitios_base [static]
    fail() const ios [inline]
    failbitios_base [static]
    fill()ios_base [inline]
    fill(char c)ios_base [inline]
    flags() const ios_base [inline]
    flags(fmtflags fl)ios_base [inline]
    flagsToBase()ios_base [inline, protected]
    fmtflags typedefios_base
    gcount() const istream [inline]
    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 ios [inline]
    goodbitios_base [static]
    hexios_base [static]
    ibufstream()ibufstream [inline]
    ibufstream(const char *str)ibufstream [inline, explicit]
    ignore(streamsize n=1, int delim=-1)istream
    inios_base [static]
    init(const char *str)ibufstream [inline]
    internalios_base [static]
    ios()ios [inline]
    ios_base() (defined in ios_base)ios_base [inline]
    iostate typedefios_base
    istream() (defined in istream)istream [inline]
    leftios_base [static]
    octios_base [static]
    off_type typedefios_base
    openmode typedefios_base
    operator const void *() const ios [inline]
    operator!() const ios [inline]
    operator>>(istream &(*pf)(istream &str))istream [inline]
    operator>>(ios_base &(*pf)(ios_base &str))istream [inline]
    operator>>(ios &(*pf)(ios &str))istream [inline]
    operator>>(char *str)istream [inline]
    operator>>(char &ch)istream [inline]
    operator>>(signed char *str)istream [inline]
    operator>>(signed char &ch)istream [inline]
    operator>>(unsigned char *str)istream [inline]
    operator>>(unsigned char &ch)istream [inline]
    operator>>(bool &arg)istream [inline]
    operator>>(short &arg)istream [inline]
    operator>>(unsigned short &arg)istream [inline]
    operator>>(int16_t &arg)istream [inline]
    operator>>(uint16_t &arg)istream [inline]
    operator>>(int32_t &arg)istream [inline]
    operator>>(uint32_t &arg)istream [inline]
    operator>>(double &arg)istream [inline]
    operator>>(float &arg)istream [inline]
    operator>>(void *&arg)istream [inline]
    outios_base [static]
    peek()istream
    pos_type typedefios_base
    precision() const ios_base [inline]
    precision(unsigned int n)ios_base [inline]
    rdstate() const ios [inline]
    rightios_base [static]
    seekdir enum nameios_base
    seekg(pos_type pos)istream [inline]
    seekg(off_type off, seekdir way)istream [inline]
    setf(fmtflags fl)ios_base [inline]
    setf(fmtflags fl, fmtflags mask)ios_base [inline]
    setstate(iostate state)ios [inline]
    showbaseios_base [static]
    showpointios_base [static]
    showposios_base [static]
    skipWhite()istream
    skipwsios_base [static]
    streamsize typedefios_base
    tellg()istream [inline]
    truncios_base [static]
    unsetf(fmtflags fl)ios_base [inline]
    uppercaseios_base [static]
    width()ios_base [inline]
    width(unsigned n)ios_base [inline]
    + + + diff --git a/libs/SdFatBeta20120108/html/classibufstream.html b/libs/SdFatBeta20120108/html/classibufstream.html new file mode 100644 index 0000000..750fb28 --- /dev/null +++ b/libs/SdFatBeta20120108/html/classibufstream.html @@ -0,0 +1,1911 @@ + + + + +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]
    + +

    List of all members.

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

    +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>> (char &ch)
    istreamoperator>> (int16_t &arg)
    istreamoperator>> (istream &(*pf)(istream &str))
    istreamoperator>> (uint16_t &arg)
    istreamoperator>> (signed char *str)
    istreamoperator>> (int32_t &arg)
    istreamoperator>> (uint32_t &arg)
    istreamoperator>> (double &arg)
    istreamoperator>> (signed char &ch)
    istreamoperator>> (float &arg)
    istreamoperator>> (void *&arg)
    istreamoperator>> (ios_base &(*pf)(ios_base &str))
    istreamoperator>> (unsigned char *str)
    istreamoperator>> (unsigned char &ch)
    istreamoperator>> (ios &(*pf)(ios &str))
    istreamoperator>> (bool &arg)
    istreamoperator>> (char *str)
    istreamoperator>> (short &arg)
    istreamoperator>> (unsigned short &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 mask)
    fmtflags setf (fmtflags fl)
    void setstate (iostate state)
    void skipWhite ()
    pos_type tellg ()
    void unsetf (fmtflags fl)
    unsigned width (unsigned n)
    unsigned width ()

    +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) [inline, explicit]
    +
    +
    +

    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 [inline, inherited]
    +
    +
    +
    Returns:
    true if bad bit is set else false.
    + +
    +
    + +
    +
    + + + + + + + + +
    void ios::clear (iostate state = goodbit) [inline, inherited]
    +
    +
    +

    Clear iostate bits.

    +
    Parameters:
    + + +
    [in]stateThe flags you want to set after clearing all flags.
    +
    +
    + +

    Reimplemented in fstream, and ofstream.

    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::eof () const [inline, inherited]
    +
    +
    +
    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, inherited]
    +
    +
    +
    Returns:
    true if any iostate bit other than eof are set else false.
    + +
    +
    + +
    +
    + + + + + + + +
    char ios_base::fill () [inline, inherited]
    +
    +
    +
    Returns:
    fill character
    + +
    +
    + +
    +
    + + + + + + + + +
    char ios_base::fill (char c) [inline, inherited]
    +
    +
    +

    Set fill character

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

    set format flags

    +
    Parameters:
    + + +
    [in]flnew flag
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + +
    uint8_t ios_base::flagsToBase () [inline, protected, inherited]
    +
    +
    +
    Returns:
    current number base
    + +
    +
    + +
    +
    + + + + + + + +
    streamsize istream::gcount () const [inline, inherited]
    +
    +
    +
    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 [inline, inherited]
    +
    +
    +
    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 [inline, inherited]
    +
    +
    +
    Returns:
    null pointer if fail() is true.
    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::operator! () const [inline, inherited]
    +
    +
    +
    Returns:
    true if fail() else false.
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (ios &(*)(ios &str) pf) [inline, inherited]
    +
    +
    +

    call manipulator

    +
    Parameters:
    + + +
    [in]pffunction to call
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (int32_t & arg) [inline, inherited]
    +
    +
    +

    Extract a value of type int32_t.

    +
    Parameters:
    + + +
    [out]arglocation to store the value.
    +
    +
    +
    Returns:
    Is always *this. Failure is indicated by the state of *this.
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (signed char & ch) [inline, inherited]
    +
    +
    +

    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>> (uint32_t & arg) [inline, inherited]
    +
    +
    +

    Extract a value of type uint32_t.

    +
    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, inherited]
    +
    +
    +

    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>> (unsigned char * str) [inline, inherited]
    +
    +
    +

    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>> (float & arg) [inline, inherited]
    +
    +
    +

    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>> (unsigned short & arg) [inline, inherited]
    +
    +
    +

    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>> (char * str) [inline, inherited]
    +
    +
    +

    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>> (void *& arg) [inline, inherited]
    +
    +
    +

    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.
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (unsigned char & ch) [inline, inherited]
    +
    +
    +

    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, inherited]
    +
    +
    +

    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>> (istream &(*)(istream &str) pf) [inline, inherited]
    +
    +
    +

    call manipulator

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

    call manipulator

    +
    Parameters:
    + + +
    [in]pffunction to call
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (short & arg) [inline, inherited]
    +
    +
    +

    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>> (char & ch) [inline, inherited]
    +
    +
    +

    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, inherited]
    +
    +
    +

    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>> (int16_t & arg) [inline, inherited]
    +
    +
    +

    Extract a value of type int16_t.

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

    Extract a value of type uint16_t.

    +
    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 (unsigned int n) [inline, inherited]
    +
    +
    +

    set precision

    +
    Parameters:
    + + +
    [in]nnew precision
    +
    +
    +
    Returns:
    old precision
    + +
    +
    + +
    +
    + + + + + + + +
    int ios_base::precision () const [inline, inherited]
    +
    +
    +
    Returns:
    precision
    + +
    +
    + +
    +
    + + + + + + + +
    iostate ios::rdstate () const [inline, inherited]
    +
    +
    +
    Returns:
    The iostate flags for this file.
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::seekg (pos_type pos) [inline, inherited]
    +
    +
    +

    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, inherited]
    +
    +
    +

    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) [inline, inherited]
    +
    +
    +

    set format flags

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

    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, inherited]
    +
    +
    +

    Set iostate bits.

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

    used to implement ws()

    + +
    +
    + +
    +
    + + + + + + + +
    pos_type istream::tellg () [inline, inherited]
    +
    +
    +
    Returns:
    the stream position
    + +
    +
    + +
    +
    + + + + + + + + +
    void ios_base::unsetf (fmtflags fl) [inline, inherited]
    +
    +
    +

    clear format flags

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

    set width

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

    Member Data Documentation

    + +
    +
    + + + + +
    const fmtflags ios_base::adjustfield = left | right | internal [static, inherited]
    +
    +
    +

    mask for adjustfield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::app = 0X4 [static, inherited]
    +
    +
    +

    seek to end before each write

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::ate = 0X8 [static, inherited]
    +
    +
    +

    open and seek to end immediately after opening

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::badbit = 0X01 [static, inherited]
    +
    +
    +

    iostate bad bit for a nonrecoverable error.

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::basefield = dec | hex | oct [static, inherited]
    +
    +
    +

    mask for basefield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::binary = 0X10 [static, inherited]
    +
    +
    +

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

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::boolalpha = 0x0100 [static, inherited]
    +
    +
    +

    use strings true/false for bool

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::dec = 0x0008 [static, inherited]
    +
    +
    +

    base 10 flag

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::eofbit = 0x02 [static, inherited]
    +
    +
    +

    iostate bit for end of file reached

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::failbit = 0X04 [static, inherited]
    +
    +
    +

    iostate fail bit for nonfatal error

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::goodbit = 0x00 [static, inherited]
    +
    +
    +

    iostate for no flags

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::hex = 0x0010 [static, inherited]
    +
    +
    +

    base 16 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::in = 0X20 [static, inherited]
    +
    +
    +

    open for input

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::internal = 0x0004 [static, inherited]
    +
    +
    +

    fill between sign/base prefix and number

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::left = 0x0001 [static, inherited]
    +
    +
    +

    left adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::oct = 0x0020 [static, inherited]
    +
    +
    +

    base 8 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::out = 0X40 [static, inherited]
    +
    +
    +

    open for output

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::right = 0x0002 [static, inherited]
    +
    +
    +

    right adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showbase = 0x0200 [static, inherited]
    +
    +
    +

    use prefix 0X for hex and 0 for oct

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpoint = 0x0400 [static, inherited]
    +
    +
    +

    always show '.' for floating numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpos = 0x0800 [static, inherited]
    +
    +
    +

    show + sign for nonnegative numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::skipws = 0x1000 [static, inherited]
    +
    +
    +

    skip initial white space

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::trunc = 0X80 [static, inherited]
    +
    +
    +

    truncate an existing stream when opening

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::uppercase = 0x4000 [static, inherited]
    +
    +
    +

    use uppercase letters in number representations

    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + diff --git a/libs/SdFatBeta20120108/html/classibufstream__coll__graph.png b/libs/SdFatBeta20120108/html/classibufstream__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..b96a31c4e9a7f7fb9557ce2f65f1bbba3e49594e GIT binary patch literal 2502 zcmb`Jc{tSV8pnT=Wn^jWO9n-DvL3roV;Q3`+Gh2KhOQWzR%~n@1IB73-KT22LM0_ z?f|>MsXhPz;^E`vs5_sRS2=|@5Md7ke*EneQcJS|;BY(~X5)$`tQPoPmAfVJu00r& zEgPCeZicU&J=$>b^<4oxueZnqZ;Quk4{xK%8>1zB2%GUq@}#N)*{c)03E%x_?0H_w z=J8#~{&1Lxh`0?I!a9bi=b@kesQjlNYfy!-FtdW8!Gb(mJP(T4`q@%ohDCf+d@Lr19B=K0&`Pl&73 zvR%V@rmW6t+oJ|`f{^!wB>tFY1atCh*I+; zZ(FHFf;Y%m6lORW0p6lKF`2ty+m1z5Z|)pgh1O;Cf3jf|LT?Q)&f2Lt*< z6~+#}TD(8!q+WIQrvbCDX9tFnuFrgzGDnLYSevm2MHN-F0;zoNed}gbJvz6O8R+K> zy_nrC6fl20RkIrMKxI05hO4O$2z~_*se>RotKALL;H)TEMUf{tV)h5%x#1s;AyUr#d~oXYobB zxZGPX1FBp|Fj1Bp-o~Z0hlT?to4;jO40*pcRiaKNu*GmtsVwa5DG_vjKAI@vE>Fm+ zT51OzR!Ht;bGIoVA>0{SjLh&Gw52u4GI}vLmSVH;_Aq^Qcj1g8OHgzUmAksSn$^wU z)t@d#L$PhGMH9m{ij)9?2|jWzUI69Ew4iQZt$?2Y7$b6hz4e~Psj^eemN2GQ4+1$A zNQYr$jQ-&zCl7z5JTqj06B1{f&ku@1T81ZPLHhP=@)S-vt0Z{|HR^sQ2>cu#&B~O_>ZS7outyrwNTD+^fP-KtY)js;~tW#FFYKGfhvZa zp1n7_$i}gDq%0oOccwC#Yi*EmqF=4sO{43WTn*!b=}>`Nv;OFSTDM*C8f`$M+wO`q z4IlM1`jAQi4zB7?JN#1u^A_w$MP89>Yc7+E;(C&}QeZ;s>dQ7)b#^0=aAc-dl^twL z9)C)>z4zNag{kjdN#Mk$(L{XP1ows;XkJifbo9x|*B2{(4XON|B8QMC4AK=blDP8z z&8DVxr<(b`v?!XYs(Z<>_K3RT-O5Vmukv442@E?f{21HK*%BBSL~qRyqNkr+v9OSi z2ign`wwJW@$b%-z*pQ{%F2$$zGZo&b@wMn(Dojw*010Qd_8=gk{?Q^fUE33mdPum` zh=54_GECxJ{bxI48Zv2~Pg;nuQtsBj&$l~8TNomg%3$}%O_*+4(wcU%9>;s0M+Pnqj|0SIdP znHDcA*>n?JWFTK6&xS9`d|xI_)9=gHE26#c6oUq9)PJ%vyU;BM$*U#&j=G=GE_9?{ z>sK>z4>=A&ImRtrJGgRTp$;@x9+mw0&)B1NzUX~JEPNhiq%IA)oLbQ#Q8h$4yxf!i z=ljU5OBX(bX{U2ZM*n0N}FD~ks?`C>B zmS0x3@p*GMKWGut>oiqSV+!~UHm!CT=HF9=$Xo1uVX^kZC)9*JZP4la$Bv#tTcS!X{E znZ`PKMj|n#Nd|xs$QosD8v%OArrfzio8Ev$%XEa$ zjj1T+6HAfe$LO;;(H&O!f)BJ}uatLwha|yOi(V2(;O!Ao zVaO}99Q`fsJEik5y^S+4!1^T+wNt=>-05b%Q>4IpEY8>uqsub`ld0d?`I6DobHJ>y z_o7;{+7jMxGbVlUy}e-6yN1#l{SZ5qKN55QWM*n}X##)8InVIU&f(pw6#{J9SlWhy)0bLkh>g(GB}yWpBPbq{snbmeO;Zw@T{IG1X3NMTageM2u^zl5j1wgyP21W2>@ Ztc-1)z8d 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 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/classifstream-members.html b/libs/SdFatBeta20120108/html/classifstream-members.html new file mode 100644 index 0000000..5c29b77 --- /dev/null +++ b/libs/SdFatBeta20120108/html/classifstream-members.html @@ -0,0 +1,200 @@ + + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    ifstream Member List
    +
    +
    +This is the complete list of members for ifstream, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    adjustfieldios_base [static]
    appios_base [static]
    ateios_base [static]
    bad() const ios [inline]
    badbitios_base [static]
    basefieldios_base [static]
    beg enum valueios_base
    binaryios_base [static]
    boolalphaios_base [static]
    clear(iostate state=goodbit)ios [inline]
    close()ifstream [inline]
    contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock)SdBaseFile [private]
    createContiguous(SdBaseFile *dirFile, const char *path, uint32_t size)SdBaseFile [private]
    cur enum valueios_base
    curCluster() const SdBaseFile [inline, private]
    curPosition() const SdBaseFile [inline, private]
    cwd()SdBaseFile [inline, private, static]
    dateTimeCallback(void(*dateTime)(uint16_t *date, uint16_t *time))SdBaseFile [inline, private, static]
    dateTimeCallbackCancel()SdBaseFile [inline, private, static]
    decios_base [static]
    dirEntry(dir_t *dir)SdBaseFile [private]
    dirName(const dir_t &dir, char *name)SdBaseFile [private, static]
    end enum valueios_base
    eof() const ios [inline]
    eofbitios_base [static]
    exists(const char *name)SdBaseFile [private]
    fail() const ios [inline]
    failbitios_base [static]
    fgets(char *str, int16_t num, char *delim=0)SdBaseFile [private]
    fileSize() const SdBaseFile [inline, private]
    fill()ios_base [inline]
    fill(char c)ios_base [inline]
    firstCluster() const SdBaseFile [inline, private]
    flags() const ios_base [inline]
    flags(fmtflags fl)ios_base [inline]
    flagsToBase()ios_base [inline, protected]
    fmtflags typedefios_base
    gcount() const istream [inline]
    get()istream
    get(char &ch)istream
    get(char *str, streamsize n, char delim= '\n')istream
    getFilename(char *name)SdBaseFile [private]
    getline(char *str, streamsize count, char delim= '\n')istream
    getpos(fpos_t *pos)SdBaseFile [private]
    good() const ios [inline]
    goodbitios_base [static]
    hexios_base [static]
    ifstream() (defined in ifstream)ifstream [inline]
    ifstream(const char *path, openmode mode=in)ifstream [inline, explicit]
    ignore(streamsize n=1, int delim=-1)istream
    inios_base [static]
    internalios_base [static]
    ios()ios [inline]
    ios_base() (defined in ios_base)ios_base [inline]
    iostate typedefios_base
    is_open()ifstream [inline]
    isDir() const SdBaseFile [inline, private]
    isFile() const SdBaseFile [inline, private]
    isOpen() const SdBaseFile [inline, private]
    isRoot() const SdBaseFile [inline, private]
    isSubDir() const SdBaseFile [inline, private]
    istream() (defined in istream)istream [inline]
    leftios_base [static]
    ls(Print *pr, uint8_t flags=0, uint8_t indent=0)SdBaseFile [private]
    ls(uint8_t flags=0)SdBaseFile [private]
    mkdir(SdBaseFile *dir, const char *path, bool pFlag=true)SdBaseFile [private]
    octios_base [static]
    off_type typedefios_base
    open(const char *path, openmode mode=in)ifstream [inline]
    SdStreamBase::open(SdBaseFile *dirFile, uint16_t index, uint8_t oflag)SdBaseFile [private]
    SdStreamBase::open(SdBaseFile *dirFile, const char *path, uint8_t oflag)SdBaseFile [private]
    openmode typedefios_base
    openNext(SdBaseFile *dirFile, uint8_t oflag)SdBaseFile [private]
    openRoot(SdVolume *vol)SdBaseFile [private]
    operator const void *() const ios [inline]
    operator!() const ios [inline]
    operator>>(istream &(*pf)(istream &str))istream [inline]
    operator>>(ios_base &(*pf)(ios_base &str))istream [inline]
    operator>>(ios &(*pf)(ios &str))istream [inline]
    operator>>(char *str)istream [inline]
    operator>>(char &ch)istream [inline]
    operator>>(signed char *str)istream [inline]
    operator>>(signed char &ch)istream [inline]
    operator>>(unsigned char *str)istream [inline]
    operator>>(unsigned char &ch)istream [inline]
    operator>>(bool &arg)istream [inline]
    operator>>(short &arg)istream [inline]
    operator>>(unsigned short &arg)istream [inline]
    operator>>(int16_t &arg)istream [inline]
    operator>>(uint16_t &arg)istream [inline]
    operator>>(int32_t &arg)istream [inline]
    operator>>(uint32_t &arg)istream [inline]
    operator>>(double &arg)istream [inline]
    operator>>(float &arg)istream [inline]
    operator>>(void *&arg)istream [inline]
    outios_base [static]
    istream::peek()istream
    SdStreamBase::peek()SdBaseFile [private]
    pos_type typedefios_base
    precision() const ios_base [inline]
    precision(unsigned int n)ios_base [inline]
    printFatDate(uint16_t fatDate)SdBaseFile [private, static]
    printFatDate(Print *pr, uint16_t fatDate)SdBaseFile [private, static]
    printFatTime(uint16_t fatTime)SdBaseFile [private, static]
    printFatTime(Print *pr, uint16_t fatTime)SdBaseFile [private, static]
    printName()SdBaseFile [private]
    rdstate() const ios [inline]
    read()SdBaseFile [private]
    read(void *buf, uint16_t nbyte)SdBaseFile [private]
    readDir(dir_t *dir)SdBaseFile [private]
    remove(SdBaseFile *dirFile, const char *path)SdBaseFile [private, static]
    remove()SdBaseFile [private]
    rename(SdBaseFile *dirFile, const char *newPath)SdBaseFile [private]
    rewind()SdBaseFile [inline, private]
    rightios_base [static]
    rmdir()SdBaseFile [private]
    rmRfStar()SdBaseFile [private]
    SdBaseFile()SdBaseFile [inline, private]
    SdBaseFile(const char *path, uint8_t oflag)SdBaseFile [private]
    seekCur(int32_t offset)SdBaseFile [inline, private]
    seekdir enum nameios_base
    seekEnd(int32_t offset=0)SdBaseFile [inline, private]
    seekg(pos_type pos)istream [inline]
    seekg(off_type off, seekdir way)istream [inline]
    seekSet(uint32_t pos)SdBaseFile [private]
    setf(fmtflags fl)ios_base [inline]
    setf(fmtflags fl, fmtflags mask)ios_base [inline]
    setpos(fpos_t *pos)SdBaseFile [private]
    setstate(iostate state)ios [inline]
    showbaseios_base [static]
    showpointios_base [static]
    showposios_base [static]
    skipWhite()istream
    skipwsios_base [static]
    streamsize typedefios_base
    sync()SdBaseFile [private]
    tellg()istream [inline]
    timestamp(SdBaseFile *file)SdBaseFile [private]
    timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)SdBaseFile [private]
    truncios_base [static]
    truncate(uint32_t size)SdBaseFile [private]
    type() const SdBaseFile [inline, private]
    unsetf(fmtflags fl)ios_base [inline]
    uppercaseios_base [static]
    volume() const SdBaseFile [inline, private]
    width()ios_base [inline]
    width(unsigned n)ios_base [inline]
    write(const void *buf, uint16_t nbyte)SdBaseFile [private]
    writeErrorSdBaseFile [private]
    ~ifstream() (defined in ifstream)ifstream [inline]
    ~SdBaseFile() (defined in SdBaseFile)SdBaseFile [inline, private]
    + + + diff --git a/libs/SdFatBeta20120108/html/classifstream.html b/libs/SdFatBeta20120108/html/classifstream.html new file mode 100644 index 0000000..e9813a4 --- /dev/null +++ b/libs/SdFatBeta20120108/html/classifstream.html @@ -0,0 +1,2019 @@ + + + + +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]
    + +

    List of all members.

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

    +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 (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>> (ios_base &(*pf)(ios_base &str))
    istreamoperator>> (bool &arg)
    istreamoperator>> (short &arg)
    istreamoperator>> (ios &(*pf)(ios &str))
    istreamoperator>> (unsigned short &arg)
    istreamoperator>> (int16_t &arg)
    istreamoperator>> (uint16_t &arg)
    istreamoperator>> (char *str)
    istreamoperator>> (signed char *str)
    istreamoperator>> (int32_t &arg)
    istreamoperator>> (char &ch)
    istreamoperator>> (uint32_t &arg)
    istreamoperator>> (double &arg)
    istreamoperator>> (float &arg)
    istreamoperator>> (void *&arg)
    istreamoperator>> (signed char &ch)
    istreamoperator>> (unsigned char *str)
    istreamoperator>> (istream &(*pf)(istream &str))
    istreamoperator>> (unsigned char &ch)
    int peek ()
    int precision (unsigned int n)
    int precision () const
    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 n)
    unsigned width ()

    +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

    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 (fpos_t *pos)
    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 printName ()
    int16_t read ()
    int16_t read (void *buf, uint16_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 (fpos_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
    int16_t write (const void *buf, uint16_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 (Print *pr, uint16_t fatTime)
    static void printFatTime (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 (const char * path,
    openmode mode = in 
    ) [inline, explicit]
    +
    +
    +

    Constructor with open

    +
    Parameters:
    + + + +
    [in]pathfile to open
    [in]modeopen mode
    +
    +
    + +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + +
    bool ios::bad () const [inline, inherited]
    +
    +
    +
    Returns:
    true if bad bit is set else false.
    + +
    +
    + +
    +
    + + + + + + + + +
    void ios::clear (iostate state = goodbit) [inline, inherited]
    +
    +
    +

    Clear iostate bits.

    +
    Parameters:
    + + +
    [in]stateThe flags you want to set after clearing all flags.
    +
    +
    + +

    Reimplemented in fstream, and ofstream.

    + +
    +
    + +
    +
    + + + + + + + +
    void ifstream::close () [inline]
    +
    +
    +

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

    + +

    Reimplemented from SdBaseFile.

    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::eof () const [inline, inherited]
    +
    +
    +
    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, inherited]
    +
    +
    +
    Returns:
    true if any iostate bit other than eof are set else false.
    + +
    +
    + +
    +
    + + + + + + + +
    char ios_base::fill () [inline, inherited]
    +
    +
    +
    Returns:
    fill character
    + +
    +
    + +
    +
    + + + + + + + + +
    char ios_base::fill (char c) [inline, inherited]
    +
    +
    +

    Set fill character

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

    set format flags

    +
    Parameters:
    + + +
    [in]flnew flag
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + +
    uint8_t ios_base::flagsToBase () [inline, protected, inherited]
    +
    +
    +
    Returns:
    current number base
    + +
    +
    + +
    +
    + + + + + + + +
    streamsize istream::gcount () const [inline, inherited]
    +
    +
    +
    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 [inline, inherited]
    +
    +
    +
    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.

    + +

    Reimplemented from SdBaseFile.

    + +
    +
    + +
    +
    + + + + + + + +
    ios::operator const void * () const [inline, inherited]
    +
    +
    +
    Returns:
    null pointer if fail() is true.
    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::operator! () const [inline, inherited]
    +
    +
    +
    Returns:
    true if fail() else false.
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (char & ch) [inline, inherited]
    +
    +
    +

    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>> (int16_t & arg) [inline, inherited]
    +
    +
    +

    Extract a value of type int16_t.

    +
    Parameters:
    + + +
    [out]arglocation to store the value.
    +
    +
    +
    Returns:
    Is always *this. Failure is indicated by the state of *this.
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (istream &(*)(istream &str) pf) [inline, inherited]
    +
    +
    +

    call manipulator

    +
    Parameters:
    + + +
    [in]pffunction to call
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (uint16_t & arg) [inline, inherited]
    +
    +
    +

    Extract a value of type uint16_t.

    +
    Parameters:
    + + +
    [out]arglocation to store the value.
    +
    +
    +
    Returns:
    Is always *this. Failure is indicated by the state of *this.
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (signed char * str) [inline, inherited]
    +
    +
    +

    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>> (int32_t & arg) [inline, inherited]
    +
    +
    +

    Extract a value of type int32_t.

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

    Extract a value of type uint32_t.

    +
    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, inherited]
    +
    +
    +

    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>> (signed char & ch) [inline, inherited]
    +
    +
    +

    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>> (float & arg) [inline, inherited]
    +
    +
    +

    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, inherited]
    +
    +
    +

    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.
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (ios_base &(*)(ios_base &str) pf) [inline, inherited]
    +
    +
    +

    call manipulator

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

    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, inherited]
    +
    +
    +

    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>> (ios &(*)(ios &str) pf) [inline, inherited]
    +
    +
    +

    call manipulator

    +
    Parameters:
    + + +
    [in]pffunction to call
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (bool & arg) [inline, inherited]
    +
    +
    +

    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>> (char * str) [inline, inherited]
    +
    +
    +

    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>> (short & arg) [inline, inherited]
    +
    +
    +

    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, inherited]
    +
    +
    +

    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.
    + +
    +
    + +
    +
    + + + + + + + +
    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 [inline, inherited]
    +
    +
    +
    Returns:
    precision
    + +
    +
    + +
    +
    + + + + + + + + +
    int ios_base::precision (unsigned int n) [inline, inherited]
    +
    +
    +

    set precision

    +
    Parameters:
    + + +
    [in]nnew precision
    +
    +
    +
    Returns:
    old precision
    + +
    +
    + +
    +
    + + + + + + + +
    iostate ios::rdstate () const [inline, inherited]
    +
    +
    +
    Returns:
    The iostate flags for this file.
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::seekg (pos_type pos) [inline, inherited]
    +
    +
    +

    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, inherited]
    +
    +
    +

    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,
    fmtflags mask 
    ) [inline, inherited]
    +
    +
    +

    modify format flags

    +
    Parameters:
    + + + +
    [in]maskflags to be removed
    [in]flflags to be set after mask bits have been cleared
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + + +
    fmtflags ios_base::setf (fmtflags fl) [inline, inherited]
    +
    +
    +

    set format flags

    +
    Parameters:
    + + +
    [in]flnew flags to be or'ed in
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + + +
    void ios::setstate (iostate state) [inline, inherited]
    +
    +
    +

    Set iostate bits.

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

    used to implement ws()

    + +
    +
    + +
    +
    + + + + + + + +
    pos_type istream::tellg () [inline, inherited]
    +
    +
    +
    Returns:
    the stream position
    + +
    +
    + +
    +
    + + + + + + + + +
    void ios_base::unsetf (fmtflags fl) [inline, inherited]
    +
    +
    +

    clear format flags

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

    set width

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

    Member Data Documentation

    + +
    +
    + + + + +
    const fmtflags ios_base::adjustfield = left | right | internal [static, inherited]
    +
    +
    +

    mask for adjustfield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::app = 0X4 [static, inherited]
    +
    +
    +

    seek to end before each write

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::ate = 0X8 [static, inherited]
    +
    +
    +

    open and seek to end immediately after opening

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::badbit = 0X01 [static, inherited]
    +
    +
    +

    iostate bad bit for a nonrecoverable error.

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::basefield = dec | hex | oct [static, inherited]
    +
    +
    +

    mask for basefield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::binary = 0X10 [static, inherited]
    +
    +
    +

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

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::boolalpha = 0x0100 [static, inherited]
    +
    +
    +

    use strings true/false for bool

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::dec = 0x0008 [static, inherited]
    +
    +
    +

    base 10 flag

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::eofbit = 0x02 [static, inherited]
    +
    +
    +

    iostate bit for end of file reached

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::failbit = 0X04 [static, inherited]
    +
    +
    +

    iostate fail bit for nonfatal error

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::goodbit = 0x00 [static, inherited]
    +
    +
    +

    iostate for no flags

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::hex = 0x0010 [static, inherited]
    +
    +
    +

    base 16 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::in = 0X20 [static, inherited]
    +
    +
    +

    open for input

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::internal = 0x0004 [static, inherited]
    +
    +
    +

    fill between sign/base prefix and number

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::left = 0x0001 [static, inherited]
    +
    +
    +

    left adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::oct = 0x0020 [static, inherited]
    +
    +
    +

    base 8 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::out = 0X40 [static, inherited]
    +
    +
    +

    open for output

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::right = 0x0002 [static, inherited]
    +
    +
    +

    right adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showbase = 0x0200 [static, inherited]
    +
    +
    +

    use prefix 0X for hex and 0 for oct

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpoint = 0x0400 [static, inherited]
    +
    +
    +

    always show '.' for floating numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpos = 0x0800 [static, inherited]
    +
    +
    +

    show + sign for nonnegative numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::skipws = 0x1000 [static, inherited]
    +
    +
    +

    skip initial white space

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::trunc = 0X80 [static, inherited]
    +
    +
    +

    truncate an existing stream when opening

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::uppercase = 0x4000 [static, inherited]
    +
    +
    +

    use uppercase letters in number representations

    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + diff --git a/libs/SdFatBeta20120108/html/classifstream__coll__graph.png b/libs/SdFatBeta20120108/html/classifstream__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..63a60bfa57a9d8ab94d8f863e80338bedb29f8a3 GIT binary patch literal 20663 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 F_21ZxXrTZA literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/classifstream__inherit__graph.png b/libs/SdFatBeta20120108/html/classifstream__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..aa5574fec3c50c00b1474bbb28d3b8f6ea4c1136 GIT binary patch literal 6674 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 + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    ios Member List
    +
    +
    +This is the complete list of members for ios, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    adjustfieldios_base [static]
    appios_base [static]
    ateios_base [static]
    bad() const ios [inline]
    badbitios_base [static]
    basefieldios_base [static]
    beg enum valueios_base
    binaryios_base [static]
    boolalphaios_base [static]
    clear(iostate state=goodbit)ios [inline]
    cur enum valueios_base
    decios_base [static]
    end enum valueios_base
    eof() const ios [inline]
    eofbitios_base [static]
    fail() const ios [inline]
    failbitios_base [static]
    fill()ios_base [inline]
    fill(char c)ios_base [inline]
    flags() const ios_base [inline]
    flags(fmtflags fl)ios_base [inline]
    flagsToBase()ios_base [inline, protected]
    fmtflags typedefios_base
    good() const ios [inline]
    goodbitios_base [static]
    hexios_base [static]
    inios_base [static]
    internalios_base [static]
    ios()ios [inline]
    ios_base() (defined in ios_base)ios_base [inline]
    iostate typedefios_base
    leftios_base [static]
    octios_base [static]
    off_type typedefios_base
    openmode typedefios_base
    operator const void *() const ios [inline]
    operator!() const ios [inline]
    outios_base [static]
    pos_type typedefios_base
    precision() const ios_base [inline]
    precision(unsigned int n)ios_base [inline]
    rdstate() const ios [inline]
    rightios_base [static]
    seekdir enum nameios_base
    setf(fmtflags fl)ios_base [inline]
    setf(fmtflags fl, fmtflags mask)ios_base [inline]
    setstate(iostate state)ios [inline]
    showbaseios_base [static]
    showpointios_base [static]
    showposios_base [static]
    skipwsios_base [static]
    streamsize typedefios_base
    truncios_base [static]
    unsetf(fmtflags fl)ios_base [inline]
    uppercaseios_base [static]
    width()ios_base [inline]
    width(unsigned n)ios_base [inline]
    + + + diff --git a/libs/SdFatBeta20120108/html/classios.html b/libs/SdFatBeta20120108/html/classios.html new file mode 100644 index 0000000..4deb8ad --- /dev/null +++ b/libs/SdFatBeta20120108/html/classios.html @@ -0,0 +1,1056 @@ + + + + +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]
    + +

    List of all members.

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

    +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 (unsigned int n)
    int precision () const
    iostate rdstate () const
    fmtflags setf (fmtflags fl, fmtflags mask)
    fmtflags setf (fmtflags fl)
    void setstate (iostate state)
    void unsetf (fmtflags fl)
    unsigned width (unsigned n)
    unsigned width ()

    +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.
    +
    +
    + +

    Reimplemented in fstream, and ofstream.

    + +
    +
    + +
    +
    + + + + + + + +
    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 () [inline, inherited]
    +
    +
    +
    Returns:
    fill character
    + +
    +
    + +
    +
    + + + + + + + + +
    char ios_base::fill (char c) [inline, inherited]
    +
    +
    +

    Set fill character

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

    set format flags

    +
    Parameters:
    + + +
    [in]flnew flag
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + +
    uint8_t ios_base::flagsToBase () [inline, protected, inherited]
    +
    +
    +
    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 (unsigned int n) [inline, inherited]
    +
    +
    +

    set precision

    +
    Parameters:
    + + +
    [in]nnew precision
    +
    +
    +
    Returns:
    old precision
    + +
    +
    + +
    +
    + + + + + + + +
    int ios_base::precision () const [inline, inherited]
    +
    +
    +
    Returns:
    precision
    + +
    +
    + +
    +
    + + + + + + + +
    iostate ios::rdstate () const [inline]
    +
    +
    +
    Returns:
    The iostate flags for this file.
    + +
    +
    + +
    +
    + + + + + + + + +
    fmtflags ios_base::setf (fmtflags fl) [inline, inherited]
    +
    +
    +

    set format flags

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

    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) [inline, inherited]
    +
    +
    +

    clear format flags

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

    set width

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

    Member Data Documentation

    + +
    +
    + + + + +
    const fmtflags ios_base::adjustfield = left | right | internal [static, inherited]
    +
    +
    +

    mask for adjustfield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::app = 0X4 [static, inherited]
    +
    +
    +

    seek to end before each write

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::ate = 0X8 [static, inherited]
    +
    +
    +

    open and seek to end immediately after opening

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::badbit = 0X01 [static, inherited]
    +
    +
    +

    iostate bad bit for a nonrecoverable error.

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::basefield = dec | hex | oct [static, inherited]
    +
    +
    +

    mask for basefield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::binary = 0X10 [static, inherited]
    +
    +
    +

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

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::boolalpha = 0x0100 [static, inherited]
    +
    +
    +

    use strings true/false for bool

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::dec = 0x0008 [static, inherited]
    +
    +
    +

    base 10 flag

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::eofbit = 0x02 [static, inherited]
    +
    +
    +

    iostate bit for end of file reached

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::failbit = 0X04 [static, inherited]
    +
    +
    +

    iostate fail bit for nonfatal error

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::goodbit = 0x00 [static, inherited]
    +
    +
    +

    iostate for no flags

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::hex = 0x0010 [static, inherited]
    +
    +
    +

    base 16 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::in = 0X20 [static, inherited]
    +
    +
    +

    open for input

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::internal = 0x0004 [static, inherited]
    +
    +
    +

    fill between sign/base prefix and number

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::left = 0x0001 [static, inherited]
    +
    +
    +

    left adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::oct = 0x0020 [static, inherited]
    +
    +
    +

    base 8 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::out = 0X40 [static, inherited]
    +
    +
    +

    open for output

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::right = 0x0002 [static, inherited]
    +
    +
    +

    right adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showbase = 0x0200 [static, inherited]
    +
    +
    +

    use prefix 0X for hex and 0 for oct

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpoint = 0x0400 [static, inherited]
    +
    +
    +

    always show '.' for floating numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpos = 0x0800 [static, inherited]
    +
    +
    +

    show + sign for nonnegative numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::skipws = 0x1000 [static, inherited]
    +
    +
    +

    skip initial white space

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::trunc = 0X80 [static, inherited]
    +
    +
    +

    truncate an existing stream when opening

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::uppercase = 0x4000 [static, inherited]
    +
    +
    +

    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/libs/SdFatBeta20120108/html/classios__base-members.html b/libs/SdFatBeta20120108/html/classios__base-members.html new file mode 100644 index 0000000..7d9fdda --- /dev/null +++ b/libs/SdFatBeta20120108/html/classios__base-members.html @@ -0,0 +1,96 @@ + + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    ios_base Member List
    +
    +
    +This is the complete list of members for ios_base, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    adjustfieldios_base [static]
    appios_base [static]
    ateios_base [static]
    badbitios_base [static]
    basefieldios_base [static]
    beg enum valueios_base
    binaryios_base [static]
    boolalphaios_base [static]
    cur enum valueios_base
    decios_base [static]
    end enum valueios_base
    eofbitios_base [static]
    failbitios_base [static]
    fill()ios_base [inline]
    fill(char c)ios_base [inline]
    flags() const ios_base [inline]
    flags(fmtflags fl)ios_base [inline]
    flagsToBase()ios_base [inline, protected]
    fmtflags typedefios_base
    goodbitios_base [static]
    hexios_base [static]
    inios_base [static]
    internalios_base [static]
    ios_base() (defined in ios_base)ios_base [inline]
    iostate typedefios_base
    leftios_base [static]
    octios_base [static]
    off_type typedefios_base
    openmode typedefios_base
    outios_base [static]
    pos_type typedefios_base
    precision() const ios_base [inline]
    precision(unsigned int n)ios_base [inline]
    rightios_base [static]
    seekdir enum nameios_base
    setf(fmtflags fl)ios_base [inline]
    setf(fmtflags fl, fmtflags mask)ios_base [inline]
    showbaseios_base [static]
    showpointios_base [static]
    showposios_base [static]
    skipwsios_base [static]
    streamsize typedefios_base
    truncios_base [static]
    unsetf(fmtflags fl)ios_base [inline]
    uppercaseios_base [static]
    width()ios_base [inline]
    width(unsigned n)ios_base [inline]
    + + + diff --git a/libs/SdFatBeta20120108/html/classios__base.html b/libs/SdFatBeta20120108/html/classios__base.html new file mode 100644 index 0000000..a044cb3 --- /dev/null +++ b/libs/SdFatBeta20120108/html/classios__base.html @@ -0,0 +1,850 @@ + + + + +SdFat: ios_base Class Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    + +
    + +

    Base class for all streams. + More...

    + +

    #include <ios.h>

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

    List of all members.

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

    +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)
    int precision () const
    int precision (unsigned int n)
    fmtflags setf (fmtflags fl, fmtflags mask)
    fmtflags setf (fmtflags fl)
    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

    +
    +
    +
    + +
    +
    +

    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 (fmtflags fl) [inline]
    +
    +
    +

    set format flags

    +
    Parameters:
    + + +
    [in]flnew flag
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + +
    fmtflags ios_base::flags () const [inline]
    +
    +
    +
    Returns:
    format flags
    + +
    +
    + +
    +
    + + + + + + + +
    uint8_t ios_base::flagsToBase () [inline, protected]
    +
    +
    +
    Returns:
    current number base
    + +
    +
    + +
    +
    + + + + + + + + +
    int ios_base::precision (unsigned int n) [inline]
    +
    +
    +

    set precision

    +
    Parameters:
    + + +
    [in]nnew precision
    +
    +
    +
    Returns:
    old precision
    + +
    +
    + +
    +
    + + + + + + + +
    int ios_base::precision () const [inline]
    +
    +
    +
    Returns:
    precision
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    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
    + +
    +
    + +
    +
    + + + + + + + + +
    fmtflags ios_base::setf (fmtflags fl) [inline]
    +
    +
    +

    set format flags

    +
    Parameters:
    + + +
    [in]flnew flags to be or'ed in
    +
    +
    +
    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 (unsigned n) [inline]
    +
    +
    +

    set width

    +
    Parameters:
    + + +
    [in]nnew width
    +
    +
    +
    Returns:
    old width
    + +
    +
    + +
    +
    + + + + + + + +
    unsigned ios_base::width () [inline]
    +
    +
    +
    Returns:
    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/libs/SdFatBeta20120108/html/classios__base__inherit__graph.png b/libs/SdFatBeta20120108/html/classios__base__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..5bbe63428b20ad04f009373c9394c2cacd21949e GIT binary patch literal 19521 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 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/classios__inherit__graph.png b/libs/SdFatBeta20120108/html/classios__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..66067c03796f17d312b9f820f7185c427b94dc4c GIT binary patch literal 19337 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 F{sk5b$0Ps% literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/classiostream-members.html b/libs/SdFatBeta20120108/html/classiostream-members.html new file mode 100644 index 0000000..c5ced47 --- /dev/null +++ b/libs/SdFatBeta20120108/html/classiostream-members.html @@ -0,0 +1,159 @@ + + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    iostream Member List
    +
    +
    +This is the complete list of members for iostream, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    adjustfieldios_base [static]
    appios_base [static]
    ateios_base [static]
    bad() const ios [inline]
    badbitios_base [static]
    basefieldios_base [static]
    beg enum valueios_base
    binaryios_base [static]
    boolalphaios_base [static]
    clear(iostate state=goodbit)ios [inline]
    cur enum valueios_base
    decios_base [static]
    end enum valueios_base
    eof() const ios [inline]
    eofbitios_base [static]
    fail() const ios [inline]
    failbitios_base [static]
    fill()ios_base [inline]
    fill(char c)ios_base [inline]
    flags() const ios_base [inline]
    flags(fmtflags fl)ios_base [inline]
    flagsToBase()ios_base [inline, protected]
    flush()ostream [inline]
    fmtflags typedefios_base
    gcount() const istream [inline]
    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 ios [inline]
    goodbitios_base [static]
    hexios_base [static]
    ignore(streamsize n=1, int delim=-1)istream
    inios_base [static]
    internalios_base [static]
    ios()ios [inline]
    ios_base() (defined in ios_base)ios_base [inline]
    iostate typedefios_base
    istream() (defined in istream)istream [inline]
    leftios_base [static]
    octios_base [static]
    off_type typedefios_base
    openmode typedefios_base
    operator const void *() const ios [inline]
    operator!() const ios [inline]
    operator<<(ostream &(*pf)(ostream &str))ostream [inline]
    operator<<(ios_base &(*pf)(ios_base &str))ostream [inline]
    operator<<(bool arg)ostream [inline]
    operator<<(const char *arg)ostream [inline]
    operator<<(const signed char *arg)ostream [inline]
    operator<<(const unsigned char *arg)ostream [inline]
    operator<<(char arg)ostream [inline]
    operator<<(signed char arg)ostream [inline]
    operator<<(unsigned char arg)ostream [inline]
    operator<<(double arg)ostream [inline]
    operator<<(int16_t arg)ostream [inline]
    operator<<(uint16_t arg)ostream [inline]
    operator<<(int32_t arg)ostream [inline]
    operator<<(uint32_t arg)ostream [inline]
    operator<<(const void *arg)ostream [inline]
    operator<<(pgm arg)ostream [inline]
    operator>>(istream &(*pf)(istream &str))istream [inline]
    operator>>(ios_base &(*pf)(ios_base &str))istream [inline]
    operator>>(ios &(*pf)(ios &str))istream [inline]
    operator>>(char *str)istream [inline]
    operator>>(char &ch)istream [inline]
    operator>>(signed char *str)istream [inline]
    operator>>(signed char &ch)istream [inline]
    operator>>(unsigned char *str)istream [inline]
    operator>>(unsigned char &ch)istream [inline]
    operator>>(bool &arg)istream [inline]
    operator>>(short &arg)istream [inline]
    operator>>(unsigned short &arg)istream [inline]
    operator>>(int16_t &arg)istream [inline]
    operator>>(uint16_t &arg)istream [inline]
    operator>>(int32_t &arg)istream [inline]
    operator>>(uint32_t &arg)istream [inline]
    operator>>(double &arg)istream [inline]
    operator>>(float &arg)istream [inline]
    operator>>(void *&arg)istream [inline]
    ostream() (defined in ostream)ostream [inline]
    outios_base [static]
    peek()istream
    pos_type typedefios_base
    precision() const ios_base [inline]
    precision(unsigned int n)ios_base [inline]
    put(char ch)ostream [inline]
    rdstate() const ios [inline]
    rightios_base [static]
    seekdir enum nameios_base
    seekg(pos_type pos)istream [inline]
    seekg(off_type off, seekdir way)istream [inline]
    seekp(pos_type pos)ostream [inline]
    seekp(off_type off, seekdir way)ostream [inline]
    setf(fmtflags fl)ios_base [inline]
    setf(fmtflags fl, fmtflags mask)ios_base [inline]
    setstate(iostate state)ios [inline]
    showbaseios_base [static]
    showpointios_base [static]
    showposios_base [static]
    skipWhite()istream
    skipwsios_base [static]
    streamsize typedefios_base
    tellg()istream [inline]
    tellp()ostream [inline]
    truncios_base [static]
    unsetf(fmtflags fl)ios_base [inline]
    uppercaseios_base [static]
    width()ios_base [inline]
    width(unsigned n)ios_base [inline]
    + + + diff --git a/libs/SdFatBeta20120108/html/classiostream.html b/libs/SdFatBeta20120108/html/classiostream.html new file mode 100644 index 0000000..27be72b --- /dev/null +++ b/libs/SdFatBeta20120108/html/classiostream.html @@ -0,0 +1,2385 @@ + + + + +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]
    + +

    List of all members.

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

    +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<< (const signed char *arg)
    ostreamoperator<< (uint32_t arg)
    ostreamoperator<< (const void *arg)
    ostreamoperator<< (pgm arg)
    ostreamoperator<< (int32_t arg)
    ostreamoperator<< (unsigned char arg)
    ostreamoperator<< (ostream &(*pf)(ostream &str))
    ostreamoperator<< (ios_base &(*pf)(ios_base &str))
    ostreamoperator<< (bool arg)
    ostreamoperator<< (const char *arg)
    ostreamoperator<< (const unsigned char *arg)
    ostreamoperator<< (char arg)
    ostreamoperator<< (signed char arg)
    ostreamoperator<< (double arg)
    ostreamoperator<< (int16_t arg)
    ostreamoperator<< (uint16_t arg)
    istreamoperator>> (signed char *str)
    istreamoperator>> (unsigned char &ch)
    istreamoperator>> (float &arg)
    istreamoperator>> (int16_t &arg)
    istreamoperator>> (double &arg)
    istreamoperator>> (char *str)
    istreamoperator>> (uint32_t &arg)
    istreamoperator>> (unsigned char *str)
    istreamoperator>> (void *&arg)
    istreamoperator>> (signed char &ch)
    istreamoperator>> (bool &arg)
    istreamoperator>> (ios_base &(*pf)(ios_base &str))
    istreamoperator>> (char &ch)
    istreamoperator>> (int32_t &arg)
    istreamoperator>> (short &arg)
    istreamoperator>> (istream &(*pf)(istream &str))
    istreamoperator>> (unsigned short &arg)
    istreamoperator>> (ios &(*pf)(ios &str))
    istreamoperator>> (uint16_t &arg)
    int peek ()
    int precision (unsigned int n)
    int precision () const
    ostreamput (char ch)
    iostate rdstate () const
    istreamseekg (off_type off, seekdir way)
    istreamseekg (pos_type pos)
    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 n)
    unsigned width ()

    +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 [inline, inherited]
    +
    +
    +
    Returns:
    true if bad bit is set else false.
    + +
    +
    + +
    +
    + + + + + + + + +
    void ios::clear (iostate state = goodbit) [inline, inherited]
    +
    +
    +

    Clear iostate bits.

    +
    Parameters:
    + + +
    [in]stateThe flags you want to set after clearing all flags.
    +
    +
    + +

    Reimplemented in fstream, and ofstream.

    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::eof () const [inline, inherited]
    +
    +
    +
    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, inherited]
    +
    +
    +
    Returns:
    true if any iostate bit other than eof are set else false.
    + +
    +
    + +
    +
    + + + + + + + +
    char ios_base::fill () [inline, inherited]
    +
    +
    +
    Returns:
    fill character
    + +
    +
    + +
    +
    + + + + + + + + +
    char ios_base::fill (char c) [inline, inherited]
    +
    +
    +

    Set fill character

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

    set format flags

    +
    Parameters:
    + + +
    [in]flnew flag
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + +
    uint8_t ios_base::flagsToBase () [inline, protected, inherited]
    +
    +
    +
    Returns:
    current number base
    + +
    +
    + +
    +
    + + + + + + + +
    ostream& ostream::flush () [inline, inherited]
    +
    +
    +

    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 [inline, inherited]
    +
    +
    +
    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 [inline, inherited]
    +
    +
    +
    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 [inline, inherited]
    +
    +
    +
    Returns:
    null pointer if fail() is true.
    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::operator! () const [inline, inherited]
    +
    +
    +
    Returns:
    true if fail() else false.
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (const char * arg) [inline, inherited]
    +
    +
    +

    Output string

    +
    Parameters:
    + + +
    [in]argstring to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (int32_t arg) [inline, inherited]
    +
    +
    +

    Output signed long

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (uint32_t arg) [inline, inherited]
    +
    +
    +

    Output uint32_t

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

    Output pointer

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (uint16_t arg) [inline, inherited]
    +
    +
    +

    Output unsigned int

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

    Output a string from flash

    +
    Parameters:
    + + +
    [in]argpgm struct pointing to string
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (signed char arg) [inline, inherited]
    +
    +
    +

    Output character

    +
    Parameters:
    + + +
    [in]argcharacter to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (ostream &(*)(ostream &str) pf) [inline, inherited]
    +
    +
    +

    call manipulator

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

    call manipulator

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

    Output bool

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

    Output string

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

    Output string

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

    Output character

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

    Output character

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

    Output double

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (int16_t arg) [inline, inherited]
    +
    +
    +

    Output signed int

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (signed char * str) [inline, inherited]
    +
    +
    +

    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, inherited]
    +
    +
    +

    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>> (double & arg) [inline, inherited]
    +
    +
    +

    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>> (char * str) [inline, inherited]
    +
    +
    +

    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>> (uint32_t & arg) [inline, inherited]
    +
    +
    +

    Extract a value of type uint32_t.

    +
    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, inherited]
    +
    +
    +

    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, inherited]
    +
    +
    +

    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.
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (signed char & ch) [inline, inherited]
    +
    +
    +

    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, inherited]
    +
    +
    +

    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>> (ios_base &(*)(ios_base &str) pf) [inline, inherited]
    +
    +
    +

    call manipulator

    +
    Parameters:
    + + +
    [in]pffunction to call
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (char & ch) [inline, inherited]
    +
    +
    +

    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>> (int32_t & arg) [inline, inherited]
    +
    +
    +

    Extract a value of type int32_t.

    +
    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, inherited]
    +
    +
    +

    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>> (istream &(*)(istream &str) pf) [inline, inherited]
    +
    +
    +

    call manipulator

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

    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 short & arg) [inline, inherited]
    +
    +
    +

    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>> (ios &(*)(ios &str) pf) [inline, inherited]
    +
    +
    +

    call manipulator

    +
    Parameters:
    + + +
    [in]pffunction to call
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (int16_t & arg) [inline, inherited]
    +
    +
    +

    Extract a value of type int16_t.

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

    Extract a value of type uint16_t.

    +
    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 (unsigned int n) [inline, inherited]
    +
    +
    +

    set precision

    +
    Parameters:
    + + +
    [in]nnew precision
    +
    +
    +
    Returns:
    old precision
    + +
    +
    + +
    +
    + + + + + + + +
    int ios_base::precision () const [inline, inherited]
    +
    +
    +
    Returns:
    precision
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::put (char ch) [inline, inherited]
    +
    +
    +

    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 [inline, inherited]
    +
    +
    +
    Returns:
    The iostate flags for this file.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    istream& istream::seekg (off_type off,
    seekdir way 
    ) [inline, inherited]
    +
    +
    +

    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.
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::seekg (pos_type pos) [inline, inherited]
    +
    +
    +

    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.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    ostream& ostream::seekp (off_type off,
    seekdir way 
    ) [inline, inherited]
    +
    +
    +

    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.
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::seekp (pos_type pos) [inline, inherited]
    +
    +
    +

    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.
    + +
    +
    + +
    +
    + + + + + + + + +
    fmtflags ios_base::setf (fmtflags fl) [inline, inherited]
    +
    +
    +

    set format flags

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

    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, inherited]
    +
    +
    +

    Set iostate bits.

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

    used to implement ws()

    + +
    +
    + +
    +
    + + + + + + + +
    pos_type istream::tellg () [inline, inherited]
    +
    +
    +
    Returns:
    the stream position
    + +
    +
    + +
    +
    + + + + + + + +
    pos_type ostream::tellp () [inline, inherited]
    +
    +
    +
    Returns:
    the stream position
    + +
    +
    + +
    +
    + + + + + + + + +
    void ios_base::unsetf (fmtflags fl) [inline, inherited]
    +
    +
    +

    clear format flags

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

    set width

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

    Member Data Documentation

    + +
    +
    + + + + +
    const fmtflags ios_base::adjustfield = left | right | internal [static, inherited]
    +
    +
    +

    mask for adjustfield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::app = 0X4 [static, inherited]
    +
    +
    +

    seek to end before each write

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::ate = 0X8 [static, inherited]
    +
    +
    +

    open and seek to end immediately after opening

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::badbit = 0X01 [static, inherited]
    +
    +
    +

    iostate bad bit for a nonrecoverable error.

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::basefield = dec | hex | oct [static, inherited]
    +
    +
    +

    mask for basefield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::binary = 0X10 [static, inherited]
    +
    +
    +

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

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::boolalpha = 0x0100 [static, inherited]
    +
    +
    +

    use strings true/false for bool

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::dec = 0x0008 [static, inherited]
    +
    +
    +

    base 10 flag

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::eofbit = 0x02 [static, inherited]
    +
    +
    +

    iostate bit for end of file reached

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::failbit = 0X04 [static, inherited]
    +
    +
    +

    iostate fail bit for nonfatal error

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::goodbit = 0x00 [static, inherited]
    +
    +
    +

    iostate for no flags

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::hex = 0x0010 [static, inherited]
    +
    +
    +

    base 16 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::in = 0X20 [static, inherited]
    +
    +
    +

    open for input

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::internal = 0x0004 [static, inherited]
    +
    +
    +

    fill between sign/base prefix and number

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::left = 0x0001 [static, inherited]
    +
    +
    +

    left adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::oct = 0x0020 [static, inherited]
    +
    +
    +

    base 8 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::out = 0X40 [static, inherited]
    +
    +
    +

    open for output

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::right = 0x0002 [static, inherited]
    +
    +
    +

    right adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showbase = 0x0200 [static, inherited]
    +
    +
    +

    use prefix 0X for hex and 0 for oct

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpoint = 0x0400 [static, inherited]
    +
    +
    +

    always show '.' for floating numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpos = 0x0800 [static, inherited]
    +
    +
    +

    show + sign for nonnegative numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::skipws = 0x1000 [static, inherited]
    +
    +
    +

    skip initial white space

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::trunc = 0X80 [static, inherited]
    +
    +
    +

    truncate an existing stream when opening

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::uppercase = 0x4000 [static, inherited]
    +
    +
    +

    use uppercase letters in number representations

    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + diff --git a/libs/SdFatBeta20120108/html/classiostream__coll__graph.png b/libs/SdFatBeta20120108/html/classiostream__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..d961f68bcf1c6a04168ffacbb05ea076c96d4197 GIT binary patch literal 5855 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 Npr>UFt<$uB{BIGcOJV>3 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/classiostream__inherit__graph.png b/libs/SdFatBeta20120108/html/classiostream__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..33c93da248c79fbcbe7eb55a66be238f64c906e6 GIT binary patch literal 6612 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 + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    istream Member List
    +
    +
    +This is the complete list of members for istream, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    adjustfieldios_base [static]
    appios_base [static]
    ateios_base [static]
    bad() const ios [inline]
    badbitios_base [static]
    basefieldios_base [static]
    beg enum valueios_base
    binaryios_base [static]
    boolalphaios_base [static]
    clear(iostate state=goodbit)ios [inline]
    cur enum valueios_base
    decios_base [static]
    end enum valueios_base
    eof() const ios [inline]
    eofbitios_base [static]
    fail() const ios [inline]
    failbitios_base [static]
    fill()ios_base [inline]
    fill(char c)ios_base [inline]
    flags() const ios_base [inline]
    flags(fmtflags fl)ios_base [inline]
    flagsToBase()ios_base [inline, protected]
    fmtflags typedefios_base
    gcount() const istream [inline]
    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 ios [inline]
    goodbitios_base [static]
    hexios_base [static]
    ignore(streamsize n=1, int delim=-1)istream
    inios_base [static]
    internalios_base [static]
    ios()ios [inline]
    ios_base() (defined in ios_base)ios_base [inline]
    iostate typedefios_base
    istream() (defined in istream)istream [inline]
    leftios_base [static]
    octios_base [static]
    off_type typedefios_base
    openmode typedefios_base
    operator const void *() const ios [inline]
    operator!() const ios [inline]
    operator>>(istream &(*pf)(istream &str))istream [inline]
    operator>>(ios_base &(*pf)(ios_base &str))istream [inline]
    operator>>(ios &(*pf)(ios &str))istream [inline]
    operator>>(char *str)istream [inline]
    operator>>(char &ch)istream [inline]
    operator>>(signed char *str)istream [inline]
    operator>>(signed char &ch)istream [inline]
    operator>>(unsigned char *str)istream [inline]
    operator>>(unsigned char &ch)istream [inline]
    operator>>(bool &arg)istream [inline]
    operator>>(short &arg)istream [inline]
    operator>>(unsigned short &arg)istream [inline]
    operator>>(int16_t &arg)istream [inline]
    operator>>(uint16_t &arg)istream [inline]
    operator>>(int32_t &arg)istream [inline]
    operator>>(uint32_t &arg)istream [inline]
    operator>>(double &arg)istream [inline]
    operator>>(float &arg)istream [inline]
    operator>>(void *&arg)istream [inline]
    outios_base [static]
    peek()istream
    pos_type typedefios_base
    precision() const ios_base [inline]
    precision(unsigned int n)ios_base [inline]
    rdstate() const ios [inline]
    rightios_base [static]
    seekdir enum nameios_base
    seekg(pos_type pos)istream [inline]
    seekg(off_type off, seekdir way)istream [inline]
    setf(fmtflags fl)ios_base [inline]
    setf(fmtflags fl, fmtflags mask)ios_base [inline]
    setstate(iostate state)ios [inline]
    showbaseios_base [static]
    showpointios_base [static]
    showposios_base [static]
    skipWhite()istream
    skipwsios_base [static]
    streamsize typedefios_base
    tellg()istream [inline]
    truncios_base [static]
    unsetf(fmtflags fl)ios_base [inline]
    uppercaseios_base [static]
    width()ios_base [inline]
    width(unsigned n)ios_base [inline]
    + + + diff --git a/libs/SdFatBeta20120108/html/classistream.html b/libs/SdFatBeta20120108/html/classistream.html new file mode 100644 index 0000000..0197b2c --- /dev/null +++ b/libs/SdFatBeta20120108/html/classistream.html @@ -0,0 +1,1843 @@ + + + + +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]
    + +

    List of all members.

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

    +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)
     operator const void * () const
    bool operator! () const
    istreamoperator>> (ios &(*pf)(ios &str))
    istreamoperator>> (int32_t &arg)
    istreamoperator>> (signed char &ch)
    istreamoperator>> (uint32_t &arg)
    istreamoperator>> (double &arg)
    istreamoperator>> (unsigned char *str)
    istreamoperator>> (float &arg)
    istreamoperator>> (char *str)
    istreamoperator>> (void *&arg)
    istreamoperator>> (unsigned char &ch)
    istreamoperator>> (bool &arg)
    istreamoperator>> (istream &(*pf)(istream &str))
    istreamoperator>> (ios_base &(*pf)(ios_base &str))
    istreamoperator>> (short &arg)
    istreamoperator>> (char &ch)
    istreamoperator>> (unsigned short &arg)
    istreamoperator>> (signed char *str)
    istreamoperator>> (int16_t &arg)
    istreamoperator>> (uint16_t &arg)
    int peek ()
    int precision () const
    int precision (unsigned int n)
    iostate rdstate () const
    istreamseekg (off_type off, seekdir way)
    istreamseekg (pos_type pos)
    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 n)
    unsigned width ()

    +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

    +
    +
    +
    + +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + +
    bool ios::bad () const [inline, inherited]
    +
    +
    +
    Returns:
    true if bad bit is set else false.
    + +
    +
    + +
    +
    + + + + + + + + +
    void ios::clear (iostate state = goodbit) [inline, inherited]
    +
    +
    +

    Clear iostate bits.

    +
    Parameters:
    + + +
    [in]stateThe flags you want to set after clearing all flags.
    +
    +
    + +

    Reimplemented in fstream, and ofstream.

    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::eof () const [inline, inherited]
    +
    +
    +
    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, inherited]
    +
    +
    +
    Returns:
    true if any iostate bit other than eof are set else false.
    + +
    +
    + +
    +
    + + + + + + + +
    char ios_base::fill () [inline, inherited]
    +
    +
    +
    Returns:
    fill character
    + +
    +
    + +
    +
    + + + + + + + + +
    char ios_base::fill (char c) [inline, inherited]
    +
    +
    +

    Set fill character

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

    set format flags

    +
    Parameters:
    + + +
    [in]flnew flag
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + +
    uint8_t ios_base::flagsToBase () [inline, protected, inherited]
    +
    +
    +
    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 [inline, inherited]
    +
    +
    +
    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 [inline, inherited]
    +
    +
    +
    Returns:
    null pointer if fail() is true.
    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::operator! () const [inline, inherited]
    +
    +
    +
    Returns:
    true if fail() else false.
    + +
    +
    + +
    +
    + + + + + + + + +
    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>> (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.
    + +
    +
    + +
    +
    + + + + + + + + +
    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>> (int32_t & arg) [inline]
    +
    +
    +

    Extract a value of type int32_t.

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

    Extract a value of type uint32_t.

    +
    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>> (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>> (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>> (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>> (ios_base &(*)(ios_base &str) pf) [inline]
    +
    +
    +

    call manipulator

    +
    Parameters:
    + + +
    [in]pffunction to call
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    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>> (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>> (istream &(*)(istream &str) pf) [inline]
    +
    +
    +

    call manipulator

    +
    Parameters:
    + + +
    [in]pffunction to call
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    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>> (ios &(*)(ios &str) pf) [inline]
    +
    +
    +

    call manipulator

    +
    Parameters:
    + + +
    [in]pffunction to call
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    istream& istream::operator>> (int16_t & arg) [inline]
    +
    +
    +

    Extract a value of type int16_t.

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

    Extract a value of type uint16_t.

    +
    Parameters:
    + + +
    [out]arglocation to store the value.
    +
    +
    +
    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.
    + +
    +
    + +
    +
    + + + + + + + +
    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 [inline, inherited]
    +
    +
    +
    Returns:
    precision
    + +
    +
    + +
    +
    + + + + + + + + +
    int ios_base::precision (unsigned int n) [inline, inherited]
    +
    +
    +

    set precision

    +
    Parameters:
    + + +
    [in]nnew precision
    +
    +
    +
    Returns:
    old precision
    + +
    +
    + +
    +
    + + + + + + + +
    iostate ios::rdstate () const [inline, inherited]
    +
    +
    +
    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,
    fmtflags mask 
    ) [inline, inherited]
    +
    +
    +

    modify format flags

    +
    Parameters:
    + + + +
    [in]maskflags to be removed
    [in]flflags to be set after mask bits have been cleared
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + + +
    fmtflags ios_base::setf (fmtflags fl) [inline, inherited]
    +
    +
    +

    set format flags

    +
    Parameters:
    + + +
    [in]flnew flags to be or'ed in
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + + +
    void ios::setstate (iostate state) [inline, inherited]
    +
    +
    +

    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) [inline, inherited]
    +
    +
    +

    clear format flags

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

    set width

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

    Member Data Documentation

    + +
    +
    + + + + +
    const fmtflags ios_base::adjustfield = left | right | internal [static, inherited]
    +
    +
    +

    mask for adjustfield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::app = 0X4 [static, inherited]
    +
    +
    +

    seek to end before each write

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::ate = 0X8 [static, inherited]
    +
    +
    +

    open and seek to end immediately after opening

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::badbit = 0X01 [static, inherited]
    +
    +
    +

    iostate bad bit for a nonrecoverable error.

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::basefield = dec | hex | oct [static, inherited]
    +
    +
    +

    mask for basefield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::binary = 0X10 [static, inherited]
    +
    +
    +

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

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::boolalpha = 0x0100 [static, inherited]
    +
    +
    +

    use strings true/false for bool

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::dec = 0x0008 [static, inherited]
    +
    +
    +

    base 10 flag

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::eofbit = 0x02 [static, inherited]
    +
    +
    +

    iostate bit for end of file reached

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::failbit = 0X04 [static, inherited]
    +
    +
    +

    iostate fail bit for nonfatal error

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::goodbit = 0x00 [static, inherited]
    +
    +
    +

    iostate for no flags

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::hex = 0x0010 [static, inherited]
    +
    +
    +

    base 16 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::in = 0X20 [static, inherited]
    +
    +
    +

    open for input

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::internal = 0x0004 [static, inherited]
    +
    +
    +

    fill between sign/base prefix and number

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::left = 0x0001 [static, inherited]
    +
    +
    +

    left adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::oct = 0x0020 [static, inherited]
    +
    +
    +

    base 8 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::out = 0X40 [static, inherited]
    +
    +
    +

    open for output

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::right = 0x0002 [static, inherited]
    +
    +
    +

    right adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showbase = 0x0200 [static, inherited]
    +
    +
    +

    use prefix 0X for hex and 0 for oct

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpoint = 0x0400 [static, inherited]
    +
    +
    +

    always show '.' for floating numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpos = 0x0800 [static, inherited]
    +
    +
    +

    show + sign for nonnegative numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::skipws = 0x1000 [static, inherited]
    +
    +
    +

    skip initial white space

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::trunc = 0X80 [static, inherited]
    +
    +
    +

    truncate an existing stream when opening

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::uppercase = 0x4000 [static, inherited]
    +
    +
    +

    use uppercase letters in number representations

    + +
    +
    +
    The documentation for this class was generated from the following files:
      +
    • Arduino/libraries/SdFat/istream.h
    • +
    • Arduino/libraries/SdFat/istream.cpp
    • +
    +
    + + + diff --git a/libs/SdFatBeta20120108/html/classistream__coll__graph.png b/libs/SdFatBeta20120108/html/classistream__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..537960123d6e5ad429f64ae1345914af33c0b87b GIT binary patch literal 1729 zcmb`IdpOg39LImmHCB<7%X!ic$t`RyAtFQW#wI2U$)%WzFtj>L$2Bn=hM}~%O_;M3 z%4JE-7Aobkq1fXRxkpOQ>O7sE=lpxl^L@VG&-Z!%@%=o{`}_L7zbS4mcHnJ_+W-In z+aHI!3#x};HcN;JRt3uKc|j2iaI}L1Ti-_M!}4r_5N!{)LdF)&kzGTSQOaGdt%E%3 zD>(-WkN3edm5{m{J`^BYE&27m6`bPCs03r;+|Fi0FvBVsbKIFv<($VfnwqOtUEO#%nPdaHXi)|@t%`iqMp&w zgd6N)``@|LfZl}pSq0T3Qv5e$yBWrI~SfZhm8h61jr$bzb<~O%d zyX4yNz$0e%FdC;^-&0#AVQ5_r+X`(otL1&@$f`R1tYck&IRGZHGBLEa5Xh(xJdF-2 zUtV*pqJseBwZYBLy4Xrns)19tT%WfLjdrD^1;1IFSDm2&Zh#KY?f3xdFh=&FUD04` za*aWSG@BJ>@HJjEGo%rlI>zvA9wF1Tzp2v9F}czhZn1|=b$>xDqbi@Sr_nHaYCv)d zVX0WJjRKF}Rjp9Y&r$gO?R!Yvo69aT1^}-9P5k^<&3CMhJ5DH*8cj*#8#c^39F3d2 z8 zFUOiJPIPtbIIF+nD)VXlHSx9v#7AgT9jz%{e-a;NSpL#Ge>!^d+@fAhI~H^5hou*O zy8C}@4aa`X#N_NCgq!Lw0?VDB&!itNu)?IqQ8#6PqriF~H??Eol(z1c5gy+7NwLiu zzz2A4llx3)n;!^VKE1C0jna3}l)r&hBQav7bij_#b4L$WQuZLqm{-cd^aR~&mU#p< z5{UTZ)V^ScB=@>koOw|gM5s^)b^}6+&I@R%i(h*X z-MOCkD1{Lj%0i?;f4sfiPl^?yjFne(Bkg{9n$ejcf4?-~6`$gxe0G(0Uti(f)Fvt2L z8hehSJmENfbq|p)BqN1!!ii`hLFnbGI{ty55d|t(T~)DqMEZ`*NgzR9=S|3zG2ix{ z(8BayBaQFD^3Rq1aP>c`6S#}9+uE3-U0F|WC>`BbRFohKJV)+knw|jCjW@n-FgMuK zJ7+dN9qC2|btC&b+mnV6e9Yk1gAL2EG& zS$FA1y`$u!;^IeY21CN*p^Gi;OLdpZrg2LzX0(=W`VOR3AS(O#?HRT)(8@6P%b~bM zzQ22#EP6=tV7T~z*`C^3nzgIH4s57jth+2Tnn;fm)>^r|OuJhc!#il71W3uf<_wzU zBTIH?S=#W96z4IpQJem&Xqkdw5&2c0^J!jabd$8-ftsQ%vv1M%ug4ceTDO+qChepG mD|A-4FrH=#2*SThfwk4jj8jUNvrZEHNr1hL3;gaeKf+(KH8oTK literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/classistream__inherit__graph.png b/libs/SdFatBeta20120108/html/classistream__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..0bc39cf6f23f1f0393c505952260ab69cd6fe50c GIT binary patch literal 6799 zcmc&(cT`i`n?)?}L_`rmsiL6L0vZIQDo6=csiA~o2}MJPKxiT&0@6Y=2t*}-bPxh0 zF$5dPgBS@VLMRWUg%YHNPA0tHteN*)v*zEKWM$p8zID#cKIhx}JKxvtg1qKw(<;Yz#<6B(p{qJjHX(kt!=q=E#o3>&33&Sz# z;*(L+OOz&0dxffZ`rIG_kl@aJG~hV>8~FGMf(kx;<5FAQ$wRe5f!RfYy2-<1CatGS zeJHu6hmXxyCnmpNEN7a3)iv%Nz$N_(0s!K!Yq@{^I&^(6JjvjND)7@)(xb#are(}x z+VBJ8BGiBzuxGdHgPWbrAcGmcrA5?1hZizOat?7&{{3o?m>Q4i9dE<|82T#8uYwPlh)aEIJAM(uWqDc_!o^i76npsGnM1;l z-A{nIp4@boR?=p0r$-+Wwoi7yd6!qQQkce+zT%P)-xsJ9Zx8e9^vS7EkCI(brj3}= z`sT0ko`{XdmLIPk^v15tDiM%s73i8!2zl1v^%=ppr|d-qt9VawmnC<9*4I*G`In<> z9E#$0$^BpdcmgnRe*@{iD)R`_{o5B8(oLVedhCzx;|t7zusF2Cisqr`lEVGvp_dyq zszyF!vx4n=3e{0fE>XNfvGINHkLam8`(hWW@9&w;o_mcy78`Hrqb75~rB;!fui(~Y z4~WLh@qe!C0Pm6gh33nC*+lw+@Xxa}-Kc3u0Jj-$>O=m0h=~*e zY~oTp?w8w8=R<9a_imNrRm40dxlt8(28NYfUmnSSA}uY54VjbhWUX7VzjSStmlC$; zJ2J(Z^w>KP<%@P=)C5Uk!M;(w6-l5LOi#7`9VuojPsT?d!GSW^Vg&4}9MfLC`0S}k zSE@u&9O}jCzK!I1>#~jC^%P5q1r7#f4hD0z3SznDPuB$F3<$jpv7ddxQ|*mz)+I}V zg&EDyh0M+fovm>6ueVrd-YCMRNJGngh}0) zrFW>3+!DuPYm|rH;dH=e~T)Rp+4JC3uhhn}96 z;fO<1iS@o5eejU5b+WXy<>&Mh-d~CZ-X%*4BdxXOo%8MeB#86RSEd6tZ-Icwg7l~kglwf18i>AV{oqXS<2 z+TdB6dT@0qK0zR6o*ja}h!N3Ilqt7PtjSfi@$5G*zDtASB{5>L@wZS6C`fF!Yw+Az zPriVo+v^PY=J|`uy>*TK&HQciW2Mfw61P;`k!tP>Z>3 z16IS^Gs7hRrXw4Rfz#aP6<{XXuVpUF`+$y93g&(C91tih&S9tuKxZka0z1kmNh?cLH1|otswEw z+$WB4^W9M4Rpk13u9oXiT&ubCZsZm7@;FTQ`;@_lYBj8I;$P<*@O%dP4KDTR zULlWr8;x&-s3XAOrdf}H@s&QWQ1`+();lBjH?lcmQ&p?jK2d&=Zo(PCyTeWr=TinR zRNfHao9lmM0@m`w(d8$K?V7|Mv<*K7LcT$LH_pNd}}fA)0$#QTSC z{&fWYBj8`GC0vlz&ze?7b)B7EWFKBzCz&dfcA_k-q?~LHL`BhMaZt~+sx7RT+Jvgg zZ$yFiW?Ek1-X$ERvh3O6p1JTVg9)vl-jZ@wbwQ{}5%SO0)~{OXu)%PU+o)r19!%UZ z|5W=WW_ouJbz$RZ&wT&ibYk2(uBz|%_0W@IrG3`>X#O5 zgPv;eUv4iSv|Io|_h#<~%<@#gE}*4|?K<)%lHLqbK`w?A)Wja7sc+{}v{yX8VtW&U zUnj&HDdrN^1nXyJHTwPXEJ*gqp=+1Q{5()yJE}D%TXhkv_5K$8j1!#vy~&dX+7hUM zdAOh3`+VxsTR8q<>D2ndSLF%ySDO!lf(Fv2SKp{ApiIg zy8uPim~9!7*Wa33Sp8@=!@sx9LjqqDTvP)dCInS0i>(p`EY-HtF z%R+S$>MAm3RB_9;E^MQSYLJc1PPH6Yl(sx&DCY7WhP=zUUtYYOAr&&mtH95n!gM{V z0D2!3g!{zAHrOdzMnk9=0{NN~RJT&5!*xND-SL+@Gne)r5G)xR-y@W~E(z@M^F~QF z6DX#La@)Zz<2gq(%2%ZxRXnYBVUzzM%x`6C!{E+@UZ6vdYbN0?e0$wEEqY$69}fr? zj*Z7BeNAM`dEb4*W0#BKl)I%hYS`zIu4NWfhCa;{6E0QU`QR5lGAp4O%)r1h)Y&M5z##RSLeCOM__kCr zwf9m#L9%|M4H4^A;>fwKHR!0^-mINq%M|FUs`gy0pD~~+MTNK~Wu33}Pb$z7Se*`x zmjlLtsTYERc128=s+{m8a-r+F7~Cu8Islw70x6AuM%Wr!*xDalgWWYqVCtQ1@7~J; zKC44TX`~ia$PTA>!nWE{C3pbfIn5uAhlE|PXoSr@OqHT&%Xy;-Zf^1xOuf)~COX^H z2A#E991rx%xZjl3xz4^%oYM+8kElSQyS-Xa=z#HCEcO2S)FR`>h@oLAf7*N`<#w7- zvgZf{FuLx4@zg@jeAvaz&FwdDx`}g+0-ABHPh{kB6 zh`%2L=orG*xD-ZWZ05dCw*vxbY}bzW&~DkU<58nNF&0JBrlCI|A|{PBws{-Y1X^OB zbS;9DI^57ygbe#NK}tJ3@YkZwe#;n&PZ}Gmg9M0^0;{qeS4)u-lA|~crKGoiW?aa$ z3Mnty&zzKAAu%GF{?oW~@^j2L^a6$_w(nl(yoUcx&VIhYBoFN#oLugW1JN2Tqm{+8 zFn0sS@j|_UMT8iAYG!>se(7gjhc)$DY#dWZHdibvhBGUoW4r4rp-0Hx+eXncvaJjL ziZS1!tCLL;sW!!5JOS1j`>@j1*tPCDZ^LA@PLY=;zm5|}t?<Fq%{Yt!roHyhtaMPCwYs=>x?}8z>VKuI+4+EFR#@*9g^Rs z-F`|K#_w`kZtdJ)81cDZay3>xlaiJ~Fm}7v10Qb=45%{!SJ~mT*W85|76FxR<+eLz zoIUEytS%Ed35Iyx$Ef5}rrG@vxM^raokn^4uif9h@WcLY@-gU8&j48C(IM4V58!p$^=+Oyj^Mb3+QEkui3!Ryx@T|I=c z`1UVFokrE;Wss<=3))7(#Z&h zfCE=&bSOEUo-Jhab^IJ>{#hM zY?sn2wdIJ?uy{NfevnvhJ3BOdquVLr_;8Fh)eGPd_N9v*1W@1er+1Cm_gj^XcKcQ?bLSW(Mjkb_ z)%3P*%v=q$UaSRHQqeVEHM#tyfRD$k`@)}`V_Hj#4o49rQ-3|Dt0>3uXFgwgPKdqR zU3U-8u5>BfsoIQq#4y<0NoGgg$N1Y*LyAwv_Ia$p4@T{E4)F_NO^Xw)Oj#GrDW&l&>#vUccpO&)FB0P%&#A3xI7jk|{qG6ydWw7)fh z3nve`3#>_8UtU6+A{+n?&305{4lz2nw%4?*^mI1$saV+*N&8oJqx`n-*8|mWSElE3 zbQkc52?`2+HI)s53eg0vZfnw&pQ z=I0+~r9KK}v76_1G+62Z?h;i?w~N8~;&2*4mIzFmDm)`9?~)a4S779h{bneV;`f*D zYpqTAMVqzF0oW@%zjSIJXc+-bqXl)xiT*-wcz5Qypo3=m|AEWS)iS! z>siEpRS(kGfP_fWT^OQ*{l^c_@dIc1MMO%&`-1w+D_}*g+avC{L0Zjy*LoJ-qy641 zxa(RAiMr4mvOn9d$~8=By~LuFZ9Rv*THN0*m8%skNbzcLAx>9Z|J^jW)=>V;SK~~V+TsW3 zVpDfu1*&O~cJckLfs`QkjP(Ed$l1-DtBtmx=BU*a(TQ&i=5WOZa~}nDrR0_kl!n{R zXQ#!+(l%RL=LBo+9Zr*~M$FX=`GSJv!qU7Wy2^-d!g5=YFZ~9VIlc+S^rjNIDMsDp zzz3rUAa2OS5ouZs7h3p1(O|_@Kz4lo`kb`N9#WE}| zPT2(&taIauZx-e<)q)z9x975`sv`yt5MO}PDp8a??-=SD7w9K$YN26nbO-9642h7{!^|kh;DY&d% zPapzN+vrRDWez8r*^y*`6#N{-xoIQ-`lR@PL^j#C8T!V-PN~mrL`MX?y9->rQr|Pu zgfiUS?V-usIhB5F^b(F{-eroQhfk*zFF)xo%w zX+N#@E@hic3W-1_lh+m&+#MCDz}Rd`TH(WzVV|w_Oel1(Epo3hNYnnz4-e*&Ye(Lm zL>+1!WI8KMWl<9ZI~XM8-B|ZNq=e{1eTr$% zBi4#_ktNLVPc88-*3yjg{&_31u=HRE(lB3p^OuYRX-17aZDp{=ZMI)PZ+CXyL@F}4 ze+Z$~y%z)dIF9naFYrafp`1$)t`je3%?==pit3*}9P?qL-mO&^ZRHY>p|cCe?1AWd zznO+?CLGcf(|EO3(}O5B+OX#qN?SN|sgGEeiD^;q2d!*pq03 zEZ)nCr4{RxAE_Q8P70|W*XDFsy=NsGzWNAw_a60OKbpLv*xN*XGc&I0j_nVc(tNiY zM5KAxrR7#gRfOO3w%7=*A`JY&u61)KWXo**jALv4LDI z@G7X=O!+QQDJJhASLgZvje0MPXdY2uDv5bt+Kcd!V + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    obufstream Member List
    +
    +
    +This is the complete list of members for obufstream, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    adjustfieldios_base [static]
    appios_base [static]
    ateios_base [static]
    bad() const ios [inline]
    badbitios_base [static]
    basefieldios_base [static]
    beg enum valueios_base
    binaryios_base [static]
    boolalphaios_base [static]
    buf()obufstream [inline]
    clear(iostate state=goodbit)ios [inline]
    cur enum valueios_base
    decios_base [static]
    end enum valueios_base
    eof() const ios [inline]
    eofbitios_base [static]
    fail() const ios [inline]
    failbitios_base [static]
    fill()ios_base [inline]
    fill(char c)ios_base [inline]
    flags() const ios_base [inline]
    flags(fmtflags fl)ios_base [inline]
    flagsToBase()ios_base [inline, protected]
    flush()ostream [inline]
    fmtflags typedefios_base
    good() const ios [inline]
    goodbitios_base [static]
    hexios_base [static]
    inios_base [static]
    init(char *buf, uint16_t size)obufstream [inline]
    internalios_base [static]
    ios()ios [inline]
    ios_base() (defined in ios_base)ios_base [inline]
    iostate typedefios_base
    leftios_base [static]
    length()obufstream [inline]
    obufstream()obufstream [inline]
    obufstream(char *buf, uint16_t size)obufstream [inline]
    octios_base [static]
    off_type typedefios_base
    openmode typedefios_base
    operator const void *() const ios [inline]
    operator!() const ios [inline]
    operator<<(ostream &(*pf)(ostream &str))ostream [inline]
    operator<<(ios_base &(*pf)(ios_base &str))ostream [inline]
    operator<<(bool arg)ostream [inline]
    operator<<(const char *arg)ostream [inline]
    operator<<(const signed char *arg)ostream [inline]
    operator<<(const unsigned char *arg)ostream [inline]
    operator<<(char arg)ostream [inline]
    operator<<(signed char arg)ostream [inline]
    operator<<(unsigned char arg)ostream [inline]
    operator<<(double arg)ostream [inline]
    operator<<(int16_t arg)ostream [inline]
    operator<<(uint16_t arg)ostream [inline]
    operator<<(int32_t arg)ostream [inline]
    operator<<(uint32_t arg)ostream [inline]
    operator<<(const void *arg)ostream [inline]
    operator<<(pgm arg)ostream [inline]
    ostream() (defined in ostream)ostream [inline]
    outios_base [static]
    pos_type typedefios_base
    precision() const ios_base [inline]
    precision(unsigned int n)ios_base [inline]
    put(char ch)ostream [inline]
    rdstate() const ios [inline]
    rightios_base [static]
    seekdir enum nameios_base
    seekp(pos_type pos)ostream [inline]
    seekp(off_type off, seekdir way)ostream [inline]
    setf(fmtflags fl)ios_base [inline]
    setf(fmtflags fl, fmtflags mask)ios_base [inline]
    setstate(iostate state)ios [inline]
    showbaseios_base [static]
    showpointios_base [static]
    showposios_base [static]
    skipwsios_base [static]
    streamsize typedefios_base
    tellp()ostream [inline]
    truncios_base [static]
    unsetf(fmtflags fl)ios_base [inline]
    uppercaseios_base [static]
    width()ios_base [inline]
    width(unsigned n)ios_base [inline]
    + + + diff --git a/libs/SdFatBeta20120108/html/classobufstream.html b/libs/SdFatBeta20120108/html/classobufstream.html new file mode 100644 index 0000000..0813a97 --- /dev/null +++ b/libs/SdFatBeta20120108/html/classobufstream.html @@ -0,0 +1,1707 @@ + + + + +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]
    + +

    List of all members.

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

    +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, uint16_t size)
    uint16_t length ()
     obufstream (char *buf, uint16_t size)
     obufstream ()
     operator const void * () const
    bool operator! () const
    ostreamoperator<< (int16_t arg)
    ostreamoperator<< (bool arg)
    ostreamoperator<< (uint16_t arg)
    ostreamoperator<< (int32_t arg)
    ostreamoperator<< (const char *arg)
    ostreamoperator<< (uint32_t arg)
    ostreamoperator<< (const signed char *arg)
    ostreamoperator<< (const void *arg)
    ostreamoperator<< (pgm arg)
    ostreamoperator<< (const unsigned char *arg)
    ostreamoperator<< (char arg)
    ostreamoperator<< (ostream &(*pf)(ostream &str))
    ostreamoperator<< (signed char arg)
    ostreamoperator<< (ios_base &(*pf)(ios_base &str))
    ostreamoperator<< (unsigned char arg)
    ostreamoperator<< (double arg)
    int precision (unsigned int n)
    int precision () const
    ostreamput (char ch)
    iostate rdstate () const
    ostreamseekp (off_type off, seekdir way)
    ostreamseekp (pos_type pos)
    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,
    uint16_t size 
    ) [inline]
    +
    +
    +

    Constructor

    +
    Parameters:
    + + + +
    [in]bufbuffer for formatted string
    [in]sizebuffer size
    +
    +
    + +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + +
    bool ios::bad () const [inline, inherited]
    +
    +
    +
    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) [inline, inherited]
    +
    +
    +

    Clear iostate bits.

    +
    Parameters:
    + + +
    [in]stateThe flags you want to set after clearing all flags.
    +
    +
    + +

    Reimplemented in fstream, and ofstream.

    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::eof () const [inline, inherited]
    +
    +
    +
    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, inherited]
    +
    +
    +
    Returns:
    true if any iostate bit other than eof are set else false.
    + +
    +
    + +
    +
    + + + + + + + +
    char ios_base::fill () [inline, inherited]
    +
    +
    +
    Returns:
    fill character
    + +
    +
    + +
    +
    + + + + + + + + +
    char ios_base::fill (char c) [inline, inherited]
    +
    +
    +

    Set fill character

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

    set format flags

    +
    Parameters:
    + + +
    [in]flnew flag
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + +
    uint8_t ios_base::flagsToBase () [inline, protected, inherited]
    +
    +
    +
    Returns:
    current number base
    + +
    +
    + +
    +
    + + + + + + + +
    ostream& ostream::flush () [inline, inherited]
    +
    +
    +

    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 [inline, inherited]
    +
    +
    +
    Returns:
    True if no iostate flags are set else false.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void obufstream::init (char * buf,
    uint16_t size 
    ) [inline]
    +
    +
    +

    Initialize an obufstream

    +
    Parameters:
    + + + +
    [in]bufbuffer for formatted string
    [in]sizebuffer size
    +
    +
    + +
    +
    + +
    +
    + + + + + + + +
    uint16_t obufstream::length () [inline]
    +
    +
    +
    Returns:
    the length of the formatted string
    + +
    +
    + +
    +
    + + + + + + + +
    ios::operator const void * () const [inline, inherited]
    +
    +
    +
    Returns:
    null pointer if fail() is true.
    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::operator! () const [inline, inherited]
    +
    +
    +
    Returns:
    true if fail() else false.
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (const signed char * arg) [inline, inherited]
    +
    +
    +

    Output string

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

    Output string

    +
    Parameters:
    + + +
    [in]argstring to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (int32_t arg) [inline, inherited]
    +
    +
    +

    Output signed long

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (uint32_t arg) [inline, inherited]
    +
    +
    +

    Output uint32_t

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

    Output pointer

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

    Output string

    +
    Parameters:
    + + +
    [in]argstring to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (pgm arg) [inline, inherited]
    +
    +
    +

    Output a string from flash

    +
    Parameters:
    + + +
    [in]argpgm struct pointing to string
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (ios_base &(*)(ios_base &str) pf) [inline, inherited]
    +
    +
    +

    call manipulator

    +
    Parameters:
    + + +
    [in]pffunction to call
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (char arg) [inline, inherited]
    +
    +
    +

    Output character

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

    Output character

    +
    Parameters:
    + + +
    [in]argcharacter to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (bool arg) [inline, inherited]
    +
    +
    +

    Output bool

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (unsigned char arg) [inline, inherited]
    +
    +
    +

    Output character

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

    Output double

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (ostream &(*)(ostream &str) pf) [inline, inherited]
    +
    +
    +

    call manipulator

    +
    Parameters:
    + + +
    [in]pffunction to call
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (int16_t arg) [inline, inherited]
    +
    +
    +

    Output signed int

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (uint16_t arg) [inline, inherited]
    +
    +
    +

    Output unsigned int

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    int ios_base::precision (unsigned int n) [inline, inherited]
    +
    +
    +

    set precision

    +
    Parameters:
    + + +
    [in]nnew precision
    +
    +
    +
    Returns:
    old precision
    + +
    +
    + +
    +
    + + + + + + + +
    int ios_base::precision () const [inline, inherited]
    +
    +
    +
    Returns:
    precision
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::put (char ch) [inline, inherited]
    +
    +
    +

    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 [inline, inherited]
    +
    +
    +
    Returns:
    The iostate flags for this file.
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::seekp (pos_type pos) [inline, inherited]
    +
    +
    +

    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, inherited]
    +
    +
    +

    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) [inline, inherited]
    +
    +
    +

    set format flags

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

    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, inherited]
    +
    +
    +

    Set iostate bits.

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

    clear format flags

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

    set width

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

    Member Data Documentation

    + +
    +
    + + + + +
    const fmtflags ios_base::adjustfield = left | right | internal [static, inherited]
    +
    +
    +

    mask for adjustfield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::app = 0X4 [static, inherited]
    +
    +
    +

    seek to end before each write

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::ate = 0X8 [static, inherited]
    +
    +
    +

    open and seek to end immediately after opening

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::badbit = 0X01 [static, inherited]
    +
    +
    +

    iostate bad bit for a nonrecoverable error.

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::basefield = dec | hex | oct [static, inherited]
    +
    +
    +

    mask for basefield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::binary = 0X10 [static, inherited]
    +
    +
    +

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

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::boolalpha = 0x0100 [static, inherited]
    +
    +
    +

    use strings true/false for bool

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::dec = 0x0008 [static, inherited]
    +
    +
    +

    base 10 flag

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::eofbit = 0x02 [static, inherited]
    +
    +
    +

    iostate bit for end of file reached

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::failbit = 0X04 [static, inherited]
    +
    +
    +

    iostate fail bit for nonfatal error

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::goodbit = 0x00 [static, inherited]
    +
    +
    +

    iostate for no flags

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::hex = 0x0010 [static, inherited]
    +
    +
    +

    base 16 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::in = 0X20 [static, inherited]
    +
    +
    +

    open for input

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::internal = 0x0004 [static, inherited]
    +
    +
    +

    fill between sign/base prefix and number

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::left = 0x0001 [static, inherited]
    +
    +
    +

    left adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::oct = 0x0020 [static, inherited]
    +
    +
    +

    base 8 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::out = 0X40 [static, inherited]
    +
    +
    +

    open for output

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::right = 0x0002 [static, inherited]
    +
    +
    +

    right adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showbase = 0x0200 [static, inherited]
    +
    +
    +

    use prefix 0X for hex and 0 for oct

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpoint = 0x0400 [static, inherited]
    +
    +
    +

    always show '.' for floating numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpos = 0x0800 [static, inherited]
    +
    +
    +

    show + sign for nonnegative numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::skipws = 0x1000 [static, inherited]
    +
    +
    +

    skip initial white space

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::trunc = 0X80 [static, inherited]
    +
    +
    +

    truncate an existing stream when opening

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::uppercase = 0x4000 [static, inherited]
    +
    +
    +

    use uppercase letters in number representations

    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + diff --git a/libs/SdFatBeta20120108/html/classobufstream__coll__graph.png b/libs/SdFatBeta20120108/html/classobufstream__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..6280da162bc338c85a9628dcd60ed192e158fe6c GIT binary patch literal 2541 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 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/classobufstream__inherit__graph.png b/libs/SdFatBeta20120108/html/classobufstream__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..6280da162bc338c85a9628dcd60ed192e158fe6c GIT binary patch literal 2541 zcmb`Jc{J4PAIHBlWX2k$qLh6XYLpQ&YBbgvVUog-%T0x3$vVc8Wul0ZY-7YQmNFzo zld@b!(v->)#x90rH)FZ#{`&py@BIG!-ShnMd4HaBp7Wf~`+1%Bc@nJAC}DxU0ssIA zo0%eQwyFyNfVM&Twv^PTA@{AqcfkUM1U7#x(hEu|0PvH|kj8dFS<~4aK2pC+{_(Qo zjndIqMFQ}Ria=sKb+-xl+C-#tJ)HnYgcO}WqUf1IC0g*Gg4QTL6H7Mbq0B+9LU%x7 zl11ZUc*yBcUOB9cTFOvOapqB3iQ%B@V}p-tzk9%7wXjOqK=Ae4+f}sX@PXj*?o~Fo z4z@H?M{t#hb(IiTaOXY(ubdH!OcWglt$Dm__T1(O%nA{V3ch$dPDo{rL;6VfT$PIh zwLKh7Ya{KE;?1o4z+ojqBEQTq4RD8O3o%5scR;8r4AJDJb8e+A*Y+pxZYq!IXUZ5( zlNpe&FL4pkGwPn1Csa-%;=ILPxW5QE?FIQ-$qnuaS8TGEz-Grl!kGq}Q|>dEyFkwe3uR5>Je^<8nh1$~Sg9#iQgo2Ca2iNjMgsNV0c zUwE*glUI%lyKy=eNLV#2cIv@Hilr59y|=Z#J4R5sV^eSH$ih0+n@Wu+P!IFpKKOG2 zH*m|=Fb;2{L_k4aU6F~ul1sxI>#aQ3XR_9H)vGn&x?m-xz?@wvsG;3rJ{K-< zRpbi|;L1S#_Zk7Qgt8JfbO9+NBejyQH5DH*%xg>%+_!IhKpj?Y06zl0bflDYc`gZI zh{;h`&v9j?5wz2G0&6R~CwaV`()3cJCKpq0moNerk{qy&nmT2#4R%Ut6Mq5om)(DJ{{NHB z$xoTjWiQX5%8r&j=~=MmTr%p{T)2y>U%8V5hR01Fj9U>RVAH}Z&*D5n1?#oUxVNI` zl1^vx{CMON5kQAMh0LMN;nZQ}hMO^qF{4zYN=lL!jL zvjP?3r%V7B)p%khg{qlEkh^!{;cygzeD6dlZ~mRAtR~*%L!jR*0m+?+=AZIxt{`V0 z;mh*Mp5kDD)Fag_=UoXLk3O{G_|Bo~ljEEAjdhgKc9r96v-Up1dA0fgUOxtJGdS{5 z9?;M%$JcdtE&~%I3LfRSh+$3r!XKQ)$lf9%ke$8#&6VsR+E6Kg4L8{Zj*n;U`_cX; zaL&=u2^uxaCo{c*4Ij|2sScb`(xol@WX#^KpgXu+tzCv-dvn?Ustp0^yt~^ldZ)1! zuNKUWLG)9-=sKv6iFFM+LVdg3p#1q0p3^~dV?_JO%Rpc60oX{pY2L^>>p+8GU-Z^t z&|_WlB`uk^*}{5?F0O;UsN}F+;YEGTl36=Md4t55UnxoKs$O{XNiaHe8kSwO@Zr=l zae|*!1$)$%ftXsXMFDS!BoGVVnU7WWTjadx5IbpgLr~fR1nBJ5-<(}fsN~ElN7K7D zRw2Md=aI}_bT;wW&4cb2NB;8nZ&v>kGDBk^xflfJbGg=1@vxA&LYhx%{ah4T)x|d} z2(;sc=dX!3oIiH8^8n5wRJ$^fkg$Xq_x7{aCJH&c8v74YTXbP}v)D8R&mtP3f>au6 z^3Vx{ahudBbb5);pS;6SpWaIm0y&(ipDOzhQ|-$&r%r_*P$Y}@+3E3|RLaTVWn>>P_{G?7rM&NA^zrwo{ztEg{t z&vxV%b*m9?NUle<+fvj3aMpC&1_-RN3h!f@`6<`_Z%mAy&5Z0loJD19<*yKur~ z7{aP#^?o%!zkxL|Qcb{A`?m@=kSMTn#0Ia!?8ZE8Z-0S5+qkI@#7|H@f9^nOvTXyT za(L>-?U>dk@H87c=jtfY(cm*-h+8F-(M@4JFQt7xKD*%u9vc(EgX;Z}A0q>^ZQ;rY z1%pq{X2ldK;gng4A2}DWf3|VwBg_@=PyKtCw@p5lFd_;IA3(~TxZUeT9JQfNXjji1 zU4v}vyC`?;$rCKsCgad(lPbtnMJq3$RT?E4%dv6zF2wV@%{w;xy3u6tD=!2$OblIZ zvcXMQT+H>kyVK!#mL!Ni5Jug61v%$cn4@-_Jji+j1r>x~BZc1Pf(-n9 z@{1m+d>w3vI|PH-qD|diH#hT@J3a$1NX@sLzgJdT>f-5H9P_w2&LUlN@J$Bnc3Q90 zzmm!l$au}Gp`|t6PoI}?r#_DFkl*TthnjAlyln5Tu`Q+55FBEQ{H9NM z&~qIhn7+6q_Az2PaD8aXKD~3`@hN9bkQwAK6`!2O3}&u#;xFm8Y&>tfGf8%~SU%cd z9&w|PBsb@0liSdb^NBF2%P~j4?rSU{8JiuuNqsGOW^^0Ce5Th{y|qW76*oFqXMB5K zvvD?G_A_+CYI`NQQrLa4gCkv-KnA`Wyn?EG^ z{!c#0X*Fu%=!xy^?KC$@&vNG^=P`DQ;Gu!#0sbhK?G2Pp>8 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/classofstream-members.html b/libs/SdFatBeta20120108/html/classofstream-members.html new file mode 100644 index 0000000..101a114 --- /dev/null +++ b/libs/SdFatBeta20120108/html/classofstream-members.html @@ -0,0 +1,191 @@ + + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    ofstream Member List
    +
    +
    +This is the complete list of members for ofstream, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    adjustfieldios_base [static]
    appios_base [static]
    ateios_base [static]
    bad() const ios [inline]
    badbitios_base [static]
    basefieldios_base [static]
    beg enum valueios_base
    binaryios_base [static]
    boolalphaios_base [static]
    clear(iostate state=goodbit)ofstream [inline]
    close()ofstream [inline]
    contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock)SdBaseFile [private]
    createContiguous(SdBaseFile *dirFile, const char *path, uint32_t size)SdBaseFile [private]
    cur enum valueios_base
    curCluster() const SdBaseFile [inline, private]
    curPosition() const SdBaseFile [inline, private]
    cwd()SdBaseFile [inline, private, static]
    dateTimeCallback(void(*dateTime)(uint16_t *date, uint16_t *time))SdBaseFile [inline, private, static]
    dateTimeCallbackCancel()SdBaseFile [inline, private, static]
    decios_base [static]
    dirEntry(dir_t *dir)SdBaseFile [private]
    dirName(const dir_t &dir, char *name)SdBaseFile [private, static]
    end enum valueios_base
    eof() const ios [inline]
    eofbitios_base [static]
    exists(const char *name)SdBaseFile [private]
    fail() const ios [inline]
    failbitios_base [static]
    fgets(char *str, int16_t num, char *delim=0)SdBaseFile [private]
    fileSize() const SdBaseFile [inline, private]
    fill()ios_base [inline]
    fill(char c)ios_base [inline]
    firstCluster() const SdBaseFile [inline, private]
    flags() const ios_base [inline]
    flags(fmtflags fl)ios_base [inline]
    flagsToBase()ios_base [inline, protected]
    flush()ostream [inline]
    fmtflags typedefios_base
    getFilename(char *name)SdBaseFile [private]
    getpos(fpos_t *pos)SdBaseFile [private]
    good() const ios [inline]
    goodbitios_base [static]
    hexios_base [static]
    inios_base [static]
    internalios_base [static]
    ios()ios [inline]
    ios_base() (defined in ios_base)ios_base [inline]
    iostate typedefios_base
    is_open()ofstream [inline]
    isDir() const SdBaseFile [inline, private]
    isFile() const SdBaseFile [inline, private]
    isOpen() const SdBaseFile [inline, private]
    isRoot() const SdBaseFile [inline, private]
    isSubDir() const SdBaseFile [inline, private]
    leftios_base [static]
    ls(Print *pr, uint8_t flags=0, uint8_t indent=0)SdBaseFile [private]
    ls(uint8_t flags=0)SdBaseFile [private]
    mkdir(SdBaseFile *dir, const char *path, bool pFlag=true)SdBaseFile [private]
    octios_base [static]
    off_type typedefios_base
    ofstream() (defined in ofstream)ofstream [inline]
    ofstream(const char *path, ios::openmode mode=out)ofstream [inline, explicit]
    open(const char *path, openmode mode=out)ofstream [inline]
    SdStreamBase::open(SdBaseFile *dirFile, uint16_t index, uint8_t oflag)SdBaseFile [private]
    SdStreamBase::open(SdBaseFile *dirFile, const char *path, uint8_t oflag)SdBaseFile [private]
    openmode typedefios_base
    openNext(SdBaseFile *dirFile, uint8_t oflag)SdBaseFile [private]
    openRoot(SdVolume *vol)SdBaseFile [private]
    operator const void *() const ios [inline]
    operator!() const ios [inline]
    operator<<(ostream &(*pf)(ostream &str))ostream [inline]
    operator<<(ios_base &(*pf)(ios_base &str))ostream [inline]
    operator<<(bool arg)ostream [inline]
    operator<<(const char *arg)ostream [inline]
    operator<<(const signed char *arg)ostream [inline]
    operator<<(const unsigned char *arg)ostream [inline]
    operator<<(char arg)ostream [inline]
    operator<<(signed char arg)ostream [inline]
    operator<<(unsigned char arg)ostream [inline]
    operator<<(double arg)ostream [inline]
    operator<<(int16_t arg)ostream [inline]
    operator<<(uint16_t arg)ostream [inline]
    operator<<(int32_t arg)ostream [inline]
    operator<<(uint32_t arg)ostream [inline]
    operator<<(const void *arg)ostream [inline]
    operator<<(pgm arg)ostream [inline]
    ostream() (defined in ostream)ostream [inline]
    outios_base [static]
    peek()SdBaseFile [private]
    pos_type typedefios_base
    precision() const ios_base [inline]
    precision(unsigned int n)ios_base [inline]
    printFatDate(uint16_t fatDate)SdBaseFile [private, static]
    printFatDate(Print *pr, uint16_t fatDate)SdBaseFile [private, static]
    printFatTime(uint16_t fatTime)SdBaseFile [private, static]
    printFatTime(Print *pr, uint16_t fatTime)SdBaseFile [private, static]
    printName()SdBaseFile [private]
    put(char ch)ostream [inline]
    rdstate() const ios [inline]
    read()SdBaseFile [private]
    read(void *buf, uint16_t nbyte)SdBaseFile [private]
    readDir(dir_t *dir)SdBaseFile [private]
    remove(SdBaseFile *dirFile, const char *path)SdBaseFile [private, static]
    remove()SdBaseFile [private]
    rename(SdBaseFile *dirFile, const char *newPath)SdBaseFile [private]
    rewind()SdBaseFile [inline, private]
    rightios_base [static]
    rmdir()SdBaseFile [private]
    rmRfStar()SdBaseFile [private]
    SdBaseFile()SdBaseFile [inline, private]
    SdBaseFile(const char *path, uint8_t oflag)SdBaseFile [private]
    seekCur(int32_t offset)SdBaseFile [inline, private]
    seekdir enum nameios_base
    seekEnd(int32_t offset=0)SdBaseFile [inline, private]
    seekp(pos_type pos)ostream [inline]
    seekp(off_type off, seekdir way)ostream [inline]
    seekSet(uint32_t pos)SdBaseFile [private]
    setf(fmtflags fl)ios_base [inline]
    setf(fmtflags fl, fmtflags mask)ios_base [inline]
    setpos(fpos_t *pos)SdBaseFile [private]
    setstate(iostate state)ios [inline]
    showbaseios_base [static]
    showpointios_base [static]
    showposios_base [static]
    skipwsios_base [static]
    streamsize typedefios_base
    sync()SdBaseFile [private]
    tellp()ostream [inline]
    timestamp(SdBaseFile *file)SdBaseFile [private]
    timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)SdBaseFile [private]
    truncios_base [static]
    truncate(uint32_t size)SdBaseFile [private]
    type() const SdBaseFile [inline, private]
    unsetf(fmtflags fl)ios_base [inline]
    uppercaseios_base [static]
    volume() const SdBaseFile [inline, private]
    width()ios_base [inline]
    width(unsigned n)ios_base [inline]
    write(const void *buf, uint16_t nbyte)SdBaseFile [private]
    writeErrorSdBaseFile [private]
    ~ofstream() (defined in ofstream)ofstream [inline]
    ~SdBaseFile() (defined in SdBaseFile)SdBaseFile [inline, private]
    + + + diff --git a/libs/SdFatBeta20120108/html/classofstream.html b/libs/SdFatBeta20120108/html/classofstream.html new file mode 100644 index 0000000..e86c737 --- /dev/null +++ b/libs/SdFatBeta20120108/html/classofstream.html @@ -0,0 +1,1757 @@ + + + + +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]
    + +

    List of all members.

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

    +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 (const char *path, ios::openmode mode=out)
    void open (const char *path, openmode mode=out)
     operator const void * () const
    bool operator! () const
    ostreamoperator<< (unsigned char arg)
    ostreamoperator<< (ostream &(*pf)(ostream &str))
    ostreamoperator<< (double arg)
    ostreamoperator<< (ios_base &(*pf)(ios_base &str))
    ostreamoperator<< (int16_t arg)
    ostreamoperator<< (uint16_t arg)
    ostreamoperator<< (bool arg)
    ostreamoperator<< (int32_t arg)
    ostreamoperator<< (pgm arg)
    ostreamoperator<< (uint32_t arg)
    ostreamoperator<< (const char *arg)
    ostreamoperator<< (const void *arg)
    ostreamoperator<< (const signed char *arg)
    ostreamoperator<< (const unsigned char *arg)
    ostreamoperator<< (char arg)
    ostreamoperator<< (signed char arg)
    int precision (unsigned int n)
    int precision () const
    ostreamput (char ch)
    iostate rdstate () const
    ostreamseekp (off_type off, seekdir way)
    ostreamseekp (pos_type pos)
    fmtflags setf (fmtflags fl, fmtflags mask)
    fmtflags setf (fmtflags fl)
    void setstate (iostate state)
    pos_type tellp ()
    void unsetf (fmtflags fl)
    unsigned width (unsigned n)
    unsigned width ()

    +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

    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 (fpos_t *pos)
    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 printName ()
    int16_t read ()
    int16_t read (void *buf, uint16_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 (fpos_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
    int16_t write (const void *buf, uint16_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 (Print *pr, uint16_t fatTime)
    static void printFatTime (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 (const char * path,
    ios::openmode mode = out 
    ) [inline, explicit]
    +
    +
    +

    Constructor with open

    +
    Parameters:
    + + + +
    [in]pathfile to open
    [in]modeopen mode
    +
    +
    + +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + +
    bool ios::bad () const [inline, inherited]
    +
    +
    +
    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
    +
    +
    + +

    Reimplemented from ios.

    + +
    +
    + +
    +
    + + + + + + + +
    void ofstream::close () [inline]
    +
    +
    +

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

    + +

    Reimplemented from SdBaseFile.

    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::eof () const [inline, inherited]
    +
    +
    +
    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, inherited]
    +
    +
    +
    Returns:
    true if any iostate bit other than eof are set else false.
    + +
    +
    + +
    +
    + + + + + + + +
    char ios_base::fill () [inline, inherited]
    +
    +
    +
    Returns:
    fill character
    + +
    +
    + +
    +
    + + + + + + + + +
    char ios_base::fill (char c) [inline, inherited]
    +
    +
    +

    Set fill character

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

    set format flags

    +
    Parameters:
    + + +
    [in]flnew flag
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + +
    uint8_t ios_base::flagsToBase () [inline, protected, inherited]
    +
    +
    +
    Returns:
    current number base
    + +
    +
    + +
    +
    + + + + + + + +
    ostream& ostream::flush () [inline, inherited]
    +
    +
    +

    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 [inline, inherited]
    +
    +
    +
    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.

    + +

    Reimplemented from SdBaseFile.

    + +
    +
    + +
    +
    + + + + + + + +
    ios::operator const void * () const [inline, inherited]
    +
    +
    +
    Returns:
    null pointer if fail() is true.
    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::operator! () const [inline, inherited]
    +
    +
    +
    Returns:
    true if fail() else false.
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (const char * arg) [inline, inherited]
    +
    +
    +

    Output string

    +
    Parameters:
    + + +
    [in]argstring to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (double arg) [inline, inherited]
    +
    +
    +

    Output double

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (uint16_t arg) [inline, inherited]
    +
    +
    +

    Output unsigned int

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (int32_t arg) [inline, inherited]
    +
    +
    +

    Output signed long

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (uint32_t arg) [inline, inherited]
    +
    +
    +

    Output uint32_t

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

    Output string

    +
    Parameters:
    + + +
    [in]argstring to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (const void * arg) [inline, inherited]
    +
    +
    +

    Output pointer

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

    Output string

    +
    Parameters:
    + + +
    [in]argstring to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (pgm arg) [inline, inherited]
    +
    +
    +

    Output a string from flash

    +
    Parameters:
    + + +
    [in]argpgm struct pointing to string
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (ostream &(*)(ostream &str) pf) [inline, inherited]
    +
    +
    +

    call manipulator

    +
    Parameters:
    + + +
    [in]pffunction to call
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (signed char arg) [inline, inherited]
    +
    +
    +

    Output character

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

    Output character

    +
    Parameters:
    + + +
    [in]argcharacter to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (ios_base &(*)(ios_base &str) pf) [inline, inherited]
    +
    +
    +

    call manipulator

    +
    Parameters:
    + + +
    [in]pffunction to call
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (char arg) [inline, inherited]
    +
    +
    +

    Output character

    +
    Parameters:
    + + +
    [in]argcharacter to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (bool arg) [inline, inherited]
    +
    +
    +

    Output bool

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (int16_t arg) [inline, inherited]
    +
    +
    +

    Output signed int

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    int ios_base::precision (unsigned int n) [inline, inherited]
    +
    +
    +

    set precision

    +
    Parameters:
    + + +
    [in]nnew precision
    +
    +
    +
    Returns:
    old precision
    + +
    +
    + +
    +
    + + + + + + + +
    int ios_base::precision () const [inline, inherited]
    +
    +
    +
    Returns:
    precision
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::put (char ch) [inline, inherited]
    +
    +
    +

    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 [inline, inherited]
    +
    +
    +
    Returns:
    The iostate flags for this file.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    ostream& ostream::seekp (off_type off,
    seekdir way 
    ) [inline, inherited]
    +
    +
    +

    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.
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::seekp (pos_type pos) [inline, inherited]
    +
    +
    +

    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.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    fmtflags ios_base::setf (fmtflags fl,
    fmtflags mask 
    ) [inline, inherited]
    +
    +
    +

    modify format flags

    +
    Parameters:
    + + + +
    [in]maskflags to be removed
    [in]flflags to be set after mask bits have been cleared
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + + +
    fmtflags ios_base::setf (fmtflags fl) [inline, inherited]
    +
    +
    +

    set format flags

    +
    Parameters:
    + + +
    [in]flnew flags to be or'ed in
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + + +
    void ios::setstate (iostate state) [inline, inherited]
    +
    +
    +

    Set iostate bits.

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

    clear format flags

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

    set width

    +
    Parameters:
    + + +
    [in]nnew width
    +
    +
    +
    Returns:
    old width
    + +
    +
    + +
    +
    + + + + + + + +
    unsigned ios_base::width () [inline, inherited]
    +
    +
    +
    Returns:
    width
    + +
    +
    +

    Member Data Documentation

    + +
    +
    + + + + +
    const fmtflags ios_base::adjustfield = left | right | internal [static, inherited]
    +
    +
    +

    mask for adjustfield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::app = 0X4 [static, inherited]
    +
    +
    +

    seek to end before each write

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::ate = 0X8 [static, inherited]
    +
    +
    +

    open and seek to end immediately after opening

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::badbit = 0X01 [static, inherited]
    +
    +
    +

    iostate bad bit for a nonrecoverable error.

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::basefield = dec | hex | oct [static, inherited]
    +
    +
    +

    mask for basefield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::binary = 0X10 [static, inherited]
    +
    +
    +

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

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::boolalpha = 0x0100 [static, inherited]
    +
    +
    +

    use strings true/false for bool

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::dec = 0x0008 [static, inherited]
    +
    +
    +

    base 10 flag

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::eofbit = 0x02 [static, inherited]
    +
    +
    +

    iostate bit for end of file reached

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::failbit = 0X04 [static, inherited]
    +
    +
    +

    iostate fail bit for nonfatal error

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::goodbit = 0x00 [static, inherited]
    +
    +
    +

    iostate for no flags

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::hex = 0x0010 [static, inherited]
    +
    +
    +

    base 16 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::in = 0X20 [static, inherited]
    +
    +
    +

    open for input

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::internal = 0x0004 [static, inherited]
    +
    +
    +

    fill between sign/base prefix and number

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::left = 0x0001 [static, inherited]
    +
    +
    +

    left adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::oct = 0x0020 [static, inherited]
    +
    +
    +

    base 8 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::out = 0X40 [static, inherited]
    +
    +
    +

    open for output

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::right = 0x0002 [static, inherited]
    +
    +
    +

    right adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showbase = 0x0200 [static, inherited]
    +
    +
    +

    use prefix 0X for hex and 0 for oct

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpoint = 0x0400 [static, inherited]
    +
    +
    +

    always show '.' for floating numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpos = 0x0800 [static, inherited]
    +
    +
    +

    show + sign for nonnegative numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::skipws = 0x1000 [static, inherited]
    +
    +
    +

    skip initial white space

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::trunc = 0X80 [static, inherited]
    +
    +
    +

    truncate an existing stream when opening

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::uppercase = 0x4000 [static, inherited]
    +
    +
    +

    use uppercase letters in number representations

    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + diff --git a/libs/SdFatBeta20120108/html/classofstream__coll__graph.png b/libs/SdFatBeta20120108/html/classofstream__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..6572f15e49cf66fa8daa33b5e40a3709143888c8 GIT binary patch literal 19755 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 P4fNd3`ZTqa;(qHNv6+U8 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/classofstream__inherit__graph.png b/libs/SdFatBeta20120108/html/classofstream__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..291d52880ae41f08a6a0ddf638967c464d3f8a34 GIT binary patch literal 6425 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 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/classostream-members.html b/libs/SdFatBeta20120108/html/classostream-members.html new file mode 100644 index 0000000..d40c419 --- /dev/null +++ b/libs/SdFatBeta20120108/html/classostream-members.html @@ -0,0 +1,128 @@ + + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    ostream Member List
    +
    +
    +This is the complete list of members for ostream, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    adjustfieldios_base [static]
    appios_base [static]
    ateios_base [static]
    bad() const ios [inline]
    badbitios_base [static]
    basefieldios_base [static]
    beg enum valueios_base
    binaryios_base [static]
    boolalphaios_base [static]
    clear(iostate state=goodbit)ios [inline]
    cur enum valueios_base
    decios_base [static]
    end enum valueios_base
    eof() const ios [inline]
    eofbitios_base [static]
    fail() const ios [inline]
    failbitios_base [static]
    fill()ios_base [inline]
    fill(char c)ios_base [inline]
    flags() const ios_base [inline]
    flags(fmtflags fl)ios_base [inline]
    flagsToBase()ios_base [inline, protected]
    flush()ostream [inline]
    fmtflags typedefios_base
    good() const ios [inline]
    goodbitios_base [static]
    hexios_base [static]
    inios_base [static]
    internalios_base [static]
    ios()ios [inline]
    ios_base() (defined in ios_base)ios_base [inline]
    iostate typedefios_base
    leftios_base [static]
    octios_base [static]
    off_type typedefios_base
    openmode typedefios_base
    operator const void *() const ios [inline]
    operator!() const ios [inline]
    operator<<(ostream &(*pf)(ostream &str))ostream [inline]
    operator<<(ios_base &(*pf)(ios_base &str))ostream [inline]
    operator<<(bool arg)ostream [inline]
    operator<<(const char *arg)ostream [inline]
    operator<<(const signed char *arg)ostream [inline]
    operator<<(const unsigned char *arg)ostream [inline]
    operator<<(char arg)ostream [inline]
    operator<<(signed char arg)ostream [inline]
    operator<<(unsigned char arg)ostream [inline]
    operator<<(double arg)ostream [inline]
    operator<<(int16_t arg)ostream [inline]
    operator<<(uint16_t arg)ostream [inline]
    operator<<(int32_t arg)ostream [inline]
    operator<<(uint32_t arg)ostream [inline]
    operator<<(const void *arg)ostream [inline]
    operator<<(pgm arg)ostream [inline]
    ostream() (defined in ostream)ostream [inline]
    outios_base [static]
    pos_type typedefios_base
    precision() const ios_base [inline]
    precision(unsigned int n)ios_base [inline]
    put(char ch)ostream [inline]
    rdstate() const ios [inline]
    rightios_base [static]
    seekdir enum nameios_base
    seekp(pos_type pos)ostream [inline]
    seekp(off_type off, seekdir way)ostream [inline]
    setf(fmtflags fl)ios_base [inline]
    setf(fmtflags fl, fmtflags mask)ios_base [inline]
    setstate(iostate state)ios [inline]
    showbaseios_base [static]
    showpointios_base [static]
    showposios_base [static]
    skipwsios_base [static]
    streamsize typedefios_base
    tellp()ostream [inline]
    truncios_base [static]
    unsetf(fmtflags fl)ios_base [inline]
    uppercaseios_base [static]
    width()ios_base [inline]
    width(unsigned n)ios_base [inline]
    + + + diff --git a/libs/SdFatBeta20120108/html/classostream.html b/libs/SdFatBeta20120108/html/classostream.html new file mode 100644 index 0000000..9391a64 --- /dev/null +++ b/libs/SdFatBeta20120108/html/classostream.html @@ -0,0 +1,1581 @@ + + + + +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]
    + +

    List of all members.

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

    +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<< (bool arg)
    ostreamoperator<< (const void *arg)
    ostreamoperator<< (pgm arg)
    ostreamoperator<< (char arg)
    ostreamoperator<< (ios_base &(*pf)(ios_base &str))
    ostreamoperator<< (signed char arg)
    ostreamoperator<< (ostream &(*pf)(ostream &str))
    ostreamoperator<< (unsigned char arg)
    ostreamoperator<< (const char *arg)
    ostreamoperator<< (double arg)
    ostreamoperator<< (const signed char *arg)
    ostreamoperator<< (int16_t arg)
    ostreamoperator<< (uint16_t arg)
    ostreamoperator<< (int32_t arg)
    ostreamoperator<< (const unsigned char *arg)
    ostreamoperator<< (uint32_t arg)
    int precision (unsigned int n)
    int precision () const
    ostreamput (char ch)
    iostate rdstate () const
    ostreamseekp (off_type off, seekdir way)
    ostreamseekp (pos_type pos)
    fmtflags setf (fmtflags fl)
    fmtflags setf (fmtflags fl, fmtflags mask)
    void setstate (iostate state)
    pos_type tellp ()
    void unsetf (fmtflags fl)
    unsigned width (unsigned n)
    unsigned width ()

    +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

    +
    +
    +
    + +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + +
    bool ios::bad () const [inline, inherited]
    +
    +
    +
    Returns:
    true if bad bit is set else false.
    + +
    +
    + +
    +
    + + + + + + + + +
    void ios::clear (iostate state = goodbit) [inline, inherited]
    +
    +
    +

    Clear iostate bits.

    +
    Parameters:
    + + +
    [in]stateThe flags you want to set after clearing all flags.
    +
    +
    + +

    Reimplemented in fstream, and ofstream.

    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::eof () const [inline, inherited]
    +
    +
    +
    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, inherited]
    +
    +
    +
    Returns:
    true if any iostate bit other than eof are set else false.
    + +
    +
    + +
    +
    + + + + + + + + +
    char ios_base::fill (char c) [inline, inherited]
    +
    +
    +

    Set fill character

    +
    Parameters:
    + + +
    [in]cnew fill character
    +
    +
    +
    Returns:
    old fill character
    + +
    +
    + +
    +
    + + + + + + + +
    char ios_base::fill () [inline, inherited]
    +
    +
    +
    Returns:
    fill character
    + +
    +
    + +
    +
    + + + + + + + +
    fmtflags ios_base::flags () const [inline, inherited]
    +
    +
    +
    Returns:
    format flags
    + +
    +
    + +
    +
    + + + + + + + + +
    fmtflags ios_base::flags (fmtflags fl) [inline, inherited]
    +
    +
    +

    set format flags

    +
    Parameters:
    + + +
    [in]flnew flag
    +
    +
    +
    Returns:
    old flags
    + +
    +
    + +
    +
    + + + + + + + +
    uint8_t ios_base::flagsToBase () [inline, protected, inherited]
    +
    +
    +
    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 [inline, inherited]
    +
    +
    +
    Returns:
    True if no iostate flags are set else false.
    + +
    +
    + +
    +
    + + + + + + + +
    ios::operator const void * () const [inline, inherited]
    +
    +
    +
    Returns:
    null pointer if fail() is true.
    + +
    +
    + +
    +
    + + + + + + + +
    bool ios::operator! () const [inline, inherited]
    +
    +
    +
    Returns:
    true if fail() else false.
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (ios_base &(*)(ios_base &str) pf) [inline]
    +
    +
    +

    call manipulator

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

    Output a string from flash

    +
    Parameters:
    + + +
    [in]argpgm struct pointing to string
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + +
    ostream& ostream::operator<< (signed char arg) [inline]
    +
    +
    +

    Output character

    +
    Parameters:
    + + +
    [in]argcharacter to output
    +
    +
    +
    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<< (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<< (ostream &(*)(ostream &str) pf) [inline]
    +
    +
    +

    call manipulator

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

    Output signed int

    +
    Parameters:
    + + +
    [in]argvalue 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<< (uint16_t arg) [inline]
    +
    +
    +

    Output unsigned int

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

    Output signed long

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

    Output uint32_t

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

    Output character

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

    Output pointer

    +
    Parameters:
    + + +
    [in]argvalue to output
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + +
    int ios_base::precision () const [inline, inherited]
    +
    +
    +
    Returns:
    precision
    + +
    +
    + +
    +
    + + + + + + + + +
    int ios_base::precision (unsigned int n) [inline, inherited]
    +
    +
    +

    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 [inline, inherited]
    +
    +
    +
    Returns:
    The iostate flags for this file.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    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.
    + +
    +
    + +
    +
    + + + + + + + + +
    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.
    + +
    +
    + +
    +
    + + + + + + + + +
    fmtflags ios_base::setf (fmtflags fl) [inline, inherited]
    +
    +
    +

    set format flags

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

    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, inherited]
    +
    +
    +

    Set iostate bits.

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

    clear format flags

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

    set width

    +
    Parameters:
    + + +
    [in]nnew width
    +
    +
    +
    Returns:
    old width
    + +
    +
    + +
    +
    + + + + + + + +
    unsigned ios_base::width () [inline, inherited]
    +
    +
    +
    Returns:
    width
    + +
    +
    +

    Member Data Documentation

    + +
    +
    + + + + +
    const fmtflags ios_base::adjustfield = left | right | internal [static, inherited]
    +
    +
    +

    mask for adjustfield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::app = 0X4 [static, inherited]
    +
    +
    +

    seek to end before each write

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::ate = 0X8 [static, inherited]
    +
    +
    +

    open and seek to end immediately after opening

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::badbit = 0X01 [static, inherited]
    +
    +
    +

    iostate bad bit for a nonrecoverable error.

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::basefield = dec | hex | oct [static, inherited]
    +
    +
    +

    mask for basefield

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::binary = 0X10 [static, inherited]
    +
    +
    +

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

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::boolalpha = 0x0100 [static, inherited]
    +
    +
    +

    use strings true/false for bool

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::dec = 0x0008 [static, inherited]
    +
    +
    +

    base 10 flag

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::eofbit = 0x02 [static, inherited]
    +
    +
    +

    iostate bit for end of file reached

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::failbit = 0X04 [static, inherited]
    +
    +
    +

    iostate fail bit for nonfatal error

    + +
    +
    + +
    +
    + + + + +
    const iostate ios_base::goodbit = 0x00 [static, inherited]
    +
    +
    +

    iostate for no flags

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::hex = 0x0010 [static, inherited]
    +
    +
    +

    base 16 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::in = 0X20 [static, inherited]
    +
    +
    +

    open for input

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::internal = 0x0004 [static, inherited]
    +
    +
    +

    fill between sign/base prefix and number

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::left = 0x0001 [static, inherited]
    +
    +
    +

    left adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::oct = 0x0020 [static, inherited]
    +
    +
    +

    base 8 flag

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::out = 0X40 [static, inherited]
    +
    +
    +

    open for output

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::right = 0x0002 [static, inherited]
    +
    +
    +

    right adjust fields

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showbase = 0x0200 [static, inherited]
    +
    +
    +

    use prefix 0X for hex and 0 for oct

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpoint = 0x0400 [static, inherited]
    +
    +
    +

    always show '.' for floating numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::showpos = 0x0800 [static, inherited]
    +
    +
    +

    show + sign for nonnegative numbers

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::skipws = 0x1000 [static, inherited]
    +
    +
    +

    skip initial white space

    + +
    +
    + +
    +
    + + + + +
    const openmode ios_base::trunc = 0X80 [static, inherited]
    +
    +
    +

    truncate an existing stream when opening

    + +
    +
    + +
    +
    + + + + +
    const fmtflags ios_base::uppercase = 0x4000 [static, inherited]
    +
    +
    +

    use uppercase letters in number representations

    + +
    +
    +
    The documentation for this class was generated from the following files:
      +
    • Arduino/libraries/SdFat/ostream.h
    • +
    • Arduino/libraries/SdFat/ostream.cpp
    • +
    +
    + + + diff --git a/libs/SdFatBeta20120108/html/classostream__coll__graph.png b/libs/SdFatBeta20120108/html/classostream__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..d05dfc1e92cd447002d6742a855556c1be49ab9f GIT binary patch literal 1733 zcmb`Ic{tR09LIl*d($dMRB|?UI`-Lpp8a$8`8=QR`+45a_n+_Q^ZI;0S&sHL(o#F6005A- zMZlZ|dP0yC2{FN`bgy_`AYy)YHZWlGOWbKH#|n%DTbQNGMIx{0c%}+m@yf)5Af|LQ z2#jGM;~qeE z-0T7kkxmKa`1KF9hXS7%vIns!3MF9~?c+nPEL)q+sGJ)gui0xM0Zy*~l&>>|qa<6) zFlX<}LP0AU_yY)zN{XJ4r>UJ*ceA>W=A!t=|<2r4v=Txo#r#}h`k#-#E zy@c{!KF?`6Uw-113rdKV2wVm2pEBx*z@Pr;ZoT>GY3Z4jx=*gJI_r@5R`!JtMgwGS zEn1#=jLzl2C(Kc_Wv3)l1uhQH^=f)#i9&gFYcHX!$7@%fU)eqA+#Hmz{CNEED(a1P z6`=s#s{(T~B@L^Cz};2(wfn4+`oZ@CIFQXJu}I+zuq=3^DMx~bCjg`q)S!PYm_JyzA!NhY}0BKzyv z{8@PXs1z{Qzj!23ckILkynPv&$Dtr+zqL(@P_Xttv~hrAKqS zbfnKow9&$h_-LhCegxa7oiy6eV(5C>@u-Abpo+~N!283+UR7CHS?mKB`9b~EJQhzk z474HRlLNz1x*}b-yKGI(Q|ej_4NU5au{SgV5`7ca*z1*-=bTQ3gVXd^xg5 zX{S_7bMs^!lB`xT+=VyW8A+ST^nRoI<0+eL@4eR^o=OTcE@yk)oQ>s#E*gZVup65Z zTHC0a5IpSf3V-F~znGz|85+`gxy3!^2T{2L%*dgDih z9m%TD;?YZ@la>I~Ku0uNRbxTf(t3`dnHHmWJ_e^ACk$ zrYLw3vYZu$wJV&z6pf43zI>g$%9go`&|u*3@NITxeH8?x1)FHy*Wdtt!hn3e;ji$x z^k~RXH9z`)D5C*Kc^?xA(Hj}BY*a#9{O$b zO=Ed~uV!FD_3o{;{%K;e4QEw`qq zo5k3&KFV8V=ZhMr`vere&QsFb9%AR@ANd`sh}$T+*0a>uc;wT!E~4Nm2m*jreY;m z2!XhP&XaZr$kohed+6EPdTmsrcHj6&zkp2J5pgFu@rG_^#O91B@O0E>?&2N208^hA z!YhwjJWF1C7bvsLEa*RnIsT9Q2)-!+ewZcB!j_bbW7)g%38u*-rp8Mm0I|jl=UM|O zhAZ%g3qIoM8dU`^f_p`l?2+(c!Eo>#}?(3e_+?=STJlkI#Ov8br} z{BrD&K~~>$do2&vFzKW?XK5fYgxWYBS2tFhAU+i^{L&jI3J=s9&8M8?ILJPsRa zu6vIeO)IUtj2rK%-_a(W<;fPCGebeBu)}PO1X) z8|C0SFgQbU*R(i?r`C+wDd)YMC=~k~K};Yi6dHqmo!vI(?xx;$MoiyS+uM})?=jp5 uYD#ZKOZtkn#=7&xI2n~787m1eb3whlJlnCv9AYlmOMorh9#&)JllmtdW-*lj literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/classostream__inherit__graph.png b/libs/SdFatBeta20120108/html/classostream__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..0a10e340971ad17aacad8f40640d7096424aceea GIT binary patch literal 8051 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 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/closed.png b/libs/SdFatBeta20120108/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..b7d4bd9fef2272c74b94762c9e2496177017775e GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VuAVNAAr*{o?>h22DDp4|bgj*t z)u^AqcA-V@guRYpb17F<&b?_~8HV>~XqWvB;^$!VVSTy0!eQcJp_yD7TIQA>7dijs YXf6~H5cs^Q6KEiVr>mdKI;Vst0NsWqGynhq literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/doxygen.css b/libs/SdFatBeta20120108/html/doxygen.css new file mode 100644 index 0000000..74445fe --- /dev/null +++ b/libs/SdFatBeta20120108/html/doxygen.css @@ -0,0 +1,835 @@ +/* The standard CSS for doxygen */ + +body, table, div, p, dl { + font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; + font-size: 12px; +} + +/* @group Heading Levels */ + +h1 { + font-size: 150%; +} + +.title { + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2 { + font-size: 120%; +} + +h3 { + font-size: 100%; +} + +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, p.starttd { + margin-top: 2px; +} + +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; + margin: 2px; + padding: 2px; +} + +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 { + color: #4665A2; +} + +a.codeRef { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +.fragment { + font-family: monospace, fixed; + font-size: 105%; +} + +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%; +} + +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: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 10px; + margin-right: 5px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; +} + +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 +} + +/* @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; +} + +.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; +} + +.memItemLeft, .memItemRight, .memTemplParams { + border-top: 1px solid #C4CFE5; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; +} + +/* @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; +} + +.memname { + white-space: nowrap; + font-weight: bold; + margin-left: 6px; +} + +.memproto { + 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); + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 8px; + border-top-left-radius: 8px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 8px; + -moz-border-radius-topleft: 8px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 8px; + -webkit-border-top-left-radius: 8px; + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + +} + +.memdoc { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 2px 5px; + background-color: #FBFCFD; + border-top-width: 0; + /* opera specific markup */ + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 8px; + -moz-border-radius-bottomright: 8px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7); + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7)); +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} + +.params, .retval, .exception, .tparams { + border-spacing: 6px 2px; +} + +.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; +} + + + + +/* @end */ + +/* @group Directory (tree) */ + +/* for the tree view */ + +.ftvtree { + font-family: sans-serif; + margin: 0px; +} + +/* these are for tree view when used as main index */ + +.directory { + font-size: 9pt; + font-weight: bold; + margin: 5px; +} + +.directory h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +/* +The following two styles can be used to replace the root node title +with an image of your choice. Simply uncomment the next two styles, +specify the name of your image and be sure to set 'height' to the +proper pixel height of your image. +*/ + +/* +.directory h3.swap { + height: 61px; + background-repeat: no-repeat; + background-image: url("yourimage.gif"); +} +.directory h3.swap span { + display: none; +} +*/ + +.directory > h3 { + margin-top: 0; +} + +.directory p { + margin: 0px; + white-space: nowrap; +} + +.directory div { + display: none; + margin: 0px; +} + +.directory img { + vertical-align: -30%; +} + +/* these are for tree view when not used as main index */ + +.directory-alt { + font-size: 100%; + font-weight: bold; +} + +.directory-alt h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +.directory-alt > h3 { + margin-top: 0; +} + +.directory-alt p { + margin: 0px; + white-space: nowrap; +} + +.directory-alt div { + display: none; + margin: 0px; +} + +.directory-alt img { + vertical-align: -30%; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable { + border-collapse:collapse; +} + +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; + text-align:left; +} + +.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; + 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; +} + +.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; + padding-left: 5px; + 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 +{ + border-left:4px solid; + padding: 0 0 0 6px; +} + +dl.note +{ + border-color: #D0C000; +} + +dl.warning, dl.attention +{ + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + border-color: #00D000; +} + +dl.deprecated +{ + border-color: #505050; +} + +dl.todo +{ + border-color: #00C0E0; +} + +dl.test +{ + border-color: #3030E0; +} + +dl.bug +{ + border-color: #C08050; +} + +#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; +} + +.caption +{ + font-weight: bold; +} + diff --git a/libs/SdFatBeta20120108/html/doxygen.png b/libs/SdFatBeta20120108/html/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..635ed52fce7057ac24df92ec7664088a881fa5d0 GIT binary patch literal 3942 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 A+yDRo literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/files.html b/libs/SdFatBeta20120108/html/files.html new file mode 100644 index 0000000..6d42813 --- /dev/null +++ b/libs/SdFatBeta20120108/html/files.html @@ -0,0 +1,64 @@ + + + + +SdFat: File List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    + + + + + + + + + + + + + + + +
    Arduino/libraries/SdFat/ArduinoStream.hArduinoInStream and ArduinoOutStream classes
    Arduino/libraries/SdFat/bufstream.hibufstream and obufstream classes
    Arduino/libraries/SdFat/ios.hios_base and ios classes
    Arduino/libraries/SdFat/iostream.hiostream class
    Arduino/libraries/SdFat/istream.histream class
    Arduino/libraries/SdFat/ostream.hostream class
    Arduino/libraries/SdFat/Sd2Card.hSd2Card class for V2 SD/SDHC cards
    Arduino/libraries/SdFat/SdBaseFile.hSdBaseFile class
    Arduino/libraries/SdFat/SdFat.hSdFat class
    Arduino/libraries/SdFat/SdFatConfig.hConfiguration definitions
    Arduino/libraries/SdFat/SdFatStructs.hFAT file structures
    Arduino/libraries/SdFat/SdFatUtil.hUseful utility functions
    Arduino/libraries/SdFat/SdFile.hSdFile class
    Arduino/libraries/SdFat/SdStream.hfstream, ifstream, and ofstream classes
    Arduino/libraries/SdFat/SdVolume.hSdVolume class
    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions.html b/libs/SdFatBeta20120108/html/functions.html new file mode 100644 index 0000000..c821275 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions.html @@ -0,0 +1,101 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - a -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x62.html b/libs/SdFatBeta20120108/html/functions_0x62.html new file mode 100644 index 0000000..33ec064 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x62.html @@ -0,0 +1,145 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - b -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x63.html b/libs/SdFatBeta20120108/html/functions_0x63.html new file mode 100644 index 0000000..3b780cf --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x63.html @@ -0,0 +1,151 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - c -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x64.html b/libs/SdFatBeta20120108/html/functions_0x64.html new file mode 100644 index 0000000..dd57be4 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x64.html @@ -0,0 +1,117 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - d -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x65.html b/libs/SdFatBeta20120108/html/functions_0x65.html new file mode 100644 index 0000000..130ed15 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x65.html @@ -0,0 +1,135 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - e -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x66.html b/libs/SdFatBeta20120108/html/functions_0x66.html new file mode 100644 index 0000000..6e2faed --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x66.html @@ -0,0 +1,180 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - f -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x67.html b/libs/SdFatBeta20120108/html/functions_0x67.html new file mode 100644 index 0000000..e8c33ed --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x67.html @@ -0,0 +1,104 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - g -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x68.html b/libs/SdFatBeta20120108/html/functions_0x68.html new file mode 100644 index 0000000..4242d49 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x68.html @@ -0,0 +1,94 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - h -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x69.html b/libs/SdFatBeta20120108/html/functions_0x69.html new file mode 100644 index 0000000..7db5424 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x69.html @@ -0,0 +1,143 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - i -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x6a.html b/libs/SdFatBeta20120108/html/functions_0x6a.html new file mode 100644 index 0000000..a06caaf --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x6a.html @@ -0,0 +1,87 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - j -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x6c.html b/libs/SdFatBeta20120108/html/functions_0x6c.html new file mode 100644 index 0000000..73e7b4a --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x6c.html @@ -0,0 +1,106 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - l -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x6d.html b/libs/SdFatBeta20120108/html/functions_0x6d.html new file mode 100644 index 0000000..47146ff --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x6d.html @@ -0,0 +1,100 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - m -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x6e.html b/libs/SdFatBeta20120108/html/functions_0x6e.html new file mode 100644 index 0000000..874f5f3 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x6e.html @@ -0,0 +1,89 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - n -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x6f.html b/libs/SdFatBeta20120108/html/functions_0x6f.html new file mode 100644 index 0000000..ccea898 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x6f.html @@ -0,0 +1,129 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - o -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x70.html b/libs/SdFatBeta20120108/html/functions_0x70.html new file mode 100644 index 0000000..7d55a85 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x70.html @@ -0,0 +1,126 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - p -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x72.html b/libs/SdFatBeta20120108/html/functions_0x72.html new file mode 100644 index 0000000..29c64ba --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x72.html @@ -0,0 +1,157 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - r -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x73.html b/libs/SdFatBeta20120108/html/functions_0x73.html new file mode 100644 index 0000000..cfaf965 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x73.html @@ -0,0 +1,188 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - s -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x74.html b/libs/SdFatBeta20120108/html/functions_0x74.html new file mode 100644 index 0000000..6893408 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x74.html @@ -0,0 +1,118 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - t -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x75.html b/libs/SdFatBeta20120108/html/functions_0x75.html new file mode 100644 index 0000000..2790d8f --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x75.html @@ -0,0 +1,92 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - u -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x76.html b/libs/SdFatBeta20120108/html/functions_0x76.html new file mode 100644 index 0000000..a3adf53 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x76.html @@ -0,0 +1,100 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - v -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_0x77.html b/libs/SdFatBeta20120108/html/functions_0x77.html new file mode 100644 index 0000000..328cede --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_0x77.html @@ -0,0 +1,118 @@ + + + + +SdFat: Class Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - w -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_enum.html b/libs/SdFatBeta20120108/html/functions_enum.html new file mode 100644 index 0000000..da1ca15 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_enum.html @@ -0,0 +1,59 @@ + + + + +SdFat: Class Members - Enumerations + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + +
    +
    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_eval.html b/libs/SdFatBeta20120108/html/functions_eval.html new file mode 100644 index 0000000..7a2d5c6 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_eval.html @@ -0,0 +1,65 @@ + + + + +SdFat: Class Members - Enumerator + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + +
    +
    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func.html b/libs/SdFatBeta20120108/html/functions_func.html new file mode 100644 index 0000000..9a4a3c9 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func.html @@ -0,0 +1,86 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - a -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func_0x62.html b/libs/SdFatBeta20120108/html/functions_func_0x62.html new file mode 100644 index 0000000..794b24b --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func_0x62.html @@ -0,0 +1,92 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - b -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func_0x63.html b/libs/SdFatBeta20120108/html/functions_func_0x63.html new file mode 100644 index 0000000..f86520f --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func_0x63.html @@ -0,0 +1,127 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - c -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func_0x64.html b/libs/SdFatBeta20120108/html/functions_func_0x64.html new file mode 100644 index 0000000..b998606 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func_0x64.html @@ -0,0 +1,98 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - d -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func_0x65.html b/libs/SdFatBeta20120108/html/functions_func_0x65.html new file mode 100644 index 0000000..82268e0 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func_0x65.html @@ -0,0 +1,114 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - e -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func_0x66.html b/libs/SdFatBeta20120108/html/functions_func_0x66.html new file mode 100644 index 0000000..93e9877 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func_0x66.html @@ -0,0 +1,119 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - f -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func_0x67.html b/libs/SdFatBeta20120108/html/functions_func_0x67.html new file mode 100644 index 0000000..6a7dbf9 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func_0x67.html @@ -0,0 +1,98 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - g -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func_0x69.html b/libs/SdFatBeta20120108/html/functions_func_0x69.html new file mode 100644 index 0000000..c47cec3 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func_0x69.html @@ -0,0 +1,132 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - i -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func_0x6c.html b/libs/SdFatBeta20120108/html/functions_func_0x6c.html new file mode 100644 index 0000000..675a757 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func_0x6c.html @@ -0,0 +1,87 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - l -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func_0x6d.html b/libs/SdFatBeta20120108/html/functions_func_0x6d.html new file mode 100644 index 0000000..4b7234d --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func_0x6d.html @@ -0,0 +1,84 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - m -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func_0x6f.html b/libs/SdFatBeta20120108/html/functions_func_0x6f.html new file mode 100644 index 0000000..107da6e --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func_0x6f.html @@ -0,0 +1,111 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - o -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func_0x70.html b/libs/SdFatBeta20120108/html/functions_func_0x70.html new file mode 100644 index 0000000..a79c5b0 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func_0x70.html @@ -0,0 +1,108 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - p -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func_0x72.html b/libs/SdFatBeta20120108/html/functions_func_0x72.html new file mode 100644 index 0000000..72d5477 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func_0x72.html @@ -0,0 +1,134 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - r -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func_0x73.html b/libs/SdFatBeta20120108/html/functions_func_0x73.html new file mode 100644 index 0000000..7c44433 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func_0x73.html @@ -0,0 +1,149 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - s -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func_0x74.html b/libs/SdFatBeta20120108/html/functions_func_0x74.html new file mode 100644 index 0000000..a458137 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func_0x74.html @@ -0,0 +1,97 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - t -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func_0x75.html b/libs/SdFatBeta20120108/html/functions_func_0x75.html new file mode 100644 index 0000000..791c2d9 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func_0x75.html @@ -0,0 +1,83 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - u -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func_0x76.html b/libs/SdFatBeta20120108/html/functions_func_0x76.html new file mode 100644 index 0000000..5e0e828 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func_0x76.html @@ -0,0 +1,89 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - v -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_func_0x77.html b/libs/SdFatBeta20120108/html/functions_func_0x77.html new file mode 100644 index 0000000..b6e08a3 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_func_0x77.html @@ -0,0 +1,108 @@ + + + + +SdFat: Class Members - Functions + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - w -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_type.html b/libs/SdFatBeta20120108/html/functions_type.html new file mode 100644 index 0000000..4f06b7e --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_type.html @@ -0,0 +1,74 @@ + + + + +SdFat: Class Members - Typedefs + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + +
    +
    +
    + + + diff --git a/libs/SdFatBeta20120108/html/functions_vars.html b/libs/SdFatBeta20120108/html/functions_vars.html new file mode 100644 index 0000000..be85259 --- /dev/null +++ b/libs/SdFatBeta20120108/html/functions_vars.html @@ -0,0 +1,502 @@ + + + + +SdFat: Class Members - Variables + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - a -

    + + +

    - b -

    + + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - f -

    + + +

    - g -

    + + +

    - h -

    + + +

    - i -

    + + +

    - j -

    + + +

    - l -

    + + +

    - m -

    + + +

    - n -

    + + +

    - o -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    + + +

    - u -

    + + +

    - v -

    + + +

    - w -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/globals.html b/libs/SdFatBeta20120108/html/globals.html new file mode 100644 index 0000000..7ee68b4 --- /dev/null +++ b/libs/SdFatBeta20120108/html/globals.html @@ -0,0 +1,594 @@ + + + + +SdFat: File Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented file members with links to the documentation:
    + +

    - a -

    + + +

    - b -

    + + +

    - d -

    + + +

    - e -

    + + +

    - f -

    + + +

    - h -

    + + +

    - i -

      +
    • internal() +: ios.h +
    • +
    + + +

    - l -

    + + +

    - m -

    + + +

    - n -

      +
    • noboolalpha() +: ios.h +
    • +
    • noshowbase() +: ios.h +
    • +
    • noshowpoint() +: ios.h +
    • +
    • noshowpos() +: ios.h +
    • +
    • noskipws() +: ios.h +
    • +
    • nouppercase() +: ios.h +
    • +
    + + +

    - o -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    + + +

    - u -

    + + +

    - w -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/globals_defs.html b/libs/SdFatBeta20120108/html/globals_defs.html new file mode 100644 index 0000000..70bfe7d --- /dev/null +++ b/libs/SdFatBeta20120108/html/globals_defs.html @@ -0,0 +1,96 @@ + + + + +SdFat: File Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + +
    +
    +
    + + + diff --git a/libs/SdFatBeta20120108/html/globals_func.html b/libs/SdFatBeta20120108/html/globals_func.html new file mode 100644 index 0000000..2a295eb --- /dev/null +++ b/libs/SdFatBeta20120108/html/globals_func.html @@ -0,0 +1,226 @@ + + + + +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 -

    + + +

    - r -

    + + +

    - s -

    + + +

    - u -

      +
    • uppercase() +: ios.h +
    • +
    + + +

    - w -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/globals_type.html b/libs/SdFatBeta20120108/html/globals_type.html new file mode 100644 index 0000000..2c346e2 --- /dev/null +++ b/libs/SdFatBeta20120108/html/globals_type.html @@ -0,0 +1,72 @@ + + + + +SdFat: File Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + +
    +
    +
    + + + diff --git a/libs/SdFatBeta20120108/html/globals_vars.html b/libs/SdFatBeta20120108/html/globals_vars.html new file mode 100644 index 0000000..a69d71c --- /dev/null +++ b/libs/SdFatBeta20120108/html/globals_vars.html @@ -0,0 +1,384 @@ + + + + +SdFat: File Members + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + + + +
    +
    +  + +

    - b -

    + + +

    - d -

    + + +

    - e -

    + + +

    - f -

    + + +

    - l -

    + + +

    - o -

    + + +

    - s -

    + + +

    - t -

    +
    + + + diff --git a/libs/SdFatBeta20120108/html/graph_legend.html b/libs/SdFatBeta20120108/html/graph_legend.html new file mode 100644 index 0000000..9c5df42 --- /dev/null +++ b/libs/SdFatBeta20120108/html/graph_legend.html @@ -0,0 +1,105 @@ + + + + +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:

    +
    +graph_legend.png +
    +

    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/libs/SdFatBeta20120108/html/graph_legend.png b/libs/SdFatBeta20120108/html/graph_legend.png new file mode 100644 index 0000000000000000000000000000000000000000..f99376d0980ff928458561787721e08a589189ea GIT binary patch literal 13683 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 + + + +SdFat: Class Hierarchy + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    Class Hierarchy
    +
    + + + + diff --git a/libs/SdFatBeta20120108/html/index.html b/libs/SdFatBeta20120108/html/index.html new file mode 100644 index 0000000..ce3ca8b --- /dev/null +++ b/libs/SdFatBeta20120108/html/index.html @@ -0,0 +1,111 @@ + + + + +SdFat: Arduino SdFat Library + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + +
    +
    +
    +
    Arduino SdFat Library
    +
    +
    +
    Copyright © 2011 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, 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 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 Wave 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 fat16lib@sbcglobal.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.

    +
    Note:
    The Arduino Print class uses character at a time writes so it was necessary to use a sync() function to control when data is written to the SD card.
    +
    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

    +

    Adafruit Industries:

    +

    http://www.adafruit.com/

    +

    http://www.ladyada.net/make/waveshield/

    +

    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/libs/SdFatBeta20120108/html/inherit_graph_0.png b/libs/SdFatBeta20120108/html/inherit_graph_0.png new file mode 100644 index 0000000000000000000000000000000000000000..2b0d4a36418d6513fd815f30fb26e636bc8fcac7 GIT binary patch literal 376 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 S0Izn#d#jA5L~c#`D6wLMnz8- z$B>N1x6}9L9ySnYwU?ZCWNJ141J0mhbFB}j9y?(Wd1P}6vpD0ELuLgE6+)_WH54o4 z4>*s1fagu)?Vd%`9tm48*=HUyW}fFZ z=ULDeg|*XfTnX7&meS^!CXv#X=xKbXH%D`q-{gf)*q+}_{`IQu%Cs-qN~d`ILss6{ z!04-3l=fspv&?RtOS{xMw|mx@6wm&sX722D_T*L5_1jLReiED3J>6ibS zzP++?tIsi`)Jk5pSMv-*60W34d9AfoK3o0w_r2R+_pG|S#NTID{+x=;*q7zq7x#C9 z9f2SgzMi*{dEM5QH8b<)neYC8<6ndGoKPnY#R`U4!&rui#`7zI!N=g~>gTe~DWM4f DFrb}) literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/inherit_graph_12.png b/libs/SdFatBeta20120108/html/inherit_graph_12.png new file mode 100644 index 0000000000000000000000000000000000000000..89883f784e3ad18119ea540ee8a47efdf0c4e707 GIT binary patch literal 402 zcmV;D0d4+?P)6A!Y~j8Ul0d6;6xR0ppuk82~!?A%qYzpmDVA0o(xWlyj+xCxENn=#t$6xC3~U&Ztrj0M2l` z9nb>kil$RHUVj_qL{<%DD?-_dP_`ofk}dTDUet?xD-_4|&>=^k&NI%}zGx(5uS!@B zQkCt(6rJ;Rw?7-Yux49--^ViB?U*6+B~em#k52^f6JS5AEomxVY#uJ@u3U2F8z3Ru ztQfm}PT2XV=OE;*J|Ue`)R;R5ETw&0MTob# zD&%YPT!pa-S_V*|(>+%}+vd_fH>^g$wTLxnbpZWf&5b};Xnq5vR_?kRv_@dbTkfhO ztVe+RmltwfnYbHPBk)a}%hPA2oSIp^AB45eyFJ0~9@J6O~J0000Jju9Wmf>t(WN9%V@j(MwY&Vujk2HjhPQwa(44hzd76BW|!pRK#|)UWg7p# z4%@VJ{?CnOY#fR$0-y3{PPxI{z|YWrF3RmG?*UcbJKEiT4D%S~RBK4hQEm`VneplH z=G8Jx4D+KttlQ4DiO-jl1BOn_TXx2=`rX3U;)~~syxkPD`IzYIc|lIU%6z#$nwV?< z%v^X*r)ZN~W_<4cJG-wrXH7CSyLf2I7sX5WjpjW|sWW>OVY}s4lwSDet;^hkMdco^ z4x6#{eD#tmSIRG6d9)Is0#ooEwFJ5j6`>*K@)s6w_4M!O zt|SJv|?rv>j&NkccTRv8EW3@HV8OzD9Y|+ ZoE_{~vTVV2CtxHnc)I$ztaD0e0syjdy{`ZO literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/inherit_graph_15.png b/libs/SdFatBeta20120108/html/inherit_graph_15.png new file mode 100644 index 0000000000000000000000000000000000000000..f8da061c87dc155147842e4c987648343b76e6a9 GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^wm_`P!3HEhK7S|=q}Y|gW!U_%O?Xx{&>1L zhGaCpowir-kO5C?yv4NziL6o*P16K5G$k7oH*u)io^D~PN$*MZP`df!&pvDMNss2t zQ~l4-A`oOb_rZN;i>E$EI;0zlUrcfN&QQj%ZknXzW~L3TYd$vrGtGL&kkG*@HdFW~ zx5h3}AoA+&o44-T6tUQrrH}UiSykF}zn^zvg@t~qznk}#DG54(&$%DpjJmsO@A8l% zx=bJTW$atq6t?s)%iOmbMG;Fc+_`+|U-0S)Vo`5xm(5z4f4Ej}F8AgQdG9a0KYplU zTi=GP_wj#%{>-+WttPK7a+eE&R#sQ>KA52`$ZVFZ9`m6_^Qzsu{11&HC2qAYNjRcg&DJa;X~UG5FC2pIWCNlpX@52SDiol$1V9UXet9e-f{I$zg!r^Uql;CC!~{ zP0k)&N=aXewvlnno7*)dqz~f#0J}o9wH9mTPBW~1vT|}KDIr~}N~=Px3NDRygr%My zZ?0(W=;LL?s!F+L?xr_=1l5wB+d*hmDetvukvY_mZat=@?zMYb{5bN2r{=m74%Df1 z*}ZtzUZ(?PPR?6c_w>Fml||-WOeyIyM9#Iffu$QueQr&g+Ew?Gi+3z-{z%%Z^v#R) z;J=IkP>30Bs0KRG`dJul20}w(8AzkqgV|GAu T?~=T;00000NkvXXu0mjfu8g;- literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/inherit_graph_3.png b/libs/SdFatBeta20120108/html/inherit_graph_3.png new file mode 100644 index 0000000000000000000000000000000000000000..c77a10f45b96c1103271d31f5640b9df253e1a4a GIT binary patch literal 448 zcmeAS@N?(olHy`uVBq!ia0vp^sX(mC!3HFwRn!*)DYhhUcNd2LAh=-f^2rPgjHR9~ zjv*P1Z)Z3b9ai9R-EY0u&1|oe`CG+ZX9ah?+2sBrv1p>s?)Ry8Tqn;Ando5AH1YBO zG>Lx3<_FCJY#fR$0!7<>-2O>7^iOQdnUc>i-{`W?Q-%kk2R1Hul}=}Wz`BhsT*j~S zOEQ1LH7+?eX(yS0DJ>9W!?wM=vS8=pu0EIB#wj%u7oGVat@Zkp#*t{TME{b#vper; zdS76xKBqm^bz-9Xe`T*Jkv8f#v}0ChZ!9^K_3gx5i_Yb1t{d%}-6`Z6ef1jG_A&>R zP5ftLv;IbZ&3ZfaR*qWpZ>z_aE{oanwoW`W^{a^M-`0QyTPE4ATX(H&+ldQHrfXdL z)|ZvdDffM9Q{eRDlN7dYdhy$}s_L!C+1QBpTRq%nUkF>c=E z{mk`Kr{}~R?X5FWoj&E;o(~(+0>f-Ss{WX6p(vt?Kuce|<~;CQ!`bXa@oV<@AG_HN jzWUn7If4UB{SVVx-g&1KHRADbhkFL(V#qi^AA zKeUw^PhiZ}2Sqn60=%__4ynf$K5Tf<<_Qc>Ve3BkozZ!pYx;86UsNl=u#nvQlsR+y zOTL?>)gh9~+TO#Tz_5LQy9miL`g`E;6ks6*SV#dDQhwIgmeYb~4lOa5@_R0000~U>E6rGg=55^ zj*KK9A2R+AAO!Fv^6>K>A_yUbD9TG>{s?^5bfgg{;47X?i825O;HRWVjd=z3q%{~Z z{Elbl9SD|TQ`wPKAW;k?ih)Ei*gCIwU$`b$_1^FlCD2X?*S(cK240a8q9IvDT$XPc51sWlfP02_}b(lCsa<-{aa{pa7-3P|bh($ literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/inherit_graph_6.png b/libs/SdFatBeta20120108/html/inherit_graph_6.png new file mode 100644 index 0000000000000000000000000000000000000000..e867dcf68974125ebfe8f4ed4cd21c7bc4f0150f GIT binary patch literal 524 zcmV+n0`vWeP)w#4r#A;1{%&aH0z;;JDnlA&&Gz3)=`yKml~X1%<;Z zk~Q*pCh<=utM{E2+p%YziS3O9Ktx1DM07(YrThuN`^Z2jj9&n+0Dfe}Nx9$!zypBK zjzLjOX8?}?F0w*P7T}sF&%Gj|ux72|Ze$d6Y)lq%W3rGNlZD)vEVoZRu&!15H5APZ z{k@Rq+SJy5a{W%pXQ|aVAsi`LYNa=>Ch@#u^c-gwEt6%LnB@tRPn^72DXmWSk@lta zp~X?+ji(foN6k37^3r@a*Lr2iEz9!DrDgIu`6MoX%eveXYt?&Vw&Jm3YB`Q|O|D*R z-$d(Vk%87O!CSA_Ccd{`XCuwfEpD$fi+1DW_EMURwKspndBR%RMkH)EdnAjsRC*7h zkq?gA))F~pQ-t>{v+}v7p9pe?aH)69P5a+tWyx(d+OM3+*-p02(b|{#vc|CzB3)s& zjI;K8mgcrv%Ve>ZTsg_!y0z_ca2GEQxIv#l?}Hbe)(WFa>u3%M~_$c@QD zZcG+(W3rH2={?ImfVWYBP<&dleBt`fMjr!Xp&0%EeD56u5fKp)QFs61Fkn7a8&|ym O0000ei!$Gd)hH-;Gga5gxj&uAC<_ynGerVY2VE@4M;Dtihmf{2R&Eqoz zj6R%t9blQF+bwdZa<#&?3kM#+P~DM5Nv`);)^g1~+I0JO=C9b(U;9Fny!YqbS=?xO z%O!7a%ITv9tlZ4&_2;d7R+FUgtZo((6wQ6?jeWHtk_KU6Fw`_mvnZR2NHzapFTNk#< z&pX%aZT9)hkJo0H)tzk-%boo&KJ(zh#)BIT3Vy}DuscxTh>&fEct`? s0n>xSk=z$|GFY4ybL0R9UD6?a>pb^|b*t(cfic72>FVdQ&MBb@05JW^u>b%7 literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/inherit_graph_8.png b/libs/SdFatBeta20120108/html/inherit_graph_8.png new file mode 100644 index 0000000000000000000000000000000000000000..31bac90a98a43dc2af4b41f4a19be48f430cef76 GIT binary patch literal 321 zcmV-H0lxl;P)eucScF;FfC4EL5yCoQ zqbPR{*!QF;ioY)UKX%Rr$8nq=B_zf-z^SAWMee`>xJhB2DA)r_;A&{fiY>4PE>cK^ zg+A!c%8?;mN|=>&F*P2xRy=I2c-UIW?XyGZ=uczu9v6fz36U1p#^drmqtFTqZ`1Nw zj=!{2?WfQxfi;)$7(=pFZ8l??`e!|?G0B6vHQEg-CPa7Hr6&oj88+8chG=HZs;Pfg zb7pg-mUvOL!hSP9NjOPU%hgET4Qc@#OBtDxGyQh)kJkfO>3#;?4j}z!7fT5J$#f7#3j`HsF9%4i!=r z>IAnxX^Z}oDiu31&adO9fDl3mF#?rg-vPLkOk_qp0h|ClLdVjWa0IXhaL<_3T-gKI z0=R_^OH7~<@{lW|8B<%1MaeAw9f?UqViJ*)BwhVxSX zNx%}bM)v|OdumMEmhw*qW@UEKUa+;DVxm~0#o~q!q3*C}A-9+xtmg$0kbmu_RRKJE6y+TMyJ#^Ptms;vu;~2taGM!0d;V132C(t>;H!2F_=<4 zGxUeQJ##&AQ+cMwyU5)$WB$spdt-a!TH^R5A;`P|>iB-|_?f~C00000NkvXXu0mjfqtmaD literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/inherits.html b/libs/SdFatBeta20120108/html/inherits.html new file mode 100644 index 0000000..e99c3b3 --- /dev/null +++ b/libs/SdFatBeta20120108/html/inherits.html @@ -0,0 +1,116 @@ + + + + +SdFat: Class Hierarchy + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    Class Hierarchy
    +
    +
    + + + + + + + + + + + + + + + + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    + + +
    +
    + + + diff --git a/libs/SdFatBeta20120108/html/ios_8h.html b/libs/SdFatBeta20120108/html/ios_8h.html new file mode 100644 index 0000000..1820151 --- /dev/null +++ b/libs/SdFatBeta20120108/html/ios_8h.html @@ -0,0 +1,549 @@ + + + + +SdFat: Arduino/libraries/SdFat/ios.h File Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    + +
    +
    Arduino/libraries/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/libs/SdFatBeta20120108/html/ios_8h__dep__incl.png b/libs/SdFatBeta20120108/html/ios_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b1bff03243d2f1d6dc3cfe80f8fb438a491d1f GIT binary patch literal 17602 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 Y&x9#HyA{l0@b{iSRY4R!HvI6v0G^0|nE(I) literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/iostream_8h.html b/libs/SdFatBeta20120108/html/iostream_8h.html new file mode 100644 index 0000000..3317397 --- /dev/null +++ b/libs/SdFatBeta20120108/html/iostream_8h.html @@ -0,0 +1,386 @@ + + + + +SdFat: Arduino/libraries/SdFat/iostream.h File Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    + +
    +
    Arduino/libraries/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 setw &arg)
    ostreamoperator<< (ostream &os, const setprecision &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 setwarg 
    ) [inline]
    +
    +
    +

    setw manipulator

    +
    Parameters:
    + + + +
    [in]osthe stream
    [in]argset setw object
    +
    +
    +
    Returns:
    the stream
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    ostream& operator<< (ostreamos,
    const setprecisionarg 
    ) [inline]
    +
    +
    +

    setprecision manipulator

    +
    Parameters:
    + + + +
    [in]osthe stream
    [in]argset setprecision 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/libs/SdFatBeta20120108/html/iostream_8h__dep__incl.png b/libs/SdFatBeta20120108/html/iostream_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..ba82d4eccf57aa1c126a02f23f40aeaec9c4068f GIT binary patch literal 11184 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 KLX>IPKl(4nD0CnI literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/iostream_8h__incl.png b/libs/SdFatBeta20120108/html/iostream_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca6ab88d8e4ad4e9800ce3b8be8233977b12425 GIT binary patch literal 23643 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 + + + +SdFat: Arduino/libraries/SdFat/istream.h File Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    + +
    +
    Arduino/libraries/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/libs/SdFatBeta20120108/html/istream_8h__dep__incl.png b/libs/SdFatBeta20120108/html/istream_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..6cda13bd203d42bcb187bfeff2c647dcf6d7409d GIT binary patch literal 12520 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
    =|oUF3u!HH-+5fYl^mCG*c$8^8( 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 DP|ayO literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/jquery.js b/libs/SdFatBeta20120108/html/jquery.js new file mode 100644 index 0000000..c052173 --- /dev/null +++ b/libs/SdFatBeta20120108/html/jquery.js @@ -0,0 +1,54 @@ +/* + * jQuery JavaScript Library v1.3.2 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) + * Revision: 6246 + */ +(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},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(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
    "]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
    ","
    "]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); +/* + * Sizzle CSS Selector Engine - v0.9.3 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

    ";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
    ";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0) +{I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
    ").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function() +{G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
    ';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); +/* + * jQuery UI 1.7.2 + * + * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI + */ +jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.2",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/* * jQuery UI Resizable 1.7.2 + * + * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Resizables + * + * Depends: + * ui.core.js + */ +(function(c){c.widget("ui.resizable",c.extend({},c.ui.mouse,{_init:function(){var e=this,j=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(j.aspectRatio),aspectRatio:j.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:j.helper||j.ghost||j.animate?j.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){if(/relative/.test(this.element.css("position"))&&c.browser.opera){this.element.css({position:"relative",top:"auto",left:"auto"})}this.element.wrap(c('
    ').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=j.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var k=this.handles.split(",");this.handles={};for(var f=0;f
    ');if(/sw|se|ne|nw/.test(h)){g.css({zIndex:++j.zIndex})}if("se"==h){g.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[h]=".ui-resizable-"+h;this.element.append(g)}}this._renderAxis=function(p){p=p||this.element;for(var m in this.handles){if(this.handles[m].constructor==String){this.handles[m]=c(this.handles[m],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var n=c(this.handles[m],this.element),o=0;o=/sw|ne|nw|se|n|s/.test(m)?n.outerHeight():n.outerWidth();var l=["padding",/ne|nw|n/.test(m)?"Top":/se|sw|s/.test(m)?"Bottom":/^e$/.test(m)?"Right":"Left"].join("");p.css(l,o);this._proportionallyResize()}if(!c(this.handles[m]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!e.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}e.axis=i&&i[1]?i[1]:"se"}});if(j.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){c(this).removeClass("ui-resizable-autohide");e._handles.show()},function(){if(!e.resizing){c(this).addClass("ui-resizable-autohide");e._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var d=function(f){c(f).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){d(this.element);var e=this.element;e.parent().append(this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")})).end().remove()}this.originalElement.css("resize",this.originalResizeStyle);d(this.originalElement)},_mouseCapture:function(e){var f=false;for(var d in this.handles){if(c(this.handles[d])[0]==e.target){f=true}}return this.options.disabled||!!f},_mouseStart:function(f){var i=this.options,e=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(d.is(".ui-draggable")||(/absolute/).test(d.css("position"))){d.css({position:"absolute",top:e.top,left:e.left})}if(c.browser.opera&&(/relative/).test(d.css("position"))){d.css({position:"relative",top:"auto",left:"auto"})}this._renderProxy();var j=b(this.helper.css("left")),g=b(this.helper.css("top"));if(i.containment){j+=c(i.containment).scrollLeft()||0;g+=c(i.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:j,top:g};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:j,top:g};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:f.pageX,top:f.pageY};this.aspectRatio=(typeof i.aspectRatio=="number")?i.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var h=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",h=="auto"?this.axis+"-resize":h);d.addClass("ui-resizable-resizing");this._propagate("start",f);return true},_mouseDrag:function(d){var g=this.helper,f=this.options,l={},p=this,i=this.originalMousePosition,m=this.axis;var q=(d.pageX-i.left)||0,n=(d.pageY-i.top)||0;var h=this._change[m];if(!h){return false}var k=h.apply(this,[d,q,n]),j=c.browser.msie&&c.browser.version<7,e=this.sizeDiff;if(this._aspectRatio||d.shiftKey){k=this._updateRatio(k,d)}k=this._respectSize(k,d);this._propagate("resize",d);g.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(k);this._trigger("resize",d,this.ui());return false},_mouseStop:function(g){this.resizing=false;var h=this.options,l=this;if(this._helper){var f=this._proportionallyResizeElements,d=f.length&&(/textarea/i).test(f[0].nodeName),e=d&&c.ui.hasScroll(f[0],"left")?0:l.sizeDiff.height,j=d?0:l.sizeDiff.width;var m={width:(l.size.width-j),height:(l.size.height-e)},i=(parseInt(l.element.css("left"),10)+(l.position.left-l.originalPosition.left))||null,k=(parseInt(l.element.css("top"),10)+(l.position.top-l.originalPosition.top))||null;if(!h.animate){this.element.css(c.extend(m,{top:k,left:i}))}l.helper.height(l.size.height);l.helper.width(l.size.width);if(this._helper&&!h.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",g);if(this._helper){this.helper.remove()}return false},_updateCache:function(d){var e=this.options;this.offset=this.helper.offset();if(a(d.left)){this.position.left=d.left}if(a(d.top)){this.position.top=d.top}if(a(d.height)){this.size.height=d.height}if(a(d.width)){this.size.width=d.width}},_updateRatio:function(g,f){var h=this.options,i=this.position,e=this.size,d=this.axis;if(g.height){g.width=(e.height*this.aspectRatio)}else{if(g.width){g.height=(e.width/this.aspectRatio)}}if(d=="sw"){g.left=i.left+(e.width-g.width);g.top=null}if(d=="nw"){g.top=i.top+(e.height-g.height);g.left=i.left+(e.width-g.width)}return g},_respectSize:function(k,f){var i=this.helper,h=this.options,q=this._aspectRatio||f.shiftKey,p=this.axis,s=a(k.width)&&h.maxWidth&&(h.maxWidthk.width),r=a(k.height)&&h.minHeight&&(h.minHeight>k.height);if(g){k.width=h.minWidth}if(r){k.height=h.minHeight}if(s){k.width=h.maxWidth}if(l){k.height=h.maxHeight}var e=this.originalPosition.left+this.originalSize.width,n=this.position.top+this.size.height;var j=/sw|nw|w/.test(p),d=/nw|ne|n/.test(p);if(g&&j){k.left=e-h.minWidth}if(s&&j){k.left=e-h.maxWidth}if(r&&d){k.top=n-h.minHeight}if(l&&d){k.top=n-h.maxHeight}var m=!k.width&&!k.height;if(m&&!k.left&&k.top){k.top=null}else{if(m&&!k.top&&k.left){k.left=null}}return k},_proportionallyResize:function(){var j=this.options;if(!this._proportionallyResizeElements.length){return}var f=this.helper||this.element;for(var e=0;e');var d=c.browser.msie&&c.browser.version<7,f=(d?1:0),g=(d?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+g,height:this.element.outerHeight()+g,position:"absolute",left:this.elementOffset.left-f+"px",top:this.elementOffset.top-f+"px",zIndex:++h.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(f,e,d){return{width:this.originalSize.width+e}},w:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{left:h.left+e,width:f.width-e}},n:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{top:h.top+d,height:f.height-d}},s:function(f,e,d){return{height:this.originalSize.height+d}},se:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},sw:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[f,e,d]))},ne:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},nw:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[f,e,d]))}},_propagate:function(e,d){c.ui.plugin.call(this,e,[d,this.ui()]);(e!="resize"&&this._trigger(e,d,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}));c.extend(c.ui.resizable,{version:"1.7.2",eventPrefix:"resize",defaults:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,cancel:":input,option",containment:false,delay:0,distance:1,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000}});c.ui.plugin.add("resizable","alsoResize",{start:function(e,f){var d=c(this).data("resizable"),g=d.options;_store=function(h){c(h).each(function(){c(this).data("resizable-alsoresize",{width:parseInt(c(this).width(),10),height:parseInt(c(this).height(),10),left:parseInt(c(this).css("left"),10),top:parseInt(c(this).css("top"),10)})})};if(typeof(g.alsoResize)=="object"&&!g.alsoResize.parentNode){if(g.alsoResize.length){g.alsoResize=g.alsoResize[0];_store(g.alsoResize)}else{c.each(g.alsoResize,function(h,i){_store(h)})}}else{_store(g.alsoResize)}},resize:function(f,h){var e=c(this).data("resizable"),i=e.options,g=e.originalSize,k=e.originalPosition;var j={height:(e.size.height-g.height)||0,width:(e.size.width-g.width)||0,top:(e.position.top-k.top)||0,left:(e.position.left-k.left)||0},d=function(l,m){c(l).each(function(){var p=c(this),q=c(this).data("resizable-alsoresize"),o={},n=m&&m.length?m:["width","height","top","left"];c.each(n||["width","height","top","left"],function(r,t){var s=(q[t]||0)+(j[t]||0);if(s&&s>=0){o[t]=s||null}});if(/relative/.test(p.css("position"))&&c.browser.opera){e._revertToRelativePosition=true;p.css({position:"absolute",top:"auto",left:"auto"})}p.css(o)})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.nodeType){c.each(i.alsoResize,function(l,m){d(l,m)})}else{d(i.alsoResize)}},stop:function(e,f){var d=c(this).data("resizable");if(d._revertToRelativePosition&&c.browser.opera){d._revertToRelativePosition=false;el.css({position:"relative"})}c(this).removeData("resizable-alsoresize-start")}});c.ui.plugin.add("resizable","animate",{stop:function(h,m){var n=c(this).data("resizable"),i=n.options;var g=n._proportionallyResizeElements,d=g.length&&(/textarea/i).test(g[0].nodeName),e=d&&c.ui.hasScroll(g[0],"left")?0:n.sizeDiff.height,k=d?0:n.sizeDiff.width;var f={width:(n.size.width-k),height:(n.size.height-e)},j=(parseInt(n.element.css("left"),10)+(n.position.left-n.originalPosition.left))||null,l=(parseInt(n.element.css("top"),10)+(n.position.top-n.originalPosition.top))||null;n.element.animate(c.extend(f,l&&j?{top:l,left:j}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var o={width:parseInt(n.element.css("width"),10),height:parseInt(n.element.css("height"),10),top:parseInt(n.element.css("top"),10),left:parseInt(n.element.css("left"),10)};if(g&&g.length){c(g[0]).css({width:o.width,height:o.height})}n._updateCache(o);n._propagate("resize",h)}})}});c.ui.plugin.add("resizable","containment",{start:function(e,q){var s=c(this).data("resizable"),i=s.options,k=s.element;var f=i.containment,j=(f instanceof c)?f.get(0):(/parent/.test(f))?k.parent().get(0):f;if(!j){return}s.containerElement=c(j);if(/document/.test(f)||f==document){s.containerOffset={left:0,top:0};s.containerPosition={left:0,top:0};s.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var m=c(j),h=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){h[p]=b(m.css("padding"+o))});s.containerOffset=m.offset();s.containerPosition=m.position();s.containerSize={height:(m.innerHeight()-h[3]),width:(m.innerWidth()-h[1])};var n=s.containerOffset,d=s.containerSize.height,l=s.containerSize.width,g=(c.ui.hasScroll(j,"left")?j.scrollWidth:l),r=(c.ui.hasScroll(j)?j.scrollHeight:d);s.parentData={element:j,left:n.left,top:n.top,width:g,height:r}}},resize:function(f,p){var s=c(this).data("resizable"),h=s.options,e=s.containerSize,n=s.containerOffset,l=s.size,m=s.position,q=s._aspectRatio||f.shiftKey,d={top:0,left:0},g=s.containerElement;if(g[0]!=document&&(/static/).test(g.css("position"))){d=n}if(m.left<(s._helper?n.left:0)){s.size.width=s.size.width+(s._helper?(s.position.left-n.left):(s.position.left-d.left));if(q){s.size.height=s.size.width/h.aspectRatio}s.position.left=h.helper?n.left:0}if(m.top<(s._helper?n.top:0)) +{s.size.height=s.size.height+(s._helper?(s.position.top-n.top):s.position.top);if(q){s.size.width=s.size.height*h.aspectRatio}s.position.top=s._helper?n.top:0}s.offset.left=s.parentData.left+s.position.left;s.offset.top=s.parentData.top+s.position.top;var k=Math.abs((s._helper?s.offset.left-d.left:(s.offset.left-d.left))+s.sizeDiff.width),r=Math.abs((s._helper?s.offset.top-d.top:(s.offset.top-n.top))+s.sizeDiff.height);var j=s.containerElement.get(0)==s.element.parent().get(0),i=/relative|absolute/.test(s.containerElement.css("position"));if(j&&i){k-=s.parentData.left}if(k+s.size.width>=s.parentData.width){s.size.width=s.parentData.width-k;if(q){s.size.height=s.size.width/s.aspectRatio}}if(r+s.size.height>=s.parentData.height){s.size.height=s.parentData.height-r;if(q){s.size.width=s.size.height*s.aspectRatio}}},stop:function(e,m){var p=c(this).data("resizable"),f=p.options,k=p.position,l=p.containerOffset,d=p.containerPosition,g=p.containerElement;var i=c(p.helper),q=i.offset(),n=i.outerWidth()-p.sizeDiff.width,j=i.outerHeight()-p.sizeDiff.height;if(p._helper&&!f.animate&&(/relative/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}if(p._helper&&!f.animate&&(/static/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}}});c.ui.plugin.add("resizable","ghost",{start:function(f,g){var d=c(this).data("resizable"),h=d.options,e=d.size;d.ghost=d.originalElement.clone();d.ghost.css({opacity:0.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof h.ghost=="string"?h.ghost:"");d.ghost.appendTo(d.helper)},resize:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost){d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})}},stop:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost&&d.helper){d.helper.get(0).removeChild(d.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(d,l){var n=c(this).data("resizable"),g=n.options,j=n.size,h=n.originalSize,i=n.originalPosition,m=n.axis,k=g._aspectRatio||d.shiftKey;g.grid=typeof g.grid=="number"?[g.grid,g.grid]:g.grid;var f=Math.round((j.width-h.width)/(g.grid[0]||1))*(g.grid[0]||1),e=Math.round((j.height-h.height)/(g.grid[1]||1))*(g.grid[1]||1);if(/^(se|s|e)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e}else{if(/^(ne)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e}else{if(/^(sw)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.left=i.left-f}else{n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e;n.position.left=i.left-f}}}}});var b=function(d){return parseInt(d,10)||0};var a=function(d){return !isNaN(parseInt(d,10))}})(jQuery);; +/** + * jQuery.ScrollTo - Easy element scrolling using jQuery. + * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com + * Licensed under GPL license (http://www.opensource.org/licenses/gpl-license.php). + * Date: 2/8/2008 + * @author Ariel Flesler + * @version 1.3.2 + */ +;(function($){var o=$.scrollTo=function(a,b,c){o.window().scrollTo(a,b,c)};o.defaults={axis:'y',duration:1};o.window=function(){return $($.browser.safari?'body':'html')};$.fn.scrollTo=function(l,m,n){if(typeof m=='object'){n=m;m=0}n=$.extend({},o.defaults,n);m=m||n.speed||n.duration;n.queue=n.queue&&n.axis.length>1;if(n.queue)m/=2;n.offset=j(n.offset);n.over=j(n.over);return this.each(function(){var a=this,b=$(a),t=l,c,d={},w=b.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(t)){t=j(t);break}t=$(t,this);case'object':if(t.is||t.style)c=(t=$(t)).offset()}$.each(n.axis.split(''),function(i,f){var P=f=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,e=a[k],D=f=='x'?'Width':'Height';if(c){d[k]=c[p]+(w?0:e-b.offset()[p]);if(n.margin){d[k]-=parseInt(t.css('margin'+P))||0;d[k]-=parseInt(t.css('border'+P+'Width'))||0}d[k]+=n.offset[p]||0;if(n.over[p])d[k]+=t[D.toLowerCase()]()*n.over[p]}else d[k]=t[p];if(/^\d+$/.test(d[k]))d[k]=d[k]<=0?0:Math.min(d[k],h(D));if(!i&&n.queue){if(e!=d[k])g(n.onAfterFirst);delete d[k]}});g(n.onAfter);function g(a){b.animate(d,m,n.easing,a&&function(){a.call(this,l)})};function h(D){var b=w?$.browser.opera?document.body:document.documentElement:a;return b['scroll'+D]-b['client'+D]}})};function j(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery); + diff --git a/libs/SdFatBeta20120108/html/nav_f.png b/libs/SdFatBeta20120108/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..1b07a16207e67c95fe2ee17e7016e6d08ac7ac99 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQfZzpjv*C{Z|{2YIT`Y>1X`Eg z-tTbne1`SITM8Q!Pb(<)UFZ(m>wMzvKZQqKM~~GcZ=A7j<~E6K62>ozFS=cD3)mf8 z9WX0+R&m(l9KUsLdTx4?9~({T__KA%`}olPJ^N;y|F^pHgs_K%!rj~{8>RwnWbkzL Kb6Mw<&;$VTdq1fF literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/nav_h.png b/libs/SdFatBeta20120108/html/nav_h.png new file mode 100644 index 0000000000000000000000000000000000000000..01f5fa6a596e36bd12c2d6ceff1b0169fda7e699 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^j6lr8!2~3AUOE6t1`SUa$B+ufw|6&kG8phMJMJ~w va4>Y+bZ&9QY?(VEUPY_cGd9nQ`um^ZSUyYpAAuKhL7F^W{an^LB{Ts5DmojT literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/open.png b/libs/SdFatBeta20120108/html/open.png new file mode 100644 index 0000000000000000000000000000000000000000..7b35d2c2c389743089632fe24c3104f2173d97af GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{Vww^AIAr*{o=Nbw!DDW^(zOibV zl!F8B0?t?i!vld4k#$~0_AX3zElaokn + + + +SdFat: Arduino/libraries/SdFat/ostream.h File Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    + +
    +
    Arduino/libraries/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...

    +Defines

    #define pstr(str)   pgm(PSTR(str))
    +

    Detailed Description

    +

    ostream class

    +

    Define Documentation

    + +
    +
    + + + + + + + + +
    #define pstr( str)   pgm(PSTR(str))
    +
    +
    +

    macro for flash inserter

    + +
    +
    +
    + + + diff --git a/libs/SdFatBeta20120108/html/ostream_8h__dep__incl.png b/libs/SdFatBeta20120108/html/ostream_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..6ff6d1ffb2c1bc9ac5f70e44d8f8c3ab56d6bb83 GIT binary patch literal 12523 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

    _33Kv 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 I&MBb@0H$M&YXATM literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/structdirectory_entry-members.html b/libs/SdFatBeta20120108/html/structdirectory_entry-members.html new file mode 100644 index 0000000..cd535d6 --- /dev/null +++ b/libs/SdFatBeta20120108/html/structdirectory_entry-members.html @@ -0,0 +1,61 @@ + + + + +SdFat: Member List + + + + + +

    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    directoryEntry Member List
    +
    + + + + diff --git a/libs/SdFatBeta20120108/html/structdirectory_entry.html b/libs/SdFatBeta20120108/html/structdirectory_entry.html new file mode 100644 index 0000000..d7bb9ce --- /dev/null +++ b/libs/SdFatBeta20120108/html/structdirectory_entry.html @@ -0,0 +1,259 @@ + + + + +SdFat: directoryEntry Struct Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    + +
    +
    directoryEntry Struct Reference
    +
    +
    + +

    FAT short directory entry. + More...

    + +

    #include <SdFatStructs.h>

    + +

    List of all members.

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

    +Public Attributes

    uint8_t attributes
    uint16_t creationDate
    uint16_t creationTime
    uint8_t creationTimeTenths
    uint32_t fileSize
    uint16_t firstClusterHigh
    uint16_t firstClusterLow
    uint16_t lastAccessDate
    uint16_t lastWriteDate
    uint16_t lastWriteTime
    uint8_t name [11]
    uint8_t reservedNT
    +

    Detailed Description

    +

    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.

    +

    Member Data Documentation

    + +
    +
    + + + + +
    uint8_t directoryEntry::attributes
    +
    +
    +

    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_.

    + +
    +
    + +
    +
    + + + + +
    uint16_t directoryEntry::creationDate
    +
    +
    +

    Date file was created.

    + +
    +
    + +
    +
    + + + + +
    uint16_t directoryEntry::creationTime
    +
    +
    +

    Time file was created.

    + +
    +
    + +
    + +
    +

    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)

    + +
    +
    + +
    +
    + + + + +
    uint32_t directoryEntry::fileSize
    +
    +
    +

    32-bit unsigned holding this file's size in bytes.

    + +
    +
    + +
    +
    + + + + +
    uint16_t directoryEntry::firstClusterHigh
    +
    +
    +

    High word of this entry's first cluster number (always 0 for a FAT12 or FAT16 volume).

    + +
    +
    + +
    +
    + + + + +
    uint16_t directoryEntry::firstClusterLow
    +
    +
    +

    Low word of this entry's first cluster number.

    + +
    +
    + +
    +
    + + + + +
    uint16_t directoryEntry::lastAccessDate
    +
    +
    +

    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 directoryEntry::lastWriteDate
    +
    +
    +

    Date of last write. File creation is considered a write.

    + +
    +
    + +
    +
    + + + + +
    uint16_t directoryEntry::lastWriteTime
    +
    +
    +

    Time of last write. File creation is considered a write.

    + +
    +
    + +
    +
    + + + + +
    uint8_t directoryEntry::name[11]
    +
    +
    +

    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 directoryEntry::reservedNT
    +
    +
    +

    Reserved for use by Windows NT. Set value to 0 when a file is created and never modify or look at it after that.

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + diff --git a/libs/SdFatBeta20120108/html/structfat32__boot-members.html b/libs/SdFatBeta20120108/html/structfat32__boot-members.html new file mode 100644 index 0000000..3139e82 --- /dev/null +++ b/libs/SdFatBeta20120108/html/structfat32__boot-members.html @@ -0,0 +1,79 @@ + + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    fat32_boot Member List
    +
    + + + + diff --git a/libs/SdFatBeta20120108/html/structfat32__boot.html b/libs/SdFatBeta20120108/html/structfat32__boot.html new file mode 100644 index 0000000..5f010f1 --- /dev/null +++ b/libs/SdFatBeta20120108/html/structfat32__boot.html @@ -0,0 +1,517 @@ + + + + +SdFat: fat32_boot Struct Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    + +
    +
    fat32_boot Struct Reference
    +
    +
    + +

    Boot sector for a FAT32 volume. + More...

    + +

    #include <SdFatStructs.h>

    + +

    List of all members.

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

    +Public Attributes

    uint8_t bootCode [420]
    uint8_t bootSectorSig0
    uint8_t bootSectorSig1
    uint8_t bootSignature
    uint16_t bytesPerSector
    uint8_t driveNumber
    uint16_t fat32BackBootBlock
    uint16_t fat32Flags
    uint16_t fat32FSInfo
    uint8_t fat32Reserved [12]
    uint32_t fat32RootCluster
    uint16_t fat32Version
    uint8_t fatCount
    char fileSystemType [8]
    uint16_t headCount
    uint32_t hidddenSectors
    uint8_t jump [3]
    uint8_t mediaType
    char oemId [8]
    uint8_t reserved1
    uint16_t reservedSectorCount
    uint16_t rootDirEntryCount
    uint8_t sectorsPerCluster
    uint16_t sectorsPerFat16
    uint32_t sectorsPerFat32
    uint16_t sectorsPerTrack
    uint16_t totalSectors16
    uint32_t totalSectors32
    char volumeLabel [11]
    uint32_t volumeSerialNumber
    +

    Detailed Description

    +

    Boot sector for a FAT32 volume.

    +

    Member Data Documentation

    + +
    +
    + + + + +
    uint8_t fat32_boot::bootCode[420]
    +
    +
    +

    X86 boot code

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat32_boot::bootSectorSig0
    +
    +
    +

    must be 0X55

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat32_boot::bootSectorSig1
    +
    +
    +

    must be 0XAA

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat32_boot::bootSignature
    +
    +
    +

    0X29 if next three fields are valid

    + +
    +
    + +
    +
    + + + + +
    uint16_t fat32_boot::bytesPerSector
    +
    +
    +

    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.

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat32_boot::driveNumber
    +
    +
    +

    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.

    + +
    +
    + +
    +
    + + + + +
    uint16_t fat32_boot::fat32BackBootBlock
    +
    +
    +

    If nonzero, 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 fat32_boot::fat32Flags
    +
    +
    +

    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 fat32_boot::fat32FSInfo
    +
    +
    +

    Sector number of FSINFO structure in the reserved area of the FAT32 volume. Usually 1.

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat32_boot::fat32Reserved[12]
    +
    +
    +

    Reserved for future expansion. Code that formats FAT32 volumes should always set all of the bytes of this field to 0.

    + +
    +
    + +
    +
    + + + + +
    uint32_t fat32_boot::fat32RootCluster
    +
    +
    +

    Cluster number of the first cluster of the root directory for FAT32. This usually 2 but not required to be 2.

    + +
    +
    + +
    +
    + + + + +
    uint16_t fat32_boot::fat32Version
    +
    +
    +

    FAT32 version. High byte is major revision number. Low byte is minor revision number. Only 0.0 define.

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat32_boot::fatCount
    +
    +
    +

    The number of copies of the FAT on the volume. The value of this field is always 2.

    + +
    +
    + +
    +
    + + + + +
    char fat32_boot::fileSystemType[8]
    +
    +
    +

    A text field with a value of FAT32.

    + +
    +
    + +
    +
    + + + + +
    uint16_t fat32_boot::headCount
    +
    +
    +

    Number of heads for interrupt 0x13. Not used otherwise.

    + +
    +
    + +
    +
    + + + + +
    uint32_t fat32_boot::hidddenSectors
    +
    +
    +

    Count of hidden sectors preceding the partition that contains this FAT volume. This field is generally only relevant for media visible on interrupt 0x13.

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat32_boot::jump[3]
    +
    +
    +

    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 nonexecutable bytes.

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat32_boot::mediaType
    +
    +
    +

    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.

    + +
    +
    + +
    +
    + + + + +
    char fat32_boot::oemId[8]
    +
    +
    +

    This is typically a string of characters that identifies the operating system that formatted the volume.

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat32_boot::reserved1
    +
    +
    +

    used by Windows NT - should be zero for FAT

    + +
    +
    + +
    +
    + + + + +
    uint16_t fat32_boot::reservedSectorCount
    +
    +
    +

    The number of sectors preceding the start of the first FAT, including the boot sector. Must not be zero

    + +
    +
    + +
    +
    + + + + +
    uint16_t fat32_boot::rootDirEntryCount
    +
    +
    +

    FAT12/FAT16 only. For FAT32 volumes, this field must be set to 0.

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat32_boot::sectorsPerCluster
    +
    +
    +

    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.

    + +
    +
    + +
    +
    + + + + +
    uint16_t fat32_boot::sectorsPerFat16
    +
    +
    +

    On FAT32 volumes this field must be 0, and sectorsPerFat32 contains the FAT size count.

    + +
    +
    + +
    +
    + + + + +
    uint32_t fat32_boot::sectorsPerFat32
    +
    +
    +

    Count of sectors occupied by one FAT on FAT32 volumes.

    + +
    +
    + +
    +
    + + + + +
    uint16_t fat32_boot::sectorsPerTrack
    +
    +
    +

    Sectors per track for interrupt 0x13. Not used otherwise.

    + +
    +
    + +
    +
    + + + + +
    uint16_t fat32_boot::totalSectors16
    +
    +
    +

    For FAT32 volumes, this field must be 0.

    + +
    +
    + +
    +
    + + + + +
    uint32_t fat32_boot::totalSectors32
    +
    +
    +

    Contains the total number of sectors in the FAT32 volume.

    + +
    +
    + +
    +
    + + + + +
    char fat32_boot::volumeLabel[11]
    +
    +
    +

    A field once used to store the volume label. The volume label is now stored as a special file in the root directory.

    + +
    +
    + +
    +
    + + + + +
    uint32_t fat32_boot::volumeSerialNumber
    +
    +
    +

    A random serial number created when formatting a disk, which helps to distinguish between disks. Usually generated by combining date and time.

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + diff --git a/libs/SdFatBeta20120108/html/structfat32__fsinfo-members.html b/libs/SdFatBeta20120108/html/structfat32__fsinfo-members.html new file mode 100644 index 0000000..c894795 --- /dev/null +++ b/libs/SdFatBeta20120108/html/structfat32__fsinfo-members.html @@ -0,0 +1,56 @@ + + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    fat32_fsinfo Member List
    +
    + + + + diff --git a/libs/SdFatBeta20120108/html/structfat32__fsinfo.html b/libs/SdFatBeta20120108/html/structfat32__fsinfo.html new file mode 100644 index 0000000..8849cad --- /dev/null +++ b/libs/SdFatBeta20120108/html/structfat32__fsinfo.html @@ -0,0 +1,172 @@ + + + + +SdFat: fat32_fsinfo Struct Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    + +
    +
    fat32_fsinfo Struct Reference
    +
    +
    + +

    FSINFO sector for a FAT32 volume. + More...

    + +

    #include <SdFatStructs.h>

    + +

    List of all members.

    + + + + + + + + + +

    +Public Attributes

    uint32_t freeCount
    uint32_t leadSignature
    uint32_t nextFree
    uint8_t reserved1 [480]
    uint8_t reserved2 [12]
    uint32_t structSignature
    uint8_t tailSignature [4]
    +

    Detailed Description

    +

    FSINFO sector for a FAT32 volume.

    +

    Member Data Documentation

    + +
    +
    + + + + +
    uint32_t fat32_fsinfo::freeCount
    +
    +
    +

    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 fat32_fsinfo::leadSignature
    +
    +
    +

    must be 0X52, 0X52, 0X61, 0X41

    + +
    +
    + +
    +
    + + + + +
    uint32_t fat32_fsinfo::nextFree
    +
    +
    +

    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.

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat32_fsinfo::reserved1[480]
    +
    +
    +

    must be zero

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat32_fsinfo::reserved2[12]
    +
    +
    +

    must be zero

    + +
    +
    + +
    +
    + + + + +
    uint32_t fat32_fsinfo::structSignature
    +
    +
    +

    must be 0X72, 0X72, 0X41, 0X61

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat32_fsinfo::tailSignature[4]
    +
    +
    +

    must be 0X00, 0X00, 0X55, 0XAA

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + diff --git a/libs/SdFatBeta20120108/html/structfat__boot-members.html b/libs/SdFatBeta20120108/html/structfat__boot-members.html new file mode 100644 index 0000000..570cbbd --- /dev/null +++ b/libs/SdFatBeta20120108/html/structfat__boot-members.html @@ -0,0 +1,72 @@ + + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    fat_boot Member List
    +
    + + + + diff --git a/libs/SdFatBeta20120108/html/structfat__boot.html b/libs/SdFatBeta20120108/html/structfat__boot.html new file mode 100644 index 0000000..b5dd917 --- /dev/null +++ b/libs/SdFatBeta20120108/html/structfat__boot.html @@ -0,0 +1,412 @@ + + + + +SdFat: fat_boot Struct Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    + +
    +
    fat_boot Struct Reference
    +
    +
    + +

    Boot sector for a FAT12/FAT16 volume. + More...

    + +

    #include <SdFatStructs.h>

    + +

    List of all members.

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

    +Public Attributes

    uint8_t bootCode [448]
    uint8_t bootSectorSig0
    uint8_t bootSectorSig1
    uint8_t bootSignature
    uint16_t bytesPerSector
    uint8_t driveNumber
    uint8_t fatCount
    char fileSystemType [8]
    uint16_t headCount
    uint32_t hidddenSectors
    uint8_t jump [3]
    uint8_t mediaType
    char oemId [8]
    uint8_t reserved1
    uint16_t reservedSectorCount
    uint16_t rootDirEntryCount
    uint8_t sectorsPerCluster
    uint16_t sectorsPerFat16
    uint16_t sectorsPerTrack
    uint16_t totalSectors16
    uint32_t totalSectors32
    char volumeLabel [11]
    uint32_t volumeSerialNumber
    +

    Detailed Description

    +

    Boot sector for a FAT12/FAT16 volume.

    +

    Member Data Documentation

    + +
    +
    + + + + +
    uint8_t fat_boot::bootCode[448]
    +
    +
    +

    X86 boot code

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat_boot::bootSectorSig0
    +
    +
    +

    must be 0X55

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat_boot::bootSectorSig1
    +
    +
    +

    must be 0XAA

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat_boot::bootSignature
    +
    +
    +

    0X29 if next three fields are valid

    + +
    +
    + +
    +
    + + + + +
    uint16_t fat_boot::bytesPerSector
    +
    +
    +

    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.

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat_boot::driveNumber
    +
    +
    +

    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 fat_boot::fatCount
    +
    +
    +

    The number of copies of the FAT on the volume. The value of this field is always 2.

    + +
    +
    + +
    +
    + + + + +
    char fat_boot::fileSystemType[8]
    +
    +
    +

    A field with a value of either FAT, FAT12 or FAT16, depending on the disk format.

    + +
    +
    + +
    +
    + + + + +
    uint16_t fat_boot::headCount
    +
    +
    +

    Number of heads for interrupt 0x13. Not used otherwise.

    + +
    +
    + +
    +
    + + + + +
    uint32_t fat_boot::hidddenSectors
    +
    +
    +

    Count of hidden sectors preceding the partition that contains this FAT volume. This field is generally only relevant for media visible on interrupt 0x13.

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat_boot::jump[3]
    +
    +
    +

    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 nonexecutable bytes.

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat_boot::mediaType
    +
    +
    +

    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.

    + +
    +
    + +
    +
    + + + + +
    char fat_boot::oemId[8]
    +
    +
    +

    This is typically a string of characters that identifies the operating system that formatted the volume.

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat_boot::reserved1
    +
    +
    +

    used by Windows NT - should be zero for FAT

    + +
    +
    + +
    +
    + + + + +
    uint16_t fat_boot::reservedSectorCount
    +
    +
    +

    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 fat_boot::rootDirEntryCount
    +
    +
    +

    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.

    + +
    +
    + +
    +
    + + + + +
    uint8_t fat_boot::sectorsPerCluster
    +
    +
    +

    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.

    + +
    +
    + +
    +
    + + + + +
    uint16_t fat_boot::sectorsPerFat16
    +
    +
    +

    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 fat_boot::sectorsPerTrack
    +
    +
    +

    Sectors per track for interrupt 0x13. Not used otherwise.

    + +
    +
    + +
    +
    + + + + +
    uint16_t fat_boot::totalSectors16
    +
    +
    +

    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 nonzero. 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).

    + +
    +
    + +
    +
    + + + + +
    uint32_t fat_boot::totalSectors32
    +
    +
    +

    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 nonzero.

    + +
    +
    + +
    +
    + + + + +
    char fat_boot::volumeLabel[11]
    +
    +
    +

    A field once used to store the volume label. The volume label is now stored as a special file in the root directory.

    + +
    +
    + +
    +
    + + + + +
    uint32_t fat_boot::volumeSerialNumber
    +
    +
    +

    A random serial number created when formatting a disk, which helps to distinguish between disks. Usually generated by combining date and time.

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + diff --git a/libs/SdFatBeta20120108/html/structfpos__t-members.html b/libs/SdFatBeta20120108/html/structfpos__t-members.html new file mode 100644 index 0000000..3558bc9 --- /dev/null +++ b/libs/SdFatBeta20120108/html/structfpos__t-members.html @@ -0,0 +1,52 @@ + + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    fpos_t Member List
    +
    +
    +This is the complete list of members for fpos_t, including all inherited members. + + + +
    clusterfpos_t
    fpos_t() (defined in fpos_t)fpos_t [inline]
    positionfpos_t
    + + + diff --git a/libs/SdFatBeta20120108/html/structfpos__t.html b/libs/SdFatBeta20120108/html/structfpos__t.html new file mode 100644 index 0000000..589cd52 --- /dev/null +++ b/libs/SdFatBeta20120108/html/structfpos__t.html @@ -0,0 +1,97 @@ + + + + +SdFat: fpos_t Struct Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    + +
    +
    fpos_t Struct Reference
    +
    +
    + +

    internal type for istream do not use in user apps + More...

    + +

    #include <SdBaseFile.h>

    + +

    List of all members.

    + + + + +

    +Public Attributes

    uint32_t cluster
    uint32_t position
    +

    Detailed Description

    +

    internal type for istream do not use in user apps

    +

    Member Data Documentation

    + +
    +
    + + + + +
    uint32_t fpos_t::cluster
    +
    +
    +

    cluster for position

    + +
    +
    + +
    +
    + + + + +
    uint32_t fpos_t::position
    +
    +
    +

    stream position

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + diff --git a/libs/SdFatBeta20120108/html/structmaster_boot_record-members.html b/libs/SdFatBeta20120108/html/structmaster_boot_record-members.html new file mode 100644 index 0000000..50acd69 --- /dev/null +++ b/libs/SdFatBeta20120108/html/structmaster_boot_record-members.html @@ -0,0 +1,55 @@ + + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    masterBootRecord Member List
    +
    + + + + diff --git a/libs/SdFatBeta20120108/html/structmaster_boot_record.html b/libs/SdFatBeta20120108/html/structmaster_boot_record.html new file mode 100644 index 0000000..a727d18 --- /dev/null +++ b/libs/SdFatBeta20120108/html/structmaster_boot_record.html @@ -0,0 +1,165 @@ + + + + +SdFat: masterBootRecord Struct Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    + +
    +
    masterBootRecord Struct Reference
    +
    +
    + +

    Master Boot Record. + More...

    + +

    #include <SdFatStructs.h>

    +
    +Collaboration diagram for masterBootRecord:
    +
    +
    Collaboration graph
    + + +
    [legend]
    + +

    List of all members.

    + + + + + + + + +

    +Public Attributes

    uint8_t codeArea [440]
    uint32_t diskSignature
    uint8_t mbrSig0
    uint8_t mbrSig1
    part_t part [4]
    uint16_t usuallyZero
    +

    Detailed Description

    +

    Master Boot Record.

    +

    The first block of a storage device that is formatted with a MBR.

    +

    Member Data Documentation

    + +
    +
    + + + + +
    uint8_t masterBootRecord::codeArea[440]
    +
    +
    +

    Code Area for master boot program.

    + +
    +
    + +
    +
    + + + + +
    uint32_t masterBootRecord::diskSignature
    +
    +
    +

    Optional Windows NT disk signature. May contain boot code.

    + +
    +
    + +
    +
    + + + + +
    uint8_t masterBootRecord::mbrSig0
    +
    +
    +

    First MBR signature byte. Must be 0X55

    + +
    +
    + +
    +
    + + + + +
    uint8_t masterBootRecord::mbrSig1
    +
    +
    +

    Second MBR signature byte. Must be 0XAA

    + +
    +
    + +
    + +
    +

    Partition tables.

    + +
    +
    + +
    +
    + + + + +
    uint16_t masterBootRecord::usuallyZero
    +
    +
    +

    Usually zero but may be more boot code.

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + diff --git a/libs/SdFatBeta20120108/html/structmaster_boot_record__coll__graph.png b/libs/SdFatBeta20120108/html/structmaster_boot_record__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..df5013f0354ab00e2cac53942adff99cf8ab80d2 GIT binary patch literal 1517 zcmZWpc`(}v6wXgZC_=2WafKE|m$GV0yFxZW94U&nk*bX&h;tpKj%K%tq7_6bL0fFA zu4o?Cbzc5My|&GdoLLg7cP17JlNSMFmk_idMTr0nCI)3~TS7h^ zpy*@Z)rm*`&;YFilbb`zg3;$ajln9xFYRq0;fbMHnWNTlY?3+ZaTcI04@T)gQqeLF z36Jz{_~;dM3X)V5GJ8ka(Sz@*Vi&@VZsd?1hi_k_Ojd$D`3RxRjEAH=wfp9AmR(}s zi$-Qjnc#89QS$7OnMTe)-b6h)8Q*q3jHc%yrxUwVuTgB_KPjPM$$oNc3tpVrQgZ3M z0m{X_FS#**TZs)Lt)^9~E+gESOZIaWyFr__p#YZSbN^a{uwo^c*d=S`G9UTb^9o}J z_H$l{nf`;#qe$}dvff_#YTW3amLEsx;xe>i<;)&icBBnDx4ow;Y%k;EyQMNE!D2Q*4QMG_HyU3v?kkR|`~nDs zbvqmo{6`~N=i7^CgA3#&SC_R6=Ei(#DQ61!)-rDH&W0K=XdTU~2L8KwyKLbdesNko zAKf_u2;vgf!=MBg?}lG$yq&fN0wxqo93?7eoYtP1wyWZD`D--K)7ge<)VP`pPL#Gt z8Iv?8&{~T(7mp3V+{}?dnqz2rt_c!37-h}ORFB(JN& zzA^oJ6ptwm!uW^rEwdOXdLIErt9#YC5z$zWm91~jIKLl&5V%84Q|--{v{WROoH7G_-dIG1g~P{hwI=aY|ANd2R>s zbw4!PL#bWMU)6+mFdq5pm`{lQ@KAatxp|s38~!IggNRC;|1togygQu&C16#X@!Y7^ zndDi*l5p%vcr!l8Jguva9?0(Q23lHM0V4&br9;K=v;Ka^0|9OyPe}Z0O%X%XgX5tV z9Zd>51!IAaua}mVHkOm&tr})p0neKuw*yBf_Q=FkSW#G2bFP=Y7dK%wH>AJfRUBcUYKL1=sQGeyaoXe+ArQ&3UVwDXa0sNp z3E`>Zr15;ud=@vGXEmz1ezlM?*`vhu=}S(TW|lQ!-^7m4ERzbXB(NvXZ4PO3DQ + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    partitionTable Member List
    +
    + + + + diff --git a/libs/SdFatBeta20120108/html/structpartition_table.html b/libs/SdFatBeta20120108/html/structpartition_table.html new file mode 100644 index 0000000..75c0778 --- /dev/null +++ b/libs/SdFatBeta20120108/html/structpartition_table.html @@ -0,0 +1,248 @@ + + + + +SdFat: partitionTable Struct Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    + +
    +
    partitionTable Struct Reference
    +
    +
    + +

    MBR partition table entry. + More...

    + +

    #include <SdFatStructs.h>

    + +

    List of all members.

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

    +Public Attributes

    unsigned beginCylinderHigh: 2
    uint8_t beginCylinderLow
    uint8_t beginHead
    unsigned beginSector: 6
    uint8_t boot
    unsigned endCylinderHigh: 2
    uint8_t endCylinderLow
    uint8_t endHead
    unsigned endSector: 6
    uint32_t firstSector
    uint32_t totalSectors
    uint8_t type
    +

    Detailed Description

    +

    MBR partition table entry.

    +

    A partition table entry for a MBR formatted storage device. The MBR partition table has four entries.

    +

    Member Data Documentation

    + +
    +
    + + + + +
    unsigned partitionTable::beginCylinderHigh
    +
    +
    +

    High bits cylinder for first block in partition.

    + +
    +
    + +
    + +
    +

    Combine beginCylinderLow with beginCylinderHigh. Legal values are 0-1023. Only used in old PC BIOS.

    + +
    +
    + +
    +
    + + + + +
    uint8_t partitionTable::beginHead
    +
    +
    +

    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.

    + +
    +
    + +
    +
    + + + + +
    unsigned partitionTable::beginSector
    +
    +
    +

    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.

    + +
    +
    + +
    +
    + + + + +
    uint8_t partitionTable::boot
    +
    +
    +

    Boot Indicator . Indicates whether the volume is the active partition. Legal values include: 0X00. Do not use for booting. 0X80 Active partition.

    + +
    +
    + +
    +
    + + + + +
    unsigned partitionTable::endCylinderHigh
    +
    +
    +

    High bits of end cylinder

    + +
    +
    + +
    +
    + + + + +
    uint8_t partitionTable::endCylinderLow
    +
    +
    +

    Combine endCylinderLow with endCylinderHigh. Legal values are 0-1023. Only used in old PC BIOS.

    + +
    +
    + +
    +
    + + + + +
    uint8_t partitionTable::endHead
    +
    +
    +

    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.

    + +
    +
    + +
    +
    + + + + +
    unsigned partitionTable::endSector
    +
    +
    +

    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.

    + +
    +
    + +
    +
    + + + + +
    uint32_t partitionTable::firstSector
    +
    +
    +

    Logical block address of the first block in the partition.

    + +
    +
    + +
    +
    + + + + +
    uint32_t partitionTable::totalSectors
    +
    +
    +

    Length of the partition, in blocks.

    + +
    +
    + +
    +
    + + + + +
    uint8_t partitionTable::type
    +
    +
    +

    Partition type. See defines that begin with PART_TYPE_ for some Microsoft partition types.

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + diff --git a/libs/SdFatBeta20120108/html/structpgm-members.html b/libs/SdFatBeta20120108/html/structpgm-members.html new file mode 100644 index 0000000..37d9801 --- /dev/null +++ b/libs/SdFatBeta20120108/html/structpgm-members.html @@ -0,0 +1,52 @@ + + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    pgm Member List
    +
    +
    +This is the complete list of members for pgm, including all inherited members. + + + +
    pgm(char *str)pgm [inline, explicit]
    pgm(const char *str)pgm [inline, explicit]
    ptrpgm
    + + + diff --git a/libs/SdFatBeta20120108/html/structpgm.html b/libs/SdFatBeta20120108/html/structpgm.html new file mode 100644 index 0000000..4b2831c --- /dev/null +++ b/libs/SdFatBeta20120108/html/structpgm.html @@ -0,0 +1,136 @@ + + + + +SdFat: pgm Struct Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    + +
    +
    pgm Struct Reference
    +
    +
    + +

    type for string in flash + More...

    + +

    #include <ostream.h>

    + +

    List of all members.

    + + + + + + +

    +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) [inline, explicit]
    +
    +
    +

    constructor

    +
    Parameters:
    + + +
    [in]strinitializer for pointer.
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    pgm::pgm (const char * str) [inline, explicit]
    +
    +
    +

    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/libs/SdFatBeta20120108/html/structsetfill-members.html b/libs/SdFatBeta20120108/html/structsetfill-members.html new file mode 100644 index 0000000..b3dd230 --- /dev/null +++ b/libs/SdFatBeta20120108/html/structsetfill-members.html @@ -0,0 +1,51 @@ + + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    setfill Member List
    +
    +
    +This is the complete list of members for setfill, including all inherited members. + + +
    csetfill
    setfill(char arg)setfill [inline, explicit]
    + + + diff --git a/libs/SdFatBeta20120108/html/structsetfill.html b/libs/SdFatBeta20120108/html/structsetfill.html new file mode 100644 index 0000000..3cc5a09 --- /dev/null +++ b/libs/SdFatBeta20120108/html/structsetfill.html @@ -0,0 +1,111 @@ + + + + +SdFat: setfill Struct Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    + +
    +
    setfill Struct Reference
    +
    +
    + +

    type for setfill manipulator + More...

    + +

    #include <iostream.h>

    + +

    List of all members.

    + + + + + +

    +Public Member Functions

     setfill (char arg)

    +Public Attributes

    char c
    +

    Detailed Description

    +

    type for setfill manipulator

    +

    Constructor & Destructor Documentation

    + +
    +
    + + + + + + + + +
    setfill::setfill (char arg) [inline, explicit]
    +
    +
    +

    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/libs/SdFatBeta20120108/html/structsetprecision-members.html b/libs/SdFatBeta20120108/html/structsetprecision-members.html new file mode 100644 index 0000000..1b6caec --- /dev/null +++ b/libs/SdFatBeta20120108/html/structsetprecision-members.html @@ -0,0 +1,51 @@ + + + + +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)setprecision [inline, explicit]
    + + + diff --git a/libs/SdFatBeta20120108/html/structsetprecision.html b/libs/SdFatBeta20120108/html/structsetprecision.html new file mode 100644 index 0000000..e256923 --- /dev/null +++ b/libs/SdFatBeta20120108/html/structsetprecision.html @@ -0,0 +1,111 @@ + + + + +SdFat: setprecision Struct Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    + +
    +
    setprecision Struct Reference
    +
    +
    + +

    type for setprecision manipulator + More...

    + +

    #include <iostream.h>

    + +

    List of all members.

    + + + + + +

    +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) [inline, explicit]
    +
    +
    +

    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/libs/SdFatBeta20120108/html/structsetw-members.html b/libs/SdFatBeta20120108/html/structsetw-members.html new file mode 100644 index 0000000..e039e7d --- /dev/null +++ b/libs/SdFatBeta20120108/html/structsetw-members.html @@ -0,0 +1,51 @@ + + + + +SdFat: Member List + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    +
    +
    setw Member List
    +
    +
    +This is the complete list of members for setw, including all inherited members. + + +
    setw(unsigned arg)setw [inline, explicit]
    wsetw
    + + + diff --git a/libs/SdFatBeta20120108/html/structsetw.html b/libs/SdFatBeta20120108/html/structsetw.html new file mode 100644 index 0000000..d52831f --- /dev/null +++ b/libs/SdFatBeta20120108/html/structsetw.html @@ -0,0 +1,111 @@ + + + + +SdFat: setw Struct Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    + +
    +
    setw Struct Reference
    +
    +
    + +

    type for setw manipulator + More...

    + +

    #include <iostream.h>

    + +

    List of all members.

    + + + + + +

    +Public Member Functions

     setw (unsigned arg)

    +Public Attributes

    unsigned w
    +

    Detailed Description

    +

    type for setw manipulator

    +

    Constructor & Destructor Documentation

    + +
    +
    + + + + + + + + +
    setw::setw (unsigned arg) [inline, explicit]
    +
    +
    +

    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/libs/SdFatBeta20120108/html/tab_a.png b/libs/SdFatBeta20120108/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..2d99ef23fed78c7683f0b5aa803d937060d288c4 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qo)`sjv*C{Z|CmjY;X`^DSv)) z;hc^cTF;t%XWXdwWP5+kt?jQ5uhqKtjd^EY`^^-S;M%tFAj_l)EwVTK)E@1LSD0{e q?a6($SGQTzz1#QBzr0NMKf^0WCX-0bi?u-G89ZJ6T-G@yGywp8?ljB* literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/tab_b.png b/libs/SdFatBeta20120108/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..b2c3d2be3c7e518fbca6bb30f571882e72fc506d GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qk9-Ajv*C{Z|~mbJ)|JfaM8Xd zIP7xAmLwau9@iXhZTrl-TjWj9jM#?{xt`6uU{<)jb9Suc^QnbhJ(o{ib8=j9u0_mE8M7kgF7f<7W7IEf=8(L_qx|g0H;V7iPxm&Q@G7p8W2Kx&iT|YUM=ITC zY<0Qbr;u&AtXD{o@41wH=7&d8=2Z_{M9Tsa=g*t*@A3H$UOlxZk7?f6RUWpx>Fc_L s#LQ{edY3MpIXkMeV^&YV=9fR%8Jv|Kya=#u06K}m)78&qol`;+0RKEt)&Kwi literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/tab_s.png b/libs/SdFatBeta20120108/html/tab_s.png new file mode 100644 index 0000000000000000000000000000000000000000..978943ac807718de0e69e5a585a8f0a1e5999285 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QZ1e?jv*C{Z|}b5Yzkm-c<7z3 zq^cq0=~}Z;b(!Zvb5Z%sTRFKGlz1=qOFg;myyu?$r`wZb^irPsN1a)6)TwB0r+)wb zPL25;=adu89?fTK`qDR>$D*)b_WOmdKI;Vst02j(hg8%>k literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/html/tabs.css b/libs/SdFatBeta20120108/html/tabs.css new file mode 100644 index 0000000..2192056 --- /dev/null +++ b/libs/SdFatBeta20120108/html/tabs.css @@ -0,0 +1,59 @@ +.tabs, .tabs2, .tabs3 { + background-image: url('tab_b.png'); + width: 100%; + z-index: 101; + font-size: 13px; +} + +.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/libs/SdFatBeta20120108/html/unioncache__t-members.html b/libs/SdFatBeta20120108/html/unioncache__t-members.html new file mode 100644 index 0000000..3536d95 --- /dev/null +++ b/libs/SdFatBeta20120108/html/unioncache__t-members.html @@ -0,0 +1,57 @@ + + + + +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/libs/SdFatBeta20120108/html/unioncache__t.html b/libs/SdFatBeta20120108/html/unioncache__t.html new file mode 100644 index 0000000..4e2b4fc --- /dev/null +++ b/libs/SdFatBeta20120108/html/unioncache__t.html @@ -0,0 +1,194 @@ + + + + +SdFat: cache_t Union Reference + + + + + +
    +
    + + + + + + +
    +
    SdFat
    +
    +
    + + +
    +
    + +
    +
    cache_t Union Reference
    +
    +
    + +

    Cache for an SD data block. + More...

    + +

    #include <SdVolume.h>

    +
    +Collaboration diagram for cache_t:
    +
    +
    Collaboration graph
    + + +
    [legend]
    + +

    List of all members.

    + + + + + + + + + + +

    +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.

    + +
    +
    + +
    + +
    +

    Used to access to a cached FAT boot sector.

    + +
    +
    + +
    + +
    +

    Used to access to a cached FAT32 boot sector.

    + +
    +
    + +
    + +
    +

    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/libs/SdFatBeta20120108/html/unioncache__t__coll__graph.png b/libs/SdFatBeta20120108/html/unioncache__t__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..ed15385bd15742c1f79c9f4cacc1f3894ee16552 GIT binary patch literal 9173 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 Zf8ywmw#4q6fai1obv12hvC50L{{_9Bp0fY| literal 0 HcmV?d00001 diff --git a/libs/SdFatBeta20120108/readme.txt b/libs/SdFatBeta20120108/readme.txt new file mode 100644 index 0000000..3d68ffd --- /dev/null +++ b/libs/SdFatBeta20120108/readme.txt @@ -0,0 +1,170 @@ +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. + +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. + +SdFat assumes 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::init(sckRateID, chipSelectPin) with second parameter set to the +chip select pin. + +If you have a shield like the SparkFun shield that uses pin 8 for chip +select you would change the line: + sd.init(SPI_HALF_SPEED); +to + sd.init(SPI_HALF_SPEED, 8); + +If the example uses + sd.init(); +change it to: + sd.init(SPI_FULL_SPEED, 8); + + +You can also edit Sd2Card.h and change the default value for chip select. +Replace SS_PIN with the new value for chip select in the following definition. + +/** The default chip select pin for the SD card is SS. */ +uint8_t const SD_CHIP_SELECT_PIN = SS_PIN; + + +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 simular to Linux's stdio. + +The new 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. + +http://www.cplusplus.com/ is a good C++ site. + +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 unmodified Adafruit GPS shield can be use on an Arduino Mega +by defining MEGA_SOFT_SPI in SdFatConfig.h. + + +This library was designed to be used on 328 Arduinos but smaller +applications can be written for 168 Arduinos. This library compiles +for the Mega Arduino but has not been thoroughly tested. + +For the AtMega168 be sure to reduce the serial buffer size by setting +RX_BUFFER_SIZE to 32 or less in +hardware/cores/arduino/HardwareSerial.cpp. +I use 16. + + +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.pde will format smaller cards FAT16 +so they can be used with SdFat. + + +The SdFat/examples directory has the following sketches. Older examples +are in the extras/examplesV1 folder. + +AnalogLogger.pde - A simple data logger for one or more analog pins. + +append.pde - This sketch creates a large file by successive + open/write/close operations. + +average.pde - A demonstration of parsing floating point numbers + +bench.pde - A read/write benchmark. + +bufstream.pde - ibufsteam to parse a line and obufstream to format a line + +cin_cout.pde - Demo of ArduinoInStream and ArduinoOutStream + +eventlog.pde - Append a line to a file - demo of pathnames and streams + +fgets.pde - Demo of the fgets read line/string function. + +format.pde - Print a table with various formatting options + +getline.pde - Example of getline from section 27.7.1.3 of the C++ standard + +HelloWorld.pde - Create a serial output stream + +OpenNext.pde - Open all files in the root dir and print their filename + +QuickStart.pde - A sketch to quickly test your SD card and SD shield/module + +readCSV.pde - Read a comma-seperated value file using iostream extractors + +readlog.pde - Read file. Demo of pathnames and current working directory + +ReadWriteSdFat.pde - SdFat version of Arduino SD ReadWrite example + +rename.pde - 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 + +TwoCards.pde - 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 01 Aug 2011 diff --git a/libs/SdFatBeta20120108/troubleshooting.txt b/libs/SdFatBeta20120108/troubleshooting.txt new file mode 100644 index 0000000..50e3efb --- /dev/null +++ b/libs/SdFatBeta20120108/troubleshooting.txt @@ -0,0 +1,45 @@ +The best source of recent information is the AdaFruit forum + +http://forums.adafruit.com/ + +Also search the Arduino forum + +http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl + + +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%. + +-------------------------------------------------------------------------------- +Redefining SS_PIN to be a pin other than the Arduino/AVR hardware SS pin. + +Arduino/AVR SPI will only function correctly in master mode if the hardware SS +pin is in output mode. Sd2Card::init() will enable output mode for the hardware +SS pin even if it is not SD chip select. + +If you have multiple SPI devices you must insure devices other than the SD card +have their chip select pin high when Sd2Card::init() is called. + +If you want to understand in more detail how AVR SPI works read this + +http://www.atmel.com/dyn/resources/prod_documents/doc2585.pdf. See section 2.3. diff --git a/libs/SerialPortBeta20120106/HowTo.txt b/libs/SerialPortBeta20120106/HowTo.txt new file mode 100644 index 0000000..9c3b944 --- /dev/null +++ b/libs/SerialPortBeta20120106/HowTo.txt @@ -0,0 +1,65 @@ +This was posted in the Adduino forum by user sixeyes. +It is a nice introduction to to the SerialPort library. + +The core Arduino based serial code looks like this: + +Code: + +void setup() +{ + Serial.begin(9600); + Serial.println("Using Arduino supplied HardwareSerial"); +} + +void loop() +{ +} + + +So if you've copied the SerialPort folder from the zip file into your +libraries folder (So you have Arduino-1.0\libraries\SerialPort\SerialPort.h +and Arduino-1.0\libraries\SerialPort\SerialPort.cpp) +you can write the following code instead + + +Code: + +#include + +SerialPort<0, 32, 256> port; + +void setup() +{ + port.begin(9600); + port.println("Using SerialPort class"); +} + +void loop() +{ +} + + +Just remember to do the following and you should be alright: + +•Include +•Declare new Serial port including its parameters +•Initialise (call begin()) and use the new serial port (NOT Serial) + +The configuration of the serial port looks odd to anyone not familiar with +C++ templates, but it's easy to explain. The first parameter inside the +angle brackets is the serial port number. Unless you've got a board with +more than one serial port (e.g. Arduino Mega) this will always be 0. The +second parameter is the size of the receive buffer in bytes and the third +is the size of the transmit buffer in bytes. + +You can ignore the stuff about editing SerialPort.h. You'll only need this +if you're short of flash memory at which point you can come back and ask +more questions. + +If you do by chance refer to both the new SerialPort and HardwareSerial in +the same sketch you'll get some error messages about duplicate interrupt +vectors. + +Hope that helps. + +Iain \ No newline at end of file diff --git a/libs/SerialPortBeta20120106/SerialPort.html b/libs/SerialPortBeta20120106/SerialPort.html new file mode 100644 index 0000000..bb02e1c --- /dev/null +++ b/libs/SerialPortBeta20120106/SerialPort.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/libs/SerialPortBeta20120106/SerialPort/SerialPort.cpp b/libs/SerialPortBeta20120106/SerialPort/SerialPort.cpp new file mode 100644 index 0000000..422852d --- /dev/null +++ b/libs/SerialPortBeta20120106/SerialPort/SerialPort.cpp @@ -0,0 +1,268 @@ +/* Arduino SerialPort Library + * Copyright (C) 2011 by William Greiman + * + * This file is part of the Arduino SerialPort 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 SerialPort Library. If not, see + * . + */ +#include "../../libs/SerialPortBeta20120106/SerialPort/SerialPort.h" +//------------------------------------------------------------------------------ +/** \return the number of bytes in the ring buffer */ +int SerialRingBuffer::available() { + uint8_t s = SREG; + cli(); + int n = head_ - tail_; + SREG = s; + return n < 0 ? size_ + n : n; +} +//------------------------------------------------------------------------------ +/** Discard all data in the ring buffer. */ +void SerialRingBuffer::flush() { + uint8_t s = SREG; + cli(); + head_ = tail_ = 0; + SREG = s; +} +//------------------------------------------------------------------------------ +/** get the next byte + * \param[in] b location for the returned byte + * \return true if a byte was returned or false if the ring buffer is empty + */ +bool SerialRingBuffer::get(uint8_t* b) { + buf_size_t t = tail_; + if (head_ == t) return false; + *b = buf_[t++]; + tail_ = t < size_ ? t : 0; + return true; +} +//------------------------------------------------------------------------------ +/** + * Get the maximum number of contiguous bytes from the ring buffer + * with one call to memcpy. Do not use this function with interrupts + * disabled. + * + * \param[in] b pointer to data + * \param[in] n number of bytes to transfer from the ring buffer + * \return number of bytes transferred + */ +SerialRingBuffer::buf_size_t SerialRingBuffer::get(uint8_t* b, buf_size_t n) { + buf_size_t nr; + cli(); + buf_size_t h = head_; + sei(); + buf_size_t t = tail_; + if (h < t) { + nr = size_ - t; + } else if (t < h) { + nr = h - t; + } else { + return 0; + } + if (nr > n) nr = n; + memcpy(b, &buf_[t], nr); + t += nr; + tail_ = t < size_ ? t : t - size_; + return nr; +} +//------------------------------------------------------------------------------ +/** initialize the ring buffer + * \param[in] b buffer for data + * \param[in] s size of the buffer + */ +void SerialRingBuffer::init(uint8_t* b, buf_size_t s) { + buf_ = b; + size_ = s; + head_ = tail_ = 0; +} +//------------------------------------------------------------------------------ +/** peek at the next byte in the ring buffer + * \return the next byte that would ber read or -1 if the ring buffer is empty + */ +int SerialRingBuffer::peek() { + return empty() ? -1 : buf_[tail_]; +} +//------------------------------------------------------------------------------ +/** put a byte into the ring buffer + * \param[in] b the byte + * \return true if byte was transferred or false if the ring buffer is full + */ +bool SerialRingBuffer::put(uint8_t b) { + buf_size_t h = head_; + // OK to store here even if ring is full + buf_[h++] = b; + if (h >= size_) h = 0; + if (h == tail_) return false; + head_ = h; + return true; +} +//------------------------------------------------------------------------------ +/** + * Put the maximum number of contiguous bytes into the ring buffer + * with one call to memcpy. + * + * \param[in] b pointer to data + * \param[in] n number of bytes to transfer to the ring buffer + * \return number of bytes transferred + */ +SerialRingBuffer::buf_size_t + SerialRingBuffer::put(const uint8_t* b, buf_size_t n) { + cli(); + buf_size_t t = tail_; + sei(); + buf_size_t space; // space in ring buffer + buf_size_t h = head_; + if (h < t) { + space = t - h - 1; + } else { + space = size_ - h; + if (t == 0) space -= 1; + } + if (n > space) n = space; + memcpy(&buf_[h], b, n); + h += n; + head_ = h < size_ ? h : h - size_; + return n; +} +//------------------------------------------------------------------------------ +/** + * Put the maximum number of contiguous bytes into the ring buffer + * with one call to memcpy. + * + * \param[in] b pointer to data + * \param[in] n number of bytes to transfer to the ring buffer + * \return number of bytes transferred + */ +SerialRingBuffer::buf_size_t SerialRingBuffer::put_P(PGM_P b, buf_size_t n) { + cli(); + buf_size_t t = tail_; + sei(); + buf_size_t space; // space in ring buffer + buf_size_t h = head_; + if (h < t) { + space = t - h - 1; + } else { + space = size_ - h; + if (t == 0) space -= 1; + } + if (n > space) n = space; + memcpy_P(&buf_[h], b, n); + h += n; + head_ = h < size_ ? h : h - size_; + return n; +} +//============================================================================== +// global data and ISRs +#if ENABLE_RX_ERROR_CHECKING +// +uint8_t rxErrorBits[SERIAL_PORT_COUNT]; +#endif // ENABLE_RX_ERROR_CHECKING +//------------------------------------------------------------------------------ +#if BUFFERED_RX +//------------------------------------------------------------------------------ +SerialRingBuffer rxRingBuf[SERIAL_PORT_COUNT]; +//------------------------------------------------------------------------------ +#if ENABLE_RX_ERROR_CHECKING +inline static void rx_isr(uint8_t n) { + uint8_t e = *usart[n].ucsra & SP_UCSRA_ERROR_MASK; + uint8_t b = *usart[n].udr; + if (!rxRingBuf[n].put(b)) e |= SP_RX_BUF_OVERRUN; + rxErrorBits[n] |= e; +} +#else // ENABLE_RX_ERROR_CHECKING +inline static void rx_isr(uint8_t n) { + uint8_t b = *usart[n].udr; + rxRingBuf[n].put(b); +} +#endif // ENABLE_RX_ERROR_CHECKING +//------------------------------------------------------------------------------ +// SerialRingBuffer rxbuf0; +#if defined(USART_RX_vect) +ISR(USART_RX_vect) { +#elif defined(SIG_USART0_RECV) +ISR(SIG_USART0_RECV) { +#elif defined(SIG_UART0_RECV) +ISR(SIG_UART0_RECV) { +#elif defined(USART0_RX_vect) +ISR(USART0_RX_vect) { +#elif defined(SIG_UART_RECV) +ISR(SIG_UART_RECV) { +#else // vector +#error No ISR rx vector for UART0 +#endif // vector + rx_isr(0); +} +#ifdef USART1_RX_vect +ISR(USART1_RX_vect) { + rx_isr(1); +} +#endif // USART1_RX_vect + +#ifdef USART2_RX_vect +ISR(USART2_RX_vect) { + rx_isr(2); +} +#endif // USART2_RX_vect + +#ifdef USART3_RX_vect +ISR(USART3_RX_vect) { + rx_isr(3); +} +#endif // USART3_RX_vect +#endif // BUFFERED_RX +//------------------------------------------------------------------------------ +#if BUFFERED_TX +//------------------------------------------------------------------------------ +SerialRingBuffer txRingBuf[SERIAL_PORT_COUNT]; +//------------------------------------------------------------------------------ +inline static void tx_isr(uint8_t n) { + uint8_t b; + if (txRingBuf[n].get(&b)) { + *usart[n].udr = b; + } else { + // no data - disable interrupts + *usart[n].ucsrb &= ~M_UDRIE; + } +} +#if defined(UART0_UDRE_vect) +ISR(UART0_UDRE_vect) { +#elif defined(UART_UDRE_vect) +ISR(UART_UDRE_vect) { +#elif defined(USART0_UDRE_vect) +ISR(USART0_UDRE_vect) { +#elif defined(USART_UDRE_vect) +ISR(USART_UDRE_vect) { +#else +#error N0 ISR tx vector for UART0 +#endif + tx_isr(0); +} +#ifdef USART1_UDRE_vect +ISR(USART1_UDRE_vect) { + tx_isr(1); +} +#endif // USART1_UDRE_vect + +#ifdef USART2_UDRE_vect +ISR(USART2_UDRE_vect) { + tx_isr(2); +} +#endif // USART2_UDRE_vect + +#ifdef USART3_UDRE_vect +ISR(USART3_UDRE_vect) { + tx_isr(3); +} +#endif // USART3_UDRE_vect +#endif // BUFFERED_TX diff --git a/libs/SerialPortBeta20120106/SerialPort/SerialPort.h b/libs/SerialPortBeta20120106/SerialPort/SerialPort.h new file mode 100644 index 0000000..56af767 --- /dev/null +++ b/libs/SerialPortBeta20120106/SerialPort/SerialPort.h @@ -0,0 +1,669 @@ +/* Arduino SerialPort Library + * Copyright (C) 2011 by William Greiman + * + * This file is part of the Arduino SerialPort 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 SerialPort Library. If not, see + * . + */ + /** + * \file + * \brief SerialPort class + */ +#ifndef SerialPort_h +#define SerialPort_h +//------------------------------------------------------------------------------ +/** SerialPort version YYYYMMDD */ +#define SERIAL_PORT_VERSION 20120106 +//------------------------------------------------------------------------------ +/** + * Set ALLOW_LARGE_BUFFERS to zero to limit buffer sizes to 254 bytes. + * ALLOW_LARGE_BUFFERS controls whether uint16_t or uint8_t will be + * used for buffer indices. + */ +#define ALLOW_LARGE_BUFFERS 1 +//------------------------------------------------------------------------------ +/** + * Set USE_WRITE_OVERRIDES to zero to use the Arduino Print version + * of write(const char*) and write(const uint8_t*, size_t). This will + * save some flash but is much slower. + */ +#define USE_WRITE_OVERRIDES 1 +//------------------------------------------------------------------------------ +/** + * Set BUFFERED_RX zero to save flash and RAM if no RX buffering is used. + * RxBufSize must be zero in all SerialPort constructors if + * BUFFERED_RX is zero. + */ +#define BUFFERED_RX 1 +//------------------------------------------------------------------------------ +/** + * Set BUFFERED_TX zero to save flash and RAM if no TX buffering is used. + * TxBufSize must be zero in all SerialPort constructors if + * BUFFERED_TX is zero. + */ +#define BUFFERED_TX 1 +//------------------------------------------------------------------------------ +/** + * Set ENABLE_RX_ERROR_CHECKING zero to disable RX error checking. + */ +#define ENABLE_RX_ERROR_CHECKING 1 +//------------------------------------------------------------------------------ +// Define symbols to allocate 64 byte ring buffers with capacity for 63 bytes. +/** Define NewSerial with buffering like Arduino 1.0. */ +#define USE_NEW_SERIAL SerialPort<0, 63, 63> NewSerial +/** Define NewSerial1 with buffering like Arduino 1.0. */ +#define USE_NEW_SERIAL1 SerialPort<1, 63, 63> NewSerial1 +/** Define NewSerial2 with buffering like Arduino 1.0. */ +#define USE_NEW_SERIAL2 SerialPort<2, 63, 63> NewSerial2 +/** Define NewSerial3 with buffering like Arduino 1.0. */ +#define USE_NEW_SERIAL3 SerialPort<3, 63, 63> NewSerial3 +//------------------------------------------------------------------------------ +#include +#include +#if ARDUINO < 100 +#include +class __FlashStringHelper; +#define F(string_literal)\ + (reinterpret_cast<__FlashStringHelper *>(PSTR(string_literal))) +#else // ARDUINO < 100 +#include +#endif // ARDUINO < 100 +//------------------------------------------------------------------------------ +#if defined(UCSR3A) +static const uint8_t SERIAL_PORT_COUNT = 4; +#elif defined(UCSR2A) +static const uint8_t SERIAL_PORT_COUNT = 3; +#elif defined(UCSR1A) +static const uint8_t SERIAL_PORT_COUNT = 2; +#elif defined(UCSR0A) || defined(UCSRA) +static const uint8_t SERIAL_PORT_COUNT = 1; +#else +#error no serial ports +#endif +//------------------------------------------------------------------------------ +#ifdef UCSR0A +// bits in UCSRA +static const uint8_t M_RXC = 1 << RXC0; +static const uint8_t M_TXC = 1 << TXC0; +static const uint8_t M_UDRE = 1 << UDRE0; +static const uint8_t M_FE = 1 << FE0; +static const uint8_t M_DOR = 1 << DOR0; +static const uint8_t M_UPE = 1 << UPE0; +static const uint8_t M_U2X = 1 << U2X0; +// bits in UCSRB +static const uint8_t M_RXCIE = 1 << RXCIE0; +static const uint8_t M_TXCIE = 1 << TXCIE0; +static const uint8_t M_UDRIE = 1 << UDRIE0; +static const uint8_t M_RXEN = 1 << RXEN0; +static const uint8_t M_TXEN = 1 << TXEN0; +// bits in UCSRC +static const uint8_t M_UPM0 = 1 << UPM00; +static const uint8_t M_UPM1 = 1 << UPM01; +static const uint8_t M_USBS = 1 << USBS0; +static const uint8_t M_UCSZ0 = 1 << UCSZ00; +static const uint8_t M_UCSZ1 = 1 << UCSZ01; +#elif defined(UCSRA) // UCSR0A +// bits in UCSRA +static const uint8_t M_RXC = 1 << RXC; +static const uint8_t M_TXC = 1 << TXC; +static const uint8_t M_UDRE = 1 << UDRE; +static const uint8_t M_FE = 1 << FE; +static const uint8_t M_DOR = 1 << DOR; +static const uint8_t M_UPE = 1 << PE; +static const uint8_t M_U2X = 1 << U2X; +// bits in UCSRB +static const uint8_t M_RXCIE = 1 << RXCIE; +static const uint8_t M_TXCIE = 1 << TXCIE; +static const uint8_t M_UDRIE = 1 << UDRIE; +static const uint8_t M_RXEN = 1 << RXEN; +static const uint8_t M_TXEN = 1 << TXEN; +// bits in UCSRC +static const uint8_t M_UPM0 = 1 << UPM0; +static const uint8_t M_UPM1 = 1 << UPM1; +static const uint8_t M_USBS = 1 << USBS; +static const uint8_t M_UCSZ0 = 1 << UCSZ0; +static const uint8_t M_UCSZ1 = 1 << UCSZ1; +#else // UCSR0A +#error no serial ports +#endif // UCSR0A +//------------------------------------------------------------------------------ +/** use one stop bit */ +static const uint8_t SP_1_STOP_BIT = 0; +/** use two stop bits */ +static const uint8_t SP_2_STOP_BIT = M_USBS; + +/** disable parity bit */ +static const uint8_t SP_NO_PARITY = 0; +/** use even parity */ +static const uint8_t SP_EVEN_PARITY = M_UPM1; +/** use odd parity */ +static const uint8_t SP_ODD_PARITY = M_UPM0 | M_UPM1; + +/** use 5-bit character size */ +static const uint8_t SP_5_BIT_CHAR = 0; +/** use 6-bit character size */ +static const uint8_t SP_6_BIT_CHAR = M_UCSZ0; +/** use 7-bit character size */ +static const uint8_t SP_7_BIT_CHAR = M_UCSZ1; +/** use 8-bit character size */ +static const uint8_t SP_8_BIT_CHAR = M_UCSZ0 | M_UCSZ1; +/** mask for all options bits */ +static const uint8_t SP_OPT_MASK = M_USBS | M_UPM0 | M_UPM1 |M_UCSZ0 | M_UCSZ1; + +/** USART frame error bit */ +static const uint8_t SP_FRAMING_ERROR = M_FE; +/** USART RX data overrun error bit */ +static const uint8_t SP_RX_DATA_OVERRUN = M_DOR; +/** USART parity error bit */ +static const uint8_t SP_PARITY_ERROR = M_UPE; +/** mask for all error bits in UCSRA */ +static const uint8_t SP_UCSRA_ERROR_MASK = M_FE | M_DOR | M_UPE; +/** RX ring buffer full overrun */ +static const uint8_t SP_RX_BUF_OVERRUN = 1; +//------------------------------------------------------------------------------ +/** + * \class UsartRegister + * \brief addresses of USART registers + */ +struct UsartRegister { + volatile uint8_t* ucsra; /**< USART Control and Status Register A */ + volatile uint8_t* ucsrb; /**< USART Control and Status Register B */ + volatile uint8_t* ucsrc; /**< USART Control and Status Register C */ + volatile uint8_t* ubrrl; /**< USART Baud Rate Register Low */ + volatile uint8_t* ubrrh; /**< USART Baud Rate Register High */ + volatile uint8_t* udr; /**< USART I/O Data Register */ +}; +//------------------------------------------------------------------------------ +/** + * Pointers to USART registers. This static const array allows the compiler + * to generate very efficient code if the array index is a constant. + */ +static const UsartRegister usart[] = { +#ifdef UCSR0A + {&UCSR0A, &UCSR0B, &UCSR0C, &UBRR0L, &UBRR0H, &UDR0}, +#elif defined(UCSRA) + {&UCSRA, &UCSRB, &UCSRC, &UBRRL, &UBRRH, &UDR}, +#else // UCSR0A + {0, 0, 0, 0, 0, 0}, +#endif // UCSR0A + +#ifdef UCSR1A + {&UCSR1A, &UCSR1B, &UCSR1C, &UBRR1L, &UBRR1H, &UDR1}, +#else // UCSR1A + {0, 0, 0, 0, 0, 0}, +#endif // UCSR1A + +#ifdef UCSR2A + {&UCSR2A, &UCSR2B, &UCSR2C, &UBRR2L, &UBRR2H, &UDR2}, +#else // UCSR2A + {0, 0, 0, 0, 0, 0}, +#endif // UCSR2A + +#ifdef UCSR3A + {&UCSR3A, &UCSR3B, &UCSR3C, &UBRR3L, &UBRR3H, &UDR3} +#else // UCSR3A + {0, 0, 0, 0, 0, 0} +#endif // UCSR3A +}; +//------------------------------------------------------------------------------ +/** + * \class SerialRingBuffer + * \brief ring buffer for RX and TX data + */ +class SerialRingBuffer { + public: + /** Define type for buffer indices */ +#if ALLOW_LARGE_BUFFERS + typedef uint16_t buf_size_t; +#else // ALLOW_LARGE_BUFFERS + typedef uint8_t buf_size_t; +#endif // ALLOW_LARGE_BUFFERS + int available(); + /** \return true if the ring buffer is empty else false */ + bool empty() {return head_ == tail_;} + void flush(); + bool get(uint8_t* b); + buf_size_t get(uint8_t* b, buf_size_t n); + void init(uint8_t* b, buf_size_t s); + int peek(); + bool put(uint8_t b); + buf_size_t put(const uint8_t* b, buf_size_t n); + buf_size_t put_P(PGM_P b, buf_size_t n); + private: + uint8_t* buf_; /**< Pointer to start of buffer. */ + volatile buf_size_t head_; /**< Index to next empty location. */ + volatile buf_size_t tail_; /**< Index to last entry if head_ != tail_. */ + buf_size_t size_; /**< Size of the buffer. Capacity is size -1. */ +}; +//------------------------------------------------------------------------------ +/** RX ring buffers */ +extern SerialRingBuffer rxRingBuf[]; +/** TX ring buffers */ +extern SerialRingBuffer txRingBuf[]; +/** RX error bits */ +extern uint8_t rxErrorBits[]; +//------------------------------------------------------------------------------ +/** Cause error message for bad port number + * \return Never returns since it is never called + */ +uint8_t badPortNumber(void) + __attribute__((error("Bad port number"))); +/** Cause error message for bad port number + * \return Never returns since it is never called + */ +uint8_t badRxBufSize(void) + __attribute__((error("RX buffer size too large"))); +/** Cause error message for bad port number + * \return Never returns since it is never called + */ +uint8_t badTxBufSize(void) + __attribute__((error("TX buffer size too large"))); +//------------------------------------------------------------------------------ +/** + * \class SerialPort + * \brief class for avr hardware USART ports + */ +template +class SerialPort : public Stream { + public: + //---------------------------------------------------------------------------- + SerialPort() { + if (PortNumber >= SERIAL_PORT_COUNT) badPortNumber(); + if (sizeof(SerialRingBuffer::buf_size_t) == 1) { + if (RxBufSize >254) badRxBufSize(); + if (TxBufSize >254) badTxBufSize(); + } + if (RxBufSize) rxRingBuf[PortNumber].init(rxBuffer_, sizeof(rxBuffer_)); + if (TxBufSize) txRingBuf[PortNumber].init(txBuffer_, sizeof(txBuffer_)); + } + //---------------------------------------------------------------------------- + /** + * \return The number of bytes (characters) available for reading from + * the serial port. + */ + int available(void) { + if (!RxBufSize) { + return *usart[PortNumber].ucsra & M_RXC ? 1 : 0; + } else { + return rxRingBuf[PortNumber].available(); + } + } + //---------------------------------------------------------------------------- + /** + * Sets the data rate in bits per second (baud) for serial data transmission. + * + * \param[in] baud rate in bits per second (baud) + * \param[in] options constructed by a bitwise-inclusive + * OR of values from the following list. Choose one value for stop bit, + * parity, and character size. + * + * The default is SP_8_BIT_CHAR which results in one stop bit, no parity, + * and 8-bit characters. + * + * SP_1_STOP_BIT - use one stop bit (default if stop bit not specified) + * + * SP_2_STOP_BIT - use two stop bits + * + * SP_NO_PARITY - no parity bit (default if parity not specified) + * + * SP_EVEN_PARITY - add even parity bit + * + * SP_ODD_PARITY - add odd parity bit + * + * SP_5_BIT_CHAR - use 5-bit characters (default if size not specified) + * + * SP_6_BIT_CHAR - use 6-bit characters + * + * SP_7_BIT_CHAR - use 7-bit characters + * + * SP_8_BIT_CHAR - use 8-bit characters + */ + void begin(uint32_t baud, uint8_t options = SP_8_BIT_CHAR) { + uint16_t baud_setting; + + // disable USART interrupts. Set UCSRB to reset values. + *usart[PortNumber].ucsrb = 0; + + // set option bits + *usart[PortNumber].ucsrc = options & SP_OPT_MASK; + + if (F_CPU == 16000000UL && baud == 57600) { + // 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. + *usart[PortNumber].ucsra = 0; + baud_setting = (F_CPU / 8 / baud - 1) / 2; + } else { + *usart[PortNumber].ucsra = M_U2X; + baud_setting = (F_CPU / 4 / baud - 1) / 2; + } + // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) + *usart[PortNumber].ubrrh = baud_setting >> 8; + *usart[PortNumber].ubrrl = baud_setting; + + // enable RX and TX + uint8_t bits = M_TXEN | M_RXEN; + + // enable receive interrupt if buffered + if (RxBufSize) bits |= M_RXCIE; + *usart[PortNumber].ucsrb = bits; + } + //---------------------------------------------------------------------------- + #if ENABLE_RX_ERROR_CHECKING + /** clear RX error bits */ + void clearRxError() {rxErrorBits[PortNumber] = 0;} + /** \return RX error bits */ + uint8_t getRxError() {return rxErrorBits[PortNumber];} + #endif // ENABLE_RX_ERROR_CHECKING + //---------------------------------------------------------------------------- + /** + * Disables serial communication, allowing the RX and TX pins to be used for + * general input and output. To re-enable serial communication, + * call SerialPort::begin(). + */ + void end() { + // wait for transmission of outgoing data + flushTx(); + // disable USART + cli(); + *usart[PortNumber].ucsrb &= ~(M_RXEN | M_TXEN | M_RXCIE | M_UDRIE); + sei(); + // clear any received data + flushRx(); + } + //---------------------------------------------------------------------------- + /** + * For Arduino 1.0 and greater call flushTx(). + * For Arduino 0023 and before call flushRx(). + */ + #if ARDUINO < 100 + void flush() {flushRx();} + #else // ARDUINO < 100 + void flush() {flushTx();} + #endif // ARDUINO < 100 + //---------------------------------------------------------------------------- + /** + * Discard any buffered incoming serial data. + */ + void flushRx() { + if (RxBufSize) { + rxRingBuf[PortNumber].flush(); + } else { + uint8_t b; + while (*usart[PortNumber].ucsra & M_RXC) b = *usart[PortNumber].udr; + } + } + //---------------------------------------------------------------------------- + /** + * Waits for the transmission of outgoing serial data to complete. + */ + void flushTx() { + if (TxBufSize) { + while (!txRingBuf[PortNumber].empty()) {} + } + } + //---------------------------------------------------------------------------- + /** + * \return the first byte of incoming serial data available or + * -1 if no data is available. Peek() always return -1 for unbuffered RX. + */ + int peek(void) { + return RxBufSize ? rxRingBuf[PortNumber].peek() : -1; + } + //---------------------------------------------------------------------------- + /** + * Read incoming serial data. + * + * \return the first byte of incoming serial data available + * or -1 if no data is available + */ + __attribute__((noinline)) + int read() { + if (!RxBufSize) { + uint8_t s = *usart[PortNumber].ucsra; + #if ENABLE_RX_ERROR_CHECKING + rxErrorBits[PortNumber] |= s & SP_UCSRA_ERROR_MASK; + #endif // ENABLE_RX_ERROR_CHECKING + return s & M_RXC ? *usart[PortNumber].udr : -1; + } else { + uint8_t b; + return rxRingBuf[PortNumber].get(&b) ? b : -1; + } + } + //---------------------------------------------------------------------------- + /** + * Read incoming serial data. Stop when RX buffer is empty or n + * bytes have been read. + * + * \param[in] b location to receive the data + * \param[in] n maximum number of bytes to read + * \return number of bytes read + */ + __attribute__((noinline)) + size_t read(uint8_t* b, size_t n) { + uint8_t* limit = b + n; + uint8_t* p = b; + if (RxBufSize) { + while (p < limit && !rxRingBuf[PortNumber].empty()) { + size_t nr = limit - p; + if (sizeof(SerialRingBuffer::buf_size_t) == 1 && nr > 255) nr = 255; + p += rxRingBuf[PortNumber].get(p, nr); + } + return p - b; + } else { + while (p < limit) { + int rb = read(); + if (rb < 0) break; + *p++ = rb; + } + } + return p - b; + } + //---------------------------------------------------------------------------- + /** + * Write binary data to the serial port. + * + * \param[in] b byte to be written. + * \return number of bytes written to the serial port + */ + __attribute__((noinline)) + #if ARDUINO < 100 + void write(uint8_t b) { + #else // ARDUINO < 100 + size_t write(uint8_t b) { + #endif // ARDUINO < 100 + if (!TxBufSize) { + while (!(*usart[PortNumber].ucsra & M_UDRE)) {} + *usart[PortNumber].udr = b; + } else { + // wait for TX ISR if buffer is full + while (!txRingBuf[PortNumber].put(b)) {} + // enable interrupts + *usart[PortNumber].ucsrb |= M_UDRIE; + } + #if ARDUINO > 99 + return 1; + #endif // ARDUINO > 99 + } + //---------------------------------------------------------------------------- + /** write CR LF + * \return 2 + */ + __attribute__((noinline)) + #if ARDUINO < 100 + void writeln() { + write('\r'); + write('\n'); + } + #else // ARDUINO < 100 + size_t writeln() { + write('\r'); + write('\n'); + return 2; + } + #endif // ARDUINO >= 100 + //---------------------------------------------------------------------------- + /** + * Write a string to the serial port followed by CF LF + * + * \param[in] s string to be written. + * \return number of bytes written to the serial port + */ + __attribute__((noinline)) + #if ARDUINO < 100 + void writeln(const char* s) { + write(s); + writeln(); + } + #else // ARDUINO < 100 + size_t writeln(const char* s) { + return write(s) + writeln(); + } + #endif // ARDUINO >= 100 + //---------------------------------------------------------------------------- + /** + * Write binary data from flash memory to the serial port. + * + * \param[in] b bytes to be written + * \param[in] n number of bytes to write + * \return number of bytes written to the serial port + */ + __attribute__((noinline)) + #if ARDUINO < 100 + void write_P(PGM_P b, size_t n) { + #else // ARDUINO < 100 + size_t write_P(PGM_P b, size_t n) { + #endif // ARDUINO < 100 + if (!TxBufSize) { + for (size_t i = 0; i < n; i++) write(pgm_read_byte(b + i)); + } else { + size_t w = n; + while (w) { + size_t nw = w; + if (sizeof(SerialRingBuffer::buf_size_t) == 1 && nw > 255) nw = 255; + size_t m = txRingBuf[PortNumber].put_P(b, nw); + // enable interrupts + *usart[PortNumber].ucsrb |= M_UDRIE; + w -= m; + b += m; + } + } + #if ARDUINO >= 100 + return n; + #endif // ARDUINO >= 100 + } + //---------------------------------------------------------------------------- + /** + * Write a flash string to the serial port. + * + * \param[in] s string to be written. + * \return number of bytes written to the serial port + */ + __attribute__((noinline)) + #if ARDUINO < 100 + void write(const __FlashStringHelper* s) { + const prog_char* p = (const prog_char*)s; + size_t n = strlen_P(p); + write_P(p, n); + } + #else // ARDUINO < 100 + size_t write(const __FlashStringHelper* s) { + const prog_char* p = (const prog_char*)s; + size_t n = strlen_P(p); + return write_P(p, n); + } + #endif // ARDUINO >= 100 + //---------------------------------------------------------------------------- + /** + * Write a flash string to the serial port followed by CF LF + * + * \param[in] s string to be written. + * \return number of bytes written to the serial port + */ + __attribute__((noinline)) + #if ARDUINO < 100 + void writeln(const __FlashStringHelper* s) { + write(s); + writeln(); + } + #else // ARDUINO < 100 + size_t writeln(const __FlashStringHelper* s) { + return write(s) + writeln(); + } + #endif // ARDUINO >= 100 + #if USE_WRITE_OVERRIDES + //---------------------------------------------------------------------------- + /** + * Write binary data to the serial port. + * + * \param[in] b bytes to be written + * \param[in] n number of bytes to write + * \return number of bytes written to the serial port + */ + __attribute__((noinline)) + #if ARDUINO < 100 + void write(const uint8_t* b, size_t n) { + #else // ARDUINO < 100 + size_t write(const uint8_t* b, size_t n) { + #endif // ARDUINO < 100 + if (!TxBufSize) { + for (size_t i = 0; i < n; i++) write(b[i]); + } else { + size_t w = n; + while (w) { + size_t nw = w; + if (sizeof(SerialRingBuffer::buf_size_t) == 1 && nw > 255) nw = 255; + size_t m = txRingBuf[PortNumber].put(b, nw); + // enable interrupts + *usart[PortNumber].ucsrb |= M_UDRIE; + w -= m; + b += m; + } + } + #if ARDUINO >= 100 + return n; + #endif // ARDUINO >= 100 + } + //---------------------------------------------------------------------------- + /** + * Write a string to the serial port. + * + * \param[in] s string to be written. + * \return number of bytes written to the serial port + */ + __attribute__((noinline)) + #if ARDUINO < 100 + void write(const char* s) { + size_t n = strlen(s); + write(reinterpret_cast(s), n); + } + #else // ARDUINO < 100 + size_t write(const char* s) { + size_t n = strlen(s); + return write(reinterpret_cast(s), n); + } + #endif // ARDUINO >= 100 + #else // USE_WRITE_OVERRIDES + using Print::write; // use write(str) and write(buf, size) from Print + #endif // USE_WRITE_OVERRIDES + //---------------------------------------------------------------------------- + private: + // RX buffer with a capacity of RxBufSize. + uint8_t rxBuffer_[RxBufSize + 1]; + // TX buffer with a capacity of TxBufSize + uint8_t txBuffer_[TxBufSize + 1]; +}; +//------------------------------------------------------------------------------ +#endif // SerialPort_h diff --git a/libs/SerialPortBeta20120106/SerialPort/examples/ArduinoSize/ArduinoSize.pde b/libs/SerialPortBeta20120106/SerialPort/examples/ArduinoSize/ArduinoSize.pde new file mode 100644 index 0000000..69c6820 --- /dev/null +++ b/libs/SerialPortBeta20120106/SerialPort/examples/ArduinoSize/ArduinoSize.pde @@ -0,0 +1,10 @@ +// Print free RAM for Arduino HardwareSerial +// +#include "FreeRam.h" + +void setup() { + Serial.begin(9600); + Serial.println(FreeRam()); +} +void loop() { +} diff --git a/libs/SerialPortBeta20120106/SerialPort/examples/ArduinoSize/FreeRam.h b/libs/SerialPortBeta20120106/SerialPort/examples/ArduinoSize/FreeRam.h new file mode 100644 index 0000000..1b44fa5 --- /dev/null +++ b/libs/SerialPortBeta20120106/SerialPort/examples/ArduinoSize/FreeRam.h @@ -0,0 +1,15 @@ +static inline int FreeRam() { + extern int __bss_end; + extern int* __brkval; + int free_memory; + if (reinterpret_cast(__brkval) == 0) { + // if no heap use from end of bss section + free_memory = reinterpret_cast(&free_memory) + - reinterpret_cast(&__bss_end); + } else { + // use from top of stack to heap + free_memory = reinterpret_cast(&free_memory) + - reinterpret_cast(__brkval); + } + return free_memory; +} diff --git a/libs/SerialPortBeta20120106/SerialPort/examples/ArduinoTest/ArduinoTest.pde b/libs/SerialPortBeta20120106/SerialPort/examples/ArduinoTest/ArduinoTest.pde new file mode 100644 index 0000000..4659cbc --- /dev/null +++ b/libs/SerialPortBeta20120106/SerialPort/examples/ArduinoTest/ArduinoTest.pde @@ -0,0 +1,20 @@ + +void setup() { + Serial.begin(9600); + uint32_t t = micros(); + Serial.write("This string is used to measure the time to buffer data.\r\n"); + t = micros() - t; + Serial.write("Time: "); + Serial.print(t); + Serial.write(" us\r\n"); +} +void loop() { + Serial.write("\r\nenter a string\r\n"); + while (!Serial.available()) {} + do { + Serial.write(Serial.read()); + uint32_t m = millis(); + while (!Serial.available() && (millis() - m) < 3) {} + } while(Serial.available()); + Serial.write("\r\n"); +} \ No newline at end of file diff --git a/libs/SerialPortBeta20120106/SerialPort/examples/BufferedSize/BufferedSize.pde b/libs/SerialPortBeta20120106/SerialPort/examples/BufferedSize/BufferedSize.pde new file mode 100644 index 0000000..4b66a2a --- /dev/null +++ b/libs/SerialPortBeta20120106/SerialPort/examples/BufferedSize/BufferedSize.pde @@ -0,0 +1,15 @@ +// print free RAM for Arduino 1.0 style buffering +// +#include +#include "FreeRam.h" + +SerialPort<0, 63, 63> NewSerial; + +// for Arduino 0022 style buffering use this +//SerialPort<0, 127, 0> NewSerial; + +void setup() { + NewSerial.begin(9600); + NewSerial.println(FreeRam()); +} +void loop() {} \ No newline at end of file diff --git a/libs/SerialPortBeta20120106/SerialPort/examples/BufferedSize/FreeRam.h b/libs/SerialPortBeta20120106/SerialPort/examples/BufferedSize/FreeRam.h new file mode 100644 index 0000000..1b44fa5 --- /dev/null +++ b/libs/SerialPortBeta20120106/SerialPort/examples/BufferedSize/FreeRam.h @@ -0,0 +1,15 @@ +static inline int FreeRam() { + extern int __bss_end; + extern int* __brkval; + int free_memory; + if (reinterpret_cast(__brkval) == 0) { + // if no heap use from end of bss section + free_memory = reinterpret_cast(&free_memory) + - reinterpret_cast(&__bss_end); + } else { + // use from top of stack to heap + free_memory = reinterpret_cast(&free_memory) + - reinterpret_cast(__brkval); + } + return free_memory; +} diff --git a/libs/SerialPortBeta20120106/SerialPort/examples/BufferedTest/BufferedTest.pde b/libs/SerialPortBeta20120106/SerialPort/examples/BufferedTest/BufferedTest.pde new file mode 100644 index 0000000..78dd44d --- /dev/null +++ b/libs/SerialPortBeta20120106/SerialPort/examples/BufferedTest/BufferedTest.pde @@ -0,0 +1,24 @@ +#include + +// port zero, 63 character RX and TX buffers +SerialPort<0, 63, 63> NewSerial; + +void setup() { + NewSerial.begin(9600); + uint32_t t = micros(); + NewSerial.write("This string is used to measure the time to buffer data.\r\n"); + t = micros() - t; + NewSerial.write("Time: "); + NewSerial.print(t); + NewSerial.write(" us\r\n"); +} +void loop() { + NewSerial.write("\r\nenter a string\r\n"); + while (!NewSerial.available()) {} + do { + NewSerial.write(NewSerial.read()); + uint32_t m = millis(); + while (!NewSerial.available() && (millis() - m) < 3) {} + } while(NewSerial.available()); + NewSerial.write("\r\n"); +} \ No newline at end of file diff --git a/libs/SerialPortBeta20120106/SerialPort/examples/HelloWorld/HelloWorld.pde b/libs/SerialPortBeta20120106/SerialPort/examples/HelloWorld/HelloWorld.pde new file mode 100644 index 0000000..f608de5 --- /dev/null +++ b/libs/SerialPortBeta20120106/SerialPort/examples/HelloWorld/HelloWorld.pde @@ -0,0 +1,11 @@ +// Simple usage with buffering like Arduino 1.0 +#include + +// use NewSerial for port 0 +USE_NEW_SERIAL; + +void setup() { + NewSerial.begin(9600); + NewSerial.println("Hello World!"); +} +void loop() {} \ No newline at end of file diff --git a/libs/SerialPortBeta20120106/SerialPort/examples/MegaTest/MegaTest.pde b/libs/SerialPortBeta20120106/SerialPort/examples/MegaTest/MegaTest.pde new file mode 100644 index 0000000..3672bd5 --- /dev/null +++ b/libs/SerialPortBeta20120106/SerialPort/examples/MegaTest/MegaTest.pde @@ -0,0 +1,41 @@ +// Test all ports on the Mega +// +// place loopback jumpers, RX connected to TX, +// on ports 1, 2, and 3. +// +#include +// port 0 unbuffered +SerialPort<0, 0, 0> port0; + +// port 1 buffered RX +SerialPort<1, 32, 0> port1; + +// port 2 buffered RX and TX +SerialPort<2, 32, 32> port2; + +// port 3 buffered RX and TX +SerialPort<3, 32, 32> port3; + +void transfer(Stream* in, Stream* out) { + while(!in->available()) {} + do { + out->write(in->read()); + uint32_t m = millis(); + while (!in->available() && (millis() -m) < 3) {} + } while (in->available()); +} + +void setup() { + port0.begin(9600); + port1.begin(9600); + port2.begin(9600); + port3.begin(9600); +} +void loop() { + port0.write("type a string\r\n"); + transfer(&port0, &port1); + transfer(&port1, &port2); + transfer(&port2, &port3); + transfer(&port3, &port0); + port0.write("\r\n\r\n"); +} diff --git a/libs/SerialPortBeta20120106/SerialPort/examples/MegaTestArduino/MegaTestArduino.pde b/libs/SerialPortBeta20120106/SerialPort/examples/MegaTestArduino/MegaTestArduino.pde new file mode 100644 index 0000000..2ec1134 --- /dev/null +++ b/libs/SerialPortBeta20120106/SerialPort/examples/MegaTestArduino/MegaTestArduino.pde @@ -0,0 +1,27 @@ +// Test all ports on the Mega +// +// place loopback jumpers, RX connected to TX, +// on ports 1, 2, and 3. +// +void transfer(Stream* in, Stream* out) { + while(!in->available()) {} + do { + out->write(in->read()); + uint32_t m = millis(); + while (!in->available() && (millis() - m) < 3) {} + } while (in->available()); +} +void setup() { + Serial.begin(9600); + Serial1.begin(9600); + Serial2.begin(9600); + Serial3.begin(9600); +} +void loop() { + Serial.write("type a string\r\n"); + transfer(&Serial, &Serial1); + transfer(&Serial1, &Serial2); + transfer(&Serial2, &Serial3); + transfer(&Serial3, &Serial); + Serial.write("\r\n\r\n"); +} diff --git a/libs/SerialPortBeta20120106/SerialPort/examples/ReadWriteTest/ReadWriteTest.pde b/libs/SerialPortBeta20120106/SerialPort/examples/ReadWriteTest/ReadWriteTest.pde new file mode 100644 index 0000000..bd54585 --- /dev/null +++ b/libs/SerialPortBeta20120106/SerialPort/examples/ReadWriteTest/ReadWriteTest.pde @@ -0,0 +1,32 @@ +// test that ring buffer overrun can be detected +#include +// port 0, 16 byte RX and TX buffers +SerialPort<0, 16, 16> port0; + +void setup() { + port0.begin(9600); + port0.write("SerialPort version: "); + port0.println(SERIAL_PORT_VERSION); +} +void loop() { + uint8_t buffer[10]; + port0.writeln("Enter a string. Overrun error for more than 16 bytes."); + while (!port0.available()) {} + // delay so an ring buffer overrun will occur for long strings + delay(50); + uint32_t m = millis(); + do { + size_t n = port0.read(buffer, sizeof (buffer)); + if (n) { + m = millis(); + port0.write(buffer, n); + } + } while ((millis() - m) < 4); + port0.writeln(); + uint8_t e = port0.getRxError(); + if (e) { + port0.write("Error: "); + port0.println(e, HEX); + port0.clearRxError(); + } +} \ No newline at end of file diff --git a/libs/SerialPortBeta20120106/SerialPort/examples/UnbufferedSize/FreeRam.h b/libs/SerialPortBeta20120106/SerialPort/examples/UnbufferedSize/FreeRam.h new file mode 100644 index 0000000..1b44fa5 --- /dev/null +++ b/libs/SerialPortBeta20120106/SerialPort/examples/UnbufferedSize/FreeRam.h @@ -0,0 +1,15 @@ +static inline int FreeRam() { + extern int __bss_end; + extern int* __brkval; + int free_memory; + if (reinterpret_cast(__brkval) == 0) { + // if no heap use from end of bss section + free_memory = reinterpret_cast(&free_memory) + - reinterpret_cast(&__bss_end); + } else { + // use from top of stack to heap + free_memory = reinterpret_cast(&free_memory) + - reinterpret_cast(__brkval); + } + return free_memory; +} diff --git a/libs/SerialPortBeta20120106/SerialPort/examples/UnbufferedSize/UnbufferedSize.pde b/libs/SerialPortBeta20120106/SerialPort/examples/UnbufferedSize/UnbufferedSize.pde new file mode 100644 index 0000000..c1e7a5f --- /dev/null +++ b/libs/SerialPortBeta20120106/SerialPort/examples/UnbufferedSize/UnbufferedSize.pde @@ -0,0 +1,15 @@ +// print free RAM for unbuffered mode +// you can reduce flash and RAM use more by setting +// BUFFERED_TX and BUFFERED_RX zero in SerialPort.h +// +#include +#include "FreeRam.h" + +// no buffers +SerialPort<0, 0, 0> NewSerial; + +void setup() { + NewSerial.begin(9600); + NewSerial.println(FreeRam()); +} +void loop() {} \ No newline at end of file diff --git a/libs/SerialPortBeta20120106/SerialPort/examples/UnbufferedTest/UnbufferedTest.pde b/libs/SerialPortBeta20120106/SerialPort/examples/UnbufferedTest/UnbufferedTest.pde new file mode 100644 index 0000000..c84a8cb --- /dev/null +++ b/libs/SerialPortBeta20120106/SerialPort/examples/UnbufferedTest/UnbufferedTest.pde @@ -0,0 +1,24 @@ +#include + +// serial port zero with no RX or TX buffering +SerialPort<0, 0, 0> NewSerial; + +void setup() { + NewSerial.begin(9600); + uint32_t t = micros(); + NewSerial.write("This string is used to measure the time to buffer data.\r\n"); + t = micros() - t; + NewSerial.write("Time: "); + NewSerial.print(t); + NewSerial.write(" us\r\n"); +} +void loop() { + NewSerial.write("\r\nenter a string\r\n"); + while (!NewSerial.available()) {} + do { + NewSerial.write(NewSerial.read()); + uint32_t m = millis(); + while (!NewSerial.available() && (millis() - m) < 3) {} + } while(NewSerial.available()); + NewSerial.write("\r\n"); +} \ No newline at end of file diff --git a/libs/SerialPortBeta20120106/SerialPort/examples/WriteFlash/WriteFlash.pde b/libs/SerialPortBeta20120106/SerialPort/examples/WriteFlash/WriteFlash.pde new file mode 100644 index 0000000..da2c567 --- /dev/null +++ b/libs/SerialPortBeta20120106/SerialPort/examples/WriteFlash/WriteFlash.pde @@ -0,0 +1,19 @@ +// test write() for a flash string +#include + +SerialPort<0, 0, 32> port; + +void setup(void) { + port.begin(115200); + + for (int route = 0; route < 11; route++) { + uint32_t start = micros(); + port.writeln(F("Selecting passenger route x")); + uint32_t stop = micros(); + port.write(F("Message time: ")); + port.print(stop - start, DEC); + port.writeln(F(" us")); + delay(400); + } +} +void loop(void) {} diff --git a/libs/SerialPortBeta20120106/changes.txt b/libs/SerialPortBeta20120106/changes.txt new file mode 100644 index 0000000..f9d0215 --- /dev/null +++ b/libs/SerialPortBeta20120106/changes.txt @@ -0,0 +1,82 @@ +6 Jan 2012 + +Made buffer indice type an option (uint8_t or uint16_t) with +#define ALLOW_LARGE_BUFFERS + +Added defines to hide templates: +/** Define NewSerial with buffering like Arduino 1.0. */ +#define USE_NEW_SERIAL SerialPort<0, 63, 63> NewSerial +/** Define NewSerial1 with buffering like Arduino 1.0. */ +#define USE_NEW_SERIAL1 SerialPort<1, 63, 63> NewSerial1 +/** Define NewSerial2 with buffering like Arduino 1.0. */ +#define USE_NEW_SERIAL2 SerialPort<2, 63, 63> NewSerial2 +/** Define NewSerial3 with buffering like Arduino 1.0. */ +#define USE_NEW_SERIAL3 SerialPort<3, 63, 63> NewSerial3 + +Added HelloWorld example. + +Modified several examples. + +Internal changes based on running Google's style program cpplint.py. + +4 Jan 2012 + +Added examples: + +ReadWriteTest +WriteFlash + +Added functions: + +size_t write_P(PGM_P b, size_t n); +size_t write(const __FlashStringHelper* s); +size_t writeln(const __FlashStringHelper* s); + +fixed bug in size_t read(uint8_t* b, size_t n) + + +3 Jan 2012 + +Almost total rewrite so expect bugs! Be sure to tell me about bugs. + +See html for more details about the following functions. + +Changed begin() to have a optional second argument to set parity, +character size, and number of stop bits. + +void begin (long baud, uint8_t options = SP_8_BIT_CHAR) + +The following can be ORed together for options: + +Choose one stop bit option. +static const uint8_t SP_1_STOP_BIT = 0 (default) +static const uint8_t SP_2_STOP_BIT = M_USBS + +Choose one character size. +static const uint8_t SP_5_BIT_CHAR = 0 +static const uint8_t SP_6_BIT_CHAR = M_UCSZ0 +static const uint8_t SP_7_BIT_CHAR = M_UCSZ1 +static const uint8_t SP_8_BIT_CHAR = M_UCSZ0 | M_UCSZ1 + +Choose one parity option. +static const uint8_t SP_EVEN_PARITY = M_UPM1 +static const uint8_t SP_NO_PARITY = 0 +static const uint8_t SP_ODD_PARITY = M_UPM0 | M_UPM1 + +Added RX error checking. + +The following error bits are returned: +static const uint8_t SP_FRAMING_ERROR = M_FE +static const uint8_t SP_PARITY_ERROR = M_UPE +static const uint8_t SP_RX_BUF_OVERRUN = 1 +static const uint8_t SP_RX_DATA_OVERRUN = M_DOR + +Added the following functions: + +void clearRxError() +uint8_t getRxError() +size_t read (uint8_t *b, size_t n) +size_t write (const char *s) - overrides version in Stream +size_t write (uint8_t *b, size_t n) - overrides version in Stream +size_t writeln (const char *s) +size_t writeln () diff --git a/libs/SerialPortBeta20120106/html/_serial_port_8h.html b/libs/SerialPortBeta20120106/html/_serial_port_8h.html new file mode 100644 index 0000000..64d775a --- /dev/null +++ b/libs/SerialPortBeta20120106/html/_serial_port_8h.html @@ -0,0 +1,636 @@ + + + + +SoftRTClib: Arduino/libraries/SerialPort/SerialPort.h File Reference + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + +
    +
    + +
    +
    Arduino/libraries/SerialPort/SerialPort.h File Reference
    +
    +
    + +

    SerialPort class. +More...

    +
    #include <avr/io.h>
    +#include <avr/pgmspace.h>
    +#include <Arduino.h>
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Classes

    class  SerialPort< PortNumber, RxBufSize, TxBufSize >
     class for avr hardware USART ports More...
    class  SerialRingBuffer
     ring buffer for RX and TX data More...
    class  UsartRegister
     addresses of USART registers More...

    +Defines

    #define ALLOW_LARGE_BUFFERS   1
    #define BUFFERED_RX   1
    #define BUFFERED_TX   1
    #define ENABLE_RX_ERROR_CHECKING   1
    #define SERIAL_PORT_VERSION   20120106
    #define USE_NEW_SERIAL   SerialPort<0, 63, 63> NewSerial
    #define USE_NEW_SERIAL1   SerialPort<1, 63, 63> NewSerial1
    #define USE_NEW_SERIAL2   SerialPort<2, 63, 63> NewSerial2
    #define USE_NEW_SERIAL3   SerialPort<3, 63, 63> NewSerial3
    #define USE_WRITE_OVERRIDES   1

    +Functions

    uint8_t badPortNumber (void)
    uint8_t badRxBufSize (void)
    uint8_t badTxBufSize (void)

    +Variables

    uint8_t rxErrorBits []
    SerialRingBuffer rxRingBuf []
    static const uint8_t SP_1_STOP_BIT = 0
    static const uint8_t SP_2_STOP_BIT = M_USBS
    static const uint8_t SP_5_BIT_CHAR = 0
    static const uint8_t SP_6_BIT_CHAR = M_UCSZ0
    static const uint8_t SP_7_BIT_CHAR = M_UCSZ1
    static const uint8_t SP_8_BIT_CHAR = M_UCSZ0 | M_UCSZ1
    static const uint8_t SP_EVEN_PARITY = M_UPM1
    static const uint8_t SP_FRAMING_ERROR = M_FE
    static const uint8_t SP_NO_PARITY = 0
    static const uint8_t SP_ODD_PARITY = M_UPM0 | M_UPM1
    static const uint8_t SP_OPT_MASK = M_USBS | M_UPM0 | M_UPM1 |M_UCSZ0 | M_UCSZ1
    static const uint8_t SP_PARITY_ERROR = M_UPE
    static const uint8_t SP_RX_BUF_OVERRUN = 1
    static const uint8_t SP_RX_DATA_OVERRUN = M_DOR
    static const uint8_t SP_UCSRA_ERROR_MASK = M_FE | M_DOR | M_UPE
    SerialRingBuffer txRingBuf []
    static const UsartRegister usart []
    +

    Detailed Description

    +

    SerialPort class.

    +

    Define Documentation

    + +
    +
    + + + + +
    #define ALLOW_LARGE_BUFFERS   1
    +
    +
    +

    Set ALLOW_LARGE_BUFFERS to zero to limit buffer sizes to 254 bytes. ALLOW_LARGE_BUFFERS controls whether uint16_t or uint8_t will be used for buffer indices.

    + +
    +
    + +
    +
    + + + + +
    #define BUFFERED_RX   1
    +
    +
    +

    Set BUFFERED_RX zero to save flash and RAM if no RX buffering is used. RxBufSize must be zero in all SerialPort constructors if BUFFERED_RX is zero.

    + +
    +
    + +
    +
    + + + + +
    #define BUFFERED_TX   1
    +
    +
    +

    Set BUFFERED_TX zero to save flash and RAM if no TX buffering is used. TxBufSize must be zero in all SerialPort constructors if BUFFERED_TX is zero.

    + +
    +
    + +
    +
    + + + + +
    #define ENABLE_RX_ERROR_CHECKING   1
    +
    +
    +

    Set ENABLE_RX_ERROR_CHECKING zero to disable RX error checking.

    + +
    +
    + +
    +
    + + + + +
    #define SERIAL_PORT_VERSION   20120106
    +
    +
    +

    SerialPort version YYYYMMDD

    + +
    +
    + +
    +
    + + + + +
    #define USE_NEW_SERIAL   SerialPort<0, 63, 63> NewSerial
    +
    +
    +

    Define NewSerial with buffering like Arduino 1.0.

    + +
    +
    + +
    +
    + + + + +
    #define USE_NEW_SERIAL1   SerialPort<1, 63, 63> NewSerial1
    +
    +
    +

    Define NewSerial1 with buffering like Arduino 1.0.

    + +
    +
    + +
    +
    + + + + +
    #define USE_NEW_SERIAL2   SerialPort<2, 63, 63> NewSerial2
    +
    +
    +

    Define NewSerial2 with buffering like Arduino 1.0.

    + +
    +
    + +
    +
    + + + + +
    #define USE_NEW_SERIAL3   SerialPort<3, 63, 63> NewSerial3
    +
    +
    +

    Define NewSerial3 with buffering like Arduino 1.0.

    + +
    +
    + +
    +
    + + + + +
    #define USE_WRITE_OVERRIDES   1
    +
    +
    +

    Set USE_WRITE_OVERRIDES to zero to use the Arduino Print version of write(const char*) and write(const uint8_t*, size_t). This will save some flash but is much slower.

    + +
    +
    +

    Function Documentation

    + +
    +
    + + + + + + + + +
    uint8_t badPortNumber (void )
    +
    +
    +

    Cause error message for bad port number

    +
    Returns:
    Never returns since it is never called
    + +
    +
    + +
    +
    + + + + + + + + +
    uint8_t badRxBufSize (void )
    +
    +
    +

    Cause error message for bad port number

    +
    Returns:
    Never returns since it is never called
    + +
    +
    + +
    +
    + + + + + + + + +
    uint8_t badTxBufSize (void )
    +
    +
    +

    Cause error message for bad port number

    +
    Returns:
    Never returns since it is never called
    + +
    +
    +

    Variable Documentation

    + +
    +
    + + + + +
    uint8_t rxErrorBits[]
    +
    +
    +

    RX error bits

    + +
    +
    + +
    + +
    +

    RX ring buffers

    + +
    +
    + +
    +
    + + + + +
    const uint8_t SP_1_STOP_BIT = 0 [static]
    +
    +
    +

    use one stop bit

    + +
    +
    + +
    +
    + + + + +
    const uint8_t SP_2_STOP_BIT = M_USBS [static]
    +
    +
    +

    use two stop bits

    + +
    +
    + +
    +
    + + + + +
    const uint8_t SP_5_BIT_CHAR = 0 [static]
    +
    +
    +

    use 5-bit character size

    + +
    +
    + +
    +
    + + + + +
    const uint8_t SP_6_BIT_CHAR = M_UCSZ0 [static]
    +
    +
    +

    use 6-bit character size

    + +
    +
    + +
    +
    + + + + +
    const uint8_t SP_7_BIT_CHAR = M_UCSZ1 [static]
    +
    +
    +

    use 7-bit character size

    + +
    +
    + +
    +
    + + + + +
    const uint8_t SP_8_BIT_CHAR = M_UCSZ0 | M_UCSZ1 [static]
    +
    +
    +

    use 8-bit character size

    + +
    +
    + +
    +
    + + + + +
    const uint8_t SP_EVEN_PARITY = M_UPM1 [static]
    +
    +
    +

    use even parity

    + +
    +
    + +
    +
    + + + + +
    const uint8_t SP_FRAMING_ERROR = M_FE [static]
    +
    +
    +

    USART frame error bit

    + +
    +
    + +
    +
    + + + + +
    const uint8_t SP_NO_PARITY = 0 [static]
    +
    +
    +

    disable parity bit

    + +
    +
    + +
    +
    + + + + +
    const uint8_t SP_ODD_PARITY = M_UPM0 | M_UPM1 [static]
    +
    +
    +

    use odd parity

    + +
    +
    + +
    +
    + + + + +
    const uint8_t SP_OPT_MASK = M_USBS | M_UPM0 | M_UPM1 |M_UCSZ0 | M_UCSZ1 [static]
    +
    +
    +

    mask for all options bits

    + +
    +
    + +
    +
    + + + + +
    const uint8_t SP_PARITY_ERROR = M_UPE [static]
    +
    +
    +

    USART parity error bit

    + +
    +
    + +
    +
    + + + + +
    const uint8_t SP_RX_BUF_OVERRUN = 1 [static]
    +
    +
    +

    RX ring buffer full overrun

    + +
    +
    + +
    +
    + + + + +
    const uint8_t SP_RX_DATA_OVERRUN = M_DOR [static]
    +
    +
    +

    USART RX data overrun error bit

    + +
    +
    + +
    +
    + + + + +
    const uint8_t SP_UCSRA_ERROR_MASK = M_FE | M_DOR | M_UPE [static]
    +
    +
    +

    mask for all error bits in UCSRA

    + +
    +
    + +
    + +
    +

    TX ring buffers

    + +
    +
    + +
    +
    + + + + +
    const UsartRegister usart[] [static]
    +
    +
    +Initial value:
     {
    +
    +
    +
    +
    +  
    +  {0, 0, 0, 0, 0, 0},
    +
    +
    +
    +
    +  
    +  {0, 0, 0, 0, 0, 0},
    +
    +
    +
    +
    +  
    +  {0, 0, 0, 0, 0, 0},
    +
    +
    +
    +
    +  
    +  {0, 0, 0, 0, 0, 0}
    +
    +}
    +

    Pointers to USART registers. This static const array allows the compiler to generate very efficient code if the array index is a constant.

    + +
    +
    +
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/annotated.html b/libs/SerialPortBeta20120106/html/annotated.html new file mode 100644 index 0000000..3ae0d68 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/annotated.html @@ -0,0 +1,87 @@ + + + + +SoftRTClib: Class List + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + +
    +
    +
    +
    Class List
    +
    +
    +
    Here are the classes, structs, unions and interfaces with brief descriptions:
    + + + +
    SerialPort< PortNumber, RxBufSize, TxBufSize >Class for avr hardware USART ports
    SerialRingBufferRing buffer for RX and TX data
    UsartRegisterAddresses of USART registers
    +
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/bc_s.png b/libs/SerialPortBeta20120106/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..51ba0066debbeac813d4014d805dc95ebd5b532e GIT binary patch literal 705 zcmV;y0zUnTP)rF$rQRw6Q(&UpP1C2j9>6opbR!_oV&F*Ar#jFVPDcrqyulXW;j+8j#k`kzKrw^%mxu{{V1|%gWybaP{#p01Ow~ zB}u2{E{(}bUp!#{_s(CTu-lqpI0GO7kSiTS0H7s=EN*pJI7&&m$E!@mK+B_{Xx(nj zH0-yS_)(8nX^er(4+o=lHsk1YNuDJFz~=EOD_HN~zW*iu%I90GV!oc&bWQk_4geq* z?tP92Q)0;sZ>cqtNr zOitc-rw&Cz$YQa>g0&|*N&WS=YH&7966!J}!88AdX)_x%jMh)j1wW9Z z*IvhmrFxz{vu`%7PR#}L0f5_4b|fCOXQid+8KYfFC_DlHq_*W{G_-J(_zH3*04SWE z4=w=!x2-hRp+Pe7IRei{XXZoQv3aO*zlhc|&K$GAain(EABqhLSF-2uT86!Xj#Z0B zU3k_Xawp7W)%kt^=&@!R3-to)mi?gz3E*IJe>$ba=d_9I2l8b9axei@p6k1qW)^BJ zqHa=NSguR@Srtva-n?v)XN=T%7nVoVfN2cYfePZIbCZQi`9_mavc00000NkvXXu0mjfn{!2m literal 0 HcmV?d00001 diff --git a/libs/SerialPortBeta20120106/html/class_serial_port-members.html b/libs/SerialPortBeta20120106/html/class_serial_port-members.html new file mode 100644 index 0000000..f19748f --- /dev/null +++ b/libs/SerialPortBeta20120106/html/class_serial_port-members.html @@ -0,0 +1,103 @@ + + + + +SoftRTClib: Member List + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + +
    +
    +
    +
    SerialPort< PortNumber, RxBufSize, TxBufSize > Member List
    +
    +
    +This is the complete list of members for SerialPort< PortNumber, RxBufSize, TxBufSize >, including all inherited members. + + + + + + + + + + + + + + + + + + + + +
    available(void)SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    begin(uint32_t baud, uint8_t options=SP_8_BIT_CHAR)SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    clearRxError()SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    end()SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    flush()SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    flushRx()SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    flushTx()SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    getRxError()SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    peek(void)SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    read()SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    read(uint8_t *b, size_t n)SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    SerialPort() (defined in SerialPort< PortNumber, RxBufSize, TxBufSize >)SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    write(uint8_t b)SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    write(const __FlashStringHelper *s)SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    write(const uint8_t *b, size_t n)SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    write(const char *s)SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    write_P(PGM_P b, size_t n)SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    writeln()SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    writeln(const char *s)SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    writeln(const __FlashStringHelper *s)SerialPort< PortNumber, RxBufSize, TxBufSize > [inline]
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/class_serial_port.html b/libs/SerialPortBeta20120106/html/class_serial_port.html new file mode 100644 index 0000000..015557b --- /dev/null +++ b/libs/SerialPortBeta20120106/html/class_serial_port.html @@ -0,0 +1,613 @@ + + + + +SoftRTClib: SerialPort< PortNumber, RxBufSize, TxBufSize > Class Template Reference + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + +
    +
    + +
    +
    SerialPort< PortNumber, RxBufSize, TxBufSize > Class Template Reference
    +
    +
    + +

    class for avr hardware USART ports + More...

    + +

    #include <SerialPort.h>

    + +

    List of all members.

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

    +Public Member Functions

    int available (void)
    void begin (uint32_t baud, uint8_t options=SP_8_BIT_CHAR)
    void clearRxError ()
    void end ()
    void flush ()
    void flushRx ()
    void flushTx ()
    uint8_t getRxError ()
    int peek (void)
    int read ()
    size_t read (uint8_t *b, size_t n)
    size_t write (const char *s)
    size_t write (uint8_t b)
    size_t write (const __FlashStringHelper *s)
    size_t write (const uint8_t *b, size_t n)
    size_t write_P (PGM_P b, size_t n)
    size_t writeln (const char *s)
    size_t writeln ()
    size_t writeln (const __FlashStringHelper *s)
    +

    Detailed Description

    +

    template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    +class SerialPort< PortNumber, RxBufSize, TxBufSize >

    + +

    class for avr hardware USART ports

    +

    Member Function Documentation

    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + + +
    int SerialPort< PortNumber, RxBufSize, TxBufSize >::available (void ) [inline]
    +
    +
    +
    Returns:
    The number of bytes (characters) available for reading from the serial port.
    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + + + + + + + + + + + + +
    void SerialPort< PortNumber, RxBufSize, TxBufSize >::begin (uint32_t baud,
    uint8_t options = SP_8_BIT_CHAR 
    ) [inline]
    +
    +
    +

    Sets the data rate in bits per second (baud) for serial data transmission.

    +
    Parameters:
    + + + +
    [in]baudrate in bits per second (baud)
    [in]optionsconstructed by a bitwise-inclusive OR of values from the following list. Choose one value for stop bit, parity, and character size.
    +
    +
    +

    The default is SP_8_BIT_CHAR which results in one stop bit, no parity, and 8-bit characters.

    +

    SP_1_STOP_BIT - use one stop bit (default if stop bit not specified)

    +

    SP_2_STOP_BIT - use two stop bits

    +

    SP_NO_PARITY - no parity bit (default if parity not specified)

    +

    SP_EVEN_PARITY - add even parity bit

    +

    SP_ODD_PARITY - add odd parity bit

    +

    SP_5_BIT_CHAR - use 5-bit characters (default if size not specified)

    +

    SP_6_BIT_CHAR - use 6-bit characters

    +

    SP_7_BIT_CHAR - use 7-bit characters

    +

    SP_8_BIT_CHAR - use 8-bit characters

    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + +
    void SerialPort< PortNumber, RxBufSize, TxBufSize >::clearRxError () [inline]
    +
    +
    +

    clear RX error bits

    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + +
    void SerialPort< PortNumber, RxBufSize, TxBufSize >::end () [inline]
    +
    +
    +

    Disables serial communication, allowing the RX and TX pins to be used for general input and output. To re-enable serial communication, call SerialPort::begin().

    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + +
    void SerialPort< PortNumber, RxBufSize, TxBufSize >::flush () [inline]
    +
    +
    +

    For Arduino 1.0 and greater call flushTx(). For Arduino 0023 and before call flushRx().

    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + +
    void SerialPort< PortNumber, RxBufSize, TxBufSize >::flushRx () [inline]
    +
    +
    +

    Discard any buffered incoming serial data.

    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + +
    void SerialPort< PortNumber, RxBufSize, TxBufSize >::flushTx () [inline]
    +
    +
    +

    Waits for the transmission of outgoing serial data to complete.

    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + +
    uint8_t SerialPort< PortNumber, RxBufSize, TxBufSize >::getRxError () [inline]
    +
    +
    +
    Returns:
    RX error bits
    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + + +
    int SerialPort< PortNumber, RxBufSize, TxBufSize >::peek (void ) [inline]
    +
    +
    +
    Returns:
    the first byte of incoming serial data available or -1 if no data is available. Peek() always return -1 for unbuffered RX.
    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + +
    int SerialPort< PortNumber, RxBufSize, TxBufSize >::read () [inline]
    +
    +
    +

    Read incoming serial data.

    +
    Returns:
    the first byte of incoming serial data available or -1 if no data is available
    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + + + + + + + + + + + + +
    size_t SerialPort< PortNumber, RxBufSize, TxBufSize >::read (uint8_t * b,
    size_t n 
    ) [inline]
    +
    +
    +

    Read incoming serial data. Stop when RX buffer is empty or n bytes have been read.

    +
    Parameters:
    + + + +
    [in]blocation to receive the data
    [in]nmaximum number of bytes to read
    +
    +
    +
    Returns:
    number of bytes read
    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + + +
    size_t SerialPort< PortNumber, RxBufSize, TxBufSize >::write (const __FlashStringHelper * s) [inline]
    +
    +
    +

    Write a flash string to the serial port.

    +
    Parameters:
    + + +
    [in]sstring to be written.
    +
    +
    +
    Returns:
    number of bytes written to the serial port
    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + + +
    size_t SerialPort< PortNumber, RxBufSize, TxBufSize >::write (const char * s) [inline]
    +
    +
    +

    Write a string to the serial port.

    +
    Parameters:
    + + +
    [in]sstring to be written.
    +
    +
    +
    Returns:
    number of bytes written to the serial port
    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + + + + + + + + + + + + +
    size_t SerialPort< PortNumber, RxBufSize, TxBufSize >::write (const uint8_t * b,
    size_t n 
    ) [inline]
    +
    +
    +

    Write binary data to the serial port.

    +
    Parameters:
    + + + +
    [in]bbytes to be written
    [in]nnumber of bytes to write
    +
    +
    +
    Returns:
    number of bytes written to the serial port
    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + + +
    size_t SerialPort< PortNumber, RxBufSize, TxBufSize >::write (uint8_t b) [inline]
    +
    +
    +

    Write binary data to the serial port.

    +
    Parameters:
    + + +
    [in]bbyte to be written.
    +
    +
    +
    Returns:
    number of bytes written to the serial port
    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + + + + + + + + + + + + +
    size_t SerialPort< PortNumber, RxBufSize, TxBufSize >::write_P (PGM_P b,
    size_t n 
    ) [inline]
    +
    +
    +

    Write binary data from flash memory to the serial port.

    +
    Parameters:
    + + + +
    [in]bbytes to be written
    [in]nnumber of bytes to write
    +
    +
    +
    Returns:
    number of bytes written to the serial port
    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + + +
    size_t SerialPort< PortNumber, RxBufSize, TxBufSize >::writeln (const __FlashStringHelper * s) [inline]
    +
    +
    +

    Write a flash string to the serial port followed by CF LF

    +
    Parameters:
    + + +
    [in]sstring to be written.
    +
    +
    +
    Returns:
    number of bytes written to the serial port
    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + + +
    size_t SerialPort< PortNumber, RxBufSize, TxBufSize >::writeln (const char * s) [inline]
    +
    +
    +

    Write a string to the serial port followed by CF LF

    +
    Parameters:
    + + +
    [in]sstring to be written.
    +
    +
    +
    Returns:
    number of bytes written to the serial port
    + +
    +
    + +
    +
    +
    +template<uint8_t PortNumber, size_t RxBufSize, size_t TxBufSize>
    + + + + + + + +
    size_t SerialPort< PortNumber, RxBufSize, TxBufSize >::writeln () [inline]
    +
    +
    +

    write CR LF

    +
    Returns:
    2
    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/class_serial_ring_buffer-members.html b/libs/SerialPortBeta20120106/html/class_serial_ring_buffer-members.html new file mode 100644 index 0000000..5bf290e --- /dev/null +++ b/libs/SerialPortBeta20120106/html/class_serial_ring_buffer-members.html @@ -0,0 +1,94 @@ + + + + +SoftRTClib: Member List + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + +
    +
    +
    +
    SerialRingBuffer Member List
    +
    +
    +This is the complete list of members for SerialRingBuffer, including all inherited members. + + + + + + + + + + + +
    available()SerialRingBuffer
    buf_size_t typedefSerialRingBuffer
    empty()SerialRingBuffer [inline]
    flush()SerialRingBuffer
    get(uint8_t *b)SerialRingBuffer
    get(uint8_t *b, buf_size_t n)SerialRingBuffer
    init(uint8_t *b, buf_size_t s)SerialRingBuffer
    peek()SerialRingBuffer
    put(uint8_t b)SerialRingBuffer
    put(const uint8_t *b, buf_size_t n)SerialRingBuffer
    put_P(PGM_P b, buf_size_t n)SerialRingBuffer
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/class_serial_ring_buffer.html b/libs/SerialPortBeta20120106/html/class_serial_ring_buffer.html new file mode 100644 index 0000000..ead78d2 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/class_serial_ring_buffer.html @@ -0,0 +1,393 @@ + + + + +SoftRTClib: SerialRingBuffer Class Reference + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + +
    +
    + +
    +
    SerialRingBuffer Class Reference
    +
    +
    + +

    ring buffer for RX and TX data + More...

    + +

    #include <SerialPort.h>

    + +

    List of all members.

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

    +Public Types

    typedef uint16_t buf_size_t

    +Public Member Functions

    int available ()
    bool empty ()
    void flush ()
    bool get (uint8_t *b)
    buf_size_t get (uint8_t *b, buf_size_t n)
    void init (uint8_t *b, buf_size_t s)
    int peek ()
    bool put (uint8_t b)
    buf_size_t put (const uint8_t *b, buf_size_t n)
    buf_size_t put_P (PGM_P b, buf_size_t n)
    +

    Detailed Description

    +

    ring buffer for RX and TX data

    +

    Member Typedef Documentation

    + +
    +
    + + + + +
    typedef uint16_t SerialRingBuffer::buf_size_t
    +
    +
    +

    Define type for buffer indices

    + +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + +
    int SerialRingBuffer::available ()
    +
    +
    +
    Returns:
    the number of bytes in the ring buffer
    + +
    +
    + +
    +
    + + + + + + + +
    bool SerialRingBuffer::empty () [inline]
    +
    +
    +
    Returns:
    true if the ring buffer is empty else false
    + +
    +
    + +
    +
    + + + + + + + +
    void SerialRingBuffer::flush ()
    +
    +
    +

    Discard all data in the ring buffer.

    + +
    +
    + +
    +
    + + + + + + + + +
    bool SerialRingBuffer::get (uint8_t * b)
    +
    +
    +

    get the next byte

    +
    Parameters:
    + + +
    [in]blocation for the returned byte
    +
    +
    +
    Returns:
    true if a byte was returned or false if the ring buffer is empty
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    SerialRingBuffer::buf_size_t SerialRingBuffer::get (uint8_t * b,
    buf_size_t n 
    )
    +
    +
    +

    Get the maximum number of contiguous bytes from the ring buffer with one call to memcpy. Do not use this function with interrupts disabled.

    +
    Parameters:
    + + + +
    [in]bpointer to data
    [in]nnumber of bytes to transfer from the ring buffer
    +
    +
    +
    Returns:
    number of bytes transferred
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void SerialRingBuffer::init (uint8_t * b,
    buf_size_t s 
    )
    +
    +
    +

    initialize the ring buffer

    +
    Parameters:
    + + + +
    [in]bbuffer for data
    [in]ssize of the buffer
    +
    +
    + +
    +
    + +
    +
    + + + + + + + +
    int SerialRingBuffer::peek ()
    +
    +
    +

    peek at the next byte in the ring buffer

    +
    Returns:
    the next byte that would ber read or -1 if the ring buffer is empty
    + +
    +
    + +
    +
    + + + + + + + + +
    bool SerialRingBuffer::put (uint8_t b)
    +
    +
    +

    put a byte into the ring buffer

    +
    Parameters:
    + + +
    [in]bthe byte
    +
    +
    +
    Returns:
    true if byte was transferred or false if the ring buffer is full
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    SerialRingBuffer::buf_size_t SerialRingBuffer::put (const uint8_t * b,
    buf_size_t n 
    )
    +
    +
    +

    Put the maximum number of contiguous bytes into the ring buffer with one call to memcpy.

    +
    Parameters:
    + + + +
    [in]bpointer to data
    [in]nnumber of bytes to transfer to the ring buffer
    +
    +
    +
    Returns:
    number of bytes transferred
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    SerialRingBuffer::buf_size_t SerialRingBuffer::put_P (PGM_P b,
    buf_size_t n 
    )
    +
    +
    +

    Put the maximum number of contiguous bytes into the ring buffer with one call to memcpy.

    +
    Parameters:
    + + + +
    [in]bpointer to data
    [in]nnumber of bytes to transfer to the ring buffer
    +
    +
    +
    Returns:
    number of bytes transferred
    + +
    +
    +
    The documentation for this class was generated from the following files:
      +
    • Arduino/libraries/SerialPort/SerialPort.h
    • +
    • Arduino/libraries/SerialPort/SerialPort.cpp
    • +
    +
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/class_usart_register-members.html b/libs/SerialPortBeta20120106/html/class_usart_register-members.html new file mode 100644 index 0000000..1b9747e --- /dev/null +++ b/libs/SerialPortBeta20120106/html/class_usart_register-members.html @@ -0,0 +1,89 @@ + + + + +SoftRTClib: Member List + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + +
    +
    +
    +
    UsartRegister Member List
    +
    +
    +This is the complete list of members for UsartRegister, including all inherited members. + + + + + + +
    ubrrhUsartRegister
    ubrrlUsartRegister
    ucsraUsartRegister
    ucsrbUsartRegister
    ucsrcUsartRegister
    udrUsartRegister
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/classes.html b/libs/SerialPortBeta20120106/html/classes.html new file mode 100644 index 0000000..32a1cca --- /dev/null +++ b/libs/SerialPortBeta20120106/html/classes.html @@ -0,0 +1,87 @@ + + + + +SoftRTClib: Class Index + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + +
    +
    +
    +
    Class Index
    +
    +
    +
    S | U
    + +
      S  
    +
    SerialPort   SerialRingBuffer   
      U  
    +
    UsartRegister   
    S | U
    +
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/closed.png b/libs/SerialPortBeta20120106/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..b7d4bd9fef2272c74b94762c9e2496177017775e GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VuAVNAAr*{o?>h22DDp4|bgj*t z)u^AqcA-V@guRYpb17F<&b?_~8HV>~XqWvB;^$!VVSTy0!eQcJp_yD7TIQA>7dijs YXf6~H5cs^Q6KEiVr>mdKI;Vst0NsWqGynhq literal 0 HcmV?d00001 diff --git a/libs/SerialPortBeta20120106/html/doxygen.css b/libs/SerialPortBeta20120106/html/doxygen.css new file mode 100644 index 0000000..74445fe --- /dev/null +++ b/libs/SerialPortBeta20120106/html/doxygen.css @@ -0,0 +1,835 @@ +/* The standard CSS for doxygen */ + +body, table, div, p, dl { + font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; + font-size: 12px; +} + +/* @group Heading Levels */ + +h1 { + font-size: 150%; +} + +.title { + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2 { + font-size: 120%; +} + +h3 { + font-size: 100%; +} + +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, p.starttd { + margin-top: 2px; +} + +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; + margin: 2px; + padding: 2px; +} + +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 { + color: #4665A2; +} + +a.codeRef { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +.fragment { + font-family: monospace, fixed; + font-size: 105%; +} + +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%; +} + +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: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 10px; + margin-right: 5px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; +} + +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 +} + +/* @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; +} + +.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; +} + +.memItemLeft, .memItemRight, .memTemplParams { + border-top: 1px solid #C4CFE5; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; +} + +/* @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; +} + +.memname { + white-space: nowrap; + font-weight: bold; + margin-left: 6px; +} + +.memproto { + 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); + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 8px; + border-top-left-radius: 8px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 8px; + -moz-border-radius-topleft: 8px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 8px; + -webkit-border-top-left-radius: 8px; + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + +} + +.memdoc { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 2px 5px; + background-color: #FBFCFD; + border-top-width: 0; + /* opera specific markup */ + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 8px; + -moz-border-radius-bottomright: 8px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7); + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7)); +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} + +.params, .retval, .exception, .tparams { + border-spacing: 6px 2px; +} + +.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; +} + + + + +/* @end */ + +/* @group Directory (tree) */ + +/* for the tree view */ + +.ftvtree { + font-family: sans-serif; + margin: 0px; +} + +/* these are for tree view when used as main index */ + +.directory { + font-size: 9pt; + font-weight: bold; + margin: 5px; +} + +.directory h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +/* +The following two styles can be used to replace the root node title +with an image of your choice. Simply uncomment the next two styles, +specify the name of your image and be sure to set 'height' to the +proper pixel height of your image. +*/ + +/* +.directory h3.swap { + height: 61px; + background-repeat: no-repeat; + background-image: url("yourimage.gif"); +} +.directory h3.swap span { + display: none; +} +*/ + +.directory > h3 { + margin-top: 0; +} + +.directory p { + margin: 0px; + white-space: nowrap; +} + +.directory div { + display: none; + margin: 0px; +} + +.directory img { + vertical-align: -30%; +} + +/* these are for tree view when not used as main index */ + +.directory-alt { + font-size: 100%; + font-weight: bold; +} + +.directory-alt h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +.directory-alt > h3 { + margin-top: 0; +} + +.directory-alt p { + margin: 0px; + white-space: nowrap; +} + +.directory-alt div { + display: none; + margin: 0px; +} + +.directory-alt img { + vertical-align: -30%; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable { + border-collapse:collapse; +} + +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; + text-align:left; +} + +.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; + 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; +} + +.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; + padding-left: 5px; + 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 +{ + border-left:4px solid; + padding: 0 0 0 6px; +} + +dl.note +{ + border-color: #D0C000; +} + +dl.warning, dl.attention +{ + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + border-color: #00D000; +} + +dl.deprecated +{ + border-color: #505050; +} + +dl.todo +{ + border-color: #00C0E0; +} + +dl.test +{ + border-color: #3030E0; +} + +dl.bug +{ + border-color: #C08050; +} + +#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; +} + +.caption +{ + font-weight: bold; +} + diff --git a/libs/SerialPortBeta20120106/html/doxygen.png b/libs/SerialPortBeta20120106/html/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..635ed52fce7057ac24df92ec7664088a881fa5d0 GIT binary patch literal 3942 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 A+yDRo literal 0 HcmV?d00001 diff --git a/libs/SerialPortBeta20120106/html/files.html b/libs/SerialPortBeta20120106/html/files.html new file mode 100644 index 0000000..c71df9a --- /dev/null +++ b/libs/SerialPortBeta20120106/html/files.html @@ -0,0 +1,85 @@ + + + + +SoftRTClib: File List + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + +
    +
    +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    + +
    Arduino/libraries/SerialPort/SerialPort.hSerialPort class
    +
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/functions.html b/libs/SerialPortBeta20120106/html/functions.html new file mode 100644 index 0000000..cc6d5b0 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/functions.html @@ -0,0 +1,223 @@ + + + + +SoftRTClib: Class Members + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - a -

    + + +

    - b -

    + + +

    - c -

    + + +

    - e -

    + + +

    - f -

    + + +

    - g -

    + + +

    - i -

    + + +

    - p -

    + + +

    - r -

    + + +

    - u -

    + + +

    - w -

    +
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/functions_func.html b/libs/SerialPortBeta20120106/html/functions_func.html new file mode 100644 index 0000000..b98309e --- /dev/null +++ b/libs/SerialPortBeta20120106/html/functions_func.html @@ -0,0 +1,145 @@ + + + + +SoftRTClib: Class Members - Functions + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + + +
    + + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/functions_type.html b/libs/SerialPortBeta20120106/html/functions_type.html new file mode 100644 index 0000000..a153b9a --- /dev/null +++ b/libs/SerialPortBeta20120106/html/functions_type.html @@ -0,0 +1,91 @@ + + + + +SoftRTClib: Class Members - Typedefs + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + + +
    +
    +
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/functions_vars.html b/libs/SerialPortBeta20120106/html/functions_vars.html new file mode 100644 index 0000000..443beaf --- /dev/null +++ b/libs/SerialPortBeta20120106/html/functions_vars.html @@ -0,0 +1,106 @@ + + + + +SoftRTClib: Class Members - Variables + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + + +
    +
    +
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/globals.html b/libs/SerialPortBeta20120106/html/globals.html new file mode 100644 index 0000000..753620e --- /dev/null +++ b/libs/SerialPortBeta20120106/html/globals.html @@ -0,0 +1,221 @@ + + + + +SoftRTClib: File Members + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + + + +
    +
    +
    Here is a list of all documented file members with links to the documentation:
    + +

    - a -

    + + +

    - b -

    + + +

    - e -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    + + +

    - u -

    +
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/globals_defs.html b/libs/SerialPortBeta20120106/html/globals_defs.html new file mode 100644 index 0000000..9acbc78 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/globals_defs.html @@ -0,0 +1,118 @@ + + + + +SoftRTClib: File Members + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + + +
    +
    +
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/globals_func.html b/libs/SerialPortBeta20120106/html/globals_func.html new file mode 100644 index 0000000..9f3cdf6 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/globals_func.html @@ -0,0 +1,97 @@ + + + + +SoftRTClib: File Members + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + + +
    +
    +
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/globals_vars.html b/libs/SerialPortBeta20120106/html/globals_vars.html new file mode 100644 index 0000000..07b5a2f --- /dev/null +++ b/libs/SerialPortBeta20120106/html/globals_vars.html @@ -0,0 +1,145 @@ + + + + +SoftRTClib: File Members + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + + +
    +
    +
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/index.html b/libs/SerialPortBeta20120106/html/index.html new file mode 100644 index 0000000..3398ed9 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/index.html @@ -0,0 +1,80 @@ + + + + +SoftRTClib: Arduino SerialPort Library + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + +
    +
    +
    +
    Arduino SerialPort Library
    +
    +
    +
    Copyright © 2011 by William Greiman

    +Introduction

    +

    This library are in early beta development so documentation is incomplete.

    +

    For now please explore the above tabs.

    +
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/installdox b/libs/SerialPortBeta20120106/html/installdox new file mode 100644 index 0000000..edf5bbf --- /dev/null +++ b/libs/SerialPortBeta20120106/html/installdox @@ -0,0 +1,112 @@ +#!/usr/bin/perl + +%subst = ( ); +$quiet = 0; + +while ( @ARGV ) { + $_ = shift @ARGV; + if ( s/^-// ) { + if ( /^l(.*)/ ) { + $v = ($1 eq "") ? shift @ARGV : $1; + ($v =~ /\/$/) || ($v .= "/"); + $_ = $v; + if ( /(.+)\@(.+)/ ) { + if ( exists $subst{$1} ) { + $subst{$1} = $2; + } else { + print STDERR "Unknown tag file $1 given with option -l\n"; + &usage(); + } + } else { + print STDERR "Argument $_ is invalid for option -l\n"; + &usage(); + } + } + elsif ( /^q/ ) { + $quiet = 1; + } + elsif ( /^\?|^h/ ) { + &usage(); + } + else { + print STDERR "Illegal option -$_\n"; + &usage(); + } + } + else { + push (@files, $_ ); + } +} + +foreach $sub (keys %subst) +{ + if ( $subst{$sub} eq "" ) + { + print STDERR "No substitute given for tag file `$sub'\n"; + &usage(); + } + elsif ( ! $quiet && $sub ne "_doc" && $sub ne "_cgi" ) + { + print "Substituting $subst{$sub} for each occurrence of tag file $sub\n"; + } +} + +if ( ! @files ) { + if (opendir(D,".")) { + foreach $file ( readdir(D) ) { + $match = ".html"; + next if ( $file =~ /^\.\.?$/ ); + ($file =~ /$match/) && (push @files, $file); + ($file =~ /\.svg/) && (push @files, $file); + ($file =~ "navtree.js") && (push @files, $file); + } + closedir(D); + } +} + +if ( ! @files ) { + print STDERR "Warning: No input files given and none found!\n"; +} + +foreach $f (@files) +{ + if ( ! $quiet ) { + print "Editing: $f...\n"; + } + $oldf = $f; + $f .= ".bak"; + unless (rename $oldf,$f) { + print STDERR "Error: cannot rename file $oldf\n"; + exit 1; + } + if (open(F,"<$f")) { + unless (open(G,">$oldf")) { + print STDERR "Error: opening file $oldf for writing\n"; + exit 1; + } + if ($oldf ne "tree.js") { + while () { + s/doxygen\=\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\" (xlink:href|href|src)=\"\2/doxygen\=\"$1:$subst{$1}\" \3=\"$subst{$1}/g; + print G "$_"; + } + } + else { + while () { + s/\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\", \"\2/\"$1:$subst{$1}\" ,\"$subst{$1}/g; + print G "$_"; + } + } + } + else { + print STDERR "Warning file $f does not exist\n"; + } + unlink $f; +} + +sub usage { + print STDERR "Usage: installdox [options] [html-file [html-file ...]]\n"; + print STDERR "Options:\n"; + print STDERR " -l tagfile\@linkName tag file + URL or directory \n"; + print STDERR " -q Quiet mode\n\n"; + exit 1; +} diff --git a/libs/SerialPortBeta20120106/html/jquery.js b/libs/SerialPortBeta20120106/html/jquery.js new file mode 100644 index 0000000..c052173 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/jquery.js @@ -0,0 +1,54 @@ +/* + * jQuery JavaScript Library v1.3.2 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) + * Revision: 6246 + */ +(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},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(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
    "]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
    ","
    "]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); +/* + * Sizzle CSS Selector Engine - v0.9.3 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

    ";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
    ";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0) +{I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
    ").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function() +{G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
    ';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); +/* + * jQuery UI 1.7.2 + * + * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI + */ +jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.2",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/* * jQuery UI Resizable 1.7.2 + * + * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Resizables + * + * Depends: + * ui.core.js + */ +(function(c){c.widget("ui.resizable",c.extend({},c.ui.mouse,{_init:function(){var e=this,j=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(j.aspectRatio),aspectRatio:j.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:j.helper||j.ghost||j.animate?j.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){if(/relative/.test(this.element.css("position"))&&c.browser.opera){this.element.css({position:"relative",top:"auto",left:"auto"})}this.element.wrap(c('
    ').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=j.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var k=this.handles.split(",");this.handles={};for(var f=0;f
    ');if(/sw|se|ne|nw/.test(h)){g.css({zIndex:++j.zIndex})}if("se"==h){g.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[h]=".ui-resizable-"+h;this.element.append(g)}}this._renderAxis=function(p){p=p||this.element;for(var m in this.handles){if(this.handles[m].constructor==String){this.handles[m]=c(this.handles[m],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var n=c(this.handles[m],this.element),o=0;o=/sw|ne|nw|se|n|s/.test(m)?n.outerHeight():n.outerWidth();var l=["padding",/ne|nw|n/.test(m)?"Top":/se|sw|s/.test(m)?"Bottom":/^e$/.test(m)?"Right":"Left"].join("");p.css(l,o);this._proportionallyResize()}if(!c(this.handles[m]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!e.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}e.axis=i&&i[1]?i[1]:"se"}});if(j.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){c(this).removeClass("ui-resizable-autohide");e._handles.show()},function(){if(!e.resizing){c(this).addClass("ui-resizable-autohide");e._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var d=function(f){c(f).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){d(this.element);var e=this.element;e.parent().append(this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")})).end().remove()}this.originalElement.css("resize",this.originalResizeStyle);d(this.originalElement)},_mouseCapture:function(e){var f=false;for(var d in this.handles){if(c(this.handles[d])[0]==e.target){f=true}}return this.options.disabled||!!f},_mouseStart:function(f){var i=this.options,e=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(d.is(".ui-draggable")||(/absolute/).test(d.css("position"))){d.css({position:"absolute",top:e.top,left:e.left})}if(c.browser.opera&&(/relative/).test(d.css("position"))){d.css({position:"relative",top:"auto",left:"auto"})}this._renderProxy();var j=b(this.helper.css("left")),g=b(this.helper.css("top"));if(i.containment){j+=c(i.containment).scrollLeft()||0;g+=c(i.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:j,top:g};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:j,top:g};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:f.pageX,top:f.pageY};this.aspectRatio=(typeof i.aspectRatio=="number")?i.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var h=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",h=="auto"?this.axis+"-resize":h);d.addClass("ui-resizable-resizing");this._propagate("start",f);return true},_mouseDrag:function(d){var g=this.helper,f=this.options,l={},p=this,i=this.originalMousePosition,m=this.axis;var q=(d.pageX-i.left)||0,n=(d.pageY-i.top)||0;var h=this._change[m];if(!h){return false}var k=h.apply(this,[d,q,n]),j=c.browser.msie&&c.browser.version<7,e=this.sizeDiff;if(this._aspectRatio||d.shiftKey){k=this._updateRatio(k,d)}k=this._respectSize(k,d);this._propagate("resize",d);g.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(k);this._trigger("resize",d,this.ui());return false},_mouseStop:function(g){this.resizing=false;var h=this.options,l=this;if(this._helper){var f=this._proportionallyResizeElements,d=f.length&&(/textarea/i).test(f[0].nodeName),e=d&&c.ui.hasScroll(f[0],"left")?0:l.sizeDiff.height,j=d?0:l.sizeDiff.width;var m={width:(l.size.width-j),height:(l.size.height-e)},i=(parseInt(l.element.css("left"),10)+(l.position.left-l.originalPosition.left))||null,k=(parseInt(l.element.css("top"),10)+(l.position.top-l.originalPosition.top))||null;if(!h.animate){this.element.css(c.extend(m,{top:k,left:i}))}l.helper.height(l.size.height);l.helper.width(l.size.width);if(this._helper&&!h.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",g);if(this._helper){this.helper.remove()}return false},_updateCache:function(d){var e=this.options;this.offset=this.helper.offset();if(a(d.left)){this.position.left=d.left}if(a(d.top)){this.position.top=d.top}if(a(d.height)){this.size.height=d.height}if(a(d.width)){this.size.width=d.width}},_updateRatio:function(g,f){var h=this.options,i=this.position,e=this.size,d=this.axis;if(g.height){g.width=(e.height*this.aspectRatio)}else{if(g.width){g.height=(e.width/this.aspectRatio)}}if(d=="sw"){g.left=i.left+(e.width-g.width);g.top=null}if(d=="nw"){g.top=i.top+(e.height-g.height);g.left=i.left+(e.width-g.width)}return g},_respectSize:function(k,f){var i=this.helper,h=this.options,q=this._aspectRatio||f.shiftKey,p=this.axis,s=a(k.width)&&h.maxWidth&&(h.maxWidthk.width),r=a(k.height)&&h.minHeight&&(h.minHeight>k.height);if(g){k.width=h.minWidth}if(r){k.height=h.minHeight}if(s){k.width=h.maxWidth}if(l){k.height=h.maxHeight}var e=this.originalPosition.left+this.originalSize.width,n=this.position.top+this.size.height;var j=/sw|nw|w/.test(p),d=/nw|ne|n/.test(p);if(g&&j){k.left=e-h.minWidth}if(s&&j){k.left=e-h.maxWidth}if(r&&d){k.top=n-h.minHeight}if(l&&d){k.top=n-h.maxHeight}var m=!k.width&&!k.height;if(m&&!k.left&&k.top){k.top=null}else{if(m&&!k.top&&k.left){k.left=null}}return k},_proportionallyResize:function(){var j=this.options;if(!this._proportionallyResizeElements.length){return}var f=this.helper||this.element;for(var e=0;e');var d=c.browser.msie&&c.browser.version<7,f=(d?1:0),g=(d?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+g,height:this.element.outerHeight()+g,position:"absolute",left:this.elementOffset.left-f+"px",top:this.elementOffset.top-f+"px",zIndex:++h.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(f,e,d){return{width:this.originalSize.width+e}},w:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{left:h.left+e,width:f.width-e}},n:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{top:h.top+d,height:f.height-d}},s:function(f,e,d){return{height:this.originalSize.height+d}},se:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},sw:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[f,e,d]))},ne:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},nw:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[f,e,d]))}},_propagate:function(e,d){c.ui.plugin.call(this,e,[d,this.ui()]);(e!="resize"&&this._trigger(e,d,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}));c.extend(c.ui.resizable,{version:"1.7.2",eventPrefix:"resize",defaults:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,cancel:":input,option",containment:false,delay:0,distance:1,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000}});c.ui.plugin.add("resizable","alsoResize",{start:function(e,f){var d=c(this).data("resizable"),g=d.options;_store=function(h){c(h).each(function(){c(this).data("resizable-alsoresize",{width:parseInt(c(this).width(),10),height:parseInt(c(this).height(),10),left:parseInt(c(this).css("left"),10),top:parseInt(c(this).css("top"),10)})})};if(typeof(g.alsoResize)=="object"&&!g.alsoResize.parentNode){if(g.alsoResize.length){g.alsoResize=g.alsoResize[0];_store(g.alsoResize)}else{c.each(g.alsoResize,function(h,i){_store(h)})}}else{_store(g.alsoResize)}},resize:function(f,h){var e=c(this).data("resizable"),i=e.options,g=e.originalSize,k=e.originalPosition;var j={height:(e.size.height-g.height)||0,width:(e.size.width-g.width)||0,top:(e.position.top-k.top)||0,left:(e.position.left-k.left)||0},d=function(l,m){c(l).each(function(){var p=c(this),q=c(this).data("resizable-alsoresize"),o={},n=m&&m.length?m:["width","height","top","left"];c.each(n||["width","height","top","left"],function(r,t){var s=(q[t]||0)+(j[t]||0);if(s&&s>=0){o[t]=s||null}});if(/relative/.test(p.css("position"))&&c.browser.opera){e._revertToRelativePosition=true;p.css({position:"absolute",top:"auto",left:"auto"})}p.css(o)})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.nodeType){c.each(i.alsoResize,function(l,m){d(l,m)})}else{d(i.alsoResize)}},stop:function(e,f){var d=c(this).data("resizable");if(d._revertToRelativePosition&&c.browser.opera){d._revertToRelativePosition=false;el.css({position:"relative"})}c(this).removeData("resizable-alsoresize-start")}});c.ui.plugin.add("resizable","animate",{stop:function(h,m){var n=c(this).data("resizable"),i=n.options;var g=n._proportionallyResizeElements,d=g.length&&(/textarea/i).test(g[0].nodeName),e=d&&c.ui.hasScroll(g[0],"left")?0:n.sizeDiff.height,k=d?0:n.sizeDiff.width;var f={width:(n.size.width-k),height:(n.size.height-e)},j=(parseInt(n.element.css("left"),10)+(n.position.left-n.originalPosition.left))||null,l=(parseInt(n.element.css("top"),10)+(n.position.top-n.originalPosition.top))||null;n.element.animate(c.extend(f,l&&j?{top:l,left:j}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var o={width:parseInt(n.element.css("width"),10),height:parseInt(n.element.css("height"),10),top:parseInt(n.element.css("top"),10),left:parseInt(n.element.css("left"),10)};if(g&&g.length){c(g[0]).css({width:o.width,height:o.height})}n._updateCache(o);n._propagate("resize",h)}})}});c.ui.plugin.add("resizable","containment",{start:function(e,q){var s=c(this).data("resizable"),i=s.options,k=s.element;var f=i.containment,j=(f instanceof c)?f.get(0):(/parent/.test(f))?k.parent().get(0):f;if(!j){return}s.containerElement=c(j);if(/document/.test(f)||f==document){s.containerOffset={left:0,top:0};s.containerPosition={left:0,top:0};s.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var m=c(j),h=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){h[p]=b(m.css("padding"+o))});s.containerOffset=m.offset();s.containerPosition=m.position();s.containerSize={height:(m.innerHeight()-h[3]),width:(m.innerWidth()-h[1])};var n=s.containerOffset,d=s.containerSize.height,l=s.containerSize.width,g=(c.ui.hasScroll(j,"left")?j.scrollWidth:l),r=(c.ui.hasScroll(j)?j.scrollHeight:d);s.parentData={element:j,left:n.left,top:n.top,width:g,height:r}}},resize:function(f,p){var s=c(this).data("resizable"),h=s.options,e=s.containerSize,n=s.containerOffset,l=s.size,m=s.position,q=s._aspectRatio||f.shiftKey,d={top:0,left:0},g=s.containerElement;if(g[0]!=document&&(/static/).test(g.css("position"))){d=n}if(m.left<(s._helper?n.left:0)){s.size.width=s.size.width+(s._helper?(s.position.left-n.left):(s.position.left-d.left));if(q){s.size.height=s.size.width/h.aspectRatio}s.position.left=h.helper?n.left:0}if(m.top<(s._helper?n.top:0)) +{s.size.height=s.size.height+(s._helper?(s.position.top-n.top):s.position.top);if(q){s.size.width=s.size.height*h.aspectRatio}s.position.top=s._helper?n.top:0}s.offset.left=s.parentData.left+s.position.left;s.offset.top=s.parentData.top+s.position.top;var k=Math.abs((s._helper?s.offset.left-d.left:(s.offset.left-d.left))+s.sizeDiff.width),r=Math.abs((s._helper?s.offset.top-d.top:(s.offset.top-n.top))+s.sizeDiff.height);var j=s.containerElement.get(0)==s.element.parent().get(0),i=/relative|absolute/.test(s.containerElement.css("position"));if(j&&i){k-=s.parentData.left}if(k+s.size.width>=s.parentData.width){s.size.width=s.parentData.width-k;if(q){s.size.height=s.size.width/s.aspectRatio}}if(r+s.size.height>=s.parentData.height){s.size.height=s.parentData.height-r;if(q){s.size.width=s.size.height*s.aspectRatio}}},stop:function(e,m){var p=c(this).data("resizable"),f=p.options,k=p.position,l=p.containerOffset,d=p.containerPosition,g=p.containerElement;var i=c(p.helper),q=i.offset(),n=i.outerWidth()-p.sizeDiff.width,j=i.outerHeight()-p.sizeDiff.height;if(p._helper&&!f.animate&&(/relative/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}if(p._helper&&!f.animate&&(/static/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}}});c.ui.plugin.add("resizable","ghost",{start:function(f,g){var d=c(this).data("resizable"),h=d.options,e=d.size;d.ghost=d.originalElement.clone();d.ghost.css({opacity:0.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof h.ghost=="string"?h.ghost:"");d.ghost.appendTo(d.helper)},resize:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost){d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})}},stop:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost&&d.helper){d.helper.get(0).removeChild(d.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(d,l){var n=c(this).data("resizable"),g=n.options,j=n.size,h=n.originalSize,i=n.originalPosition,m=n.axis,k=g._aspectRatio||d.shiftKey;g.grid=typeof g.grid=="number"?[g.grid,g.grid]:g.grid;var f=Math.round((j.width-h.width)/(g.grid[0]||1))*(g.grid[0]||1),e=Math.round((j.height-h.height)/(g.grid[1]||1))*(g.grid[1]||1);if(/^(se|s|e)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e}else{if(/^(ne)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e}else{if(/^(sw)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.left=i.left-f}else{n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e;n.position.left=i.left-f}}}}});var b=function(d){return parseInt(d,10)||0};var a=function(d){return !isNaN(parseInt(d,10))}})(jQuery);; +/** + * jQuery.ScrollTo - Easy element scrolling using jQuery. + * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com + * Licensed under GPL license (http://www.opensource.org/licenses/gpl-license.php). + * Date: 2/8/2008 + * @author Ariel Flesler + * @version 1.3.2 + */ +;(function($){var o=$.scrollTo=function(a,b,c){o.window().scrollTo(a,b,c)};o.defaults={axis:'y',duration:1};o.window=function(){return $($.browser.safari?'body':'html')};$.fn.scrollTo=function(l,m,n){if(typeof m=='object'){n=m;m=0}n=$.extend({},o.defaults,n);m=m||n.speed||n.duration;n.queue=n.queue&&n.axis.length>1;if(n.queue)m/=2;n.offset=j(n.offset);n.over=j(n.over);return this.each(function(){var a=this,b=$(a),t=l,c,d={},w=b.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(t)){t=j(t);break}t=$(t,this);case'object':if(t.is||t.style)c=(t=$(t)).offset()}$.each(n.axis.split(''),function(i,f){var P=f=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,e=a[k],D=f=='x'?'Width':'Height';if(c){d[k]=c[p]+(w?0:e-b.offset()[p]);if(n.margin){d[k]-=parseInt(t.css('margin'+P))||0;d[k]-=parseInt(t.css('border'+P+'Width'))||0}d[k]+=n.offset[p]||0;if(n.over[p])d[k]+=t[D.toLowerCase()]()*n.over[p]}else d[k]=t[p];if(/^\d+$/.test(d[k]))d[k]=d[k]<=0?0:Math.min(d[k],h(D));if(!i&&n.queue){if(e!=d[k])g(n.onAfterFirst);delete d[k]}});g(n.onAfter);function g(a){b.animate(d,m,n.easing,a&&function(){a.call(this,l)})};function h(D){var b=w?$.browser.opera?document.body:document.documentElement:a;return b['scroll'+D]-b['client'+D]}})};function j(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery); + diff --git a/libs/SerialPortBeta20120106/html/nav_f.png b/libs/SerialPortBeta20120106/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..1b07a16207e67c95fe2ee17e7016e6d08ac7ac99 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQfZzpjv*C{Z|{2YIT`Y>1X`Eg z-tTbne1`SITM8Q!Pb(<)UFZ(m>wMzvKZQqKM~~GcZ=A7j<~E6K62>ozFS=cD3)mf8 z9WX0+R&m(l9KUsLdTx4?9~({T__KA%`}olPJ^N;y|F^pHgs_K%!rj~{8>RwnWbkzL Kb6Mw<&;$VTdq1fF literal 0 HcmV?d00001 diff --git a/libs/SerialPortBeta20120106/html/nav_h.png b/libs/SerialPortBeta20120106/html/nav_h.png new file mode 100644 index 0000000000000000000000000000000000000000..01f5fa6a596e36bd12c2d6ceff1b0169fda7e699 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^j6lr8!2~3AUOE6t1`SUa$B+ufw|6&kG8phMJMJ~w va4>Y+bZ&9QY?(VEUPY_cGd9nQ`um^ZSUyYpAAuKhL7F^W{an^LB{Ts5DmojT literal 0 HcmV?d00001 diff --git a/libs/SerialPortBeta20120106/html/open.png b/libs/SerialPortBeta20120106/html/open.png new file mode 100644 index 0000000000000000000000000000000000000000..7b35d2c2c389743089632fe24c3104f2173d97af GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{Vww^AIAr*{o=Nbw!DDW^(zOibV zl!F8B0?t?i!vld4k#$~0_AX3zElaokn + + + + + + +
    +
    Loading...
    +
    +
    + ALLOW_LARGE_BUFFERS + SerialPort.h +
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/all_62.html b/libs/SerialPortBeta20120106/html/search/all_62.html new file mode 100644 index 0000000..1587c91 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/all_62.html @@ -0,0 +1,62 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + badPortNumber + SerialPort.h +
    +
    +
    +
    + badRxBufSize + SerialPort.h +
    +
    +
    +
    + badTxBufSize + SerialPort.h +
    +
    +
    +
    + begin + SerialPort +
    +
    +
    +
    + buf_size_t + SerialRingBuffer +
    +
    +
    +
    + BUFFERED_RX + SerialPort.h +
    +
    +
    +
    + BUFFERED_TX + SerialPort.h +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/all_63.html b/libs/SerialPortBeta20120106/html/search/all_63.html new file mode 100644 index 0000000..eb8f39a --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/all_63.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + clearRxError + SerialPort +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/all_65.html b/libs/SerialPortBeta20120106/html/search/all_65.html new file mode 100644 index 0000000..aef29a4 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/all_65.html @@ -0,0 +1,38 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + empty + SerialRingBuffer +
    +
    +
    +
    + ENABLE_RX_ERROR_CHECKING + SerialPort.h +
    +
    +
    +
    + end + SerialPort +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/all_66.html b/libs/SerialPortBeta20120106/html/search/all_66.html new file mode 100644 index 0000000..c2d5144 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/all_66.html @@ -0,0 +1,41 @@ + + + + + + + +
    +
    Loading...
    + +
    +
    + flushRx + SerialPort +
    +
    +
    +
    + flushTx + SerialPort +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/all_67.html b/libs/SerialPortBeta20120106/html/search/all_67.html new file mode 100644 index 0000000..c8594fe --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/all_67.html @@ -0,0 +1,35 @@ + + + + + + + +
    +
    Loading...
    + +
    +
    + getRxError + SerialPort +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/all_69.html b/libs/SerialPortBeta20120106/html/search/all_69.html new file mode 100644 index 0000000..d173f64 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/all_69.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + init + SerialRingBuffer +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/all_70.html b/libs/SerialPortBeta20120106/html/search/all_70.html new file mode 100644 index 0000000..f23f245 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/all_70.html @@ -0,0 +1,44 @@ + + + + + + + +
    +
    Loading...
    + + +
    +
    + put_P + SerialRingBuffer +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/all_72.html b/libs/SerialPortBeta20120106/html/search/all_72.html new file mode 100644 index 0000000..774da5a --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/all_72.html @@ -0,0 +1,41 @@ + + + + + + + +
    +
    Loading...
    + +
    +
    + rxErrorBits + SerialPort.h +
    +
    +
    +
    + rxRingBuf + SerialPort.h +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/all_73.html b/libs/SerialPortBeta20120106/html/search/all_73.html new file mode 100644 index 0000000..1f73a81 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/all_73.html @@ -0,0 +1,131 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + SERIAL_PORT_VERSION + SerialPort.h +
    +
    +
    + +
    +
    + +
    + +
    +
    + SP_1_STOP_BIT + SerialPort.h +
    +
    +
    +
    + SP_2_STOP_BIT + SerialPort.h +
    +
    +
    +
    + SP_5_BIT_CHAR + SerialPort.h +
    +
    +
    +
    + SP_6_BIT_CHAR + SerialPort.h +
    +
    +
    +
    + SP_7_BIT_CHAR + SerialPort.h +
    +
    +
    +
    + SP_8_BIT_CHAR + SerialPort.h +
    +
    +
    +
    + SP_EVEN_PARITY + SerialPort.h +
    +
    +
    +
    + SP_FRAMING_ERROR + SerialPort.h +
    +
    +
    +
    + SP_NO_PARITY + SerialPort.h +
    +
    +
    +
    + SP_ODD_PARITY + SerialPort.h +
    +
    +
    +
    + SP_OPT_MASK + SerialPort.h +
    +
    +
    +
    + SP_PARITY_ERROR + SerialPort.h +
    +
    +
    +
    + SP_RX_BUF_OVERRUN + SerialPort.h +
    +
    +
    +
    + SP_RX_DATA_OVERRUN + SerialPort.h +
    +
    +
    +
    + SP_UCSRA_ERROR_MASK + SerialPort.h +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/all_74.html b/libs/SerialPortBeta20120106/html/search/all_74.html new file mode 100644 index 0000000..1148c48 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/all_74.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + txRingBuf + SerialPort.h +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/all_75.html b/libs/SerialPortBeta20120106/html/search/all_75.html new file mode 100644 index 0000000..f890fdf --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/all_75.html @@ -0,0 +1,97 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + ubrrh + UsartRegister +
    +
    +
    +
    + ubrrl + UsartRegister +
    +
    +
    +
    + ucsra + UsartRegister +
    +
    +
    +
    + ucsrb + UsartRegister +
    +
    +
    +
    + ucsrc + UsartRegister +
    +
    +
    +
    + udr + UsartRegister +
    +
    +
    +
    + usart + SerialPort.h +
    +
    +
    + +
    +
    +
    + USE_NEW_SERIAL + SerialPort.h +
    +
    +
    +
    + USE_NEW_SERIAL1 + SerialPort.h +
    +
    +
    +
    + USE_NEW_SERIAL2 + SerialPort.h +
    +
    +
    +
    + USE_NEW_SERIAL3 + SerialPort.h +
    +
    +
    +
    + USE_WRITE_OVERRIDES + SerialPort.h +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/all_77.html b/libs/SerialPortBeta20120106/html/search/all_77.html new file mode 100644 index 0000000..e44384e --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/all_77.html @@ -0,0 +1,47 @@ + + + + + + + +
    +
    Loading...
    + +
    +
    + write_P + SerialPort +
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/classes_73.html b/libs/SerialPortBeta20120106/html/search/classes_73.html new file mode 100644 index 0000000..2cb1dc2 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/classes_73.html @@ -0,0 +1,30 @@ + + + + + + + +
    +
    Loading...
    +
    + +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/classes_75.html b/libs/SerialPortBeta20120106/html/search/classes_75.html new file mode 100644 index 0000000..f03b72c --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/classes_75.html @@ -0,0 +1,25 @@ + + + + + + + +
    +
    Loading...
    +
    + +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/close.png b/libs/SerialPortBeta20120106/html/search/close.png new file mode 100644 index 0000000000000000000000000000000000000000..9342d3dfeea7b7c4ee610987e717804b5a42ceb9 GIT binary patch literal 273 zcmV+s0q*{ZP)4(RlMby96)VwnbG{ zbe&}^BDn7x>$<{ck4zAK-=nT;=hHG)kmplIF${xqm8db3oX6wT3bvp`TE@m0cg;b) zBuSL}5?N7O(iZLdAlz@)b)Rd~DnSsSX&P5qC`XwuFwcAYLC+d2>+1(8on;wpt8QIC X2MT$R4iQDd00000NkvXXu0mjfia~GN literal 0 HcmV?d00001 diff --git a/libs/SerialPortBeta20120106/html/search/defines_61.html b/libs/SerialPortBeta20120106/html/search/defines_61.html new file mode 100644 index 0000000..99347bb --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/defines_61.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + ALLOW_LARGE_BUFFERS + SerialPort.h +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/defines_62.html b/libs/SerialPortBeta20120106/html/search/defines_62.html new file mode 100644 index 0000000..d3fe9c9 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/defines_62.html @@ -0,0 +1,32 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + BUFFERED_RX + SerialPort.h +
    +
    +
    +
    + BUFFERED_TX + SerialPort.h +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/defines_65.html b/libs/SerialPortBeta20120106/html/search/defines_65.html new file mode 100644 index 0000000..c901e66 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/defines_65.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + ENABLE_RX_ERROR_CHECKING + SerialPort.h +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/defines_73.html b/libs/SerialPortBeta20120106/html/search/defines_73.html new file mode 100644 index 0000000..73eb14c --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/defines_73.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + SERIAL_PORT_VERSION + SerialPort.h +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/defines_75.html b/libs/SerialPortBeta20120106/html/search/defines_75.html new file mode 100644 index 0000000..938474d --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/defines_75.html @@ -0,0 +1,50 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + USE_NEW_SERIAL + SerialPort.h +
    +
    +
    +
    + USE_NEW_SERIAL1 + SerialPort.h +
    +
    +
    +
    + USE_NEW_SERIAL2 + SerialPort.h +
    +
    +
    +
    + USE_NEW_SERIAL3 + SerialPort.h +
    +
    +
    +
    + USE_WRITE_OVERRIDES + SerialPort.h +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/files_73.html b/libs/SerialPortBeta20120106/html/search/files_73.html new file mode 100644 index 0000000..842c937 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/files_73.html @@ -0,0 +1,25 @@ + + + + + + + +
    +
    Loading...
    +
    + +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/functions_61.html b/libs/SerialPortBeta20120106/html/search/functions_61.html new file mode 100644 index 0000000..971e08e --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/functions_61.html @@ -0,0 +1,29 @@ + + + + + + + +
    +
    Loading...
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/functions_62.html b/libs/SerialPortBeta20120106/html/search/functions_62.html new file mode 100644 index 0000000..e0a6ec2 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/functions_62.html @@ -0,0 +1,44 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + badPortNumber + SerialPort.h +
    +
    +
    +
    + badRxBufSize + SerialPort.h +
    +
    +
    +
    + badTxBufSize + SerialPort.h +
    +
    +
    +
    + begin + SerialPort +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/functions_63.html b/libs/SerialPortBeta20120106/html/search/functions_63.html new file mode 100644 index 0000000..eb8f39a --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/functions_63.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + clearRxError + SerialPort +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/functions_65.html b/libs/SerialPortBeta20120106/html/search/functions_65.html new file mode 100644 index 0000000..fed8c82 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/functions_65.html @@ -0,0 +1,32 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + empty + SerialRingBuffer +
    +
    +
    +
    + end + SerialPort +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/functions_66.html b/libs/SerialPortBeta20120106/html/search/functions_66.html new file mode 100644 index 0000000..c2d5144 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/functions_66.html @@ -0,0 +1,41 @@ + + + + + + + +
    +
    Loading...
    + +
    +
    + flushRx + SerialPort +
    +
    +
    +
    + flushTx + SerialPort +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/functions_67.html b/libs/SerialPortBeta20120106/html/search/functions_67.html new file mode 100644 index 0000000..c8594fe --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/functions_67.html @@ -0,0 +1,35 @@ + + + + + + + +
    +
    Loading...
    + +
    +
    + getRxError + SerialPort +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/functions_69.html b/libs/SerialPortBeta20120106/html/search/functions_69.html new file mode 100644 index 0000000..d173f64 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/functions_69.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + init + SerialRingBuffer +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/functions_70.html b/libs/SerialPortBeta20120106/html/search/functions_70.html new file mode 100644 index 0000000..f23f245 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/functions_70.html @@ -0,0 +1,44 @@ + + + + + + + +
    +
    Loading...
    + + +
    +
    + put_P + SerialRingBuffer +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/functions_72.html b/libs/SerialPortBeta20120106/html/search/functions_72.html new file mode 100644 index 0000000..c3aea1d --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/functions_72.html @@ -0,0 +1,29 @@ + + + + + + + +
    +
    Loading...
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/functions_77.html b/libs/SerialPortBeta20120106/html/search/functions_77.html new file mode 100644 index 0000000..e44384e --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/functions_77.html @@ -0,0 +1,47 @@ + + + + + + + +
    +
    Loading...
    + +
    +
    + write_P + SerialPort +
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/mag_sel.png b/libs/SerialPortBeta20120106/html/search/mag_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..81f6040a2092402b4d98f9ffa8855d12a0d4ca17 GIT binary patch literal 563 zcmV-30?hr1P)zxx&tqG15pu7)IiiXFflOc2k;dXd>%13GZAy? zRz!q0=|E6a6vV)&ZBS~G9oe0kbqyw1*gvY`{Pop2oKq#FlzgXt@Xh-7fxh>}`Fxg> z$%N%{$!4=5nM{(;=c!aG1Ofr^Do{u%Ih{^&Fc@H2)+a-?TBXrw5DW&z%Nb6mQ!L9O zl}b@6mB?f=tX3;#vl)}ggh(Vpyh(IK z(Mb0D{l{U$FsRjP;!{($+bsaaVi8T#1c0V#qEIOCYa9@UVLV`f__E81L;?WEaRA;Y zUH;rZ;vb;mk7JX|$=i3O~&If0O@oZfLg8gfIjW=dcBsz;gI=!{-r4# z4%6v$&~;q^j7Fo67yJ(NJWuX+I~I!tj^nW3?}^9bq|<3^+vapS5sgM^x7!cs(+mMT z&y%j};&~po+YO)3hoUH4E*E;e9>?R6SS&`X)p`njycAVcg{rEb41T{~Hk(bl-7eSb zmFxA2uIqo#@R?lKm50ND`~6Nfn|-b1|L6O98vt3Tx@gKz#isxO002ovPDHLkV1kyW B_l^Jn literal 0 HcmV?d00001 diff --git a/libs/SerialPortBeta20120106/html/search/nomatches.html b/libs/SerialPortBeta20120106/html/search/nomatches.html new file mode 100644 index 0000000..b1ded27 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/nomatches.html @@ -0,0 +1,12 @@ + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/search.css b/libs/SerialPortBeta20120106/html/search/search.css new file mode 100644 index 0000000..50249e5 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/search.css @@ -0,0 +1,240 @@ +/*---------------- Search Box */ + +#FSearchBox { + float: left; +} + +#searchli { + float: right; + display: block; + width: 170px; + height: 36px; +} + +#MSearchBox { + white-space : nowrap; + position: absolute; + float: none; + display: inline; + margin-top: 8px; + right: 0px; + width: 170px; + z-index: 102; +} + +#MSearchBox .left +{ + display:block; + position:absolute; + left:10px; + width:20px; + height:19px; + background:url('search_l.png') no-repeat; + background-position:right; +} + +#MSearchSelect { + display:block; + position:absolute; + width:20px; + height:19px; +} + +.left #MSearchSelect { + left:4px; +} + +.right #MSearchSelect { + right:5px; +} + +#MSearchField { + display:block; + position:absolute; + height:19px; + background:url('search_m.png') repeat-x; + border:none; + width:116px; + margin-left:20px; + padding-left:4px; + color: #909090; + outline: none; + font: 9pt Arial, Verdana, sans-serif; +} + +#FSearchBox #MSearchField { + margin-left:15px; +} + +#MSearchBox .right { + display:block; + position:absolute; + right:10px; + top:0px; + width:20px; + height:19px; + background:url('search_r.png') no-repeat; + background-position:left; +} + +#MSearchClose { + display: none; + position: absolute; + top: 4px; + background : none; + border: none; + margin: 0px 4px 0px 0px; + padding: 0px 0px; + outline: none; +} + +.left #MSearchClose { + left: 6px; +} + +.right #MSearchClose { + right: 2px; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 1; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; +} + +.SRResult { + display: none; +} + +DIV.searchresults { + margin-left: 10px; + margin-right: 10px; +} diff --git a/libs/SerialPortBeta20120106/html/search/search.js b/libs/SerialPortBeta20120106/html/search/search.js new file mode 100644 index 0000000..ff8d0b6 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/search.js @@ -0,0 +1,738 @@ +// Search script generated by doxygen +// Copyright (C) 2009 by Dimitri van Heesch. + +// The code in this file is loosly based on main.js, part of Natural Docs, +// which is Copyright (C) 2003-2008 Greg Valure +// Natural Docs is licensed under the GPL. + +var indexSectionsWithContent = +{ + 0: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111011101000000101111010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 1: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 2: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 3: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111011101000000101000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 4: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 5: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 6: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110010000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +}; + +var indexSectionNames = +{ + 0: "all", + 1: "classes", + 2: "files", + 3: "functions", + 4: "variables", + 5: "typedefs", + 6: "defines" +}; + +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var hexCode; + if (code<16) + { + hexCode="0"+code.toString(16); + } + else + { + hexCode=code.toString(16); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1') + { + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location.href = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} diff --git a/libs/SerialPortBeta20120106/html/search/search_l.png b/libs/SerialPortBeta20120106/html/search/search_l.png new file mode 100644 index 0000000000000000000000000000000000000000..c872f4da4a01d0754f923e6c94fd8159c0621bd1 GIT binary patch literal 604 zcmV-i0;BzjP)k7RCwB~R6VQOP#AvB$vH7i{6H{96zot$7cZT<7246EF5Np6N}+$IbiG6W zg#87A+NFaX+=_^xM1#gCtshC=E{%9^uQX_%?YwXvo{#q&MnpJ8uh(O?ZRc&~_1%^SsPxG@rfElJg-?U zm!Cz-IOn(qJP3kDp-^~qt+FGbl=5jNli^Wj_xIBG{Rc0en{!oFvyoNC7{V~T8}b>| z=jL2WIReZzX(YN(_9fV;BBD$VXQIxNasAL8ATvEu822WQ%mvv4FO#qs` BFGc_W literal 0 HcmV?d00001 diff --git a/libs/SerialPortBeta20120106/html/search/search_r.png b/libs/SerialPortBeta20120106/html/search/search_r.png new file mode 100644 index 0000000000000000000000000000000000000000..97ee8b439687084201b79c6f776a41f495c6392a GIT binary patch literal 612 zcmV-q0-ODbP)PbXFRCwB?)W514K@j&X?z2*SxFI6-@HT2E2K=9X9%Pb zEK*!TBw&g(DMC;|A)uGlRkOS9vd-?zNs%bR4d$w+ox_iFnE8fvIvv7^5<(>Te12Li z7C)9srCzmK{ZcNM{YIl9j{DePFgOWiS%xG@5CnnnJa4nvY<^glbz7^|-ZY!dUkAwd z{gaTC@_>b5h~;ug#R0wRL0>o5!hxm*s0VW?8dr}O#zXTRTnrQm_Z7z1Mrnx>&p zD4qifUjzLvbVVWi?l?rUzwt^sdb~d!f_LEhsRVIXZtQ=qSxuxqm zEX#tf>$?M_Y1-LSDT)HqG?`%-%ZpY!#{N!rcNIiL;G7F0`l?)mNGTD9;f9F5Up3Kg zw}a<-JylhG&;=!>B+fZaCX+?C+kHYrP%c?X2!Zu_olK|GcS4A70HEy;vn)I0>0kLH z`jc(WIaaHc7!HS@f*^R^Znx8W=_jIl2oWJoQ*h1^$FX!>*PqR1J8k|fw}w_y}TpE>7m8DqDO<3z`OzXt$ccSejbEZCg@0000 + + + + + + +
    +
    Loading...
    +
    +
    + buf_size_t + SerialRingBuffer +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/variables_72.html b/libs/SerialPortBeta20120106/html/search/variables_72.html new file mode 100644 index 0000000..5efe478 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/variables_72.html @@ -0,0 +1,32 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + rxErrorBits + SerialPort.h +
    +
    +
    +
    + rxRingBuf + SerialPort.h +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/variables_73.html b/libs/SerialPortBeta20120106/html/search/variables_73.html new file mode 100644 index 0000000..774715c --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/variables_73.html @@ -0,0 +1,110 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + SP_1_STOP_BIT + SerialPort.h +
    +
    +
    +
    + SP_2_STOP_BIT + SerialPort.h +
    +
    +
    +
    + SP_5_BIT_CHAR + SerialPort.h +
    +
    +
    +
    + SP_6_BIT_CHAR + SerialPort.h +
    +
    +
    +
    + SP_7_BIT_CHAR + SerialPort.h +
    +
    +
    +
    + SP_8_BIT_CHAR + SerialPort.h +
    +
    +
    +
    + SP_EVEN_PARITY + SerialPort.h +
    +
    +
    +
    + SP_FRAMING_ERROR + SerialPort.h +
    +
    +
    +
    + SP_NO_PARITY + SerialPort.h +
    +
    +
    +
    + SP_ODD_PARITY + SerialPort.h +
    +
    +
    +
    + SP_OPT_MASK + SerialPort.h +
    +
    +
    +
    + SP_PARITY_ERROR + SerialPort.h +
    +
    +
    +
    + SP_RX_BUF_OVERRUN + SerialPort.h +
    +
    +
    +
    + SP_RX_DATA_OVERRUN + SerialPort.h +
    +
    +
    +
    + SP_UCSRA_ERROR_MASK + SerialPort.h +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/variables_74.html b/libs/SerialPortBeta20120106/html/search/variables_74.html new file mode 100644 index 0000000..1148c48 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/variables_74.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + txRingBuf + SerialPort.h +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/search/variables_75.html b/libs/SerialPortBeta20120106/html/search/variables_75.html new file mode 100644 index 0000000..6b01a04 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/search/variables_75.html @@ -0,0 +1,62 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + ubrrh + UsartRegister +
    +
    +
    +
    + ubrrl + UsartRegister +
    +
    +
    +
    + ucsra + UsartRegister +
    +
    +
    +
    + ucsrb + UsartRegister +
    +
    +
    +
    + ucsrc + UsartRegister +
    +
    +
    +
    + udr + UsartRegister +
    +
    +
    +
    + usart + SerialPort.h +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/libs/SerialPortBeta20120106/html/struct_usart_register.html b/libs/SerialPortBeta20120106/html/struct_usart_register.html new file mode 100644 index 0000000..13b552e --- /dev/null +++ b/libs/SerialPortBeta20120106/html/struct_usart_register.html @@ -0,0 +1,191 @@ + + + + +SoftRTClib: UsartRegister Class Reference + + + + + + + + +
    +
    + + + + + + +
    +
    SoftRTClib
    +
    +
    + + +
    +
    + +
    +
    UsartRegister Class Reference
    +
    +
    + +

    addresses of USART registers + More...

    + +

    #include <SerialPort.h>

    + +

    List of all members.

    + + + + + + + + +

    +Public Attributes

    volatile uint8_t * ubrrh
    volatile uint8_t * ubrrl
    volatile uint8_t * ucsra
    volatile uint8_t * ucsrb
    volatile uint8_t * ucsrc
    volatile uint8_t * udr
    +

    Detailed Description

    +

    addresses of USART registers

    +

    Member Data Documentation

    + +
    +
    + + + + +
    volatile uint8_t* UsartRegister::ubrrh
    +
    +
    +

    USART Baud Rate Register High

    + +
    +
    + +
    +
    + + + + +
    volatile uint8_t* UsartRegister::ubrrl
    +
    +
    +

    USART Baud Rate Register Low

    + +
    +
    + +
    +
    + + + + +
    volatile uint8_t* UsartRegister::ucsra
    +
    +
    +

    USART Control and Status Register A

    + +
    +
    + +
    +
    + + + + +
    volatile uint8_t* UsartRegister::ucsrb
    +
    +
    +

    USART Control and Status Register B

    + +
    +
    + +
    +
    + + + + +
    volatile uint8_t* UsartRegister::ucsrc
    +
    +
    +

    USART Control and Status Register C

    + +
    +
    + +
    +
    + + + + +
    volatile uint8_t* UsartRegister::udr
    +
    +
    +

    USART I/O Data Register

    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + + + + diff --git a/libs/SerialPortBeta20120106/html/tab_a.png b/libs/SerialPortBeta20120106/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..2d99ef23fed78c7683f0b5aa803d937060d288c4 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qo)`sjv*C{Z|CmjY;X`^DSv)) z;hc^cTF;t%XWXdwWP5+kt?jQ5uhqKtjd^EY`^^-S;M%tFAj_l)EwVTK)E@1LSD0{e q?a6($SGQTzz1#QBzr0NMKf^0WCX-0bi?u-G89ZJ6T-G@yGywp8?ljB* literal 0 HcmV?d00001 diff --git a/libs/SerialPortBeta20120106/html/tab_b.png b/libs/SerialPortBeta20120106/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..b2c3d2be3c7e518fbca6bb30f571882e72fc506d GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qk9-Ajv*C{Z|~mbJ)|JfaM8Xd zIP7xAmLwau9@iXhZTrl-TjWj9jM#?{xt`6uU{<)jb9Suc^QnbhJ(o{ib8=j9u0_mE8M7kgF7f<7W7IEf=8(L_qx|g0H;V7iPxm&Q@G7p8W2Kx&iT|YUM=ITC zY<0Qbr;u&AtXD{o@41wH=7&d8=2Z_{M9Tsa=g*t*@A3H$UOlxZk7?f6RUWpx>Fc_L s#LQ{edY3MpIXkMeV^&YV=9fR%8Jv|Kya=#u06K}m)78&qol`;+0RKEt)&Kwi literal 0 HcmV?d00001 diff --git a/libs/SerialPortBeta20120106/html/tab_s.png b/libs/SerialPortBeta20120106/html/tab_s.png new file mode 100644 index 0000000000000000000000000000000000000000..978943ac807718de0e69e5a585a8f0a1e5999285 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QZ1e?jv*C{Z|}b5Yzkm-c<7z3 zq^cq0=~}Z;b(!Zvb5Z%sTRFKGlz1=qOFg;myyu?$r`wZb^irPsN1a)6)TwB0r+)wb zPL25;=adu89?fTK`qDR>$D*)b_WOmdKI;Vst02j(hg8%>k literal 0 HcmV?d00001 diff --git a/libs/SerialPortBeta20120106/html/tabs.css b/libs/SerialPortBeta20120106/html/tabs.css new file mode 100644 index 0000000..2192056 --- /dev/null +++ b/libs/SerialPortBeta20120106/html/tabs.css @@ -0,0 +1,59 @@ +.tabs, .tabs2, .tabs3 { + background-image: url('tab_b.png'); + width: 100%; + z-index: 101; + font-size: 13px; +} + +.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/libs/SerialPortBeta20120106/readme.txt b/libs/SerialPortBeta20120106/readme.txt new file mode 100644 index 0000000..0446e13 --- /dev/null +++ b/libs/SerialPortBeta20120106/readme.txt @@ -0,0 +1,69 @@ +This is an early beta and has had minimal testing. Please provide +feedback about features, any suggestions, and report bugs. + +Please read changes.txt + +This library provides access to the Arduino serial ports. + +To install the this library, copy the SerialPort folder to the +your libraries directory. + +See the HowTo.txt file for a quick introduction to usage. + +Try the HelloWorld example first. + +The API was designed to be backward compatible with Arduino Serial. +A number of functions have been added to the API. + +See the html for additional documentation. + +-------------------------------------------------------------------------------- +A number of examples are included in the SerialPort/examples folder. + +ArduinoSize - Print the amount of free RAM using Arduino HardwareSerial. + +ArduinoTest - Arduino HardwareSerial version of test sketch + +BufferedSize - Print the amount of free RAM using SerialPort with + buffered RX and TX. + +BufferedTest - Test SerialPort with buffered RX and TX. + +HelloWorld - Simple first example. + +MegaTest - Test all ports on a Mega using SerialPort. + +MegaTestArduino - Test all ports on a Mega using Arduino HardwareSerial. + +ReadWriteTest - Test that ring buffer overrun can be detected. + +UnbufferedSize - Print the amount of free RAM using SerialPort with no buffers. + +UnbufferedTest - Test SerialPort with no buffering. + +WriteFlash - Test write() for a flash string. + +-------------------------------------------------------------------------------- +configuration options: + +You can can save flash if your buffers are always smaller than 254 bytes +by setting ALLOW_LARGE_BUFFERS zero in SerialPort.h. This will also +increase performance slightly. + +You can save substantial flash by disabling the faster versions of +write(const char*) and write(const uint8_t*, size_t) by setting +USE_WRITE_OVERRIDES zero in SerialPort.h. + +If you only use unbuffered TX, edit SerialPort.h and set BUFFERED_TX zero. +This will save some flash and RAM by preventing the TX ISR from being +loaded. TxBufSize must always be zero in SerialPort constructors if +BUFFERED_TX is zero. + +If you only do output or if input buffering is not required, edit +SerialPort.h and set BUFFERED_RX zero. This will save some flash +and RAM by preventing the RX ISR from being loaded. RxBufSize must +always be zero in SerialPort constructors if BUFFERED_RX is zero. + +You can disable RX error functions by setting ENABLE_RX_ERROR_CHECKING +zero in SerialPort.h This will save a tiny bit of flash, RAM, and +speedup receive a little. \ No newline at end of file diff --git a/libs/SerialPortBeta20120106/serialportdiff.txt b/libs/SerialPortBeta20120106/serialportdiff.txt new file mode 100644 index 0000000..52bd8c6 --- /dev/null +++ b/libs/SerialPortBeta20120106/serialportdiff.txt @@ -0,0 +1,404 @@ +diff -rb ArduinoOldVer/SerialPort/SerialPort.cpp Arduino/libraries/SerialPort/SerialPort.cpp +44c44 +< size_t t = tail_; +--- +> buf_size_t t = tail_; +60,61c60,61 +< uint16_t SerialRingBuffer::get(uint8_t* b, size_t n) { +< size_t nr; +--- +> SerialRingBuffer::buf_size_t SerialRingBuffer::get(uint8_t* b, buf_size_t n) { +> buf_size_t nr; +63c63 +< size_t h = head_; +--- +> buf_size_t h = head_; +65c65 +< size_t t = tail_; +--- +> buf_size_t t = tail_; +84c84 +< void SerialRingBuffer::init(uint8_t* b, size_t s) { +--- +> void SerialRingBuffer::init(uint8_t* b, buf_size_t s) { +102c102 +< size_t h = head_; +--- +> buf_size_t h = head_; +119c119,120 +< uint16_t SerialRingBuffer::put(uint8_t* b, size_t n) { +--- +> SerialRingBuffer::buf_size_t +> SerialRingBuffer::put(const uint8_t* b, buf_size_t n) { +121c122 +< size_t t = tail_; +--- +> buf_size_t t = tail_; +123,124c124,125 +< size_t w; +< size_t h = head_; +--- +> buf_size_t space; // space in ring buffer +> buf_size_t h = head_; +126c127 +< w = t - h - 1; +--- +> space = t - h - 1; +128,129c129,130 +< w = size_ - h; +< if (t == 0) w -= 1; +--- +> space = size_ - h; +> if (t == 0) space -= 1; +131c132 +< if (n > w) n = w; +--- +> if (n > space) n = space; +146c147 +< uint16_t SerialRingBuffer::put_P(PGM_P b, size_t n) { +--- +> SerialRingBuffer::buf_size_t SerialRingBuffer::put_P(PGM_P b, buf_size_t n) { +148c149 +< size_t t = tail_; +--- +> buf_size_t t = tail_; +150,151c151,152 +< size_t w; +< size_t h = head_; +--- +> buf_size_t space; // space in ring buffer +> buf_size_t h = head_; +153c154 +< w = t - h - 1; +--- +> space = t - h - 1; +155,156c156,157 +< w = size_ - h; +< if (t == 0) w -= 1; +--- +> space = size_ - h; +> if (t == 0) space -= 1; +158c159 +< if (n > w) n = w; +--- +> if (n > space) n = space; +189c190 +< //SerialRingBuffer rxbuf0; +--- +> // SerialRingBuffer rxbuf0; +diff -rb ArduinoOldVer/SerialPort/SerialPort.h Arduino/libraries/SerialPort/SerialPort.h +26,34d25 +< #include +< #include +< #if ARDUINO < 100 +< #include +< class __FlashStringHelper; +< #define F(string_literal) (reinterpret_cast<__FlashStringHelper *>(PSTR(string_literal))) +< #else +< #include +< #endif +37c28,35 +< #define SERIAL_PORT_VERSION 20120104 +--- +> #define SERIAL_PORT_VERSION 20120106 +> //------------------------------------------------------------------------------ +> /** +> * Set ALLOW_LARGE_BUFFERS to zero to limit buffer sizes to 254 bytes. +> * ALLOW_LARGE_BUFFERS controls whether uint16_t or uint8_t will be +> * used for buffer indices. +> */ +> #define ALLOW_LARGE_BUFFERS 1 +40,42c38,40 +< * Set to zero to use the Arduino Print version of write(const char*) +< * and write(const uint8_t*, size_t). This will save some flash +< * but is much slower. +--- +> * Set USE_WRITE_OVERRIDES to zero to use the Arduino Print version +> * of write(const char*) and write(const uint8_t*, size_t). This will +> * save some flash but is much slower. +44a43 +> //------------------------------------------------------------------------------ +46,47c45,47 +< * Set zero to save flash and RAM if no RX buffering is used. RxBufSize +< * must be zero in all SerialPort constructors if BUFFERED_RX is zero. +--- +> * Set BUFFERED_RX zero to save flash and RAM if no RX buffering is used. +> * RxBufSize must be zero in all SerialPort constructors if +> * BUFFERED_RX is zero. +49a50 +> //------------------------------------------------------------------------------ +51,52c52,54 +< * Set zero to save flash and RAM if no TX buffering is used. TxBufSize +< * must be zero in all SerialPort constructors if BUFFERED_TX is zero. +--- +> * Set BUFFERED_TX zero to save flash and RAM if no TX buffering is used. +> * TxBufSize must be zero in all SerialPort constructors if +> * BUFFERED_TX is zero. +54a57 +> //------------------------------------------------------------------------------ +56c59 +< * Set nonzero to enable RX error checking +--- +> * Set ENABLE_RX_ERROR_CHECKING zero to disable RX error checking. +59a63,83 +> // Define symbols to allocate 64 byte ring buffers with capacity for 63 bytes. +> /** Define NewSerial with buffering like Arduino 1.0. */ +> #define USE_NEW_SERIAL SerialPort<0, 63, 63> NewSerial +> /** Define NewSerial1 with buffering like Arduino 1.0. */ +> #define USE_NEW_SERIAL1 SerialPort<1, 63, 63> NewSerial1 +> /** Define NewSerial2 with buffering like Arduino 1.0. */ +> #define USE_NEW_SERIAL2 SerialPort<2, 63, 63> NewSerial2 +> /** Define NewSerial3 with buffering like Arduino 1.0. */ +> #define USE_NEW_SERIAL3 SerialPort<3, 63, 63> NewSerial3 +> //------------------------------------------------------------------------------ +> #include +> #include +> #if ARDUINO < 100 +> #include +> class __FlashStringHelper; +> #define F(string_literal)\ +> (reinterpret_cast<__FlashStringHelper *>(PSTR(string_literal))) +> #else // ARDUINO < 100 +> #include +> #endif // ARDUINO < 100 +> //------------------------------------------------------------------------------ +93c117 +< #elif defined(UCSRA) +--- +> #elif defined(UCSRA) // UCSR0A +202a227,232 +> /** Define type for buffer indices */ +> #if ALLOW_LARGE_BUFFERS +> typedef uint16_t buf_size_t; +> #else // ALLOW_LARGE_BUFFERS +> typedef uint8_t buf_size_t; +> #endif // ALLOW_LARGE_BUFFERS +208,209c238,239 +< size_t get(uint8_t* b, size_t n); +< void init(uint8_t* b, size_t s); +--- +> buf_size_t get(uint8_t* b, buf_size_t n); +> void init(uint8_t* b, buf_size_t s); +212,213c242,243 +< size_t put(uint8_t* b, size_t n); +< size_t put_P(PGM_P b, size_t n); +--- +> buf_size_t put(const uint8_t* b, buf_size_t n); +> buf_size_t put_P(PGM_P b, buf_size_t n); +216,218c246,248 +< volatile size_t head_; /**< Index to next empty location. */ +< volatile size_t tail_; /**< Index to last entry if head_ != tail_. */ +< size_t size_; /**< Size of the buffer. Capacity is size -1. */ +--- +> volatile buf_size_t head_; /**< Index to next empty location. */ +> volatile buf_size_t tail_; /**< Index to last entry if head_ != tail_. */ +> buf_size_t size_; /**< Size of the buffer. Capacity is size -1. */ +232a263,272 +> /** Cause error message for bad port number +> * \return Never returns since it is never called +> */ +> uint8_t badRxBufSize(void) +> __attribute__((error("RX buffer size too large"))); +> /** Cause error message for bad port number +> * \return Never returns since it is never called +> */ +> uint8_t badTxBufSize(void) +> __attribute__((error("TX buffer size too large"))); +243,244c283,286 +< if (PortNumber >= SERIAL_PORT_COUNT) { +< badPortNumber(); +--- +> if (PortNumber >= SERIAL_PORT_COUNT) badPortNumber(); +> if (sizeof(SerialRingBuffer::buf_size_t) == 1) { +> if (RxBufSize >254) badRxBufSize(); +> if (TxBufSize >254) badTxBufSize(); +291c333 +< void begin(long baud, uint8_t options = SP_8_BIT_CHAR) { +--- +> void begin(uint32_t baud, uint8_t options = SP_8_BIT_CHAR) { +293d334 +< bool use_u2x = true; +295,298c336,338 +< // disable USART interrupts +< cli(); +< *usart[PortNumber].ucsrb &= ~(M_RXCIE | M_UDRIE); +< sei(); +--- +> // disable USART interrupts. Set UCSRB to reset values. +> *usart[PortNumber].ucsrb = 0; +> +300,301c340 +< *usart[PortNumber].ucsrc &= ~SP_OPT_MASK; +< *usart[PortNumber].ucsrc |= options & SP_OPT_MASK; +--- +> *usart[PortNumber].ucsrc = options & SP_OPT_MASK; +303c342 +< #if F_CPU == 16000000UL +--- +> if (F_CPU == 16000000UL && baud == 57600) { +307,315d345 +< if (baud == 57600) { +< use_u2x = false; +< } +< #endif +< +< if (use_u2x) { +< *usart[PortNumber].ucsra = M_U2X; +< baud_setting = (F_CPU / 4 / baud - 1) / 2; +< } else { +317a348,350 +> } else { +> *usart[PortNumber].ucsra = M_U2X; +> baud_setting = (F_CPU / 4 / baud - 1) / 2; +328c361 +< *usart[PortNumber].ucsrb |= bits; +--- +> *usart[PortNumber].ucsrb = bits; +407c440 +< }else { +--- +> } else { +427c460,462 +< p += rxRingBuf[PortNumber].get(p, limit - p); +--- +> size_t nr = limit - p; +> if (sizeof(SerialRingBuffer::buf_size_t) == 1 && nr > 255) nr = 255; +> p += rxRingBuf[PortNumber].get(p, nr); +519c554,556 +< int m = txRingBuf[PortNumber].put_P(b, w); +--- +> size_t nw = w; +> if (sizeof(SerialRingBuffer::buf_size_t) == 1 && nw > 255) nw = 255; +> size_t m = txRingBuf[PortNumber].put_P(b, nw); +580c617 +< void write(uint8_t* b, size_t n) { +--- +> void write(const uint8_t* b, size_t n) { +582c619 +< size_t write(uint8_t* b, size_t n) { +--- +> size_t write(const uint8_t* b, size_t n) { +589c626,628 +< int m = txRingBuf[PortNumber].put(b, w); +--- +> size_t nw = w; +> if (sizeof(SerialRingBuffer::buf_size_t) == 1 && nw > 255) nw = 255; +> size_t m = txRingBuf[PortNumber].put(b, nw); +611c650 +< write((uint8_t*)s, n); +--- +> write(reinterpret_cast(s), n); +616c655 +< return write((uint8_t*)s, n); +--- +> return write(reinterpret_cast(s), n); +diff -rb ArduinoOldVer/SerialPort/examples/ArduinoTest/ArduinoTest.pde Arduino/libraries/SerialPort/examples/ArduinoTest/ArduinoTest.pde +3a4,9 +> uint32_t t = micros(); +> Serial.write("This string is used to measure the time to buffer data.\r\n"); +> t = micros() - t; +> Serial.write("Time: "); +> Serial.print(t); +> Serial.write(" us\r\n"); +6c12 +< Serial.write("enter a string\r\n"); +--- +> Serial.write("\r\nenter a string\r\n"); +13c19 +< Serial.write("\r\n\r\n"); +--- +> Serial.write("\r\n"); +diff -rb ArduinoOldVer/SerialPort/examples/BufferedSize/BufferedSize.pde Arduino/libraries/SerialPort/examples/BufferedSize/BufferedSize.pde +11,13d10 +< // use macro to substitute for Serial +< #define Serial NewSerial +< +15,16c12,13 +< Serial.begin(9600); +< Serial.println(FreeRam()); +--- +> NewSerial.begin(9600); +> NewSerial.println(FreeRam()); +diff -rb ArduinoOldVer/SerialPort/examples/BufferedTest/BufferedTest.pde Arduino/libraries/SerialPort/examples/BufferedTest/BufferedTest.pde +6,8d5 +< // use macro to substitute for Serial +< #define Serial NewSerial +< +10c7,13 +< Serial.begin(9600); +--- +> NewSerial.begin(9600); +> uint32_t t = micros(); +> NewSerial.write("This string is used to measure the time to buffer data.\r\n"); +> t = micros() - t; +> NewSerial.write("Time: "); +> NewSerial.print(t); +> NewSerial.write(" us\r\n"); +13,14c16,17 +< Serial.write("enter a string\r\n"); +< while (!Serial.available()) {} +--- +> NewSerial.write("\r\nenter a string\r\n"); +> while (!NewSerial.available()) {} +16c19 +< Serial.write(Serial.read()); +--- +> NewSerial.write(NewSerial.read()); +18,20c21,23 +< while (!Serial.available() && (millis() - m) < 3) {} +< } while(Serial.available()); +< Serial.write("\r\n\r\n"); +--- +> while (!NewSerial.available() && (millis() - m) < 3) {} +> } while(NewSerial.available()); +> NewSerial.write("\r\n"); +Only in Arduino/libraries/SerialPort/examples: HelloWorld +diff -rb ArduinoOldVer/SerialPort/examples/MegaTest/MegaTest.pde Arduino/libraries/SerialPort/examples/MegaTest/MegaTest.pde +25c25 +< }while (in->available()); +--- +> } while (in->available()); +diff -rb ArduinoOldVer/SerialPort/examples/UnbufferedSize/UnbufferedSize.pde Arduino/libraries/SerialPort/examples/UnbufferedSize/UnbufferedSize.pde +11,13d10 +< // use macro to substitute for Serial +< #define Serial NewSerial +< +15,16c12,13 +< Serial.begin(9600); +< Serial.println(FreeRam()); +--- +> NewSerial.begin(9600); +> NewSerial.println(FreeRam()); +diff -rb ArduinoOldVer/SerialPort/examples/UnbufferedTest/UnbufferedTest.pde Arduino/libraries/SerialPort/examples/UnbufferedTest/UnbufferedTest.pde +6,8d5 +< // use macro to substitute for Serial +< #define Serial NewSerial +< +10c7,13 +< Serial.begin(9600); +--- +> NewSerial.begin(9600); +> uint32_t t = micros(); +> NewSerial.write("This string is used to measure the time to buffer data.\r\n"); +> t = micros() - t; +> NewSerial.write("Time: "); +> NewSerial.print(t); +> NewSerial.write(" us\r\n"); +13,14c16,17 +< Serial.write("enter a string\r\n"); +< while (!Serial.available()) {} +--- +> NewSerial.write("\r\nenter a string\r\n"); +> while (!NewSerial.available()) {} +16c19 +< Serial.write(Serial.read()); +--- +> NewSerial.write(NewSerial.read()); +18,20c21,23 +< while (!Serial.available() && (millis() - m) < 3) {} +< } while(Serial.available()); +< Serial.write("\r\n\r\n"); +--- +> while (!NewSerial.available() && (millis() - m) < 3) {} +> } while(NewSerial.available()); +> NewSerial.write("\r\n");