#ifndef SYSTEMFILEH #define SYSTEMFILEH #include "connection.h" #define MAX_NAME_LENGTH 20 /** * Enumeration for file modes when opening a file * @see Filesystem#open */ enum File_mode{ /** * Open the file for reading */ READ=0x00, /** * append data to the file (if files does not exist a new file is created) */ APPEND=0x01, /** * create and write data to a file (before closing the file it must be filled with data otherwise it will be deleted) */ WRITE=0x02, /** * create and write data to a linear non-fragmented file - should be used with "ric"(picture) and "rxe"(program) files (before closing the file it must be filled with data otherwise it will be deleted) */ WRITE_LINEAR = 0x03, /** * create and write data to a linear non-fragmented data file (before closing the file it must be filled with data otherwise it will be deleted) */ WRITE_LINEAR_DATA = 0x04 }; /** * Struct that holds information on a nxt file * @see Filesystem */ struct Nxt_file_t{ /** * The name of the file (maximum 19 characters + termination) */ char name[MAX_NAME_LENGTH]; /** * The NXT file handel ID */ unsigned char handle; /** * The size of the file in bytes */ unsigned int size; }; /** * typedef for Nxt_file_t * @see Nxt_file_t * @see Filesystem */ typedef struct Nxt_file_t Nxt_file; using namespace std; /** * Class to interact with the filesystem on the NXT */ class Filesystem{ public: /** * @param *connection [attach a connection] */ Filesystem(Connection *connection); ~Filesystem(); /** * Get remaining flash memory * @return the remaining flash memory in bytes */ unsigned int get_free_flash(); /** * Delete the flash memory - all user programs and data */ void delete_flash(); /** * Delete a file on the NXT * @param file_name [the name of the file to delete] * @param reply [true = require reply from NXT; false = no reply from NXT] */ void delete_file(string file_name, bool reply=false); /** * Delete a file on the NXT * @param file [a Nxt_file struct of the file to close] * @param reply [true = require reply from NXT; false = no reply from NXT] */ void delete_file(Nxt_file &file, bool reply=false); /** * Download a file from the NXT to the PC * @param pc_name [path to the download destination (example: c:\\download.txt)] * @param nxt_name [name of the file on the NXT (example: "program.rxe")] */ void download_file(string pc_name, string nxt_name); /** * Upload a file from the PC to the NXT * @param pc_name [path to the PC file to upload (example: c:\\upload.txt)] * @param nxt_name [name of the file on the NXT (example: "data.txt")] */ void upload_file(string pc_file, string nxt_file); /** * Create a file list * @param wild_card [search cretia] * <UL> * <LI>filename.extension (search for a specific file ) * <LI>*.[file name type] (search for file type) * <LI>filename.* (search for files with a specific filename) * <LI>*.* (list all files) * </UL> * @return number of files in the file list */ unsigned int create_file_list(string wild_card); /** * Get the number of files in the file list * @return number of files in the file list */ unsigned int get_file_list_size(); /** * Get a element from the file list * @param idx [the element to return ( 0= first element in the list)] * @return a nxt file struct (if idx is out of range all attributes in the struct will be zero * - use the file list size to make sure you are not out of range) */ Nxt_file get_file_list_element(unsigned int idx); /** * Open or create a file on the NXT * @param file_name [the name of the file to create or open] * @param mode [use the FILE_MODE enumeration how the file should be created or opended] * @param file_size [the size of the file in bytes (will be ignored in append and read mode)] * @return a nxt file struct containing the data of the openend file */ Nxt_file open_file(string file_name, File_mode mode, unsigned int file_size=0); /** * read a byte string from a file * @param &file [Nxt_file struct of the file to read data from] * @param *buffer [a pointer to a buffer that can hold the read bytes] * @param no_bytes [bytes to read] * @return number of bytes that was read */ unsigned int read_file(Nxt_file &file, unsigned char *buffer, unsigned int num_bytes); /** * write a byte string to a file * @param &file [Nxt_file struct of the file to write data to] * @param *buffer [a pointer to a buffer that can hold the bytes to write] * @param no_bytes [bytes to write] * @return number of bytes that was written */ unsigned int write_file(Nxt_file &file, unsigned char *buffer, unsigned int num_bytes); /** * close a file on the nxt * @param &file [Nxt_file struct of the file to close] */ void close_file(Nxt_file &file); private: Connection *connection; int get_next(int handle, Nxt_file *file); int get_first(string wild_card, Nxt_file *file); unsigned int update_file_list(string wild_card); unsigned int file_list_size; Nxt_file *file_list; /** * To prevent copy - to lazy to create a copy constructor */ Filesystem::Filesystem(const Filesystem& p);//to prevent copy - to lazy to create a copy constructor Nxt_file open_read(string file_name); Nxt_file open_append(string file_name); Nxt_file open_write(string file_name, unsigned int file_size, char type); unsigned short int read_command(Nxt_file &file, unsigned char *buffer, unsigned short int num_bytes); unsigned short int write_command(Nxt_file &file, unsigned char *buffer, unsigned short int num_bytes); }; #endif