diff --git a/.gitignore b/.gitignore index 290c37d..c48b544 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,8 @@ /obj /lib*.so* /lib*.dll* -/man +/man/*.[1-9] +/man/*.gz /docs/_build build diff --git a/Makefile b/Makefile index aa48d01..cf3c282 100755 --- a/Makefile +++ b/Makefile @@ -213,7 +213,7 @@ $(eval $(call make-obj-rule,$(src)))) define make-util-rules ./build/$1$(if $(FOR_WINDOWS),.exe): $(U_OBJ_$1) \ - $(if $(filter libcasio,$(U_DEPS_$1)),./build/lib$(LIB).so) | ./build/ + $(if $(filter libcasio,$(U_DEPS_$1)),$(L_AS_DEP)) | ./build/ $(call bcmd,ld,$$@,$(LD) -o $$@ $(U_OBJ_$1) $(U_LDFLAGS_$1)) all-$1: ./build/$1$(if $(FOR_WINDOWS),.exe) diff --git a/Makefile.vars b/Makefile.vars index 4d34fbe..e745314 100755 --- a/Makefile.vars +++ b/Makefile.vars @@ -113,13 +113,13 @@ endif # imagemagick, for image manipulation. - DEP_magick_CFLAGS := $(shell $(PKGCONFIG) MagickCore --cflags) - DEP_magick_LIBS := $(shell $(PKGCONFIG) MagickCore --libs) + DEP_magick_CFLAGS := $(shell $(PKGCONFIG) MagickCore --cflags 2>/dev/null) + DEP_magick_LIBS := $(shell $(PKGCONFIG) MagickCore --libs 2>/dev/null) # SDL, for simple graphical utilities. - DEP_sdl_CFLAGS := $(shell $(PKGCONFIG) sdl --cflags) - DEP_sdl_LIBS := $(shell $(PKGCONFIG) sdl --libs) + DEP_sdl_CFLAGS := $(shell $(PKGCONFIG) sdl2 --cflags 2>/dev/null) + DEP_sdl_LIBS := $(shell $(PKGCONFIG) sdl2 --libs 2>/dev/null) # --- # Informations about the library. @@ -145,6 +145,9 @@ endif L_ANAMES := ./build/lib$(LIB).lib ./build/lib$(LIB).a \ ./build/lib$(LIB).dll.a + L_AS_DEP := $(if $(STATIC),$(L_ANAME),$(if \ + $(FOR_WINDOWS),./build/$(L_SONAME),./build/lib$(LIB).so)) + # Files. L_SRC := $(patsubst $(L_SRCDIR)/%,%,$(wildcard $(L_SRCDIR)/*.c \ diff --git a/README.rst b/README.rst index 5dd979b..eeb84bb 100644 --- a/README.rst +++ b/README.rst @@ -32,6 +32,7 @@ Runtime dependencies - `libusb `_ (>= 1.0). - `zlib `_ (>= 1.2.8). +- `SDL `_ (>= 2.0). Configuring ----------- diff --git a/include/libcasio/builtin.h b/include/libcasio/builtin.h index 2b7a07f..bb71dd4 100644 --- a/include/libcasio/builtin.h +++ b/include/libcasio/builtin.h @@ -78,7 +78,7 @@ CASIO_EXTERN int CASIO_EXPORT casio_opencom_windows CASIO_EXTERN int CASIO_EXPORT casio_open_posix_fs OF((casio_fs_t **casio__filesystem)); # else -# define LIBCASIO_DISABLED_POSIX_FS +# define LIBCASIO_DISABLED_POSIX_FS 1 # endif /* Make a Windows API filesystem interface. */ diff --git a/lib/fs/builtin/posix/del.c b/lib/fs/builtin/posix/del.c index 44b3b61..9dacf93 100644 --- a/lib/fs/builtin/posix/del.c +++ b/lib/fs/builtin/posix/del.c @@ -18,7 +18,7 @@ * ************************************************************************* */ #define PATHS_FTW #include "posix.h" -#ifndef LIBCASIO_DISABLED_POSIX +#ifndef LIBCASIO_DISABLED_POSIX_FS /** * casio_posix_delete: diff --git a/lib/fs/builtin/posix/make.c b/lib/fs/builtin/posix/make.c index 8302bba..b007325 100644 --- a/lib/fs/builtin/posix/make.c +++ b/lib/fs/builtin/posix/make.c @@ -18,7 +18,7 @@ * ************************************************************************* */ #define PATHS_FTW #include "posix.h" -#ifndef LIBCASIO_DISABLED_POSIX +#ifndef LIBCASIO_DISABLED_POSIX_FS /** * casio_posix_make: diff --git a/man/libcasio.3.txt b/man/libcasio.3.txt new file mode 100644 index 0000000..7bfcc05 --- /dev/null +++ b/man/libcasio.3.txt @@ -0,0 +1,25 @@ +LIBCASIO(3) +=========== +Thomas "Cakeisalie5" Touhey +:Email: thomas@touhey.fr +:man source: libcasio +:man manual: libcasio manual + +NAME +---- +libcasio - library for using CASIO's protocols and file formats + +DESCRIPTION +----------- +libcasio is a community effort at using protocols and file formats defined +by CASIO for its graphical calculators, produced from the 90s to to this day. +It is part of a project named the P7 project, and is a personal project of +Thomas Touhey, also known as “Cakeisalie5”, from Planète Casio. + +See more at . + +SEE ALSO +-------- +*p7*(1), +*p7screen*(1), +*mcsfile*(1) diff --git a/man/mcsfile.1.txt b/man/mcsfile.1.txt new file mode 100644 index 0000000..b8d6ec7 --- /dev/null +++ b/man/mcsfile.1.txt @@ -0,0 +1,37 @@ +MCSFILE(1) +========== +Thomas "Cakeisalie5" Touhey +:Email: thomas@touhey.fr +:man source: p7utils +:man manual: p7utils manual + +NAME +---- +mcsfile - list subfiles in a CASIO MCS archive file + +SYNOPSIS +-------- +[source,bash] +---- +mcsfile [--help] [--version] +---- + +DESCRIPTION +----------- +mcsfile is a simple utility that looks like *file*(1), excepts it lists +subfiles in a CASIO MCS archive file (things with extensions like *g1m* +or *g2r*). + +OPTIONS +------- +Options start with one or two dashes. Some of the options require an additional +value next to them. + +*-h, --help*:: + Display command/subcommand help page and quit. +*-v, --version*:: + Display version and quit. + +SEE ALSO +-------- +*libcasio*(3) diff --git a/man/p7.1.txt b/man/p7.1.txt new file mode 100644 index 0000000..41062a0 --- /dev/null +++ b/man/p7.1.txt @@ -0,0 +1,86 @@ +P7(1) +===== +Thomas "Cakeisalie5" Touhey +:Email: thomas@touhey.fr +:man source: p7utils +:man manual: p7utils manual + +NAME +---- +p7 - command-line utility to communicate with casio calculators + +SYNOPSIS +-------- +[source,bash] +---- +p7 [-h|--help] [-v|--version] [ []] +---- + +DESCRIPTION +----------- +p7 is a command-line utility to communicate with machines using casio's +communication protocol 7.00, like (almost only, not gonna lie) CASIO +fx calculators. For now, it only implements file sending/getting functions +on flash memories. + +Available submenus are: + +*send [-f] [-o oncalc.ext] [-d oncalcdir] local.ext*:: + Send a file to the calculator. +*get [-o local.ext] [-d oncalcdir] oncalc.ext*:: + Get a file from calculator. +*copy [-d sourcedir] [-t destdir] source.ext dest.ext*:: + Copies a file into another on the calculator. +*del [-d oncalcdir] oncalc.ext*:: + Delete a file on the calculator. +*ls*:: + List files on the calculator. +*reset*:: + Reset a filesystem on the calculator. +*optimize*:: + Optimize the distant filesystem (defragment). +*info*:: + Dumps information about the calculator. + +OPTIONS +------- +Options start with one or two dashes. Some of the options require an additional +value next to them. + +*-h, --help*:: + Display command/subcommand help page and quit. +*-v, --version*:: + Display version and quit. +*--com *:: + The serial device, if you want to communicate with a calculator connected + using a USB-to-serial cable. + :: + If this option isn't used, the program will look for a calculator connected + using direct USB. +*--storage abc0*:: + The storage device with which to interact. +*--no-term, --no-exit*:: + Do not terminate connection when action is completed. +*--no-start, --no-init*:: + Do not initialize connection -- should only be used when + *--no-term*/*--no-exit* was used last time p7 was called. +*-d DIR, --directory=DIR*:: + The on-calc directory to work in. + Default for this option is device root. +*-t DDIR, --to=DIR*:: + The destination directory (for file copying/moving). + Default for this option is device root. +*-o OUT, --output=OUT*:: + For the *get* subcommand, the local file path to store in the output (or + '-' for stdout). For the *send* subcommand, the distant filename. For the + two subcommands, default is adapted from the input parameter. +*-f, --force*:: + For the *send* subcommand, force overwrite (default is interactive + confirmation from user). +*-#*:: + Displays a nice little loading bar for *send* and *get* subcommands. If + command is *get* and output is stdout, loading bar won't be displayed. + +SEE ALSO +-------- +*libcasio*(3) diff --git a/man/p7os.1.txt b/man/p7os.1.txt new file mode 100644 index 0000000..8fd1007 --- /dev/null +++ b/man/p7os.1.txt @@ -0,0 +1,61 @@ +P7OS(1) +======= +Thomas "Cakeisalie5" Touhey +:Email: thomas@touhey.fr +:man source: p7utils +:man manual: p7utils manual + +NAME +---- +p7os - backup and setup CASIO calculator's software components using protocol 7 + +SYNOPSIS +-------- +[source,bash] +---- +p7os [-h|--help] [-v|--version] [--no-prepare] [--uexe ] + [ []] +---- + +DESCRIPTION +----------- +p7os is a command-line utility to get and upload an OS on CASIO fx calculators, +using its communication protocol 7.00 and OS update mode. + +Available submenus are : + +*prepare-only*:: + Sends the update program, but leave it for other programs to interact + with it. +*get [-o os.bin]*:: + Backup the bootcode, CASIOWIN entry and OS. + +You have to *prepare* before doing any other action. Preparing means sending +a P7 server on the calculator that will be able to execute commands required +by other subcommands. + +OPTIONS +------- +Options start with one or two dashes. Some of the options require an additional +value next to them. + +*-h, --help*:: + Display command/subcommand help page and quit. +*-v, --version*:: + Display version and quit. +*--com *:: + The serial device, if you want to communicate with a calculator connected + using a USB-to-serial cable. + :: + If this option isn't used, the program will look for a calculator connected + using direct USB. +*--no-prepare*:: + Use the current environment, instead of uploading one. +*--uexe *:: + Use a custom update program. +*-o OUT, --output=OUT*:: + When getting something, where to store. + +SEE ALSO +-------- +*libcasio*(3) diff --git a/man/p7screen.1.txt b/man/p7screen.1.txt new file mode 100644 index 0000000..9951f3f --- /dev/null +++ b/man/p7screen.1.txt @@ -0,0 +1,39 @@ +P7SCREEN(1) +=========== +Thomas "Cakeisalie5" Touhey +:Email: thomas@touhey.fr +:man source: p7utils +:man manual: p7utils manual + +NAME +---- +p7screen - display streamed screen from casio fx calculator + +SYNOPSIS +-------- +[source,bash] +---- +p7screen [-h|--help] [-v|--version] +---- + +DESCRIPTION +----------- +p7screen is a command-line utility to display streamed screen from casio fx +calculator, using its communication protocol 7.00 and screenstreaming mode. + +OPTIONS +------- +Options start with one or two dashes. Some of the options require an additional +value next to them. + +*-h, --help*:: + Display help page and quit. +*-v, --version*:: + Display version and quit. +*-z ZOOM, --zoom=ZOOM*:: + Change the zoom (will change the window size too). + +SEE ALSO +-------- +*p7*(1), +*libcasio*(3) diff --git a/src/p7screen/args.c b/src/p7screen/args.c index d1fa30a..789457a 100644 --- a/src/p7screen/args.c +++ b/src/p7screen/args.c @@ -145,7 +145,7 @@ int parse_args(int ac, char **av, int *zoom) case 'z': *zoom = atoi(optarg); if (*zoom <= 0 || *zoom > 16) { - log("-z, --zoom: should be between 1 and 16"); + fprintf(stderr, "-z, --zoom: should be between 1 and 16"); return (1); } break; @@ -157,7 +157,7 @@ int parse_args(int ac, char **av, int *zoom) /* error (ignore) */ case '?': if (optopt == 'z') - log("-z, --zoom: expected an argument\n"); + fprintf(stderr, "-z, --zoom: expected an argument\n"); else break; return (1); diff --git a/src/p7screen/main.c b/src/p7screen/main.c index 71be816..ad340c3 100644 --- a/src/p7screen/main.c +++ b/src/p7screen/main.c @@ -17,7 +17,6 @@ * along with p7utils; if not, see . * ************************************************************************** */ #include "main.h" -#include #include /* ************************************************************************** */ @@ -64,47 +63,102 @@ static int zoom; static void display_callback(void *vcookie, int w, int h, casio_uint32_t **pixels) { - static SDL_Surface *screen = NULL; + static SDL_Window *window = NULL; + static SDL_Renderer *rendr = NULL; + static SDL_Texture *texture = NULL; static int saved_w = 0, saved_h = 0; (void)vcookie; - /* Create screen if there isn't one. */ - if (!screen || saved_w != w || saved_h != h) { - /* Create the window. */ - if (!(screen = SDL_SetVideoMode(w * zoom, h * zoom, 32, - SDL_SWSURFACE | SDL_DOUBLEBUF))) { - log("Couldn't set video mode: %s\n", SDL_GetError()); + + if (!window) { + int ret; + + /* We haven't got a window, our objective is to create one, + * with a renderer and a texture. First, let's create the window. */ + + window = SDL_CreateWindow("p7screen", + SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + w * zoom, h * zoom, 0); + if (!window) { + fprintf(stderr, "Couldn't create the window: %s\n", + SDL_GetError()); + return ; + } + + /* Then let's create the renderer. */ + + rendr = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE); + if (!rendr) { + SDL_DestroyWindow(window); + window = NULL; + + fprintf(stderr, "Couldn't create the renderer: %s\n", + SDL_GetError()); + return ; + } + + /* Finally, create the texture we're gonna use for drawing + * the picture as a classic ARGB pixel matric (8 bits per + * component). */ + + texture = SDL_CreateTexture(rendr, SDL_PIXELFORMAT_ARGB8888, + SDL_TEXTUREACCESS_STREAMING, w * zoom, h * zoom); + if (!texture) { + SDL_DestroyRenderer(rendr); + rendr = NULL; + + SDL_DestroyWindow(window); + window = NULL; + + fprintf(stderr, "Couldn't create the texture: %s\n", + SDL_GetError()); return ; } - SDL_WM_SetCaption("P7screen", NULL); /* Save data and display message. */ - saved_w = w; saved_h = h; - puts("Turn off your calculator (SHIFT+AC) when you have finished."); - } - /* Lock the screen. */ - SDL_LockSurface(screen); + saved_w = w; + saved_h = h; + + puts("Turn off your calculator (SHIFT+AC) when you have finished."); + } else if (saved_w != w || saved_h != h) { + /* The dimensions have changed somehow, we're gonna manage it! + * FIXME: one day. */ + + return ; + } /* Copy the data. */ - uint32_t *px = (uint32_t*)screen->pixels; - int linesize = w * zoom; - for (int y = 0; y < h; y++) { - uint32_t *refline = px; - for (int x = 0; x < w; x++) { - uint32_t pixel = pixels[y][x]; - for (int zx = 0; zx < zoom; zx++) - *px++ = pixel; - } - for (int zy = 1; zy < zoom; zy++) { - memcpy(px, refline, linesize * sizeof(uint32_t)); - px += linesize; + + { + Uint32 *px; + int pitch; + int linesize = w * zoom; + + SDL_LockTexture(texture, NULL, (void **)&px, &pitch); + + for (int y = 0; y < h; y++) { + Uint32 *refline = px; + + for (int x = 0; x < w; x++) { + Uint32 pixel = pixels[y][x]; + + for (int zx = 0; zx < zoom; zx++) + *px++ = pixel; + } + for (int zy = 1; zy < zoom; zy++) { + memcpy(px, refline, linesize * sizeof(uint32_t)); + px += linesize; + } } + + SDL_UnlockTexture(texture); } - /* Unlock the screen, and flippin' flip it. */ - SDL_UnlockSurface(screen); - SDL_Flip(screen); + /* Flippin' flip the screen! */ + + SDL_RenderCopy(rendr, texture, NULL, NULL); + SDL_RenderPresent(rendr); } /* ************************************************************************** */ /* Main function */ @@ -130,9 +184,15 @@ int main(int ac, char **av) if ((err = casio_open_usb(&handle, 0))) { /* display error */ switch (err) { - case casio_error_nocalc: log(error_noconnexion); break; - case casio_error_noaccess: log(error_noaccess); break; - default: log(error_unplanned, casio_strerror(err)); break; + case casio_error_nocalc: + fprintf(stderr, error_noconnexion); + break; + case casio_error_noaccess: + fprintf(stderr, error_noaccess); + break; + default: + fprintf(stderr, error_unplanned, casio_strerror(err)); + break; } /* return */ @@ -141,7 +201,7 @@ int main(int ac, char **av) /* Initialize SDL */ if (SDL_Init(SDL_INIT_VIDEO)) { - log("Failed to initialize SDL: %s\n", SDL_GetError()); + fprintf(stderr, "Failed to initialize SDL: %s\n", SDL_GetError()); return (3); } atexit(SDL_Quit); @@ -150,8 +210,12 @@ int main(int ac, char **av) if ((err = casio_getscreen(handle, &display_callback, NULL)) && err != casio_error_nocalc) { switch (err) { - case casio_error_timeout: log(error_noconnexion); break; - default: log(error_unplanned, casio_strerror(err)); break; + case casio_error_timeout: + fprintf(stderr, error_noconnexion); + break; + default: + fprintf(stderr, error_unplanned, casio_strerror(err)); + break; } return (1); } diff --git a/src/p7screen/main.h b/src/p7screen/main.h index 539d498..d8d8243 100644 --- a/src/p7screen/main.h +++ b/src/p7screen/main.h @@ -16,17 +16,18 @@ * You should have received a copy of the GNU General Public License * along with p7utils; if not, see . * ************************************************************************** */ -#ifndef MAIN_H -# define MAIN_H +#ifndef MAIN_H +# define MAIN_H 1 # include # include # include # include + # define Q(x) #x # define QUOTE(x) Q(x) -# define log(S, ...) fprintf(stderr, S, ##__VA_ARGS__) -/* all functions */ +/* Prototypes. */ + int parse_args(int ac, char **av, int *zoom); #endif /* MAIN_H */