86 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include <chrono>
 | 
						|
#include <functional>
 | 
						|
#include <pybind11/cast.h>
 | 
						|
#include <pybind11/chrono.h>
 | 
						|
#include <pybind11/functional.h>
 | 
						|
#include <pybind11/pybind11.h>
 | 
						|
#include <pybind11/pytypes.h>
 | 
						|
 | 
						|
#include "simplesync.hpp"
 | 
						|
 | 
						|
namespace py = pybind11;
 | 
						|
typedef simplesync::SimpleSync<std::chrono::time_point<std::chrono::steady_clock>,
 | 
						|
                               std::chrono::nanoseconds, 1024, true>
 | 
						|
    SimpleS;
 | 
						|
 | 
						|
PYBIND11_MODULE(pysimplesync, m) {
 | 
						|
    py::class_<SimpleS>(m, "SimpleSync")
 | 
						|
        .def(py::init([](const std::function<void(py::bytes)> &write) {
 | 
						|
            return std::unique_ptr<SimpleS>(new SimpleS(
 | 
						|
                [write](uint8_t *buf, unsigned int buf_size) {
 | 
						|
                    std::string sbuf;
 | 
						|
                    sbuf.assign((char *)buf, buf_size);
 | 
						|
                    write(py::bytes(sbuf));
 | 
						|
                    // py::print(py::bytes((char *)buf, buf_size));
 | 
						|
                    return 0;
 | 
						|
                },
 | 
						|
                []() { return (std::chrono::steady_clock::now()); }));
 | 
						|
        }))
 | 
						|
        .def("request_all_interfaces", &SimpleS::request_all_interfaces)
 | 
						|
        .def(
 | 
						|
            "__getitem__",
 | 
						|
            [](SimpleS &s, const std::string &key) -> py::object {
 | 
						|
                auto ni = s.get_number(key.c_str());
 | 
						|
                if (ni) return py::int_(*ni);
 | 
						|
                auto si = s.get_string(key.c_str());
 | 
						|
                if (si) return py::str(*si);
 | 
						|
                throw pybind11::key_error();
 | 
						|
            },
 | 
						|
            py::is_operator())
 | 
						|
        .def(
 | 
						|
            "__getitem__",
 | 
						|
            [](SimpleS &s, unsigned int i) -> py::tuple {
 | 
						|
                if (i < s.interfaces.size()) {
 | 
						|
                    auto &interface = s.interfaces[i];
 | 
						|
                    if (!interface) throw pybind11::index_error();
 | 
						|
                    switch (interface->type) {
 | 
						|
                    case 0x01:
 | 
						|
                        return py::make_tuple(py::str(interface->key),
 | 
						|
                                              py::int_(*s.get_number(interface->key.c_str())));
 | 
						|
                    case 0x02:
 | 
						|
                        return py::make_tuple(py::str(interface->key),
 | 
						|
                                              py::str(*s.get_string(interface->key.c_str())));
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                throw pybind11::index_error();
 | 
						|
            },
 | 
						|
            py::is_operator())
 | 
						|
        .def(
 | 
						|
            "__setitem__",
 | 
						|
            [](SimpleS &s, const std::string &key, py::object value) {
 | 
						|
                if (py::isinstance<py::int_>(value)) {
 | 
						|
                    auto ni = s.get_or_create_interface(0x01, key.c_str());
 | 
						|
                    if (ni) {
 | 
						|
                        *(int *)ni->data   = value.cast<int>();
 | 
						|
                        ni->send_requested = true;
 | 
						|
                        return;
 | 
						|
                    }
 | 
						|
                } else if (py::isinstance<py::str>(value)) {
 | 
						|
                    auto ni = s.get_or_create_interface(0x02, key.c_str());
 | 
						|
                    if (ni) {
 | 
						|
                        *(std::string *)ni->data = value.cast<std::string>();
 | 
						|
                        ni->send_requested       = true;
 | 
						|
                        return;
 | 
						|
                    }
 | 
						|
                } else
 | 
						|
                    throw pybind11::type_error();
 | 
						|
                throw pybind11::key_error();
 | 
						|
            },
 | 
						|
            py::is_operator())
 | 
						|
        .def("update", &SimpleS::update)
 | 
						|
        .def("handle_stream", [](SimpleS &s, const std::string &buf_new) {
 | 
						|
            /* handle_stream(b'\x06\x01\x74\x65\x73\x74\x04\x6d\x21\x97\x00') */
 | 
						|
            s.handle_stream((const uint8_t *)buf_new.data(), buf_new.length());
 | 
						|
        });
 | 
						|
}
 |