#ifndef NALL_EMULATION_SUPER_FAMICOM_USART_HPP #define NALL_EMULATION_SUPER_FAMICOM_USART_HPP #include #include using namespace nall; #include #include #include #define usartproc dllexport static function usart_quit; static function usart_usleep; static function usart_readable; static function usart_read; static function usart_writable; static function usart_write; extern "C" usartproc auto usart_init( function quit, function usleep, function readable, function read, function writable, function write ) -> void { usart_quit = quit; usart_usleep = usleep; usart_readable = readable; usart_read = read; usart_writable = writable; usart_write = write; } extern "C" usartproc auto usart_main(nall::lstring) -> void; // static serial usart; static bool usart_is_virtual = true; static bool usart_sigint = false; static auto usart_virtual() -> bool { return usart_is_virtual; } // static auto usarthw_quit() -> bool { return usart_sigint; } static auto usarthw_usleep(uint milliseconds) -> void { usleep(milliseconds); } static auto usarthw_readable() -> bool { return usart.readable(); } static auto usarthw_read() -> uint8 { while(true) { uint8 buffer[1]; int length = usart.read((uint8_t*)&buffer, 1); if(length > 0) return buffer[0]; } } static auto usarthw_writable() -> bool { return usart.writable(); } static auto usarthw_write(uint8 data) -> void { uint8 buffer[1] = {data}; usart.write((uint8*)&buffer, 1); } static auto sigint(int) -> void { signal(SIGINT, SIG_DFL); usart_sigint = true; } #include auto nall::main(lstring args) -> void { setpriority(PRIO_PROCESS, 0, -20); //requires superuser privileges; otherwise priority = +0 signal(SIGINT, sigint); if(!usart.open("/dev/ttyACM0", 57600, true)) { return print("error: unable to open USART hardware device\n"); } usart_is_virtual = false; usart_init(usarthw_quit, usarthw_usleep, usarthw_readable, usarthw_read, usarthw_writable, usarthw_write); usart_main(args); usart.close(); } #endif