// Copyright (c) 2012 - 2026 kio@little-bat.de
// BSD-2-Clause license
// https://opensource.org/licenses/BSD-2-Clause

#include "PicoTerm.h"
#include "Graphics/Printer<Canvas>.h"
#include "Graphics/Printer<CharMap>.h"
#include "Graphics/Printer<SimpleCharMap>.h"
//#include "USBHost/USBKeyboard.h"
#include "common/cstrings.h"

namespace kilipili
{

// =============================================================================
//							F U N C T I O N S
// =============================================================================


PicoTerm::PicoTerm(RCPtr<Printer<>> text) noexcept : //
	SerialDevice(writable),
	printer(text)
{
	//auto_crlf = true;
	//reset();
}

void PicoTerm::reset() noexcept
{
	// all settings = default, home cursor
	// does not clear screen

	auto_crlf = true;
	printer->reset();
}

uint32 PicoTerm::ioctl(IoCtl cmd, void* arg1, void* arg2)
{
	switch (cmd.cmd)
	{
	case IoCtl::FLUSH_OUT: return 0;
	case IoCtl::CTRL_RESET: reset(); return 0;
	default: return super::ioctl(cmd, arg1, arg2);
	}
}

SIZE PicoTerm::write(const void* _data, SIZE count, bool /*partial*/)
{
	cptr data = cptr(_data);
	cptr end  = data + count;

	while (void* null = memchr(data, 0, size_t(end - data)))
	{
		printer->print(data);
		printer->printChar(0);
		data = cptr(null) + 1;
	}

	printer->printf("%*s", int(end - data), data);
	return count;
}

} // namespace kilipili

/*





































*/
