Add simulator SD card (and SPI, PFF) support.
Add simulator for SD card driver, plus add stubs for SPI and PFF primarily to prevent the on-device code from being picked up by the makefiles for the simulator.
This commit is contained in:
parent
cd1eb4e250
commit
ad2a76b2df
3
pff.h
3
pff.h
|
|
@ -18,6 +18,7 @@
|
||||||
#include "sd.h"
|
#include "sd.h"
|
||||||
|
|
||||||
#ifdef SD
|
#ifdef SD
|
||||||
|
#ifndef SIMULATOR
|
||||||
|
|
||||||
#ifndef _PFATFS
|
#ifndef _PFATFS
|
||||||
#define _PFATFS 4004 /* Revision ID */
|
#define _PFATFS 4004 /* Revision ID */
|
||||||
|
|
@ -164,5 +165,5 @@ FRESULT pf_readdir (DIR* dj, FILINFO* fno); /* Read a directory
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _PFATFS */
|
#endif /* _PFATFS */
|
||||||
|
#endif /* SIMULATOR */
|
||||||
#endif /* SD */
|
#endif /* SD */
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,118 @@
|
||||||
|
|
||||||
|
/** \file SD card simulator
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "sd.h"
|
||||||
|
|
||||||
|
#ifdef SD
|
||||||
|
|
||||||
|
#include "delay.h"
|
||||||
|
#include "serial.h"
|
||||||
|
#include "sersendf.h"
|
||||||
|
#include "gcode_parse.h"
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
/** Initialize SPI for SD card reading.
|
||||||
|
*/
|
||||||
|
void sd_init(void) {
|
||||||
|
sim_info("SD card mounted (simulated).");
|
||||||
|
}
|
||||||
|
|
||||||
|
void sd_mount(void) {}
|
||||||
|
|
||||||
|
void sd_unmount(void) {}
|
||||||
|
|
||||||
|
/** List a given directory.
|
||||||
|
|
||||||
|
\param path The path to list. Toplevel path is "/".
|
||||||
|
|
||||||
|
A slash is added to directory names, to make it easier for users to
|
||||||
|
recognize them.
|
||||||
|
*/
|
||||||
|
void sd_list(const char* path) {
|
||||||
|
DIR *dir;
|
||||||
|
|
||||||
|
dir = opendir(path);
|
||||||
|
serial_writechar('\n');
|
||||||
|
if (dir) {
|
||||||
|
for (;;) {
|
||||||
|
struct dirent *de = readdir(dir);
|
||||||
|
if (!de)
|
||||||
|
break;
|
||||||
|
serial_writestr((uint8_t *)de->d_name);
|
||||||
|
#ifdef _DIRENT_HAVE_D_TYPE
|
||||||
|
if (de->d_type & DT_DIR)
|
||||||
|
serial_writechar('/');
|
||||||
|
#endif
|
||||||
|
serial_writechar('\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sim_info("E: failed to open dir. (%s, %u)", path, errno);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Open a file for reading.
|
||||||
|
|
||||||
|
\param filename Name of the file to open and to read G-code from.
|
||||||
|
*/
|
||||||
|
static FILE *f;
|
||||||
|
void sd_open(const char* filename) {
|
||||||
|
if (f) fclose(f);
|
||||||
|
f = fopen(filename, "rb");
|
||||||
|
if (!f) {
|
||||||
|
sim_info("E: failed to open file. (%s, %u)", filename, errno);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t gcode_parse_char_sd(uint8_t c) {
|
||||||
|
return gcode_parse_char(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Read a line of G-code from a file.
|
||||||
|
|
||||||
|
\param A pointer to the parser function. This function should accept an
|
||||||
|
uint8_t with the character to parse and return an uint8_t whether
|
||||||
|
end of line (EOL) was reached.
|
||||||
|
|
||||||
|
\return Whether end of line (EOF) was reached or an error happened.
|
||||||
|
*/
|
||||||
|
uint8_t sd_read_gcode_line(void) {
|
||||||
|
char str[1024] ;
|
||||||
|
if (!f) {
|
||||||
|
sim_info("E: file not open.");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
char *s = fgets(str, sizeof(str), f);
|
||||||
|
if (!s) {
|
||||||
|
sim_info("SD card: reached EOF.");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (*s)
|
||||||
|
gcode_parse_char_sd((uint8_t)*s++);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Read a character from a file.
|
||||||
|
|
||||||
|
\return The character read, or zero if there is no such character (e.g. EOF).
|
||||||
|
*/
|
||||||
|
uint8_t sd_read_char(void) {
|
||||||
|
if (!f) {
|
||||||
|
sim_info("E: file not open");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
char ch = fgetc(f);
|
||||||
|
if (ch == EOF) {
|
||||||
|
sim_info("SD card: reached EOF");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return (uint8_t) ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* SD */
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
\brief Simulated SPI subsystem
|
||||||
|
*/
|
||||||
|
#include "spi.h"
|
||||||
|
#include "arduino.h"
|
||||||
|
|
||||||
|
void spi_init() {
|
||||||
|
}
|
||||||
3
spi.h
3
spi.h
|
|
@ -12,6 +12,8 @@
|
||||||
*/
|
*/
|
||||||
void spi_init(void);
|
void spi_init(void);
|
||||||
|
|
||||||
|
#ifndef SIMULATOR /* Avoid inlining code on simulator. */
|
||||||
|
|
||||||
/** SPI device selection.
|
/** SPI device selection.
|
||||||
|
|
||||||
Because out famous WRITE() macro works with constant pins, only, we define
|
Because out famous WRITE() macro works with constant pins, only, we define
|
||||||
|
|
@ -99,4 +101,5 @@ inline uint8_t spi_rw(uint8_t byte) {
|
||||||
return SPDR;
|
return SPDR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* SIMULATOR */
|
||||||
#endif /* _SPI_H */
|
#endif /* _SPI_H */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue