tjbot-ce 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +382 -0
  3. package/dist/camera/camera.d.ts +62 -0
  4. package/dist/camera/camera.d.ts.map +1 -0
  5. package/dist/camera/camera.js +155 -0
  6. package/dist/camera/camera.js.map +1 -0
  7. package/dist/camera/index.d.ts +18 -0
  8. package/dist/camera/index.d.ts.map +1 -0
  9. package/dist/camera/index.js +18 -0
  10. package/dist/camera/index.js.map +1 -0
  11. package/dist/config/config-types.d.ts +75 -0
  12. package/dist/config/config-types.d.ts.map +1 -0
  13. package/dist/config/config-types.generated.d.ts +495 -0
  14. package/dist/config/config-types.generated.d.ts.map +1 -0
  15. package/dist/config/config-types.generated.js +2 -0
  16. package/dist/config/config-types.generated.js.map +1 -0
  17. package/dist/config/config-types.js +175 -0
  18. package/dist/config/config-types.js.map +1 -0
  19. package/dist/config/index.d.ts +20 -0
  20. package/dist/config/index.d.ts.map +1 -0
  21. package/dist/config/index.js +19 -0
  22. package/dist/config/index.js.map +1 -0
  23. package/dist/config/tjbot-config.d.ts +98 -0
  24. package/dist/config/tjbot-config.d.ts.map +1 -0
  25. package/dist/config/tjbot-config.js +309 -0
  26. package/dist/config/tjbot-config.js.map +1 -0
  27. package/dist/config/vendor/colors.yaml +61 -0
  28. package/dist/config/vendor/model-registry.yaml +275 -0
  29. package/dist/config/vendor/tjbot-config.schema.yaml +792 -0
  30. package/dist/config/vendor/tjbot.default.toml +452 -0
  31. package/dist/led/index.d.ts +20 -0
  32. package/dist/led/index.d.ts.map +1 -0
  33. package/dist/led/index.js +20 -0
  34. package/dist/led/index.js.map +1 -0
  35. package/dist/led/led-common-anode.d.ts +38 -0
  36. package/dist/led/led-common-anode.d.ts.map +1 -0
  37. package/dist/led/led-common-anode.js +79 -0
  38. package/dist/led/led-common-anode.js.map +1 -0
  39. package/dist/led/led-neopixel-spi.d.ts +60 -0
  40. package/dist/led/led-neopixel-spi.d.ts.map +1 -0
  41. package/dist/led/led-neopixel-spi.js +216 -0
  42. package/dist/led/led-neopixel-spi.js.map +1 -0
  43. package/dist/led/led-neopixel-ws281x.js +186 -0
  44. package/dist/led/led-neopixel.d.ts +57 -0
  45. package/dist/led/led-neopixel.d.ts.map +1 -0
  46. package/dist/led/led-neopixel.js +235 -0
  47. package/dist/led/led-neopixel.js.map +1 -0
  48. package/dist/microphone/index.d.ts +18 -0
  49. package/dist/microphone/index.d.ts.map +1 -0
  50. package/dist/microphone/index.js +18 -0
  51. package/dist/microphone/index.js.map +1 -0
  52. package/dist/microphone/microphone.d.ts +65 -0
  53. package/dist/microphone/microphone.d.ts.map +1 -0
  54. package/dist/microphone/microphone.js +179 -0
  55. package/dist/microphone/microphone.js.map +1 -0
  56. package/dist/rpi-drivers/index.d.ts +22 -0
  57. package/dist/rpi-drivers/index.d.ts.map +1 -0
  58. package/dist/rpi-drivers/index.js +22 -0
  59. package/dist/rpi-drivers/index.js.map +1 -0
  60. package/dist/rpi-drivers/rpi-detect.d.ts +24 -0
  61. package/dist/rpi-drivers/rpi-detect.d.ts.map +1 -0
  62. package/dist/rpi-drivers/rpi-detect.js +49 -0
  63. package/dist/rpi-drivers/rpi-detect.js.map +1 -0
  64. package/dist/rpi-drivers/rpi-driver.d.ts +116 -0
  65. package/dist/rpi-drivers/rpi-driver.d.ts.map +1 -0
  66. package/dist/rpi-drivers/rpi-driver.js +261 -0
  67. package/dist/rpi-drivers/rpi-driver.js.map +1 -0
  68. package/dist/rpi-drivers/rpi3-driver.d.ts +47 -0
  69. package/dist/rpi-drivers/rpi3-driver.d.ts.map +1 -0
  70. package/dist/rpi-drivers/rpi3-driver.js +145 -0
  71. package/dist/rpi-drivers/rpi3-driver.js.map +1 -0
  72. package/dist/rpi-drivers/rpi4-driver.d.ts +35 -0
  73. package/dist/rpi-drivers/rpi4-driver.d.ts.map +1 -0
  74. package/dist/rpi-drivers/rpi4-driver.js +101 -0
  75. package/dist/rpi-drivers/rpi4-driver.js.map +1 -0
  76. package/dist/rpi-drivers/rpi5-driver.d.ts +33 -0
  77. package/dist/rpi-drivers/rpi5-driver.d.ts.map +1 -0
  78. package/dist/rpi-drivers/rpi5-driver.js +78 -0
  79. package/dist/rpi-drivers/rpi5-driver.js.map +1 -0
  80. package/dist/servo/index.d.ts +19 -0
  81. package/dist/servo/index.d.ts.map +1 -0
  82. package/dist/servo/index.js +19 -0
  83. package/dist/servo/index.js.map +1 -0
  84. package/dist/servo/servo-constants.d.ts +33 -0
  85. package/dist/servo/servo-constants.d.ts.map +1 -0
  86. package/dist/servo/servo-constants.js +34 -0
  87. package/dist/servo/servo-constants.js.map +1 -0
  88. package/dist/servo/servo-lgpio.d.ts +82 -0
  89. package/dist/servo/servo-lgpio.d.ts.map +1 -0
  90. package/dist/servo/servo-lgpio.js +178 -0
  91. package/dist/servo/servo-lgpio.js.map +1 -0
  92. package/dist/speaker/audio-player.d.ts +30 -0
  93. package/dist/speaker/audio-player.d.ts.map +1 -0
  94. package/dist/speaker/audio-player.js +68 -0
  95. package/dist/speaker/audio-player.js.map +1 -0
  96. package/dist/speaker/index.d.ts +18 -0
  97. package/dist/speaker/index.d.ts.map +1 -0
  98. package/dist/speaker/index.js +18 -0
  99. package/dist/speaker/index.js.map +1 -0
  100. package/dist/speaker/speaker.d.ts +53 -0
  101. package/dist/speaker/speaker.d.ts.map +1 -0
  102. package/dist/speaker/speaker.js +125 -0
  103. package/dist/speaker/speaker.js.map +1 -0
  104. package/dist/stt/backends/azure-stt.d.ts +32 -0
  105. package/dist/stt/backends/azure-stt.d.ts.map +1 -0
  106. package/dist/stt/backends/azure-stt.js +227 -0
  107. package/dist/stt/backends/azure-stt.js.map +1 -0
  108. package/dist/stt/backends/google-cloud-stt.d.ts +31 -0
  109. package/dist/stt/backends/google-cloud-stt.d.ts.map +1 -0
  110. package/dist/stt/backends/google-cloud-stt.js +371 -0
  111. package/dist/stt/backends/google-cloud-stt.js.map +1 -0
  112. package/dist/stt/backends/ibm-watson-stt.d.ts +32 -0
  113. package/dist/stt/backends/ibm-watson-stt.d.ts.map +1 -0
  114. package/dist/stt/backends/ibm-watson-stt.js +190 -0
  115. package/dist/stt/backends/ibm-watson-stt.js.map +1 -0
  116. package/dist/stt/backends/sherpa-onnx-stt.d.ts +117 -0
  117. package/dist/stt/backends/sherpa-onnx-stt.d.ts.map +1 -0
  118. package/dist/stt/backends/sherpa-onnx-stt.js +694 -0
  119. package/dist/stt/backends/sherpa-onnx-stt.js.map +1 -0
  120. package/dist/stt/index.d.ts +20 -0
  121. package/dist/stt/index.d.ts.map +1 -0
  122. package/dist/stt/index.js +21 -0
  123. package/dist/stt/index.js.map +1 -0
  124. package/dist/stt/stt-engine.d.ts +68 -0
  125. package/dist/stt/stt-engine.d.ts.map +1 -0
  126. package/dist/stt/stt-engine.js +99 -0
  127. package/dist/stt/stt-engine.js.map +1 -0
  128. package/dist/stt/stt-utils.d.ts +36 -0
  129. package/dist/stt/stt-utils.d.ts.map +1 -0
  130. package/dist/stt/stt-utils.js +112 -0
  131. package/dist/stt/stt-utils.js.map +1 -0
  132. package/dist/stt/stt.d.ts +52 -0
  133. package/dist/stt/stt.d.ts.map +1 -0
  134. package/dist/stt/stt.js +100 -0
  135. package/dist/stt/stt.js.map +1 -0
  136. package/dist/tjbot.d.ts +317 -0
  137. package/dist/tjbot.d.ts.map +1 -0
  138. package/dist/tjbot.js +736 -0
  139. package/dist/tjbot.js.map +1 -0
  140. package/dist/tts/backends/azure-tts.d.ts +30 -0
  141. package/dist/tts/backends/azure-tts.d.ts.map +1 -0
  142. package/dist/tts/backends/azure-tts.js +92 -0
  143. package/dist/tts/backends/azure-tts.js.map +1 -0
  144. package/dist/tts/backends/google-cloud-tts.d.ts +38 -0
  145. package/dist/tts/backends/google-cloud-tts.d.ts.map +1 -0
  146. package/dist/tts/backends/google-cloud-tts.js +116 -0
  147. package/dist/tts/backends/google-cloud-tts.js.map +1 -0
  148. package/dist/tts/backends/ibm-watson-tts.d.ts +42 -0
  149. package/dist/tts/backends/ibm-watson-tts.d.ts.map +1 -0
  150. package/dist/tts/backends/ibm-watson-tts.js +99 -0
  151. package/dist/tts/backends/ibm-watson-tts.js.map +1 -0
  152. package/dist/tts/backends/sherpa-onnx-tts.d.ts +80 -0
  153. package/dist/tts/backends/sherpa-onnx-tts.d.ts.map +1 -0
  154. package/dist/tts/backends/sherpa-onnx-tts.js +237 -0
  155. package/dist/tts/backends/sherpa-onnx-tts.js.map +1 -0
  156. package/dist/tts/index.d.ts +19 -0
  157. package/dist/tts/index.d.ts.map +1 -0
  158. package/dist/tts/index.js +20 -0
  159. package/dist/tts/index.js.map +1 -0
  160. package/dist/tts/tts-engine.d.ts +67 -0
  161. package/dist/tts/tts-engine.d.ts.map +1 -0
  162. package/dist/tts/tts-engine.js +109 -0
  163. package/dist/tts/tts-engine.js.map +1 -0
  164. package/dist/tts/tts.d.ts +47 -0
  165. package/dist/tts/tts.d.ts.map +1 -0
  166. package/dist/tts/tts.js +101 -0
  167. package/dist/tts/tts.js.map +1 -0
  168. package/dist/utils/colors.d.ts +39 -0
  169. package/dist/utils/colors.d.ts.map +1 -0
  170. package/dist/utils/colors.js +155 -0
  171. package/dist/utils/colors.js.map +1 -0
  172. package/dist/utils/constants.d.ts +41 -0
  173. package/dist/utils/constants.d.ts.map +1 -0
  174. package/dist/utils/constants.js +43 -0
  175. package/dist/utils/constants.js.map +1 -0
  176. package/dist/utils/credentials.d.ts +43 -0
  177. package/dist/utils/credentials.d.ts.map +1 -0
  178. package/dist/utils/credentials.js +121 -0
  179. package/dist/utils/credentials.js.map +1 -0
  180. package/dist/utils/errors.d.ts +26 -0
  181. package/dist/utils/errors.d.ts.map +1 -0
  182. package/dist/utils/errors.js +32 -0
  183. package/dist/utils/errors.js.map +1 -0
  184. package/dist/utils/index.d.ts +25 -0
  185. package/dist/utils/index.d.ts.map +1 -0
  186. package/dist/utils/index.js +23 -0
  187. package/dist/utils/index.js.map +1 -0
  188. package/dist/utils/logging.d.ts +44 -0
  189. package/dist/utils/logging.d.ts.map +1 -0
  190. package/dist/utils/logging.js +113 -0
  191. package/dist/utils/logging.js.map +1 -0
  192. package/dist/utils/model-registry.d.ts +142 -0
  193. package/dist/utils/model-registry.d.ts.map +1 -0
  194. package/dist/utils/model-registry.js +391 -0
  195. package/dist/utils/model-registry.js.map +1 -0
  196. package/dist/utils/utils.d.ts +33 -0
  197. package/dist/utils/utils.d.ts.map +1 -0
  198. package/dist/utils/utils.js +50 -0
  199. package/dist/utils/utils.js.map +1 -0
  200. package/dist/vision/backends/azure-vision.d.ts +33 -0
  201. package/dist/vision/backends/azure-vision.d.ts.map +1 -0
  202. package/dist/vision/backends/azure-vision.js +151 -0
  203. package/dist/vision/backends/azure-vision.js.map +1 -0
  204. package/dist/vision/backends/google-cloud-vision.d.ts +32 -0
  205. package/dist/vision/backends/google-cloud-vision.d.ts.map +1 -0
  206. package/dist/vision/backends/google-cloud-vision.js +193 -0
  207. package/dist/vision/backends/google-cloud-vision.js.map +1 -0
  208. package/dist/vision/backends/onnx.d.ts +116 -0
  209. package/dist/vision/backends/onnx.d.ts.map +1 -0
  210. package/dist/vision/backends/onnx.js +781 -0
  211. package/dist/vision/backends/onnx.js.map +1 -0
  212. package/dist/vision/index.d.ts +19 -0
  213. package/dist/vision/index.d.ts.map +1 -0
  214. package/dist/vision/index.js +20 -0
  215. package/dist/vision/index.js.map +1 -0
  216. package/dist/vision/vision-engine.d.ts +131 -0
  217. package/dist/vision/vision-engine.d.ts.map +1 -0
  218. package/dist/vision/vision-engine.js +97 -0
  219. package/dist/vision/vision-engine.js.map +1 -0
  220. package/dist/vision/vision.d.ts +48 -0
  221. package/dist/vision/vision.d.ts.map +1 -0
  222. package/dist/vision/vision.js +83 -0
  223. package/dist/vision/vision.js.map +1 -0
  224. package/package.json +124 -0
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Copyright 2025 IBM Corp. All Rights Reserved.
3
+ * Copyright 2026-present TJBot Contributors. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import fs from 'fs';
18
+ class RPiDetect {
19
+ static model() {
20
+ let cpuInfo;
21
+ try {
22
+ cpuInfo = fs.readFileSync('/proc/cpuinfo', { encoding: 'utf8' });
23
+ }
24
+ catch {
25
+ // likely not a Pi if we can't open /proc/cpuinfo
26
+ return '';
27
+ }
28
+ const modelLine = cpuInfo.split('\n').find((line) => line.startsWith('Model'));
29
+ if (modelLine === undefined) {
30
+ return '';
31
+ }
32
+ const model = modelLine.split(':')[1].trim();
33
+ return model;
34
+ }
35
+ static isPi3() {
36
+ const model = RPiDetect.model();
37
+ return model.startsWith('Raspberry Pi 3');
38
+ }
39
+ static isPi4() {
40
+ const model = RPiDetect.model();
41
+ return model.startsWith('Raspberry Pi 4');
42
+ }
43
+ static isPi5() {
44
+ const model = RPiDetect.model();
45
+ return model.startsWith('Raspberry Pi 5');
46
+ }
47
+ }
48
+ export default RPiDetect;
49
+ //# sourceMappingURL=rpi-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpi-detect.js","sourceRoot":"","sources":["../../src/rpi-drivers/rpi-detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,SAAS;IACX,MAAM,CAAC,KAAK;QACR,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACD,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACL,iDAAiD;YACjD,OAAO,EAAE,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/E,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,KAAK;QACR,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,KAAK;QACR,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,KAAK;QACR,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC9C,CAAC;CACJ;AAED,eAAe,SAAS,CAAC"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Copyright 2025 IBM Corp. All Rights Reserved.
3
+ * Copyright 2026-present TJBot Contributors. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { Transform } from 'stream';
18
+ import { CameraController } from '../camera/index.js';
19
+ import { ListenConfig, SeeConfig, ShineConfig, SpeakConfig, WaveConfig } from '../config/index.js';
20
+ import { MicrophoneController } from '../microphone/index.js';
21
+ import { ServoPosition } from '../servo/index.js';
22
+ import { SpeakerController } from '../speaker/index.js';
23
+ import { STTController } from '../stt/stt.js';
24
+ import { TTSController } from '../tts/tts.js';
25
+ import { Capability, Hardware } from '../utils/index.js';
26
+ import { FaceDetectionMetadata, ImageClassificationResult, ImageDescriptionResult, ObjectDetectionResult } from '../vision/index.js';
27
+ import { VisionController } from '../vision/vision.js';
28
+ export declare abstract class RPiHardwareDriver {
29
+ abstract getHardware(): Set<Hardware>;
30
+ abstract hasHardware(hardware: Hardware): boolean;
31
+ abstract hasCapability(capability: Capability): boolean;
32
+ abstract setupCamera(config: SeeConfig): void;
33
+ abstract setupLED(config: ShineConfig): Promise<void>;
34
+ abstract setupLEDCommonAnode(config: ShineConfig['commonanode']): void;
35
+ abstract setupLEDNeopixel(config: ShineConfig['neopixel']): Promise<void>;
36
+ abstract setupMicrophone(config: ListenConfig): void;
37
+ abstract setupServo(config: WaveConfig): void;
38
+ abstract setupSpeaker(config: SpeakConfig): void;
39
+ abstract cleanup(): Promise<void>;
40
+ abstract initializeSTTEngine(): Promise<void>;
41
+ abstract initializeTTSEngine(): Promise<void>;
42
+ abstract initializeVisionEngine(): Promise<void>;
43
+ abstract startMic(): void;
44
+ abstract pauseMic(): void;
45
+ abstract resumeMic(): void;
46
+ abstract stopMic(): void;
47
+ abstract getMicInputStream(): Transform;
48
+ abstract listenForTranscript(options?: {
49
+ onPartialResult?: (text: string) => void;
50
+ onFinalResult?: (text: string) => void;
51
+ abortSignal?: AbortSignal;
52
+ }): Promise<string>;
53
+ abstract capturePhoto(atPath?: string): Promise<string>;
54
+ abstract capturePhotoBuffer(): Promise<Buffer>;
55
+ abstract detectObjects(image: Buffer | string): Promise<ObjectDetectionResult[]>;
56
+ abstract classifyImage(image: Buffer | string): Promise<ImageClassificationResult[]>;
57
+ abstract detectFaces(image: Buffer | string): Promise<{
58
+ isFaceDetected: boolean;
59
+ metadata: FaceDetectionMetadata[];
60
+ }>;
61
+ abstract describeImage(image: Buffer | string): Promise<ImageDescriptionResult>;
62
+ abstract renderLED(hexColor: string): Promise<void>;
63
+ abstract renderLEDCommonAnode(rgbColor: [number, number, number]): void;
64
+ abstract renderLEDNeopixel(hexColor: string): Promise<void>;
65
+ abstract playAudio(audioPath: string): Promise<void>;
66
+ abstract speak(message: string): Promise<void>;
67
+ abstract renderServoPosition(position: ServoPosition): void;
68
+ }
69
+ export declare abstract class RPiBaseHardwareDriver extends RPiHardwareDriver {
70
+ initializedHardware: Set<Hardware>;
71
+ protected cameraController?: CameraController;
72
+ protected microphoneController?: MicrophoneController;
73
+ protected speakerController?: SpeakerController;
74
+ protected sttController?: STTController;
75
+ protected ttsController?: TTSController;
76
+ protected visionController?: VisionController;
77
+ protected listenConfig: ListenConfig;
78
+ protected shineConfig: ShineConfig;
79
+ protected seeConfig: SeeConfig;
80
+ protected speakConfig: SpeakConfig;
81
+ constructor();
82
+ getHardware(): Set<Hardware>;
83
+ hasHardware(hardware: Hardware): boolean;
84
+ hasCapability(capability: Capability): boolean;
85
+ setupCamera(config: SeeConfig): void;
86
+ setupLED(config: ShineConfig): Promise<void>;
87
+ setupMicrophone(config: ListenConfig): void;
88
+ setupSpeaker(config: SpeakConfig): void;
89
+ cleanup(): Promise<void>;
90
+ initializeSTTEngine(): Promise<void>;
91
+ initializeTTSEngine(): Promise<void>;
92
+ initializeVisionEngine(): Promise<void>;
93
+ startMic(): void;
94
+ pauseMic(): void;
95
+ resumeMic(): void;
96
+ stopMic(): void;
97
+ getMicInputStream(): Transform;
98
+ listenForTranscript(options?: {
99
+ onPartialResult?: (text: string) => void;
100
+ onFinalResult?: (text: string) => void;
101
+ abortSignal?: AbortSignal;
102
+ }): Promise<string>;
103
+ capturePhoto(atPath?: string): Promise<string>;
104
+ capturePhotoBuffer(): Promise<Buffer>;
105
+ detectObjects(image: Buffer | string): Promise<ObjectDetectionResult[]>;
106
+ classifyImage(image: Buffer | string): Promise<ImageClassificationResult[]>;
107
+ describeImage(image: Buffer | string): Promise<ImageDescriptionResult>;
108
+ detectFaces(image: Buffer | string): Promise<{
109
+ isFaceDetected: boolean;
110
+ metadata: FaceDetectionMetadata[];
111
+ }>;
112
+ renderLED(hexColor: string): Promise<void>;
113
+ playAudio(audioPath: string): Promise<void>;
114
+ speak(message: string): Promise<void>;
115
+ }
116
+ //# sourceMappingURL=rpi-driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpi-driver.d.ts","sourceRoot":"","sources":["../../src/rpi-drivers/rpi-driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Copyright 2025 IBM Corp. All Rights Reserved.
3
+ * Copyright 2026-present TJBot Contributors. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { CameraController } from '../camera/index.js';
18
+ import { MicrophoneController } from '../microphone/index.js';
19
+ import { SpeakerController } from '../speaker/index.js';
20
+ import { STTController } from '../stt/stt.js';
21
+ import { TTSController } from '../tts/tts.js';
22
+ import { Capability, convertHexToRgbColor, Hardware, isCommandAvailable, TJBotError } from '../utils/index.js';
23
+ import { VisionController } from '../vision/vision.js';
24
+ export class RPiHardwareDriver {
25
+ }
26
+ export class RPiBaseHardwareDriver extends RPiHardwareDriver {
27
+ // initialized hardware
28
+ initializedHardware;
29
+ // controllers for hardware components
30
+ cameraController;
31
+ microphoneController;
32
+ speakerController;
33
+ // controllers for STT, TTS, CV
34
+ sttController;
35
+ ttsController;
36
+ visionController;
37
+ // cached configuration for listen
38
+ listenConfig = {};
39
+ // cached configuration for shine
40
+ shineConfig = {};
41
+ // cached configuration for see
42
+ seeConfig = {};
43
+ // cached configuration for speak
44
+ speakConfig = {};
45
+ constructor() {
46
+ super();
47
+ this.initializedHardware = new Set();
48
+ }
49
+ getHardware() {
50
+ return new Set(this.initializedHardware);
51
+ }
52
+ hasHardware(hardware) {
53
+ return this.initializedHardware.has(hardware);
54
+ }
55
+ hasCapability(capability) {
56
+ switch (capability) {
57
+ case Capability.LISTEN:
58
+ return this.hasHardware(Hardware.MICROPHONE);
59
+ case Capability.SEE:
60
+ return this.hasHardware(Hardware.CAMERA);
61
+ case Capability.SHINE:
62
+ return this.hasHardware(Hardware.LED);
63
+ case Capability.SPEAK:
64
+ return this.hasHardware(Hardware.SPEAKER);
65
+ case Capability.WAVE:
66
+ return this.hasHardware(Hardware.SERVO);
67
+ default:
68
+ return false;
69
+ }
70
+ }
71
+ setupCamera(config) {
72
+ this.cameraController = new CameraController();
73
+ this.seeConfig = config;
74
+ const width = config.cameraResolution?.[0] ?? 1920;
75
+ const height = config.cameraResolution?.[1] ?? 1080;
76
+ const verticalFlip = config.verticalFlip ?? false;
77
+ const horizontalFlip = config.horizontalFlip ?? false;
78
+ const captureTimeout = config.captureTimeout ?? 500;
79
+ const zeroShutterLag = config.zeroShutterLag ?? false;
80
+ this.cameraController.initialize([width, height], verticalFlip, horizontalFlip, captureTimeout, zeroShutterLag);
81
+ this.initializedHardware.add(Hardware.CAMERA);
82
+ }
83
+ async setupLED(config) {
84
+ this.shineConfig = config;
85
+ if (config.hasCommonAnodeLED) {
86
+ this.setupLEDCommonAnode(config.commonanode ?? {});
87
+ }
88
+ if (config.hasNeopixelLED) {
89
+ await this.setupLEDNeopixel(config.neopixel ?? {});
90
+ }
91
+ }
92
+ setupMicrophone(config) {
93
+ this.microphoneController = new MicrophoneController();
94
+ this.listenConfig = config;
95
+ const rate = config.microphoneRate ?? 44100;
96
+ const channels = config.microphoneChannels ?? 2;
97
+ const device = config.device ?? '';
98
+ this.microphoneController.initialize(rate, channels, device);
99
+ this.initializedHardware.add(Hardware.MICROPHONE);
100
+ }
101
+ setupSpeaker(config) {
102
+ this.speakerController = new SpeakerController();
103
+ // Validate that aplay is available
104
+ if (!isCommandAvailable('aplay')) {
105
+ throw new TJBotError('TJBot requires the aplay command for audio playback. ' +
106
+ 'Install it with: sudo apt-get install alsa-utils');
107
+ }
108
+ const device = config.device ?? '';
109
+ // Cache the full config for later use in speak()
110
+ this.speakConfig = config;
111
+ this.speakerController.initialize(device);
112
+ this.speakerController.setAudioLifecycleCallbacks(() => this.pauseMic(), () => this.resumeMic());
113
+ this.initializedHardware.add(Hardware.SPEAKER);
114
+ }
115
+ async cleanup() {
116
+ // Clean up controllers
117
+ if (this.cameraController) {
118
+ await this.cameraController.cleanup?.();
119
+ }
120
+ if (this.microphoneController) {
121
+ await this.microphoneController.cleanup?.();
122
+ }
123
+ if (this.speakerController) {
124
+ await this.speakerController.cleanup?.();
125
+ }
126
+ if (this.sttController) {
127
+ await this.sttController.cleanup?.();
128
+ }
129
+ if (this.ttsController) {
130
+ await this.ttsController.cleanup?.();
131
+ }
132
+ if (this.visionController) {
133
+ await this.visionController.cleanup?.();
134
+ }
135
+ // Clear hardware state
136
+ this.initializedHardware.clear();
137
+ this.cameraController = undefined;
138
+ this.microphoneController = undefined;
139
+ this.speakerController = undefined;
140
+ this.sttController = undefined;
141
+ this.ttsController = undefined;
142
+ this.visionController = undefined;
143
+ }
144
+ async initializeSTTEngine() {
145
+ if (this.microphoneController === undefined) {
146
+ throw new TJBotError('Microphone controllernot initialized. Make sure to call setupMicrophone() before initializing the STT engine.');
147
+ }
148
+ this.sttController = new STTController(this.microphoneController);
149
+ await this.sttController.initialize(this.listenConfig);
150
+ }
151
+ async initializeTTSEngine() {
152
+ if (this.speakerController === undefined) {
153
+ throw new TJBotError('Speaker controllernot initialized. Make sure to call setupSpeaker() before initializing the TTS engine.');
154
+ }
155
+ this.ttsController = new TTSController(this.speakerController);
156
+ await this.ttsController.initialize(this.speakConfig);
157
+ }
158
+ async initializeVisionEngine() {
159
+ this.visionController = new VisionController();
160
+ await this.visionController.initialize(this.seeConfig);
161
+ }
162
+ startMic() {
163
+ if (this.microphoneController === undefined) {
164
+ throw new TJBotError('Microphone controllernot initialized. Make sure to call setupMicrophone() before using the microphone.');
165
+ }
166
+ this.microphoneController.start();
167
+ }
168
+ pauseMic() {
169
+ if (this.microphoneController === undefined) {
170
+ return;
171
+ }
172
+ this.microphoneController.pause();
173
+ }
174
+ resumeMic() {
175
+ if (this.microphoneController === undefined) {
176
+ return;
177
+ }
178
+ this.microphoneController.resume();
179
+ }
180
+ stopMic() {
181
+ if (this.microphoneController === undefined) {
182
+ throw new TJBotError('Microphone controllernot initialized. Make sure to call setupMicrophone() before using the microphone.');
183
+ }
184
+ this.microphoneController.stop();
185
+ }
186
+ getMicInputStream() {
187
+ if (this.microphoneController === undefined) {
188
+ throw new TJBotError('Microphone controller not initialized. Make sure to call setupMicrophone() before using the microphone.');
189
+ }
190
+ return this.microphoneController.getInputStream();
191
+ }
192
+ async listenForTranscript(options) {
193
+ if (this.sttController === undefined) {
194
+ throw new TJBotError('STT controller not initialized. Make sure to call setupMicrophone() before listening.');
195
+ }
196
+ const transcript = await this.sttController.transcribe({
197
+ onPartialResult: options?.onPartialResult,
198
+ onFinalResult: options?.onFinalResult,
199
+ abortSignal: options?.abortSignal,
200
+ });
201
+ return transcript.trim();
202
+ }
203
+ async capturePhoto(atPath) {
204
+ if (this.cameraController === undefined) {
205
+ throw new TJBotError('Camera controller not initialized. Make sure to call setupCamera() before using the camera.');
206
+ }
207
+ return this.cameraController.capturePhoto(atPath);
208
+ }
209
+ async capturePhotoBuffer() {
210
+ if (this.cameraController === undefined) {
211
+ throw new TJBotError('Camera controller not initialized. Make sure to call setupCamera() before using the camera.');
212
+ }
213
+ return this.cameraController.capturePhotoBuffer();
214
+ }
215
+ async detectObjects(image) {
216
+ if (this.visionController === undefined) {
217
+ throw new TJBotError('Vision controller is not initialized. Make sure to call setupCamera() before using Vision.');
218
+ }
219
+ return this.visionController.detectObjects(image);
220
+ }
221
+ async classifyImage(image) {
222
+ if (this.visionController === undefined) {
223
+ throw new TJBotError('Vision controller is not initialized. Make sure to call setupCamera() before using Vision.');
224
+ }
225
+ return this.visionController.classifyImage(image);
226
+ }
227
+ async describeImage(image) {
228
+ if (this.visionController === undefined) {
229
+ throw new TJBotError('Vision controller is not initialized. Make sure to call setupCamera() before using Vision.');
230
+ }
231
+ return this.visionController.describeImage(image);
232
+ }
233
+ async detectFaces(image) {
234
+ if (this.visionController === undefined) {
235
+ throw new TJBotError('Vision controller is not initialized. Make sure to call setupCamera() before using Vision.');
236
+ }
237
+ return this.visionController.detectFaces(image);
238
+ }
239
+ async renderLED(hexColor) {
240
+ if (this.shineConfig.hasCommonAnodeLED) {
241
+ const rgb = convertHexToRgbColor(hexColor);
242
+ this.renderLEDCommonAnode(rgb);
243
+ }
244
+ if (this.shineConfig.hasNeopixelLED) {
245
+ await this.renderLEDNeopixel(hexColor);
246
+ }
247
+ }
248
+ async playAudio(audioPath) {
249
+ if (this.speakerController === undefined) {
250
+ throw new TJBotError('Speaker controller not initialized. Make sure to call setupSpeaker() before playing audio.');
251
+ }
252
+ return this.speakerController.playAudio(audioPath);
253
+ }
254
+ async speak(message) {
255
+ if (this.ttsController === undefined) {
256
+ throw new TJBotError('TTS controller not initialized. Make sure to call setupSpeaker() before speaking.');
257
+ }
258
+ return this.ttsController.speak(message);
259
+ }
260
+ }
261
+ //# sourceMappingURL=rpi-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpi-driver.js","sourceRoot":"","sources":["../../src/rpi-drivers/rpi-driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Copyright 2025 IBM Corp. All Rights Reserved.
3
+ * Copyright 2026-present TJBot Contributors. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { ShineConfig, WaveConfig } from '../config/index.js';
18
+ import { ServoPosition } from '../servo/index.js';
19
+ import { RPiBaseHardwareDriver } from './rpi-driver.js';
20
+ import { FaceDetectionMetadata, ImageClassificationResult, ImageDescriptionResult, ObjectDetectionResult } from '../vision/index.js';
21
+ declare class RPi3Driver extends RPiBaseHardwareDriver {
22
+ private commonAnodeLed;
23
+ private neopixelLed;
24
+ private useGRBFormat;
25
+ private servo;
26
+ private userHasBeenWarned;
27
+ constructor();
28
+ setupLEDCommonAnode(config: ShineConfig['commonanode']): void;
29
+ setupLEDNeopixel(config: ShineConfig['neopixel']): Promise<void>;
30
+ setupServo(config: WaveConfig): void;
31
+ renderLEDCommonAnode(rgbColor: [number, number, number]): void;
32
+ renderLEDNeopixel(hexColor: string): Promise<void>;
33
+ cleanup(): Promise<void>;
34
+ renderServoPosition(position: ServoPosition): void;
35
+ private warnIfUsingLocalAI;
36
+ listenForTranscript(): Promise<string>;
37
+ speak(message: string): Promise<void>;
38
+ detectObjects(image: Buffer | string): Promise<ObjectDetectionResult[]>;
39
+ classifyImage(image: Buffer | string): Promise<ImageClassificationResult[]>;
40
+ describeImage(image: Buffer | string): Promise<ImageDescriptionResult>;
41
+ detectFaces(image: Buffer | string): Promise<{
42
+ isFaceDetected: boolean;
43
+ metadata: FaceDetectionMetadata[];
44
+ }>;
45
+ }
46
+ export default RPi3Driver;
47
+ //# sourceMappingURL=rpi3-driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpi3-driver.d.ts","sourceRoot":"","sources":["../../src/rpi-drivers/rpi3-driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAwB,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EACH,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,EACtB,qBAAqB,EACxB,MAAM,oBAAoB,CAAC;AAI5B,cAAM,UAAW,SAAQ,qBAAqB;IAC1C,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,iBAAiB,CAAkC;;IAO3D,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,aAAa,CAAC,GAAG,IAAI;IAQvD,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtE,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAMpC,oBAAoB,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAQxD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBlD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAQlD,OAAO,CAAC,kBAAkB;IAgCpB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;IAKtC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAKvE,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,yBAAyB,EAAE,CAAC;IAK3E,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAKtE,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;QAAE,cAAc,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,qBAAqB,EAAE,CAAA;KAAE,CAAC;CAIrH;AAED,eAAe,UAAU,CAAC"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Copyright 2025 IBM Corp. All Rights Reserved.
3
+ * Copyright 2026-present TJBot Contributors. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { LEDCommonAnode, LEDNeopixel } from '../led/index.js';
18
+ import { LGPIOServoController } from '../servo/index.js';
19
+ import { Hardware } from '../utils/index.js';
20
+ import { getLogger } from '../utils/logging.js';
21
+ import { RPiBaseHardwareDriver } from './rpi-driver.js';
22
+ const logger = getLogger(import.meta.url);
23
+ class RPi3Driver extends RPiBaseHardwareDriver {
24
+ commonAnodeLed;
25
+ neopixelLed;
26
+ useGRBFormat;
27
+ servo;
28
+ userHasBeenWarned = {};
29
+ constructor() {
30
+ super();
31
+ this.useGRBFormat = true;
32
+ }
33
+ setupLEDCommonAnode(config) {
34
+ const redPin = config?.redPin ?? 19;
35
+ const greenPin = config?.greenPin ?? 13;
36
+ const bluePin = config?.bluePin ?? 12;
37
+ this.commonAnodeLed = new LEDCommonAnode(redPin, greenPin, bluePin);
38
+ this.initializedHardware.add(Hardware.LED);
39
+ }
40
+ async setupLEDNeopixel(config) {
41
+ const pin = config?.gpioPin ?? 18;
42
+ this.neopixelLed = new LEDNeopixel(pin);
43
+ await this.neopixelLed.initialize();
44
+ this.useGRBFormat = config?.useGRBFormat ?? true;
45
+ this.initializedHardware.add(Hardware.LED);
46
+ }
47
+ setupServo(config) {
48
+ const pin = config.servoPin ?? 18;
49
+ this.servo = new LGPIOServoController(0, pin);
50
+ this.initializedHardware.add(Hardware.SERVO);
51
+ }
52
+ renderLEDCommonAnode(rgbColor) {
53
+ if (this.commonAnodeLed) {
54
+ this.commonAnodeLed.render(rgbColor);
55
+ }
56
+ else {
57
+ logger.warn('Attempted to render on an uninitialized Common Anode LED');
58
+ }
59
+ }
60
+ async renderLEDNeopixel(hexColor) {
61
+ if (this.neopixelLed) {
62
+ const c = hexColor.startsWith('#') ? hexColor.slice(1) : hexColor;
63
+ if (c.length !== 6) {
64
+ logger.warn(`Invalid NeoPixel color '${hexColor}'`);
65
+ return;
66
+ }
67
+ if (this.useGRBFormat) {
68
+ const grbStr = `0x${c[2]}${c[3]}${c[0]}${c[1]}${c[4]}${c[5]}`;
69
+ const grb = parseInt(grbStr, 16);
70
+ await this.neopixelLed.render(grb);
71
+ }
72
+ else {
73
+ const rgbStr = `0x${c}`;
74
+ const rgb = parseInt(rgbStr, 16);
75
+ await this.neopixelLed.render(rgb);
76
+ }
77
+ }
78
+ else {
79
+ logger.warn('Attempted to render on an uninitialized Neopixel LED');
80
+ }
81
+ }
82
+ async cleanup() {
83
+ if (this.neopixelLed) {
84
+ await this.neopixelLed.cleanup();
85
+ }
86
+ await super.cleanup();
87
+ }
88
+ renderServoPosition(position) {
89
+ if (this.servo) {
90
+ this.servo.setPosition(position);
91
+ }
92
+ else {
93
+ logger.warn('Attempted to render on an uninitialized servo');
94
+ }
95
+ }
96
+ warnIfUsingLocalAI(aiType) {
97
+ if (this.userHasBeenWarned[aiType]) {
98
+ return;
99
+ }
100
+ switch (aiType) {
101
+ case 'stt':
102
+ if (this.listenConfig.backend?.type === 'local') {
103
+ logger.warn('Using local STT on Raspberry Pi 3 may have poor performance. Consider using a cloud-based backend for better results.');
104
+ }
105
+ break;
106
+ case 'tts':
107
+ if (this.speakConfig.backend?.type === 'local') {
108
+ logger.warn('Using local TTS on Raspberry Pi 3 may have poor performance. Consider using a cloud-based backend for better results.');
109
+ }
110
+ break;
111
+ case 'vision':
112
+ if (this.seeConfig.backend?.type === 'local') {
113
+ logger.warn('Using local Vision on Raspberry Pi 3 may have poor performance. Consider using a cloud-based backend for better results.');
114
+ }
115
+ break;
116
+ }
117
+ this.userHasBeenWarned[aiType] = true;
118
+ }
119
+ async listenForTranscript() {
120
+ this.warnIfUsingLocalAI('stt');
121
+ return super.listenForTranscript();
122
+ }
123
+ async speak(message) {
124
+ this.warnIfUsingLocalAI('tts');
125
+ return super.speak(message);
126
+ }
127
+ async detectObjects(image) {
128
+ this.warnIfUsingLocalAI('vision');
129
+ return super.detectObjects(image);
130
+ }
131
+ async classifyImage(image) {
132
+ this.warnIfUsingLocalAI('vision');
133
+ return super.classifyImage(image);
134
+ }
135
+ async describeImage(image) {
136
+ this.warnIfUsingLocalAI('vision');
137
+ return super.describeImage(image);
138
+ }
139
+ async detectFaces(image) {
140
+ this.warnIfUsingLocalAI('vision');
141
+ return super.detectFaces(image);
142
+ }
143
+ }
144
+ export default RPi3Driver;
145
+ //# sourceMappingURL=rpi3-driver.js.map