package protocol import ( "fmt" ) const ( esc = '\x1b' gs = '\x1d' ) // InitializePrinter executes ESC @ ("Initialize printer") func (p Protocol) InitializePrinter() ([]byte, error) { return []byte{esc, '@'}, nil } // SelectCharacterCodeTable executes ESC t n ("Select character code table") func (p Protocol) SelectCharacterCodeTable(n uint8) ([]byte, error) { if (n > 5 && n < 16) || (n > 19 && n < 255) { return nil, fmt.Errorf("range error: 0 ≤ n ≤ 5, 16 ≤ n ≤ 19, n = 255") } return []byte{esc, 't', n}, nil } const ( PrintModeDefault = 0 PrintModeFont2 = 1 << 0 _ = 1 << 1 _ = 1 << 2 PrintModeEmphasized = 1 << 3 PrintModeDoubleHeight = 1 << 4 PrintModeDoubleWidth = 1 << 5 _ = 1 << 6 PrintModeUnderline = 1 << 7 ) // SelectPrintModes executes ESC ! n ("Select print mode(s)") func (p Protocol) SelectPrintModes(n uint8) ([]byte, error) { return []byte{esc, '!', n}, nil } // SetPrintSpeed executes GS ( K ("Select the print speed") func (p Protocol) SelectPrintSpeed(m uint8) ([]byte, error) { if (m > 9 && m < 48) || m > 57 { return nil, fmt.Errorf("range error: m = 0 ≤ m ≤ 9, 48 ≤ m ≤ 57") } return []byte{gs, '(', 'K', 2, 0, 50, m}, nil } const ( ASBReportNothing = 0 ASBReportKickoutConnector = 1 << 0 ASBReportOnlineStatus = 1 << 1 ASBReportErrors = 1 << 2 ASBReportRollPaperSensorStatus = 1 << 3 _ = 1 << 4 _ = 1 << 5 ASBReportPanelSwitchStatus = 1 << 6 _ = 1 << 7 ASBReportAll = ASBReportKickoutConnector | ASBReportOnlineStatus | ASBReportErrors | ASBReportRollPaperSensorStatus | ASBReportPanelSwitchStatus ) func (p Protocol) SetAutomaticStatusBack(n uint8) ([]byte, error) { return []byte{gs, 'a', n}, nil } const ( TransmitPaperSensorStatus = 1 TransmitKickoutConnectorStatus = 2 ) func (p Protocol) TransmitStatus(n uint8) ([]byte, error) { if n != 1 && n != 2 && n != 49 && n != 50 { return nil, fmt.Errorf("range error: n = 1, 2, 49, 50") } return []byte{gs, 'r', n}, nil } func (p Protocol) gs8l(m uint8, fn uint8, parameters ...uint8) ([]byte, error) { p_ := 1 /* m */ + 1 /* fn */ + len(parameters) p1 := uint8(p_ >> 0) p2 := uint8(p_ >> 8) p3 := uint8(p_ >> 16) p4 := uint8(p_ >> 24) command := []uint8{gs, '8', 'L', p1, p2, p3, p4, m, fn} command = append(command, parameters...) return command, nil } const ( Color1 = 49 Color2 = 50 ) // StoreGraphicsData executes GS 8 L p1 p2 p3 p4 m fn a bx by c xL xH yL yH // d1...dk ("Store the graphics data in the print buffer (raster // format).") func (p Protocol) StoreGraphicsData(bx uint8, by uint8, c uint8, x uint16, y uint16, d ...uint8) ([]byte, error) { var m uint8 = 0x30 var fn uint8 = 0x70 var a uint8 = 0x30 if bx != 1 && bx != 2 { return nil, fmt.Errorf("range error: bx = 1, 2") } if by != 1 && by != 2 { return nil, fmt.Errorf("range error: by = 1, 2") } if c != Color1 && c != Color2 { return nil, fmt.Errorf("range error: c = 49, 50") } if x > 2047 { return nil, fmt.Errorf("range error: 1 ≤ x ≤ 2047 (x = %d)", x) } if by == 1 && y > 1662 { return nil, fmt.Errorf("range error: (by = 1): 1 ≤ y ≤ 1662 (y = %d)", y) } if by == 2 && y > 831 { return nil, fmt.Errorf("range error: (by = 2): 1 ≤ y ≤ 831 (y = %d)", y) } if (int(x)+7)/8*int(y) != len(d) { return nil, fmt.Errorf("range error: k = (int(x + 7)/8) × y (k = %d, x = %d, y = %d)", len(d), x, y) } xl := uint8(x >> 0) xh := uint8(x >> 8) yl := uint8(y >> 0) yh := uint8(y >> 8) paramters := []byte{a, bx, by, c, xl, xh, yl, yh} paramters = append(paramters, d...) return p.gs8l(m, fn, paramters...) } // PrintGraphicsData executes GS 8 L p1 p2 p3 p4 m fn ("Print the // graphics data in the print buffer.") func (p Protocol) PrintGraphicsData() ([]byte, error) { var m uint8 = 48 var fn uint8 = 50 return p.gs8l(m, fn) } const ( FullCut = 0 PartialCut = 1 FeedAndFullCut = 65 FeedAndPartialCut = 66 ) // CutPaper executes GS V ("Select cut mode and cut paper") func (p Protocol) CutPaper(m uint8, n uint8) ([]byte, error) { if m == FullCut || m == PartialCut { return []byte{gs, 'V', m}, nil } else { return []byte{gs, 'V', m, n}, nil } }