forked from fgmart-zz/tweet-machine
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgoojprt.rkt
120 lines (100 loc) · 3.56 KB
/
goojprt.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#lang racket
(require libserialport)
(provide print-string)
(provide print-number)
(provide normal)
(provide bold)
(provide double-height)
(provide double-width)
(provide print-bitmap)
(provide print-newline)
(define-values (in out)
(open-serial-port "/dev/ttyS0" #:baudrate 9600))
(define *resume-time* (current-inexact-milliseconds)) ; 1 ms per byte at 9600 baud
(define ASCII-DC2 18) ; Device control 2
(define ASCII-ESC 27) ; Escape
(define ASCII-FS 28) ; Field separator
(define ASCII-GS 29) ; Group separator
(define INVERSE-MASK (expt 2 1)) ; doesnt work Not in 2.6.8 firmware (see inverseOn())
(define UPDOWN-MASK (expt 2 2)) ; doesnt work
(define BOLD-MASK (expt 2 3))
(define DOUBLE-HEIGHT-MASK (expt 2 4))
(define DOUBLE-WIDTH-MASK (expt 2 5))
(define STRIKE-MASK (expt 2 6)) ; doesnt work
(define *print-mode* 0)
(define (timeout-wait)
(cond ((< (current-inexact-milliseconds) *resume-time*) (timeout-wait))))
(define (set-print-mode mask)
(begin
(set! *print-mode* (bitwise-ior *print-mode* mask))
(write-print-mode)))
(define (unset-print-mode mask)
(begin
(set! *print-mode* (bitwise-and *print-mode* (bitwise-xor mask 255)))
(write-print-mode)))
(define (write-print-mode)
(write-bytes
(bytes-append (bytes ASCII-ESC) #"!" (bytes *print-mode*))
out))
(define (normal)
(begin
(set! *print-mode* 0)
(write-print-mode)))
(define (bold mode?)
(if mode?
(set-print-mode BOLD-MASK)
(unset-print-mode BOLD-MASK)))
(define (double-height mode?)
(if mode?
(set-print-mode DOUBLE-HEIGHT-MASK)
(unset-print-mode DOUBLE-HEIGHT-MASK)))
(define (double-width mode?)
(if mode?
(set-print-mode DOUBLE-WIDTH-MASK)
(unset-print-mode DOUBLE-WIDTH-MASK)))
(define (print-to start end)
(if (> start end)
'()
(begin
(if (even? start)
(begin (double-width #f) (double-height #t))
(begin (double-width #t) (double-height #f)))
(write-bytes (string->bytes/utf-8 (number->string start)) out)
(write-bytes #"\n" out)
(print-to (+ start 1) end))))
(define (print-string str)
(write-bytes (string->bytes/utf-8 str) out))
(define (print-number num)
(print-string (number->string num)))
; one row; 48 columns (which is max and = 384 px)
; this is looking like one byte per "column" = 8 px per column
; looks like can output max of 255 rows at once
(define (enter-bitmap-mode rows cols)
(write-bytes
(bytes-append (bytes ASCII-DC2) #"*" (bytes rows) (bytes (ceiling (/ cols 8))))
out))
(define (print-newline)
(write-bytes #"\n" out))
; prints up to 384 wide, 255 high
; if the bitmap is bigger than that, prints upper corner
(define (print-bitmap bm)
(let* ((width (min 384 (send bm get-width)))
(height (min 255 (send bm get-height)))
(pixels (make-bytes (* 4 width height))))
(begin
(send bm get-argb-pixels 0 0 width height pixels)
(enter-bitmap-mode height width)
(for ((y (in-range 0 height)))
(begin
(set! *resume-time* (+ (current-inexact-milliseconds) (floor (/ width 8))))
(for ((x (in-range 0 width 8)))
; gather the byte and send it
(let ((byte 0))
(begin
(for ((i (in-range 0 8)))
(cond ((< (bytes-ref pixels (+ (* y width 4) (* x 4) (* i 4) 2)) ; get green px
128)
(set! byte (+ byte (arithmetic-shift 1 (- 7 i)))))))
(write-bytes (bytes byte) out))))
(timeout-wait)))
(print-newline))))