/** * N: I/O */ #include "nio.h" #include "sio.h" #include #include #define TIMEOUT 0x1f /* approx 30 seconds */ #define UNIT 1 /* only support one FujiNet! */ static char get_status(char *devicespec) { if(OS.dcb.dstats != SUCCESS) { // something went wrong // do we need to return extended status? if(OS.dcb.dstats == DERROR) { nstatus(devicespec); return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended error. } } return OS.dcb.dstats; // Return SIO error or success } static void set_defaults(void) { OS.dcb.ddevic = DFUJI; // Fuji Device Identifier OS.dcb.dunit = UNIT; // Unit number integer 1 through 4 OS.dcb.dtimlo = TIMEOUT; // approximately 30 second timeout } unsigned char nopen(char* devicespec, unsigned char trans) { set_defaults(); OS.dcb.dcomnd = 'O'; // Open OS.dcb.dstats = DWRITE; // sending to to SIO device OS.dcb.dbuf = devicespec; // eg: N:TCP// OS.dcb.dbyt = 256; // max size of our device spec OS.dcb.daux1 = OUPDATE; // Read and write OS.dcb.daux2 = trans; // CR/LF translation siov(); return get_status(devicespec); } unsigned char nclose(char* devicespec) { set_defaults(); OS.dcb.dcomnd = 'C'; // Close OS.dcb.dstats = 0x00; OS.dcb.dbuf = NULL; OS.dcb.dbyt = 0; OS.dcb.daux = 0; siov(); return get_status(devicespec); } unsigned char nstatus(char* devicespec) { set_defaults(); OS.dcb.dcomnd = 'S'; // status OS.dcb.dstats = DREAD; OS.dcb.dbuf = OS.dvstat; OS.dcb.dbyt = sizeof(OS.dvstat); OS.dcb.daux = 0; siov(); return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended status } unsigned char nread(char* devicespec, unsigned char* buf, unsigned short len) { set_defaults(); OS.dcb.dcomnd = 'R'; // read OS.dcb.dstats = DREAD; OS.dcb.dbuf = buf; OS.dcb.dbyt = OS.dcb.daux = len; // Set the buffer size AND daux with length siov(); return get_status(devicespec); } unsigned char nwrite(char* devicespec, unsigned char* buf, unsigned short len) { set_defaults(); OS.dcb.dcomnd = 'W'; // write OS.dcb.dstats = DWRITE; OS.dcb.dbuf = buf; OS.dcb.dbyt = OS.dcb.daux = len; siov(); return get_status(devicespec); } /* https://fujinet.online/wiki/?p=SIO-Command-%24FF-Reset-FujiNet */ unsigned char nreset(void) { set_defaults(); OS.dcb.ddevic = 0x70; OS.dcb.dcomnd = 0xff; /* reset */ OS.dcb.dstats = DWRITE; OS.dcb.dbuf = 0; OS.dcb.dbyt = 0; OS.dcb.daux = 0; siov(); return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended status }