Keyboard firmwares for Atmel AVR and Cortex-M
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

MemFileSystem.h 2.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /* mbed Microcontroller Library - MemFileSystem
  2. * Copyright (c) 2008, sford
  3. */
  4. #ifndef MBED_MEMFILESYSTEM_H
  5. #define MBED_MEMFILESYSTEM_H
  6. #include "FATFileSystem.h"
  7. namespace mbed
  8. {
  9. class MemFileSystem : public FATFileSystem
  10. {
  11. public:
  12. // 2000 sectors, each 512 bytes (malloced as required)
  13. char *sectors[2000];
  14. MemFileSystem(const char* name) : FATFileSystem(name) {
  15. memset(sectors, 0, sizeof(sectors));
  16. }
  17. virtual ~MemFileSystem() {
  18. for(int i = 0; i < 2000; i++) {
  19. if(sectors[i]) {
  20. free(sectors[i]);
  21. }
  22. }
  23. }
  24. // read a sector in to the buffer, return 0 if ok
  25. virtual int disk_read(char *buffer, int sector) {
  26. if(sectors[sector] == 0) {
  27. // nothing allocated means sector is empty
  28. memset(buffer, 0, 512);
  29. } else {
  30. memcpy(buffer, sectors[sector], 512);
  31. }
  32. return 0;
  33. }
  34. // write a sector from the buffer, return 0 if ok
  35. virtual int disk_write(const char *buffer, int sector) {
  36. // if buffer is zero deallocate sector
  37. char zero[512];
  38. memset(zero, 0, 512);
  39. if(memcmp(zero, buffer, 512)==0) {
  40. if(sectors[sector] != 0) {
  41. free(sectors[sector]);
  42. sectors[sector] = 0;
  43. }
  44. return 0;
  45. }
  46. // else allocate a sector if needed, and write
  47. if(sectors[sector] == 0) {
  48. char *sec = (char*)malloc(512);
  49. if(sec==0) {
  50. return 1; // out of memory
  51. }
  52. sectors[sector] = sec;
  53. }
  54. memcpy(sectors[sector], buffer, 512);
  55. return 0;
  56. }
  57. // return the number of sectors
  58. virtual int disk_sectors() {
  59. return sizeof(sectors)/sizeof(sectors[0]);
  60. }
  61. };
  62. }
  63. #endif