Skip to content

Commit 5e967d2

Browse files
committed
Screen API implementation
1 parent 2a3374a commit 5e967d2

File tree

3 files changed

+182
-52
lines changed

3 files changed

+182
-52
lines changed

apis/interface/display/src/lib.rs

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -213,15 +213,15 @@ impl<S: Syscalls, C: Config> Display<S, C> {
213213
let called: Cell<Option<(u32,)>> = Cell::new(None);
214214
share::scope::<
215215
(
216-
AllowRo<_, DRIVER_NUM, { allow_ro::SHARED }>,
216+
AllowRo<_, DRIVER_NUM, { allow_ro::WRITE_BUFFER_ID }>,
217217
Subscribe<_, DRIVER_NUM, { subscribe::WRITE }>,
218218
),
219219
_,
220220
_,
221221
>(|handle| {
222222
let (allow_ro, subscribe) = handle.split();
223223

224-
S::allow_ro::<C, DRIVER_NUM, { allow_ro::SHARED }>(allow_ro, s)?;
224+
S::allow_ro::<C, DRIVER_NUM, { allow_ro::WRITE_BUFFER_ID }>(allow_ro, s)?;
225225

226226
S::subscribe::<_, _, C, DRIVER_NUM, { subscribe::WRITE }>(subscribe, &called)?;
227227

@@ -236,34 +236,37 @@ impl<S: Syscalls, C: Config> Display<S, C> {
236236
})
237237
}
238238
pub fn fill(s: &mut [u8], color: u16) -> Result<(), ErrorCode> {
239-
if s.len() - 2 > 0 {
239+
if s.len() >= 2 {
240240
s[0] = ((color >> 8) & 0xFF) as u8;
241241
s[1] = (color & 0xFF) as u8;
242-
}
243-
let called: Cell<Option<(u32,)>> = Cell::new(None);
244-
share::scope::<
245-
(
246-
AllowRo<_, DRIVER_NUM, { allow_ro::SHARED }>,
247-
Subscribe<_, DRIVER_NUM, { subscribe::WRITE }>,
248-
),
249-
_,
250-
_,
251-
>(|handle| {
252-
let (allow_ro, subscribe) = handle.split();
253242

254-
S::allow_ro::<C, DRIVER_NUM, { allow_ro::SHARED }>(allow_ro, s)?;
243+
let called: Cell<Option<(u32,)>> = Cell::new(None);
244+
share::scope::<
245+
(
246+
AllowRo<_, DRIVER_NUM, { allow_ro::WRITE_BUFFER_ID }>,
247+
Subscribe<_, DRIVER_NUM, { subscribe::WRITE }>,
248+
),
249+
_,
250+
_,
251+
>(|handle| {
252+
let (allow_ro, subscribe) = handle.split();
255253

256-
S::subscribe::<_, _, C, DRIVER_NUM, { subscribe::WRITE }>(subscribe, &called)?;
254+
S::allow_ro::<C, DRIVER_NUM, { allow_ro::WRITE_BUFFER_ID }>(allow_ro, s)?;
257255

258-
let val = S::command(DRIVER_NUM, command::FILL, 0, 0).to_result();
256+
S::subscribe::<_, _, C, DRIVER_NUM, { subscribe::WRITE }>(subscribe, &called)?;
259257

260-
loop {
261-
S::yield_wait();
262-
if let Some((_,)) = called.get() {
263-
return val;
258+
let val = S::command(DRIVER_NUM, command::FILL, 0, 0).to_result();
259+
260+
loop {
261+
S::yield_wait();
262+
if let Some((_,)) = called.get() {
263+
return val;
264+
}
264265
}
265-
}
266-
})
266+
})
267+
} else {
268+
Err(ErrorCode::Fail)
269+
}
267270
}
268271
}
269272
pub trait Config:
@@ -314,5 +317,5 @@ mod subscribe {
314317
pub const WRITE: u32 = 0;
315318
}
316319
mod allow_ro {
317-
pub const SHARED: u32 = 0;
320+
pub const WRITE_BUFFER_ID: u32 = 0;
318321
}

apis/interface/display/src/tests.rs

Lines changed: 115 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,20 @@ fn get_resolution_width_height() {
9292
let kernel = fake::Kernel::new();
9393
let driver = fake::Screen::new();
9494
kernel.add_driver(&driver);
95-
assert_eq!(Screen::get_resolution_width_height(1), Ok((1920, 1080)));
95+
assert_eq!(Screen::get_resolution_width_height(0), Ok((1920, 1080)));
96+
assert_eq!(Screen::get_resolution_width_height(1), Ok((2560, 1440)));
97+
assert_eq!(Screen::get_resolution_width_height(2), Ok((1280, 720)));
98+
}
99+
#[test]
100+
fn get_resolution_width_height_fail() {
101+
let kernel = fake::Kernel::new();
102+
let driver = fake::Screen::new();
103+
kernel.add_driver(&driver);
104+
assert_eq!(
105+
Screen::get_resolution_width_height(3),
106+
Err(ErrorCode::Invalid)
107+
);
96108
}
97-
98109
#[test]
99110
fn pixel_modes_count() {
100111
let kernel = fake::Kernel::new();
@@ -104,15 +115,24 @@ fn pixel_modes_count() {
104115
}
105116

106117
#[test]
107-
fn pixel_format() {
118+
fn get_screen_pixel_format_success() {
108119
let kernel = fake::Kernel::new();
109120
let driver = fake::Screen::new();
110121
kernel.add_driver(&driver);
111-
assert_eq!(Screen::pixel_format(1), Ok(1));
122+
assert_eq!(Screen::pixel_format(0), Ok(332));
123+
assert_eq!(Screen::pixel_format(1), Ok(565));
112124
}
113125

114126
#[test]
115-
fn set_rotation() {
127+
fn get_screen_pixel_format_fail() {
128+
let kernel = fake::Kernel::new();
129+
let driver = fake::Screen::new();
130+
kernel.add_driver(&driver);
131+
assert_eq!(Screen::pixel_format(8), Err(ErrorCode::Invalid));
132+
}
133+
134+
#[test]
135+
fn set_rotation_success() {
116136
let kernel = fake::Kernel::new();
117137
let driver = fake::Screen::new();
118138
kernel.add_driver(&driver);
@@ -125,7 +145,15 @@ fn set_rotation() {
125145
}
126146

127147
#[test]
128-
fn get_rotation() {
148+
fn set_rotation_fail() {
149+
let kernel = fake::Kernel::new();
150+
let driver = fake::Screen::new();
151+
kernel.add_driver(&driver);
152+
assert_eq!(Screen::set_rotation(360), Err(ErrorCode::Invalid));
153+
}
154+
155+
#[test]
156+
fn get_rotation_success() {
129157
let kernel = fake::Kernel::new();
130158
let driver = fake::Screen::new();
131159
kernel.add_driver(&driver);
@@ -143,6 +171,19 @@ fn get_rotation() {
143171
assert_eq!(Screen::get_rotation(), Ok(30));
144172
}
145173

174+
#[test]
175+
fn get_rotation_fail() {
176+
let kernel = fake::Kernel::new();
177+
let driver = fake::Screen::new();
178+
kernel.add_driver(&driver);
179+
kernel.add_expected_syscall(ExpectedSyscall::Subscribe {
180+
driver_num: 0x90001,
181+
subscribe_num: 0,
182+
skip_with_error: None,
183+
});
184+
assert_eq!(Screen::get_rotation(), Ok(0));
185+
}
186+
146187
#[test]
147188
fn set_resolution() {
148189
let kernel = fake::Kernel::new();
@@ -157,7 +198,7 @@ fn set_resolution() {
157198
}
158199

159200
#[test]
160-
fn get_resolution() {
201+
fn get_resolution_sucess() {
161202
let kernel = fake::Kernel::new();
162203
let driver = fake::Screen::new();
163204
kernel.add_driver(&driver);
@@ -170,6 +211,14 @@ fn get_resolution() {
170211
assert_eq!(Screen::get_resolution(), Ok((360, 720)));
171212
}
172213

214+
#[test]
215+
fn get_resolution_fail() {
216+
let kernel = fake::Kernel::new();
217+
let driver = fake::Screen::new();
218+
kernel.add_driver(&driver);
219+
assert_eq!(Screen::get_resolution(), Ok((0, 0)));
220+
}
221+
173222
#[test]
174223
fn set_pixel_format() {
175224
let kernel = fake::Kernel::new();
@@ -184,7 +233,7 @@ fn set_pixel_format() {
184233
}
185234

186235
#[test]
187-
fn get_pixel_format() {
236+
fn get_pixel_format_success() {
188237
let kernel = fake::Kernel::new();
189238
let driver = fake::Screen::new();
190239
kernel.add_driver(&driver);
@@ -197,12 +246,20 @@ fn get_pixel_format() {
197246
assert_eq!(Screen::get_pixel_format(), Ok(2));
198247
}
199248

249+
#[test]
250+
fn get_pixel_format_fail() {
251+
let kernel = fake::Kernel::new();
252+
let driver = fake::Screen::new();
253+
kernel.add_driver(&driver);
254+
assert_eq!(Screen::get_pixel_format(), Ok(0));
255+
}
256+
200257
#[test]
201258
fn set_write_frame() {
202259
let kernel = fake::Kernel::new();
203260
let driver = fake::Screen::new();
204261
kernel.add_driver(&driver);
205-
assert_eq!(Screen::set_write_frame(4660, 22136, 39612, 57072), Ok(()));
262+
assert_eq!(Screen::set_write_frame(10, 20, 30, 30), Ok(()));
206263
}
207264

208265
#[test]
@@ -213,15 +270,63 @@ fn write_buffer() {
213270
let _ = Screen::set_pixel_format(2);
214271
let buffer = [0u8; 4];
215272

273+
kernel.add_expected_syscall(ExpectedSyscall::AllowRo {
274+
driver_num: 0x90001,
275+
buffer_num: 0,
276+
return_error: None,
277+
});
278+
216279
kernel.add_expected_syscall(ExpectedSyscall::Subscribe {
217280
driver_num: 0x90001,
218281
subscribe_num: 0,
219282
skip_with_error: None,
220283
});
284+
285+
assert_eq!(Screen::write(&buffer), Ok(()));
286+
}
287+
288+
#[test]
289+
fn fill_success() {
290+
let kernel = fake::Kernel::new();
291+
let driver = fake::Screen::new();
292+
kernel.add_driver(&driver);
293+
let _ = Screen::set_pixel_format(2);
294+
let mut buffer = [0u8; 2];
295+
let color = 0xF800;
221296
kernel.add_expected_syscall(ExpectedSyscall::AllowRo {
222297
driver_num: 0x90001,
223298
buffer_num: 0,
224299
return_error: None,
225300
});
226-
assert_eq!(Screen::write(&buffer), Ok(()));
301+
302+
kernel.add_expected_syscall(ExpectedSyscall::Subscribe {
303+
driver_num: 0x90001,
304+
subscribe_num: 0,
305+
skip_with_error: None,
306+
});
307+
308+
assert_eq!(Screen::fill(&mut buffer, color), Ok(()));
309+
}
310+
311+
#[test]
312+
fn fill_fail() {
313+
let kernel = fake::Kernel::new();
314+
let driver = fake::Screen::new();
315+
kernel.add_driver(&driver);
316+
let _ = Screen::set_pixel_format(2);
317+
let mut buffer = [0u8; 1];
318+
let color = 0xF800;
319+
kernel.add_expected_syscall(ExpectedSyscall::AllowRo {
320+
driver_num: 0x90001,
321+
buffer_num: 0,
322+
return_error: None,
323+
});
324+
325+
kernel.add_expected_syscall(ExpectedSyscall::Subscribe {
326+
driver_num: 0x90001,
327+
subscribe_num: 0,
328+
skip_with_error: None,
329+
});
330+
331+
assert_eq!(Screen::fill(&mut buffer, color), Err(ErrorCode::Fail));
227332
}

0 commit comments

Comments
 (0)