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}