#include #include #include #include #include #include #define LED_PIN 13 // battery wake-up circuitry #define WAKE_PIN 10 #define WAKE_ON_TIME 400 // milliseconds #define WAKE_PERIOD 2000 // milliseconds long last_wake = 0; int wake_state = LOW; // OLED display #define OLED_MOSI A4 #define OLED_CLK A3 #define OLED_DC A2 #define OLED_CS A0 #define OLED_RESET A1 Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); #define NUMFLAKES 10 #define XPOS 0 #define YPOS 1 #define DELTAY 2 #define LOGO16_GLCD_HEIGHT 16 #define LOGO16_GLCD_WIDTH 16 // printer #include "SoftwareSerial.h" #define GND_PIN 7 Adafruit_Thermal printer(&Serial); // keyboard const int DataPin = 8; const int IRQpin = 3; PS2Keyboard keyboard; #define CHR_PER_LINE 10 #define HIDDEN_BUF 10 #define VIS_BUF 40 char line_buffer[HIDDEN_BUF + VIS_BUF + 1]; int line_start = HIDDEN_BUF; int line_len = 0; void setup() { keyboard.begin(DataPin, IRQpin); pinMode(GND_PIN, OUTPUT); digitalWrite(GND_PIN, LOW); pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, HIGH); pinMode(WAKE_PIN, OUTPUT); digitalWrite(WAKE_PIN, LOW); for (int i=0; i < HIDDEN_BUF + VIS_BUF; i++) line_buffer[i] = ' '; line_buffer[HIDDEN_BUF + VIS_BUF] = 0; line_buffer[line_start + 32] = '/'; // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) display.begin(SSD1306_SWITCHCAPVCC); display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(0,0); display.println(line_buffer + HIDDEN_BUF); display.display(); Serial.begin(19200); // baud rate for printer printer.begin(); } void loop() { long cur_time = millis(); if (wake_state == HIGH && cur_time - last_wake > WAKE_ON_TIME) { wake_state = LOW; } if (cur_time - last_wake > WAKE_PERIOD) { last_wake = cur_time; wake_state = HIGH; } digitalWrite(WAKE_PIN, wake_state); if (!keyboard.available()) return; // read the next key char c = keyboard.read(); boolean newline = false; if (c == PS2_ENTER) { newline = true; } else if (c == PS2_DELETE) { if (line_len > 0) { line_len--; line_buffer[line_start + line_len] = ' '; } } if (newline || line_len >= 32) { // send whole line to printer for (int i=0; i= 32 && c <= 126) { line_buffer[line_start + line_len] = c; line_len++; } // scroll up if (line_start + line_len > HIDDEN_BUF + VIS_BUF - 5) { for (int i=0; i < HIDDEN_BUF + VIS_BUF - CHR_PER_LINE; i++) line_buffer[i] = line_buffer[i+CHR_PER_LINE]; for (int i=HIDDEN_BUF + VIS_BUF - CHR_PER_LINE; i < HIDDEN_BUF + VIS_BUF; i++) line_buffer[i] = ' '; line_start -= CHR_PER_LINE; } if (line_start + 32 < HIDDEN_BUF + VIS_BUF) line_buffer[line_start + 32] = '/'; display.clearDisplay(); display.setCursor(0,0); display.println(line_buffer + HIDDEN_BUF); display.display(); }