ddc_node_rs/
lib.rs

1extern crate core;
2
3mod data;
4mod neon_utils;
5mod utils;
6
7use crate::data::{StructFromObject, StructToObject, VcpWriteValue};
8use ddc_hi::{FeatureCode, Query};
9use neon::prelude::*;
10use neon::types::buffer::TypedArray;
11
12pub fn display_get_vcp_feature(mut cx: FunctionContext) -> JsResult<JsObject> {
13    let index = cx.argument::<JsNumber>(0)?.value(&mut cx) as usize;
14    let feature_code = cx.argument::<JsNumber>(1)?.value(&mut cx) as FeatureCode;
15
16    match utils::get_vcp_feature(index, feature_code) {
17        Ok(value) => value.to_object(&mut cx),
18        Err(error) => cx.throw_error(error.to_string())?,
19    }
20}
21
22pub fn display_set_vcp_feature(mut cx: FunctionContext) -> JsResult<JsUndefined> {
23    let index = cx.argument::<JsNumber>(0)?.value(&mut cx) as usize;
24    let feature_code = cx.argument::<JsNumber>(1)?.value(&mut cx) as FeatureCode;
25    let value = cx.argument::<JsNumber>(2)?.value(&mut cx) as u16;
26
27    let vcp_write_value = VcpWriteValue::Single(value);
28
29    match utils::set_vcp_feature(index, feature_code, vcp_write_value) {
30        Ok(_) => Ok(cx.undefined()),
31        Err(error) => cx.throw_error(error.to_string())?,
32    }
33}
34
35pub fn display_set_table_vcp_feature(mut cx: FunctionContext) -> JsResult<JsUndefined> {
36    let index = cx.argument::<JsNumber>(0)?.value(&mut cx) as usize;
37    let feature_code = cx.argument::<JsNumber>(1)?.value(&mut cx) as FeatureCode;
38    let offset = cx.argument::<JsNumber>(3)?.value(&mut cx) as u16;
39    let data = cx.argument::<JsArrayBuffer>(2)?;
40    let data = data.as_slice(&mut cx);
41
42    let vcp_write_value = VcpWriteValue::Bytes(Vec::from(data), offset);
43
44    match utils::set_vcp_feature(index, feature_code, vcp_write_value) {
45        Ok(_) => Ok(cx.undefined()),
46        Err(error) => cx.throw_error(error.to_string())?,
47    }
48}
49
50pub fn display_manager_get_by_index(mut cx: FunctionContext) -> JsResult<JsObject> {
51    let index = cx.argument::<JsNumber>(0)?.value(&mut cx) as usize;
52
53    let (index, display) =
54        utils::get_display(false, index).or_else(|error| cx.throw_error(error.to_string()))?;
55    let display_object = display.to_object(&mut cx)?;
56    let index = cx.number(index as f64);
57    display_object.set(&mut cx, "index", index)?;
58
59    Ok(display_object)
60}
61
62pub fn display_manager_list(mut cx: FunctionContext) -> JsResult<JsArray> {
63    let queries = cx.argument::<JsArray>(0)?.to_vec(&mut cx)?;
64    let mut effective_queries: Vec<Query> = vec![];
65
66    for query in queries {
67        if query.is_a::<JsObject, _>(&mut cx) {
68            let query = query.downcast::<JsObject, _>(&mut cx).unwrap();
69            if let Some(query) = Query::from_object(&mut cx, query) {
70                effective_queries.push(query);
71            }
72        }
73    }
74    let final_query = if effective_queries.len() == 0 {
75        Query::Any
76    } else {
77        Query::And(effective_queries)
78    };
79
80    let displays = utils::get_displays(false, final_query)
81        .or_else(|error| cx.throw_error(error.to_string()))?;
82    let displays_array = cx.empty_array();
83    for (array_index, (index, display)) in displays.into_iter().enumerate() {
84        let display_object = display.to_object(&mut cx)?;
85        let index = cx.number(index as f64);
86        display_object.set(&mut cx, "index", index)?;
87        displays_array.set(&mut cx, array_index as u32, display_object)?;
88    }
89
90    Ok(displays_array)
91}
92
93#[neon::main]
94fn main(mut cx: ModuleContext) -> NeonResult<()> {
95    cx.export_function("displayGetVcpFeature", display_get_vcp_feature)?;
96    cx.export_function("displaySetVcpFeature", display_set_vcp_feature)?;
97    cx.export_function("displaySetTableVcpFeature", display_set_table_vcp_feature)?;
98    cx.export_function("displayManagerGetByIndex", display_manager_get_by_index)?;
99    cx.export_function("displayManagerList", display_manager_list)?;
100    Ok(())
101}