aiie/apple/fx80.h
2017-02-22 20:13:35 -05:00

106 lines
2.6 KiB
C++

#ifndef __FX80_H
#define __FX80_H
#include <stdint.h>
/* maximum width, in dots, that we're supporting. The FX80 supported
* up to 1920 ("quadruple density") -- which I'm not, b/c that's
* overkill for what I'm doing at the moment. I'm supporting "double density"
* (960 dots per 8-inch line).
*
* My general strategy here is to fill up a line with bits until the
* printer thinks it needs to move to the next line; and then do
* something with the bits (send them to a printer, a screen, a file,
* whatever). This gets both graphics and text modes in one swell foop.
*
* There is the troublesome "9-pin graphics mode" where each column of
* bits is > 1 byte of data; for that, we keep an extra "rowOfPin9"
* bits, which is just a bit stream across the width. It would be
* easier to make rowOfBits be uint16_t but it would consume more RAM,
* and I'm trying to minimize that as I'm down to about 13k of free
* space in the Teensy!
*/
#define FX80_MAXWIDTH 960
#ifdef TEENSYDUINO
class TeensyPrinter;
#else
class OpenCVPrinter;
#endif
enum Charset {
CS_USA = 0,
CS_France = 1,
CS_Germany = 2,
CS_UK = 3,
CS_Denmark = 4,
CS_Sweden = 5,
CS_Italy = 6,
CS_Spain = 7,
CS_Japan = 8
};
// These are bit flags for font modes
enum {
FM_Pica = 1,
FM_Elite = 2,
FM_Compressed = 4,
FM_Expanded = 8,
FM_Emphasized = 16
};
class Fx80 {
public:
Fx80();
~Fx80();
void Reset();
void input(uint8_t c);
void update();
private:
void lineFeed();
void clearLine();
void addCharacter(uint8_t c);
float pixelWidthOfSelectedFont();
uint8_t characterWidthOfSelectedFont(uint8_t c);
void handleEscape(uint8_t c);
void handleActiveEscapeMode(uint8_t c);
void emitLine();
protected:
bool escapeMode;
bool proportionalMode;
uint16_t carriageDot; // what dot-column we are at
// Line spacing. 1/216th of an inch is 1/3 of a dot, which is the minimum
// supported by the FX-80. This is usually set in terms of 72nds, and
// it's unlikely that I'll render anything at 1/216, but might as
// well interpret it the way the printer understands it.
// (That means 8/72, which is a setting of 24 here, is 8 dots tall.)
uint16_t twoSixteenthsLineSpacing;
uint16_t graphicsWidth;
bool ninePinGraphics;
uint8_t escapeModeActive;
int32_t escapeModeExpectingBytes;
uint8_t escapeModeLengthByteCount;
uint16_t escapeModeLength;
// 9 pixel-rows of (FX80_MAXWIDTH) bits (stuffed in 8-bit bytes)
uint8_t rowOfBits[(FX80_MAXWIDTH/8)*9];
Charset charsetEnabled;
uint8_t fontMode;
bool italicsMode;
};
#endif