Numworks Epsilon  1.4.1
Graphing Calculator Operating System
init.cpp
Go to the documentation of this file.
1 extern "C" {
2 #include <assert.h>
3 #include <stdio.h>
4 #include <string.h>
5 #include <unistd.h>
6 }
7 #include <chrono>
8 #include "init.h"
9 #include <kandinsky.h>
10 #include <FL/Fl.H>
11 #include <FL/Fl_Window.H>
12 #include <FL/Fl_Box.H>
13 
14 #include "display/fltklcd.h"
15 #include "keyboard/fltkkbd.h"
16 #undef None // TODO: Remove me
17 
18 static FltkLCD * sDisplay;
19 static FltkKbd * sKeyboard;
20 static KDFrameBuffer * sFrameBuffer;
21 
22 #define FRAMEBUFFER_ADDRESS (sDisplay->m_framebuffer)
23 
25 
26 void terminateHandler(Fl_Widget *) {
28 }
29 
30 void init_platform() {
31  Fl::visual(FL_RGB);
32 
33  int margin = 10;
34  int screen_width = Ion::Display::Width;
35  int screen_height = Ion::Display::Height;
36  int keyboard_height = screen_width;
37 
38  Fl_Window * window = new Fl_Window(screen_width+2*margin, margin+screen_height+margin+keyboard_height+margin);
39  window->callback(terminateHandler);
40 
41 #if defined(_WIN32) || defined(_WIN64)
42  Fl::set_font(FL_SYMBOL, "Arial Unicode MS");
43 #endif
44 
46  sFrameBuffer = new KDFrameBuffer(pixels, KDSize(Ion::Display::Width, Ion::Display::Height));
47  /*
48  sFrameBuffer.drawingArea.origin = KDPointZero;
49  sFrameBuffer.drawingArea.size = sFrameBuffer.size;
50  sFrameBuffer.drawingCursor = KDPointZero;
51  */
52 
53  sDisplay = new FltkLCD(margin, margin, screen_width, screen_height, pixels);
54  sKeyboard = new FltkKbd(margin, margin+screen_height+margin, screen_width, keyboard_height);
55 
56  window->end();
57  window->show();
58 
59  //KDCurrentContext->fillRect = NULL;
60 }
61 
62 void Ion::Display::pushRect(KDRect r, const KDColor * pixels) {
63  sFrameBuffer->pushRect(r, pixels);
64 }
65 
67  sFrameBuffer->pushRectUniform(r, c);
68 }
69 
70 void Ion::Display::pullRect(KDRect r, KDColor * pixels) {
71  sFrameBuffer->pullRect(r, pixels);
72 }
73 
75 }
76 
78  Ion::Keyboard::State result = 0;
79  for (int i=0; i<Ion::Keyboard::NumberOfKeys; i++) {
80  result = result << 1 | sKeyboard->key_down((Ion::Keyboard::Key)(Ion::Keyboard::NumberOfKeys-1-i));
81 
82  }
83  return result;
84 }
85 
87  auto last = std::chrono::high_resolution_clock::now();
88  do {
89  sDisplay->redraw();
90  Fl::wait(*timeout / 1000.0);
91  auto next = std::chrono::high_resolution_clock::now();
92  long long elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(next - last).count();
93  last = next;
94  if (elapsed > *timeout) {
95  *timeout = 0;
96  } else {
97  *timeout -= elapsed;
98  }
99  } while (*timeout && currentEvent == None);
100  Event event = currentEvent;
101  currentEvent = None;
102  return event;
103 }
104 
105 #include <chrono>
106 
107 void Ion::msleep(long ms) {
108  auto start = std::chrono::high_resolution_clock::now();
109  while (true) {
110  sDisplay->redraw();
111  Fl::wait(0);
112  auto elapsed = std::chrono::high_resolution_clock::now() - start;
113  long long milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count();
114  if (milliseconds >= ms) {
115  break;
116  }
117  }
118 }
119 
120 void Ion::getSerialNumber(char * buffer) {
121  strlcpy(buffer, "Simulator", Ion::SerialNumberLength+1);
122 }
void terminateHandler(Fl_Widget *)
Definition: init.cpp:26
Event getEvent(int *timeout)
Definition: events.cpp:12
void pushRectUniform(KDRect rect, KDColor color)
Definition: framebuffer.cpp:29
bool key_down(Ion::Keyboard::Key key)
Definition: fltkkbd.cpp:75
constexpr int Width
Definition: display.h:26
Definition: fltklcd.h:7
void pullRect(KDRect r, KDColor *pixels)
Definition: display.cpp:26
void msleep(long ms)
Definition: ion.cpp:4
size_t strlcpy(char *dst, const char *src, size_t len)
Definition: strlcpy.c:3
constexpr Event None
Definition: events.h:215
void pushRect(KDRect r, const KDColor *pixels)
Definition: display.cpp:14
constexpr int NumberOfKeys
Definition: keyboard.h:33
Definition: size.h:6
c(generic_all_nodes)
Definition: fltkkbd.h:8
Ion::Events::Event currentEvent
Definition: init.cpp:24
void init_platform()
Definition: init.cpp:30
void pushRect(KDRect rect, const KDColor *pixels)
Definition: framebuffer.cpp:18
void pullRect(KDRect rect, KDColor *pixels)
Definition: framebuffer.cpp:45
void getSerialNumber(char *buffer)
Definition: device.cpp:77
void start()
Definition: rt0.cpp:31
void * malloc(size_t size)
Definition: malloc.c:44
State scan()
Definition: keyboard.cpp:50
Definition: rect.h:26
Definition: color.h:6
void pushRectUniform(KDRect r, KDColor c)
Definition: display.cpp:20
constexpr int Height
Definition: display.h:27
void waitForVBlank()
Definition: display.cpp:32
constexpr Event Termination
Definition: events.h:216