Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 4-fix-card10-l0dable-on-crates-io
  • 5-implement-client-c-in-plain-rust
  • api
  • build-from-root
  • master
  • no-str_to_cstr
  • card10-alloc-0.1.0
  • card10-alloc-0.1.1
  • card10-l0dable-0.2.0
  • card10-l0dable-0.3.0
  • card10-sys-1.10.0
  • card10-sys-1.9.0
12 results

Target

Select target project
  • astro/rust-card10
  • rnestler/rust-card10
  • dbrgn/rust-card10
  • toon/rust-card10
  • mwall/rust-card10
  • puzzlewolf/rust-card10
  • rnd/rust-card10
  • lilpep/rust-card10
  • rafael/rust-card10
  • squeed/rust-card10
  • arist/rust-card10
11 results
Select Git revision
  • 4-fix-card10-l0dable-on-crates-io
  • 5-implement-client-c-in-plain-rust
  • api
  • build-from-root
  • embedded-graphics
  • master
6 results
Show changes
Showing
with 15835 additions and 141 deletions
use card10_sys::*; use card10_sys::*;
/// Execute Python script or ELF file
pub fn exec(path: &str) -> ! { pub fn exec(path: &str) -> ! {
let mut pathbuf = super::str_to_cstr(path); let mut pathbuf = super::str_to_cstr(path);
unsafe { unsafe {
...@@ -8,16 +9,18 @@ pub fn exec(path: &str) -> ! { ...@@ -8,16 +9,18 @@ pub fn exec(path: &str) -> ! {
unreachable!() unreachable!()
} }
/// Exit current l0dable
pub fn exit(ret: i32) -> ! { pub fn exit(ret: i32) -> ! {
unsafe { unsafe {
epic_exit(ret); epic_exit(ret);
} }
unreachable!() loop {}
} }
/// Cause a reboot
pub fn system_reset() -> ! { pub fn system_reset() -> ! {
unsafe { unsafe {
epic_system_reset(); epic_system_reset();
} }
unreachable!() loop {}
} }
//! Real-time clock functionality
use card10_sys::*; use card10_sys::*;
use core::ops::Sub; use core::ops::Sub;
/// Implemented for `Seconds` and `Milliseconds`
pub trait Time { pub trait Time {
/// Get current time
fn time() -> Self; fn time() -> Self;
/// Set the time (TODO)
fn set_time(&self); fn set_time(&self);
} }
...@@ -20,8 +25,8 @@ impl Time for Seconds { ...@@ -20,8 +25,8 @@ impl Time for Seconds {
let s = unsafe { epic_rtc_get_seconds() }; let s = unsafe { epic_rtc_get_seconds() };
Seconds(s) Seconds(s)
} }
/// TODO
fn set_time(&self) { fn set_time(&self) {
// TODO
} }
} }
...@@ -46,8 +51,8 @@ impl Time for MilliSeconds { ...@@ -46,8 +51,8 @@ impl Time for MilliSeconds {
let ms = unsafe { epic_rtc_get_milliseconds() }; let ms = unsafe { epic_rtc_get_milliseconds() };
MilliSeconds(ms) MilliSeconds(ms)
} }
/// TODO
fn set_time(&self) { fn set_time(&self) {
// TODO
} }
} }
......
//! True Random Number Generator
use card10_sys::*; use card10_sys::*;
/// Read bytes from the True Random Number Generated
pub fn read(dest: &mut [u8]) -> bool { pub fn read(dest: &mut [u8]) -> bool {
unsafe { epic_trng_read(dest.as_mut_ptr(), dest.len()) != 0 } unsafe { epic_trng_read(dest.as_mut_ptr(), dest.len()) != 0 }
} }
...@@ -2,12 +2,16 @@ use core::fmt::Write; ...@@ -2,12 +2,16 @@ use core::fmt::Write;
use card10_sys::*; use card10_sys::*;
/// USB UART, 115200 baud
///
/// Supports use of `write!(Uart, "{}", ...);` Use `println!(...);`
/// for convenience.
pub struct Uart; pub struct Uart;
impl Write for Uart { impl Write for Uart {
fn write_str(&mut self, s: &str) -> core::fmt::Result { fn write_str(&mut self, s: &str) -> core::fmt::Result {
unsafe { unsafe {
epic_uart_write_str(s.as_ptr(), s.len() as isize); epic_uart_write_str(s.as_ptr(), s.len());
} }
Ok(()) Ok(())
} }
...@@ -26,5 +30,5 @@ macro_rules! println { ...@@ -26,5 +30,5 @@ macro_rules! println {
#[doc(hidden)] #[doc(hidden)]
pub fn _print(args: core::fmt::Arguments) { pub fn _print(args: core::fmt::Arguments) {
crate::UART.write_fmt(args); crate::UART.write_fmt(args).ok();
} }
//! Vibration motor
use card10_sys::*; use card10_sys::*;
/// Set vibration motor to off/on
pub fn set(status: bool) { pub fn set(status: bool) {
unsafe { unsafe {
epic_vibra_set(status.into()); epic_vibra_set(status.into());
} }
} }
/// Vibrate for a duration
pub fn vibrate(millis: i32) { pub fn vibrate(millis: i32) {
unsafe { unsafe {
epic_vibra_vibrate(millis); epic_vibra_vibrate(millis);
......
[package] [package]
name = "card10-sys" name = "card10-sys"
version = "0.1.0" version = "1.10.0"
authors = ["Astro <astro@spaceboyz.net>", "Kloenk <me@kloenk.de>"] authors = [
"Astro <astro@spaceboyz.net>",
"Kloenk <me@kloenk.de>",
"Bruno Kirschner <bruno.kirschner@online.de>",
"Puzzlewolf <camp@nora.pink>",
"Raphael Nestler <raphael.nestler@gmail.com>",
"Danilo Bargen <mail@dbrgn.ch>",
"toon <toon@c3d2.de>",
"Sergey Pepyakin <sergei@parity.io>",
]
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
edition = "2018" edition = "2018"
description = "Unsafe C bindings for card10 l0dables" description = "Unsafe C bindings for card10 l0dables"
repository = "https://git.card10.badge.events.ccc.de/astro/rust-card10" repository = "https://git.card10.badge.events.ccc.de/astro/rust-card10"
homepage = "https://git.card10.badge.events.ccc.de/astro/rust-card10" homepage = "https://git.card10.badge.events.ccc.de/astro/rust-card10"
documentation = "https://docs.rs/card10-sys"
categories = ["external-ffi-bindings", "no-std"] categories = ["external-ffi-bindings", "no-std"]
keywords = [ keywords = [
...@@ -19,10 +30,30 @@ keywords = [ ...@@ -19,10 +30,30 @@ keywords = [
"l0dable", "l0dable",
] ]
exclude = [
"target",
"firmware/lib/micropython",
"firmware/lib/ff13",
"firmware/lib/sdk/Documentation",
"firmware/lib/sdk/Applications",
"firmware/lib/sdk/Libraries/BTLE",
"firmware/lib/sdk/Libraries/FreeRTOS",
"firmware/lib/sdk/Libraries/FreeRTOS-Plus",
"firmware/lib/sdk/Libraries/SDHC",
"firmware/lib/sdk/Libraries/MAXUSB",
"firmware/openocd",
"firmware/Documentation",
"firmware/hw-tests",
"firmware/preload",
"firmware/pycardium",
"firmware/bootloader",
"firmware/tools",
"firmware/docker",
]
[dependencies] [dependencies]
panic-abort = "^0.3"
r0 = "^0.2" r0 = "^0.2"
[build-dependencies] [build-dependencies]
bindgen = "^0.51" bindgen = "^0.52"
cc = "^1.0" cc = "^1.0"
...@@ -54,6 +54,7 @@ fn main() -> Result<(), Box<dyn Error>> { ...@@ -54,6 +54,7 @@ fn main() -> Result<(), Box<dyn Error>> {
.clang_arg("-Ifirmware/lib/sdk/Libraries/MAX32665PeriphDriver/Include") .clang_arg("-Ifirmware/lib/sdk/Libraries/MAX32665PeriphDriver/Include")
.header("vendor/wrapper.h") .header("vendor/wrapper.h")
.ctypes_prefix("ctypes") .ctypes_prefix("ctypes")
.opaque_type("epic_stat")
.generate() .generate()
.map_err(|_| "Couldn't generate bindings")?; .map_err(|_| "Couldn't generate bindings")?;
......
firmware @ da4bc11f
Subproject commit c7b7bc8468f94f52c2af115b795d98b6b0974852 Subproject commit da4bc11fbdded3588a97b1f905da4866a30f520c
//! This gets linked with the client C code for the card10 EPIC API.
#![no_std] #![no_std]
#![feature(global_asm)] #![feature(global_asm)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#![allow(non_upper_case_globals)] #![allow(non_upper_case_globals)]
#![allow(non_snake_case)] #![allow(non_snake_case)]
#![feature(core_intrinsics)]
#![feature(panic_info_message)]
use core::fmt::Write;
use core::intrinsics;
use core::panic::PanicInfo;
pub struct Uart;
impl Write for Uart {
fn write_str(&mut self, s: &str) -> core::fmt::Result {
unsafe {
epic_uart_write_str(s.as_ptr(), s.len());
}
Ok(())
}
}
#[panic_handler]
fn panic(info: &PanicInfo) -> ! {
write!(Uart, "panicked").ok();
if let Some(message) = info.message() {
write!(Uart, " at '{}'", message).ok();
}
use panic_abort as _; if let Some(location) = info.location() {
write!(
Uart,
", {}:{}:{}",
location.file(),
location.line(),
location.column()
)
.ok();
}
writeln!(Uart, "\r").ok();
unsafe { intrinsics::abort() }
}
global_asm!(include_str!(concat!(env!("OUT_DIR"), "/crt.s"))); global_asm!(include_str!(concat!(env!("OUT_DIR"), "/crt.s")));
include!(concat!(env!("OUT_DIR"), "/bindings.rs")); include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
/// Initialization for l0dables
#[link_section = ".text.boot"] #[link_section = ".text.boot"]
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn Reset_Handler() -> ! { pub unsafe extern "C" fn Reset_Handler() -> ! {
extern "C" { extern "C" {
fn SystemInit(); fn SystemInit();
// Boundaries of the .bss section, provided by the linker script // Boundaries of the .bss section, provided by the linker script
static mut __bss_start: u64; static mut __bss_start: u32;
static mut __bss_end: u64; static mut __bss_end: u32;
} }
// Zeroes the .bss section // Zeroes the .bss section
......
...@@ -158,16 +158,16 @@ int epic_read_thermistor_voltage(float *result) ...@@ -158,16 +158,16 @@ int epic_read_thermistor_voltage(float *result)
} }
/* Autogenerated stub for API_UART_WRITE_STR */ /* Autogenerated stub for API_UART_WRITE_STR */
void epic_uart_write_str( const char *str, intptr_t length ) void epic_uart_write_str( const char *str, size_t length)
{ {
const int epc__apistub_size = sizeof(const char *) + sizeof(intptr_t); const int epc__apistub_size = sizeof(const char *) + sizeof(size_t);
void*epc__apistub_buffer; void*epc__apistub_buffer;
epc__apistub_buffer = _api_call_start(API_UART_WRITE_STR, epc__apistub_size); epc__apistub_buffer = _api_call_start(API_UART_WRITE_STR, epc__apistub_size);
/* TODO: Check if epc__apistub_buffer is not NULL */ /* TODO: Check if epc__apistub_buffer is not NULL */
*(const char **)(epc__apistub_buffer + 0) = str; *(const char **)(epc__apistub_buffer + 0) = str;
*(intptr_t*)(epc__apistub_buffer + sizeof(const char *)) = length; *(size_t*)(epc__apistub_buffer + sizeof(const char *)) = length;
_api_call_transact(epc__apistub_buffer); _api_call_transact(epc__apistub_buffer);
} }
...@@ -289,6 +289,21 @@ void epic_leds_set(int led, uint8_t r, uint8_t g, uint8_t b) ...@@ -289,6 +289,21 @@ void epic_leds_set(int led, uint8_t r, uint8_t g, uint8_t b)
_api_call_transact(epc__apistub_buffer); _api_call_transact(epc__apistub_buffer);
} }
/* Autogenerated stub for API_LEDS_GET */
int epic_leds_get_rgb(int led, uint8_t * rgb)
{
const int epc__apistub_size = sizeof(int) + sizeof(uint8_t *);
void*epc__apistub_buffer;
epc__apistub_buffer = _api_call_start(API_LEDS_GET, epc__apistub_size);
/* TODO: Check if epc__apistub_buffer is not NULL */
*(int*)(epc__apistub_buffer + 0) = led;
*(uint8_t **)(epc__apistub_buffer + sizeof(int)) = rgb;
return *(int*)_api_call_transact(epc__apistub_buffer);
}
/* Autogenerated stub for API_LEDS_SET_HSV */ /* Autogenerated stub for API_LEDS_SET_HSV */
void epic_leds_set_hsv( int led, float h, float s, float v) void epic_leds_set_hsv( int led, float h, float s, float v)
{ {
...@@ -440,6 +455,20 @@ void epic_leds_set_rocket(int led, uint8_t value) ...@@ -440,6 +455,20 @@ void epic_leds_set_rocket(int led, uint8_t value)
_api_call_transact(epc__apistub_buffer); _api_call_transact(epc__apistub_buffer);
} }
/* Autogenerated stub for API_LEDS_GET_ROCKET */
int epic_leds_get_rocket(int led)
{
const int epc__apistub_size = sizeof(int);
void*epc__apistub_buffer;
epc__apistub_buffer = _api_call_start(API_LEDS_GET_ROCKET, epc__apistub_size);
/* TODO: Check if epc__apistub_buffer is not NULL */
*(int*)(epc__apistub_buffer + 0) = led;
return *(int*)_api_call_transact(epc__apistub_buffer);
}
/* Autogenerated stub for API_LEDS_SET_FLASHLIGHT */ /* Autogenerated stub for API_LEDS_SET_FLASHLIGHT */
void epic_set_flashlight(_Bool power) void epic_set_flashlight(_Bool power)
{ {
...@@ -525,6 +554,34 @@ int epic_bme680_read_sensors(struct bme680_sensor_data *data) ...@@ -525,6 +554,34 @@ int epic_bme680_read_sensors(struct bme680_sensor_data *data)
return *(int*)_api_call_transact(epc__apistub_buffer); return *(int*)_api_call_transact(epc__apistub_buffer);
} }
/* Autogenerated stub for API_MAX86150_ENABLE */
int epic_max86150_enable_sensor(struct max86150_sensor_config *config, size_t config_size)
{
const int epc__apistub_size = sizeof(struct max86150_sensor_config *) + sizeof(size_t);
void*epc__apistub_buffer;
epc__apistub_buffer = _api_call_start(API_MAX86150_ENABLE, epc__apistub_size);
/* TODO: Check if epc__apistub_buffer is not NULL */
*(struct max86150_sensor_config **)(epc__apistub_buffer + 0) = config;
*(size_t*)(epc__apistub_buffer + sizeof(struct max86150_sensor_config *)) = config_size;
return *(int*)_api_call_transact(epc__apistub_buffer);
}
/* Autogenerated stub for API_MAX86150_DISABLE */
int epic_max86150_disable_sensor()
{
const int epc__apistub_size = 0;
void*epc__apistub_buffer;
epc__apistub_buffer = _api_call_start(API_MAX86150_DISABLE, epc__apistub_size);
/* TODO: Check if epc__apistub_buffer is not NULL */
return *(int*)_api_call_transact(epc__apistub_buffer);
}
/* Autogenerated stub for API_PERSONAL_STATE_SET */ /* Autogenerated stub for API_PERSONAL_STATE_SET */
int epic_personal_state_set( uint8_t state, _Bool persistent) int epic_personal_state_set( uint8_t state, _Bool persistent)
{ {
...@@ -692,38 +749,38 @@ int epic_disp_update() ...@@ -692,38 +749,38 @@ int epic_disp_update()
} }
/* Autogenerated stub for API_DISP_PRINT */ /* Autogenerated stub for API_DISP_PRINT */
int epic_disp_print( uint16_t posx, uint16_t posy, const char *pString, uint16_t fg, uint16_t bg) int epic_disp_print( int16_t posx, int16_t posy, const char *pString, uint16_t fg, uint16_t bg)
{ {
const int epc__apistub_size = sizeof(uint16_t) + sizeof(uint16_t) + sizeof(const char *) + sizeof(uint16_t) + sizeof(uint16_t); const int epc__apistub_size = sizeof(int16_t) + sizeof(int16_t) + sizeof(const char *) + sizeof(uint16_t) + sizeof(uint16_t);
void*epc__apistub_buffer; void*epc__apistub_buffer;
epc__apistub_buffer = _api_call_start(API_DISP_PRINT, epc__apistub_size); epc__apistub_buffer = _api_call_start(API_DISP_PRINT, epc__apistub_size);
/* TODO: Check if epc__apistub_buffer is not NULL */ /* TODO: Check if epc__apistub_buffer is not NULL */
*(uint16_t*)(epc__apistub_buffer + 0) = posx; *(int16_t*)(epc__apistub_buffer + 0) = posx;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t)) = posy; *(int16_t*)(epc__apistub_buffer + sizeof(int16_t)) = posy;
*(const char **)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t)) = pString; *(const char **)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t)) = pString;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(const char *)) = fg; *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(const char *)) = fg;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(const char *) + sizeof(uint16_t)) = bg; *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(const char *) + sizeof(uint16_t)) = bg;
return *(int*)_api_call_transact(epc__apistub_buffer); return *(int*)_api_call_transact(epc__apistub_buffer);
} }
/* Autogenerated stub for API_DISP_PRINT_ADV */ /* Autogenerated stub for API_DISP_PRINT_ADV */
int epic_disp_print_adv( uint8_t font, uint16_t posx, uint16_t posy, const char *pString, uint16_t fg, uint16_t bg) int epic_disp_print_adv( uint8_t font, int16_t posx, int16_t posy, const char *pString, uint16_t fg, uint16_t bg)
{ {
const int epc__apistub_size = sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(const char *) + sizeof(uint16_t) + sizeof(uint16_t); const int epc__apistub_size = sizeof(uint8_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(const char *) + sizeof(uint16_t) + sizeof(uint16_t);
void*epc__apistub_buffer; void*epc__apistub_buffer;
epc__apistub_buffer = _api_call_start(API_DISP_PRINT_ADV, epc__apistub_size); epc__apistub_buffer = _api_call_start(API_DISP_PRINT_ADV, epc__apistub_size);
/* TODO: Check if epc__apistub_buffer is not NULL */ /* TODO: Check if epc__apistub_buffer is not NULL */
*(uint8_t*)(epc__apistub_buffer + 0) = font; *(uint8_t*)(epc__apistub_buffer + 0) = font;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint8_t)) = posx; *(int16_t*)(epc__apistub_buffer + sizeof(uint8_t)) = posx;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint8_t) + sizeof(uint16_t)) = posy; *(int16_t*)(epc__apistub_buffer + sizeof(uint8_t) + sizeof(int16_t)) = posy;
*(const char **)(epc__apistub_buffer + sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint16_t)) = pString; *(const char **)(epc__apistub_buffer + sizeof(uint8_t) + sizeof(int16_t) + sizeof(int16_t)) = pString;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(const char *)) = fg; *(uint16_t*)(epc__apistub_buffer + sizeof(uint8_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(const char *)) = fg;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(const char *) + sizeof(uint16_t)) = bg; *(uint16_t*)(epc__apistub_buffer + sizeof(uint8_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(const char *) + sizeof(uint16_t)) = bg;
return *(int*)_api_call_transact(epc__apistub_buffer); return *(int*)_api_call_transact(epc__apistub_buffer);
} }
...@@ -743,76 +800,76 @@ int epic_disp_clear(uint16_t color) ...@@ -743,76 +800,76 @@ int epic_disp_clear(uint16_t color)
} }
/* Autogenerated stub for API_DISP_PIXEL */ /* Autogenerated stub for API_DISP_PIXEL */
int epic_disp_pixel( uint16_t x, uint16_t y, uint16_t color) int epic_disp_pixel( int16_t x, int16_t y, uint16_t color)
{ {
const int epc__apistub_size = sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t); const int epc__apistub_size = sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t);
void*epc__apistub_buffer; void*epc__apistub_buffer;
epc__apistub_buffer = _api_call_start(API_DISP_PIXEL, epc__apistub_size); epc__apistub_buffer = _api_call_start(API_DISP_PIXEL, epc__apistub_size);
/* TODO: Check if epc__apistub_buffer is not NULL */ /* TODO: Check if epc__apistub_buffer is not NULL */
*(uint16_t*)(epc__apistub_buffer + 0) = x; *(int16_t*)(epc__apistub_buffer + 0) = x;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t)) = y; *(int16_t*)(epc__apistub_buffer + sizeof(int16_t)) = y;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t)) = color; *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t)) = color;
return *(int*)_api_call_transact(epc__apistub_buffer); return *(int*)_api_call_transact(epc__apistub_buffer);
} }
/* Autogenerated stub for API_DISP_LINE */ /* Autogenerated stub for API_DISP_LINE */
int epic_disp_line( uint16_t xstart, uint16_t ystart, uint16_t xend, uint16_t yend, uint16_t color, enum disp_linestyle linestyle, uint16_t pixelsize) int epic_disp_line( int16_t xstart, int16_t ystart, int16_t xend, int16_t yend, uint16_t color, enum disp_linestyle linestyle, uint16_t pixelsize)
{ {
const int epc__apistub_size = sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(enum disp_linestyle) + sizeof(uint16_t); const int epc__apistub_size = sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t) + sizeof(enum disp_linestyle) + sizeof(uint16_t);
void*epc__apistub_buffer; void*epc__apistub_buffer;
epc__apistub_buffer = _api_call_start(API_DISP_LINE, epc__apistub_size); epc__apistub_buffer = _api_call_start(API_DISP_LINE, epc__apistub_size);
/* TODO: Check if epc__apistub_buffer is not NULL */ /* TODO: Check if epc__apistub_buffer is not NULL */
*(uint16_t*)(epc__apistub_buffer + 0) = xstart; *(int16_t*)(epc__apistub_buffer + 0) = xstart;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t)) = ystart; *(int16_t*)(epc__apistub_buffer + sizeof(int16_t)) = ystart;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t)) = xend; *(int16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t)) = xend;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t)) = yend; *(int16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t)) = yend;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t)) = color; *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t)) = color;
*(enum disp_linestyle*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t)) = linestyle; *(enum disp_linestyle*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t)) = linestyle;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(enum disp_linestyle)) = pixelsize; *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t) + sizeof(enum disp_linestyle)) = pixelsize;
return *(int*)_api_call_transact(epc__apistub_buffer); return *(int*)_api_call_transact(epc__apistub_buffer);
} }
/* Autogenerated stub for API_DISP_RECT */ /* Autogenerated stub for API_DISP_RECT */
int epic_disp_rect( uint16_t xstart, uint16_t ystart, uint16_t xend, uint16_t yend, uint16_t color, enum disp_fillstyle fillstyle, uint16_t pixelsize) int epic_disp_rect( int16_t xstart, int16_t ystart, int16_t xend, int16_t yend, uint16_t color, enum disp_fillstyle fillstyle, uint16_t pixelsize)
{ {
const int epc__apistub_size = sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(enum disp_fillstyle) + sizeof(uint16_t); const int epc__apistub_size = sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t) + sizeof(enum disp_fillstyle) + sizeof(uint16_t);
void*epc__apistub_buffer; void*epc__apistub_buffer;
epc__apistub_buffer = _api_call_start(API_DISP_RECT, epc__apistub_size); epc__apistub_buffer = _api_call_start(API_DISP_RECT, epc__apistub_size);
/* TODO: Check if epc__apistub_buffer is not NULL */ /* TODO: Check if epc__apistub_buffer is not NULL */
*(uint16_t*)(epc__apistub_buffer + 0) = xstart; *(int16_t*)(epc__apistub_buffer + 0) = xstart;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t)) = ystart; *(int16_t*)(epc__apistub_buffer + sizeof(int16_t)) = ystart;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t)) = xend; *(int16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t)) = xend;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t)) = yend; *(int16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t)) = yend;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t)) = color; *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t)) = color;
*(enum disp_fillstyle*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t)) = fillstyle; *(enum disp_fillstyle*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t)) = fillstyle;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(enum disp_fillstyle)) = pixelsize; *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t) + sizeof(enum disp_fillstyle)) = pixelsize;
return *(int*)_api_call_transact(epc__apistub_buffer); return *(int*)_api_call_transact(epc__apistub_buffer);
} }
/* Autogenerated stub for API_DISP_CIRC */ /* Autogenerated stub for API_DISP_CIRC */
int epic_disp_circ( uint16_t x, uint16_t y, uint16_t rad, uint16_t color, enum disp_fillstyle fillstyle, uint16_t pixelsize) int epic_disp_circ( int16_t x, int16_t y, uint16_t rad, uint16_t color, enum disp_fillstyle fillstyle, uint16_t pixelsize)
{ {
const int epc__apistub_size = sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(enum disp_fillstyle) + sizeof(uint16_t); const int epc__apistub_size = sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(enum disp_fillstyle) + sizeof(uint16_t);
void*epc__apistub_buffer; void*epc__apistub_buffer;
epc__apistub_buffer = _api_call_start(API_DISP_CIRC, epc__apistub_size); epc__apistub_buffer = _api_call_start(API_DISP_CIRC, epc__apistub_size);
/* TODO: Check if epc__apistub_buffer is not NULL */ /* TODO: Check if epc__apistub_buffer is not NULL */
*(uint16_t*)(epc__apistub_buffer + 0) = x; *(int16_t*)(epc__apistub_buffer + 0) = x;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t)) = y; *(int16_t*)(epc__apistub_buffer + sizeof(int16_t)) = y;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t)) = rad; *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t)) = rad;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t)) = color; *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t)) = color;
*(enum disp_fillstyle*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t)) = fillstyle; *(enum disp_fillstyle*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t) + sizeof(uint16_t)) = fillstyle;
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(enum disp_fillstyle)) = pixelsize; *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(enum disp_fillstyle)) = pixelsize;
return *(int*)_api_call_transact(epc__apistub_buffer); return *(int*)_api_call_transact(epc__apistub_buffer);
} }
...@@ -1090,6 +1147,32 @@ int epic_file_mkdir(const char *dirname) ...@@ -1090,6 +1147,32 @@ int epic_file_mkdir(const char *dirname)
return *(int*)_api_call_transact(epc__apistub_buffer); return *(int*)_api_call_transact(epc__apistub_buffer);
} }
/* Autogenerated stub for API_RTC_GET_MONOTONIC_SECONDS */
uint32_t epic_rtc_get_monotonic_seconds(void)
{
const int epc__apistub_size = 0;
void*epc__apistub_buffer;
epc__apistub_buffer = _api_call_start(API_RTC_GET_MONOTONIC_SECONDS, epc__apistub_size);
/* TODO: Check if epc__apistub_buffer is not NULL */
return *(uint32_t*)_api_call_transact(epc__apistub_buffer);
}
/* Autogenerated stub for API_RTC_GET_MONOTONIC_MILLISECONDS */
uint64_t epic_rtc_get_monotonic_milliseconds(void)
{
const int epc__apistub_size = 0;
void*epc__apistub_buffer;
epc__apistub_buffer = _api_call_start(API_RTC_GET_MONOTONIC_MILLISECONDS, epc__apistub_size);
/* TODO: Check if epc__apistub_buffer is not NULL */
return *(uint64_t*)_api_call_transact(epc__apistub_buffer);
}
/* Autogenerated stub for API_RTC_GET_SECONDS */ /* Autogenerated stub for API_RTC_GET_SECONDS */
uint32_t epic_rtc_get_seconds(void) uint32_t epic_rtc_get_seconds(void)
{ {
...@@ -1174,7 +1257,7 @@ int epic_max30001_enable_sensor( struct max30001_sensor_config *config ) ...@@ -1174,7 +1257,7 @@ int epic_max30001_enable_sensor( struct max30001_sensor_config *config )
} }
/* Autogenerated stub for API_MAX30001_DISABLE */ /* Autogenerated stub for API_MAX30001_DISABLE */
int epic_max30001_disable_sensor( void ) int epic_max30001_disable_sensor()
{ {
const int epc__apistub_size = 0; const int epc__apistub_size = 0;
void*epc__apistub_buffer; void*epc__apistub_buffer;
...@@ -1225,24 +1308,90 @@ int epic_usb_cdcacm(void) ...@@ -1225,24 +1308,90 @@ int epic_usb_cdcacm(void)
return *(int*)_api_call_transact(epc__apistub_buffer); return *(int*)_api_call_transact(epc__apistub_buffer);
} }
/* Autogenerated stub for API_WS2812_WRITE */
void epic_ws2812_write(uint8_t pin, uint8_t *pixels, uint32_t n_bytes)
{
const int epc__apistub_size = sizeof(uint8_t) + sizeof(uint8_t *) + sizeof(uint32_t);
void*epc__apistub_buffer;
epc__apistub_buffer = _api_call_start(API_WS2812_WRITE, epc__apistub_size);
/* TODO: Check if epc__apistub_buffer is not NULL */
*(uint8_t*)(epc__apistub_buffer + 0) = pin;
*(uint8_t **)(epc__apistub_buffer + sizeof(uint8_t)) = pixels;
*(uint32_t*)(epc__apistub_buffer + sizeof(uint8_t) + sizeof(uint8_t *)) = n_bytes;
_api_call_transact(epc__apistub_buffer);
}
/* Autogenerated stub for API_CONFIG_GET_INTEGER */
int epic_config_get_integer(const char *key, int *value)
{
const int epc__apistub_size = sizeof(const char *) + sizeof(int *);
void*epc__apistub_buffer;
epc__apistub_buffer = _api_call_start(API_CONFIG_GET_INTEGER, epc__apistub_size);
/* TODO: Check if epc__apistub_buffer is not NULL */
*(const char **)(epc__apistub_buffer + 0) = key;
*(int **)(epc__apistub_buffer + sizeof(const char *)) = value;
return *(int*)_api_call_transact(epc__apistub_buffer);
}
/* Autogenerated stub for API_CONFIG_GET_BOOLEAN */
int epic_config_get_boolean(const char *key, _Bool *value)
{
const int epc__apistub_size = sizeof(const char *) + sizeof(_Bool *);
void*epc__apistub_buffer;
epc__apistub_buffer = _api_call_start(API_CONFIG_GET_BOOLEAN, epc__apistub_size);
/* TODO: Check if epc__apistub_buffer is not NULL */
*(const char **)(epc__apistub_buffer + 0) = key;
*(_Bool **)(epc__apistub_buffer + sizeof(const char *)) = value;
return *(int*)_api_call_transact(epc__apistub_buffer);
}
/* Autogenerated stub for API_CONFIG_GET_STRING */
int epic_config_get_string(const char *key, char *buf, size_t buf_len)
{
const int epc__apistub_size = sizeof(const char *) + sizeof(char *) + sizeof(size_t);
void*epc__apistub_buffer;
epc__apistub_buffer = _api_call_start(API_CONFIG_GET_STRING, epc__apistub_size);
/* TODO: Check if epc__apistub_buffer is not NULL */
*(const char **)(epc__apistub_buffer + 0) = key;
*(char **)(epc__apistub_buffer + sizeof(const char *)) = buf;
*(size_t*)(epc__apistub_buffer + sizeof(const char *) + sizeof(char *)) = buf_len;
return *(int*)_api_call_transact(epc__apistub_buffer);
}
/* Weakly linked stubs for ISRs */ /* Weakly linked stubs for ISRs */
void epic_isr_bhi160_accelerometer(api_int_id_t id) void __epic_isr_reset(api_int_id_t id)
__attribute__((weak, alias("__epic_isr_default_handler"))); __attribute__((weak, alias("__epic_isr_default_handler")));
void epic_isr_bhi160_orientation(api_int_id_t id) void epic_isr_uart_rx(api_int_id_t id)
__attribute__((weak, alias("__epic_isr_default_handler"))); __attribute__((weak, alias("__epic_isr_default_handler")));
void epic_isr_bhi160_gyroscope(api_int_id_t id) void epic_isr_ctrl_c(api_int_id_t id)
__attribute__((weak, alias("__epic_isr_default_handler"))); __attribute__((weak, alias("__epic_isr_default_handler")));
void epic_isr_max30001_ecg(api_int_id_t id) void epic_isr_max86150(api_int_id_t id)
__attribute__((weak, alias("__epic_isr_default_handler"))); __attribute__((weak, alias("__epic_isr_default_handler")));
void __epic_isr_reset(api_int_id_t id) void epic_isr_bhi160_accelerometer(api_int_id_t id)
__attribute__((weak, alias("__epic_isr_default_handler"))); __attribute__((weak, alias("__epic_isr_default_handler")));
void epic_isr_uart_rx(api_int_id_t id) void epic_isr_bhi160_magnetometer(api_int_id_t id)
__attribute__((weak, alias("__epic_isr_default_handler"))); __attribute__((weak, alias("__epic_isr_default_handler")));
void epic_isr_ctrl_c(api_int_id_t id) void epic_isr_bhi160_orientation(api_int_id_t id)
__attribute__((weak, alias("__epic_isr_default_handler")));
void epic_isr_bhi160_gyroscope(api_int_id_t id)
__attribute__((weak, alias("__epic_isr_default_handler"))); __attribute__((weak, alias("__epic_isr_default_handler")));
void epic_isr_rtc_alarm(api_int_id_t id) void epic_isr_rtc_alarm(api_int_id_t id)
__attribute__((weak, alias("__epic_isr_default_handler"))); __attribute__((weak, alias("__epic_isr_default_handler")));
void epic_isr_max30001_ecg(api_int_id_t id)
__attribute__((weak, alias("__epic_isr_default_handler")));
/* Default handler stub */ /* Default handler stub */
__attribute__((weak)) void epic_isr_default_handler(api_int_id_t id) __attribute__((weak)) void epic_isr_default_handler(api_int_id_t id)
...@@ -1266,18 +1415,6 @@ void __epic_isr_default_handler(api_int_id_t id) ...@@ -1266,18 +1415,6 @@ void __epic_isr_default_handler(api_int_id_t id)
void __dispatch_isr(api_int_id_t id) void __dispatch_isr(api_int_id_t id)
{ {
switch (id) { switch (id) {
case EPIC_INT_BHI160_ACCELEROMETER:
epic_isr_bhi160_accelerometer(id);
break;
case EPIC_INT_BHI160_ORIENTATION:
epic_isr_bhi160_orientation(id);
break;
case EPIC_INT_BHI160_GYROSCOPE:
epic_isr_bhi160_gyroscope(id);
break;
case EPIC_INT_MAX30001_ECG:
epic_isr_max30001_ecg(id);
break;
case EPIC_INT_RESET: case EPIC_INT_RESET:
__epic_isr_reset(id); __epic_isr_reset(id);
break; break;
...@@ -1287,9 +1424,27 @@ void __dispatch_isr(api_int_id_t id) ...@@ -1287,9 +1424,27 @@ void __dispatch_isr(api_int_id_t id)
case EPIC_INT_CTRL_C: case EPIC_INT_CTRL_C:
epic_isr_ctrl_c(id); epic_isr_ctrl_c(id);
break; break;
case EPIC_INT_MAX86150:
epic_isr_max86150(id);
break;
case EPIC_INT_BHI160_ACCELEROMETER:
epic_isr_bhi160_accelerometer(id);
break;
case EPIC_INT_BHI160_MAGNETOMETER:
epic_isr_bhi160_magnetometer(id);
break;
case EPIC_INT_BHI160_ORIENTATION:
epic_isr_bhi160_orientation(id);
break;
case EPIC_INT_BHI160_GYROSCOPE:
epic_isr_bhi160_gyroscope(id);
break;
case EPIC_INT_RTC_ALARM: case EPIC_INT_RTC_ALARM:
epic_isr_rtc_alarm(id); epic_isr_rtc_alarm(id);
break; break;
case EPIC_INT_MAX30001_ECG:
epic_isr_max30001_ecg(id);
break;
case (-1): case (-1):
/* Ignore a spurious interrupt */ /* Ignore a spurious interrupt */
break; break;
......
...@@ -61,7 +61,7 @@ void __api_dispatch_call(uint32_t id, void*epc__apistub_buffer) ...@@ -61,7 +61,7 @@ void __api_dispatch_call(uint32_t id, void*epc__apistub_buffer)
case API_UART_WRITE_STR: case API_UART_WRITE_STR:
epic_uart_write_str( epic_uart_write_str(
*(const char **)(epc__apistub_buffer + 0), *(const char **)(epc__apistub_buffer + 0),
*(intptr_t*)(epc__apistub_buffer + sizeof(const char *)) *(size_t*)(epc__apistub_buffer + sizeof(const char *))
); );
break; break;
case API_UART_READ_CHAR: case API_UART_READ_CHAR:
...@@ -109,6 +109,12 @@ void __api_dispatch_call(uint32_t id, void*epc__apistub_buffer) ...@@ -109,6 +109,12 @@ void __api_dispatch_call(uint32_t id, void*epc__apistub_buffer)
*(uint8_t*)(epc__apistub_buffer + sizeof(int) + sizeof(uint8_t) + sizeof(uint8_t)) *(uint8_t*)(epc__apistub_buffer + sizeof(int) + sizeof(uint8_t) + sizeof(uint8_t))
); );
break; break;
case API_LEDS_GET:
*((int*)epc__apistub_buffer) = epic_leds_get_rgb(
*(int*)(epc__apistub_buffer + 0),
*(uint8_t **)(epc__apistub_buffer + sizeof(int))
);
break;
case API_LEDS_SET_HSV: case API_LEDS_SET_HSV:
epic_leds_set_hsv( epic_leds_set_hsv(
*(int*)(epc__apistub_buffer + 0), *(int*)(epc__apistub_buffer + 0),
...@@ -170,6 +176,11 @@ void __api_dispatch_call(uint32_t id, void*epc__apistub_buffer) ...@@ -170,6 +176,11 @@ void __api_dispatch_call(uint32_t id, void*epc__apistub_buffer)
*(uint8_t*)(epc__apistub_buffer + sizeof(int)) *(uint8_t*)(epc__apistub_buffer + sizeof(int))
); );
break; break;
case API_LEDS_GET_ROCKET:
*((int*)epc__apistub_buffer) = epic_leds_get_rocket(
*(int*)(epc__apistub_buffer + 0)
);
break;
case API_LEDS_SET_FLASHLIGHT: case API_LEDS_SET_FLASHLIGHT:
epic_set_flashlight( epic_set_flashlight(
*(_Bool*)(epc__apistub_buffer + 0) *(_Bool*)(epc__apistub_buffer + 0)
...@@ -201,6 +212,16 @@ void __api_dispatch_call(uint32_t id, void*epc__apistub_buffer) ...@@ -201,6 +212,16 @@ void __api_dispatch_call(uint32_t id, void*epc__apistub_buffer)
*(struct bme680_sensor_data **)(epc__apistub_buffer + 0) *(struct bme680_sensor_data **)(epc__apistub_buffer + 0)
); );
break; break;
case API_MAX86150_ENABLE:
*((int*)epc__apistub_buffer) = epic_max86150_enable_sensor(
*(struct max86150_sensor_config **)(epc__apistub_buffer + 0),
*(size_t*)(epc__apistub_buffer + sizeof(struct max86150_sensor_config *))
);
break;
case API_MAX86150_DISABLE:
*((int*)epc__apistub_buffer) = epic_max86150_disable_sensor(
);
break;
case API_PERSONAL_STATE_SET: case API_PERSONAL_STATE_SET:
*((int*)epc__apistub_buffer) = epic_personal_state_set( *((int*)epc__apistub_buffer) = epic_personal_state_set(
*(uint8_t*)(epc__apistub_buffer + 0), *(uint8_t*)(epc__apistub_buffer + 0),
...@@ -261,11 +282,21 @@ void __api_dispatch_call(uint32_t id, void*epc__apistub_buffer) ...@@ -261,11 +282,21 @@ void __api_dispatch_call(uint32_t id, void*epc__apistub_buffer)
break; break;
case API_DISP_PRINT: case API_DISP_PRINT:
*((int*)epc__apistub_buffer) = epic_disp_print( *((int*)epc__apistub_buffer) = epic_disp_print(
*(uint16_t*)(epc__apistub_buffer + 0), *(int16_t*)(epc__apistub_buffer + 0),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t)), *(int16_t*)(epc__apistub_buffer + sizeof(int16_t)),
*(const char **)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t)), *(const char **)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t)),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(const char *)), *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(const char *)),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(const char *) + sizeof(uint16_t)) *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(const char *) + sizeof(uint16_t))
);
break;
case API_DISP_PRINT_ADV:
*((int*)epc__apistub_buffer) = epic_disp_print_adv(
*(uint8_t*)(epc__apistub_buffer + 0),
*(int16_t*)(epc__apistub_buffer + sizeof(uint8_t)),
*(int16_t*)(epc__apistub_buffer + sizeof(uint8_t) + sizeof(int16_t)),
*(const char **)(epc__apistub_buffer + sizeof(uint8_t) + sizeof(int16_t) + sizeof(int16_t)),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint8_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(const char *)),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint8_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(const char *) + sizeof(uint16_t))
); );
break; break;
case API_DISP_CLEAR: case API_DISP_CLEAR:
...@@ -275,41 +306,41 @@ void __api_dispatch_call(uint32_t id, void*epc__apistub_buffer) ...@@ -275,41 +306,41 @@ void __api_dispatch_call(uint32_t id, void*epc__apistub_buffer)
break; break;
case API_DISP_PIXEL: case API_DISP_PIXEL:
*((int*)epc__apistub_buffer) = epic_disp_pixel( *((int*)epc__apistub_buffer) = epic_disp_pixel(
*(uint16_t*)(epc__apistub_buffer + 0), *(int16_t*)(epc__apistub_buffer + 0),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t)), *(int16_t*)(epc__apistub_buffer + sizeof(int16_t)),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t)) *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t))
); );
break; break;
case API_DISP_LINE: case API_DISP_LINE:
*((int*)epc__apistub_buffer) = epic_disp_line( *((int*)epc__apistub_buffer) = epic_disp_line(
*(uint16_t*)(epc__apistub_buffer + 0), *(int16_t*)(epc__apistub_buffer + 0),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t)), *(int16_t*)(epc__apistub_buffer + sizeof(int16_t)),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t)), *(int16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t)),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t)), *(int16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t)),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t)), *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t)),
*(enum disp_linestyle*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t)), *(enum disp_linestyle*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t)),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(enum disp_linestyle)) *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t) + sizeof(enum disp_linestyle))
); );
break; break;
case API_DISP_RECT: case API_DISP_RECT:
*((int*)epc__apistub_buffer) = epic_disp_rect( *((int*)epc__apistub_buffer) = epic_disp_rect(
*(uint16_t*)(epc__apistub_buffer + 0), *(int16_t*)(epc__apistub_buffer + 0),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t)), *(int16_t*)(epc__apistub_buffer + sizeof(int16_t)),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t)), *(int16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t)),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t)), *(int16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t)),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t)), *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t)),
*(enum disp_fillstyle*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t)), *(enum disp_fillstyle*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t)),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(enum disp_fillstyle)) *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t) + sizeof(enum disp_fillstyle))
); );
break; break;
case API_DISP_CIRC: case API_DISP_CIRC:
*((int*)epc__apistub_buffer) = epic_disp_circ( *((int*)epc__apistub_buffer) = epic_disp_circ(
*(uint16_t*)(epc__apistub_buffer + 0), *(int16_t*)(epc__apistub_buffer + 0),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t)), *(int16_t*)(epc__apistub_buffer + sizeof(int16_t)),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t)), *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t)),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t)), *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t)),
*(enum disp_fillstyle*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t)), *(enum disp_fillstyle*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t) + sizeof(uint16_t)),
*(uint16_t*)(epc__apistub_buffer + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(enum disp_fillstyle)) *(uint16_t*)(epc__apistub_buffer + sizeof(int16_t) + sizeof(int16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(enum disp_fillstyle))
); );
break; break;
case API_DISP_FRAMEBUFFER: case API_DISP_FRAMEBUFFER:
...@@ -414,6 +445,14 @@ void __api_dispatch_call(uint32_t id, void*epc__apistub_buffer) ...@@ -414,6 +445,14 @@ void __api_dispatch_call(uint32_t id, void*epc__apistub_buffer)
*(const char **)(epc__apistub_buffer + 0) *(const char **)(epc__apistub_buffer + 0)
); );
break; break;
case API_RTC_GET_MONOTONIC_SECONDS:
*((uint32_t*)epc__apistub_buffer) = epic_rtc_get_monotonic_seconds(
);
break;
case API_RTC_GET_MONOTONIC_MILLISECONDS:
*((uint64_t*)epc__apistub_buffer) = epic_rtc_get_monotonic_milliseconds(
);
break;
case API_RTC_GET_SECONDS: case API_RTC_GET_SECONDS:
*((uint32_t*)epc__apistub_buffer) = epic_rtc_get_seconds( *((uint32_t*)epc__apistub_buffer) = epic_rtc_get_seconds(
); );
...@@ -459,6 +498,32 @@ void __api_dispatch_call(uint32_t id, void*epc__apistub_buffer) ...@@ -459,6 +498,32 @@ void __api_dispatch_call(uint32_t id, void*epc__apistub_buffer)
*((int*)epc__apistub_buffer) = epic_usb_cdcacm( *((int*)epc__apistub_buffer) = epic_usb_cdcacm(
); );
break; break;
case API_WS2812_WRITE:
epic_ws2812_write(
*(uint8_t*)(epc__apistub_buffer + 0),
*(uint8_t **)(epc__apistub_buffer + sizeof(uint8_t)),
*(uint32_t*)(epc__apistub_buffer + sizeof(uint8_t) + sizeof(uint8_t *))
);
break;
case API_CONFIG_GET_INTEGER:
*((int*)epc__apistub_buffer) = epic_config_get_integer(
*(const char **)(epc__apistub_buffer + 0),
*(int **)(epc__apistub_buffer + sizeof(const char *))
);
break;
case API_CONFIG_GET_BOOLEAN:
*((int*)epc__apistub_buffer) = epic_config_get_boolean(
*(const char **)(epc__apistub_buffer + 0),
*(_Bool **)(epc__apistub_buffer + sizeof(const char *))
);
break;
case API_CONFIG_GET_STRING:
*((int*)epc__apistub_buffer) = epic_config_get_string(
*(const char **)(epc__apistub_buffer + 0),
*(char **)(epc__apistub_buffer + sizeof(const char *)),
*(size_t*)(epc__apistub_buffer + sizeof(const char *) + sizeof(char *))
);
break;
default: default:
/* TODO: Better error handling */ /* TODO: Better error handling */
LOG_ERR("api-dispatcher", "API function 0x%lx is unknown!!", id); LOG_ERR("api-dispatcher", "API function 0x%lx is unknown!!", id);
......
let { mozillaOverlay ? import (builtins.fetchTarball https://github.com/mozilla/nixpkgs-mozilla/archive/master.tar.gz),
mozillaOverlay = import (builtins.fetchTarball https://github.com/mozilla/nixpkgs-mozilla/archive/master.tar.gz); pkgs ? import <nixpkgs> { overlays = [ mozillaOverlay ]; },
pkgs = import <nixpkgs> { overlays = [ mozillaOverlay ]; }; firmwareSrc ? ./card10-sys/firmware,
in }:
with pkgs; with pkgs;
let let
rust = rustChannelOfTargets "nightly" null [ "thumbv7em-none-eabi" ]; rust = rustChannelOfTargets "nightly" null [ "thumbv7em-none-eabi" ];
...@@ -11,7 +11,7 @@ let ...@@ -11,7 +11,7 @@ let
}; };
epic-stubs = stdenv.mkDerivation { epic-stubs = stdenv.mkDerivation {
name = "epic-stubs"; name = "epic-stubs";
src = ./card10-sys/firmware; src = firmwareSrc;
buildInputs = [ gcc python3 ]; buildInputs = [ gcc python3 ];
buildPhase = '' buildPhase = ''
${python3}/bin/python epicardium/api/genapi.py -H epicardium/epicardium.h -c client.c -s server.c ${python3}/bin/python epicardium/api/genapi.py -H epicardium/epicardium.h -c client.c -s server.c
...@@ -25,10 +25,13 @@ let ...@@ -25,10 +25,13 @@ let
name = "rust-card10"; name = "rust-card10";
version = "0.0.0"; version = "0.0.0";
src = ./.; src = ./.;
cargoSha256 = "10nims5j9r0d7pcfbbj8ycqxhcx7n07958jvkib29b0sf9c6qh3z"; cargoSha256 = "16vchzfk50crr7kbiy84d1spq072ywa7s5jz886nvh7hah94w4a1";
buildInputs = [ pkgsCross.arm-embedded.stdenv.cc ]; buildInputs = [ pkgsCross.arm-embedded.stdenv.cc ];
prePatch = '' prePatch = ''
cp ${epic-stubs}/client.c card10-sys/vendor/ cp ${epic-stubs}/client.c card10-sys/vendor/
'' + lib.optionalString (firmwareSrc != ./card10-sys/firmware) ''
rm -r card10-sys/firmware
cp -r ${firmwareSrc} card10-sys/firmware
''; '';
NIX_DEBUG=1; NIX_DEBUG=1;
LIBCLANG_PATH="${llvmPackages.libclang}/lib"; LIBCLANG_PATH="${llvmPackages.libclang}/lib";
......
...@@ -9,7 +9,7 @@ use embedded_graphics::pixelcolor::Rgb565; ...@@ -9,7 +9,7 @@ use embedded_graphics::pixelcolor::Rgb565;
main!(main); main!(main);
fn main() { fn main() {
let display = Display::open(); let mut display = Display::open();
let mut framebuffer = display.framebuffer(); let mut framebuffer = display.framebuffer();
let image: Image16BPP<Rgb565> = let image: Image16BPP<Rgb565> =
......
...@@ -25,6 +25,10 @@ fn run() -> Result<(), Error> { ...@@ -25,6 +25,10 @@ fn run() -> Result<(), Error> {
let g = BHI160::<Gyroscope>::start()?; let g = BHI160::<Gyroscope>::start()?;
let o = BHI160::<Orientation>::start()?; let o = BHI160::<Orientation>::start()?;
set_rocket(Rocket::Blue, 20);
set_rocket(Rocket::Yellow, 20);
set_rocket(Rocket::Green, 10);
let display = Display::open(); let display = Display::open();
let light = LightSensor::start(); let light = LightSensor::start();
...@@ -47,25 +51,25 @@ fn run() -> Result<(), Error> { ...@@ -47,25 +51,25 @@ fn run() -> Result<(), Error> {
} }
display.clear(Color::yellow()); display.clear(Color::yellow());
display.print(160 - t, 10, b"Hello Rust\0", Color::white(), Color::black()); display!(display, 160 - t, 10, Color::white(), Color::black(), "Hello Rust {}", t);
let b = Buttons::read(); let b = Buttons::read();
if b.left_bottom() { if b.left_bottom() {
display.print(0, 60, b"LB\0", Color::red(), Color::black()); display!(display, 0, 60, Color::red(), Color::black(), "LB");
vibra::set(true); vibra::set(true);
} }
if b.right_bottom() { if b.right_bottom() {
display.print(80, 60, b"RB\0", Color::red(), Color::black()); display!(display, 80, 60, Color::red(), Color::black(), "RB");
vibra::set(false); vibra::set(false);
} }
if b.left_top() { if b.left_top() {
display.print(0, 10, b"LT\0", Color::red(), Color::black()); display!(display, 0, 10, Color::red(), Color::black(), "LT");
} }
if b.right_top() { if b.right_top() {
display.print(80, 10, b"RT\0", Color::red(), Color::black()); display!(display, 80, 10, Color::red(), Color::black(), "RT");
} }
if b.right_top() { if b.right_top() {
display.print(80, 30, b"Reset\0", Color::red(), Color::black()); display!(display, 80, 30, Color::red(), Color::black(), "Reset");
} }
writeln!(UART, "Light: {:?}\r", light.get())?; writeln!(UART, "Light: {:?}\r", light.get())?;
......
{ pkgs ? import <nixpkgs> {},
src ? ./.,
srcPath ? "card10-sys/firmware",
}:
with pkgs;
let
cSrc = stdenv.mkDerivation rec {
name = "card10-src";
inherit src;
phases = [ "unpackPhase" "patchPhase" "installPhase" ];
nativeBuildInputs = [ git ];
prePatch = "cd ${srcPath}";
patches = [
./0001-hack-epicardium-reduce-init-delay-from-2s-to-0.1s.patch
];
postPatch = ''
VERSION="$(git -C ${src} describe --always)"
GITHASH="$(git -C ${src} rev-parse HEAD)"
substituteInPlace tools/version-header.sh \
--replace "\$VERSION" "$VERSION" \
--replace "\$GITHASH" "$GITHASH" \
--replace "git -C" echo
'';
installPhase = ''
cp -ar . $out
mkdir -p $out/nix-support
for f in $out/*.bin ; do
echo file binary-dist $f >> $out/nix-support/hydra-build-products
done
'';
};
firmware = lib.makeOverridable (attrs: {
inherit (attrs) src;
firmware = import attrs.src;
}) { src = cSrc; };
in firmware
Source diff could not be displayed: it is too large. Options to address this: view the blob.
{ pkgs ? import <nixpkgs> {},
cFirmware ? <c-firmware>,
rkanoid ? <rkanoid>,
}:
with pkgs;
let
l0dables = buildEnv {
name = "l0dables";
paths = [ rkanoid ];
pathsToLink = [ "/apps" ];
};
release = import ../release.nix {
inherit cFirmware;
rustL0dables = l0dables;
};
releaseZip = stdenv.mkDerivation {
name = "card10-combined.zip";
nativeBuildInputs = [ release zip ];
phases = [ "installPhase" ];
installPhase = ''
mkdir -p $out/nix-support
cd ${release}/
zip -9r $out/firmware.zip .
echo file binary-dist $out/firmware.zip >> $out/nix-support/hydra-build-products
'';
};
in {
release = lib.hydraJob release;
release-zip = lib.hydraJob releaseZip;
}
{ pkgs ? import <nixpkgs> {},
}:
with pkgs;
let
firmwareSrc = import ../firmware.nix {
inherit pkgs;
src = <firmware>;
srcPath = ".";
};
firmwareGit = firmwareSrc.override (oldArgs: {
src = oldArgs.src.overrideAttrs (oldAttrs: {
name = "${oldAttrs.name}-git";
# no more git, .git is dropped by Hydra
nativeBuildInputs = [];
postPatch = ''
VERSION="0.0-git"
GITHASH="0000000000000000000000000000000000000000"
substituteInPlace tools/version-header.sh \
--replace "\$VERSION" "$VERSION" \
--replace "\$GITHASH" "$GITHASH" \
--replace "git -C" echo
'';
});
});
firmware = firmwareGit.firmware.overrideAttrs (oldAttrs: {
buildCommand = ''
${oldAttrs.buildCommand}
mkdir -p $out/nix-support
for f in $out/**/*.elf $out/card10/*.bin ; do
echo file binary-dist $f >> $out/nix-support/hydra-build-products
done
'';
});
firmwareZip = stdenv.mkDerivation {
name = "card10-firmware.zip";
nativeBuildInputs = [ firmware zip ];
phases = [ "installPhase" ];
installPhase = ''
mkdir -p $out/nix-support
cd ${firmware}/card10/
zip -9r $out/firmware.zip .
echo file binary-dist $out/firmware.zip >> $out/nix-support/hydra-build-products
'';
};
in {
firmware = lib.hydraJob firmware;
firmware-zip = lib.hydraJob firmwareZip;
}
{
"enabled": 1,
"type": 0,
"hidden": true,
"description": "Jobsets",
"nixexprinput": "rust-card10",
"nixexprpath": "hydra/hydra.nix",
"checkinterval": 300,
"schedulingshares": 100,
"enableemail": false,
"emailoverride": "astro@spaceboyz.net",
"keepnr": 30,
"inputs": {
"nixpkgs": { "type": "git", "value": "https://github.com/NixOS/nixpkgs-channels nixos-19.09", "emailresponsible": false },
"rust-card10": { "type": "git", "value": "https://git.card10.badge.events.ccc.de/astro/rust-card10.git", "emailresponsible": false }
}
}
{ pkgs ? import <nixpkgs> {} }:
let
jobsets = {
c-firmware = {
enabled = 1;
type = 0;
hidden = false;
description = "card10 C firmware";
nixexprinput = "rust-card10";
nixexprpath = "hydra/firmware.nix";
checkinterval = 300;
schedulingshares = 100;
enableemail = true;
emailoverride = "astro@spaceboyz.net";
keepnr = 3;
inputs = {
firmware = { type = "git"; value = "https://git.card10.badge.events.ccc.de/card10/firmware.git"; emailresponsible = false; };
rust-card10 = { type = "git"; value = "https://git.card10.badge.events.ccc.de/astro/rust-card10.git"; emailresponsible = false; };
nixpkgs = { type = "git"; value = "git://github.com/NixOS/nixpkgs.git release-19.09"; emailresponsible = false; };
};
};
rust-l0dables = {
enabled = 1;
type = 0;
hidden = false;
description = "card10 Rust l0dable examples";
nixexprinput = "rust-card10";
nixexprpath = "hydra/l0dables.nix";
checkinterval = 300;
schedulingshares = 100;
enableemail = true;
emailoverride = "astro@spaceboyz.net";
keepnr = 3;
inputs = {
firmware = { type = "git"; value = "https://git.card10.badge.events.ccc.de/card10/firmware.git"; emailresponsible = false; };
rust-card10 = { type = "git"; value = "https://git.card10.badge.events.ccc.de/astro/rust-card10.git"; emailresponsible = false; };
nixpkgs = { type = "git"; value = "git://github.com/NixOS/nixpkgs.git release-19.09"; emailresponsible = false; };
mozillaOverlay = { type = "git"; value = "git://github.com/mozilla/nixpkgs-mozilla.git"; emailresponsible = false; };
};
};
firmware-combined = {
enabled = 1;
type = 0;
hidden = false;
description = "Prepared firmware with Rust l0dables";
nixexprinput = "rust-card10";
nixexprpath = "hydra/combined.nix";
checkinterval = 300;
schedulingshares = 100;
enableemail = true;
emailoverride = "astro@spaceboyz.net";
keepnr = 3;
inputs = {
rust-card10 = { type = "git"; value = "https://git.card10.badge.events.ccc.de/astro/rust-card10.git"; emailresponsible = false; };
c-firmware = { type = "build"; value = "rust-card10:c-firmware:firmware"; emailresponsible = false; };
rkanoid = { type = "build"; value = "rust-card10:rust-l0dables:rkanoid"; emailresponsible = false; };
nixpkgs = { type = "git"; value = "git://github.com/NixOS/nixpkgs.git release-19.09"; emailresponsible = false; };
};
};
};
jobsetsJson = pkgs.writeText "jobsets.json" (builtins.toJSON jobsets );
in
{
jobsets = pkgs.runCommand "rust-card10.json" {} ''
cp ${jobsetsJson} $out
'';
}