// ---- 1. Parser:SDK 内置 ColourTransformer 源码参考 ----
// Transformer 接口:{ uuid, defaultValue, parser(dpStr) → T, formatter(data: T) → string }
// parser 的返回值类型 T 决定了 useStructuredProps 中对应 DP code 的结构化类型
// 自定义 parser 同理,实现 parser + formatter 即可
type TColorData = { hue: number; saturation: number; value: number };
class ColourTransformer implements Transformer<TColorData> {
defaultValue = { hue: 10, saturation: 1000, value: 1000 };
uuid = 'colour_data';
// parser 返回 TColorData → useStructuredProps 中 props.colour_data 即为此类型
parser(value: string): TColorData {
if (value.length !== 12) return this.defaultValue;
const step = generateDpStrStep(value);
return { hue: step(4).value, saturation: step(4).value, value: step(4).value };
}
formatter(data: TColorData) {
const { hue, saturation, value } = data;
return `${decimalToHex(hue, 4)}${decimalToHex(saturation, 4)}${decimalToHex(value, 4)}`;
}
}
// ---- 2. devices/protocols/index.ts:实例化 parser 并映射到 DP code ----
import { protocols as sdkProtocols } from '@ray-js/panel-sdk';
import { lampSchemaMap } from '../schema';
export const protocols = {
// 实际变量名称为 colour_data,映射到 DP code
[lampSchemaMap.colour_data.code]: new sdkProtocols.ColourTransformer(),
};
// ---- 3. devices/index.ts:创建 dpKit 并传给 sdm 实例 ----
import { SmartDeviceModel, createDpKit } from '@ray-js/panel-sdk';
import { protocols } from '@/devices/protocols';
export const dpKit = createDpKit({ protocols });
export const devices = {
lamp: new SmartDeviceModel({ interceptors: dpKit.interceptors }),
};
// ---- 4. 页面组件:通过 useStructuredProps 消费结构化数据 ----
// props.colour_data 的类型 = ColourTransformer.parser() 的返回值 TColorData
// 即 { hue: number; saturation: number; value: number }
import { useStructuredProps } from '@ray-js/panel-sdk';
export default function Home() {
const colour = useStructuredProps(props => props.colour_data);
return (
<View>
<View>hue: {colour.hue}</View>
<View>saturation: {colour.saturation}</View>
<View>value: {colour.value}</View>
</View>
);
}