{"_id":"@appliedminds/amber-radiance-1","name":"@appliedminds/amber-radiance-1","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@appliedminds/amber-radiance-1","version":"1.0.0","description":"Control Interface for Raytheon Amber Radiance 1 IR Cameras","main":"index.js","type":"module","engines":{"node":">=20"},"repository":{"type":"git","url":"git+https://github.com/appliedminds/amber-radiance-1.git"},"bugs":{"url":"https://github.com/appliedminds/amber-radiance-1/issues"},"homepage":"https://github.com/appliedminds/amber-radiance-1","scripts":{"lint":"eslint","start":"node index.js","test":"node --test  --experimental-test-coverage --experimental-test-module-mocks"},"author":{"name":"Ivo Janssen","email":"ivo@appliedminds.com"},"license":"Apache-2.0","dependencies":{"@appliedminds/serial":"^4.1.1","@appliedminds/tcp":"^4.1.1"},"devDependencies":{"@appliedminds/eslint-config":"^2.0.2","eslint":"^9.17.0"},"keywords":["amber","raytheon","radiance","serial","infrared","camera","ami","appliedminds"],"_id":"@appliedminds/amber-radiance-1@1.0.0","gitHead":"4c99ba13e20335b62018464861acb718f7db97af","_nodeVersion":"23.7.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-adavx0dpzyOl7wJsf1BvWQzSXhRe+u4AO3OsB5NTfFApJLe1Bv2djltLSYP9rSfO+Fg02t4zwCPeZZJjDdLD8Q==","shasum":"dac144052277eeff32d93297a0848ea10e33ea44","tarball":"https://registry.npmjs.org/@appliedminds/amber-radiance-1/-/amber-radiance-1-1.0.0.tgz","fileCount":4,"unpackedSize":27905,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCdYjp4nWV64YZg3+lwkabG1+/f27jQ4UjyKaLQTWAcIAIhAKCVTgmIMEOnNHL+ZExqBpyg59VkGQvzlBhLc0VVRLav"}]},"_npmUser":{"name":"ami-software","email":"software@appliedminds.com"},"directories":{},"maintainers":[{"name":"ivojanssen","email":"ivo@appliedminds.com"},{"name":"ami-software","email":"software@appliedminds.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/amber-radiance-1_1.0.0_1739829931479_0.6736762670780683"},"_hasShrinkwrap":false}},"time":{"created":"2025-02-17T22:05:31.392Z","1.0.0":"2025-02-17T22:05:31.673Z","modified":"2025-02-17T22:05:31.928Z"},"maintainers":[{"name":"ivojanssen","email":"ivo@appliedminds.com"},{"name":"ami-software","email":"software@appliedminds.com"}],"description":"Control Interface for Raytheon Amber Radiance 1 IR Cameras","homepage":"https://github.com/appliedminds/amber-radiance-1","keywords":["amber","raytheon","radiance","serial","infrared","camera","ami","appliedminds"],"repository":{"type":"git","url":"git+https://github.com/appliedminds/amber-radiance-1.git"},"author":{"name":"Ivo Janssen","email":"ivo@appliedminds.com"},"bugs":{"url":"https://github.com/appliedminds/amber-radiance-1/issues"},"license":"Apache-2.0","readme":"Amber Radiance 1 Control Interface\n==================================\n\nUnofficial Node.js API for controlling Raytheon/Amber Radiance 1 IR Cameras.\n\nFeatures:\n * Getting camera status\n * Changing brightness / contrast\n * Running calibrations\n * Toggling cryo cooler\n * Changing automatic gain control (AGC) modes\n * Changing intensity transform table (ITT) modes\n * Changing look-up table (LUT) modes\n * Changing non-uniformity correction (NUC) modes\n\n##### Contents\n\n- [Background](#background)\n- [Requirements](#requirements)\n- [Installation](#installation)\n- [Examples](#usage--examples)\n- [API Docs](#api-docs)\n- [License](#license)\n\nBackground\n----------\n\nThe Radiance 1 Infrared camera was developed by Amber Engineering, a engineering company started in 1981 and purchased in 1992 by Raytheon Missile Systems. Rebranded to Raytheon Amber, they released this camera around 1993.\n\n![Amber Radiance 1 Camera](/docs/jpl-amber-1.jpg?raw=true)\n\n(Pictured: NASA Spinoff camera based on an Amber Radiance 1. Image credit: [NASA](https://spinoff.nasa.gov/spinoff2002/ps_3.html))\n\nIn 1998, Raytheon Amber closed shop and merged with Hughes Defense, after which much of the tools and documentation for their cameras became more difficult to find.\n\nMany of these cameras still exist and can provide impressive IR imaging, albeit in a relatively low resolution, but the software required to control it is long obsolete and requires a license that can no longer be obtained. Some of the functionality has been reverse-engineered and included in this library so others may breathe new life into these devices. \n\nFor more background stories on these cameras, see [Fraser's Quest on EEVblog](https://www.eevblog.com/forum/thermal-imaging/the-story-of-a-radiance-1-camera-and-frasers-quest-to-find-information-on-it/).\n\nRequirements\n------------\n\n * Node.js 20+\n\nInstallation\n------------\n\n```\nnpm install @appliedminds/amber-radiance-1\n```\n\nUsage / Examples\n----------------\n\n### Via Serial\n\n```\nimport { Camera } from '@appliedminds/amber-radiance-1'\n\nconst camera = new Camera({ port: '/dev/tty21', transport: 'serial' })\nawait camera.connect()\n\n// Set NUC mode\nawait device.setNUC('warm')\n\n// Set LUT mode\nawait device.setLUT('black-and-white')\n\n// Turn off Cryo Cooler\nawait device.setCooler(false)\n```\n\n### Via TCP\n\nThis assumes you're using some sort of RS-232/TCP pass-through device, such as a [Moxa NPort](https://www.moxa.com/en/products/industrial-edge-connectivity/serial-device-servers/general-device-servers/nport-5200-series)\n\n```\nimport { Camera } from '@appliedminds/amber-radiance-1'\n\nconst camera = new Camera({ host: '192.168.100.50', port: 4001, transport: 'tcp' })\nawait camera.connect()\n\n// Get power and cooler cycles\nconsole.log(await camera.getStatus())\n```\n\nAPI Docs\n--------\n\n### `new Camera({ port : String/Number, host?: String, verbose?: Boolean, transport?: String })`\n\nConstructor\n\n  * `port`:\n    * When `transport` set to `tcp`: TCP port\n    * When `transport` set to `serial`: Qualified path on MacOS/Linux (E.G. `/dev/some/device/path`), COM port on Windows (E.G. `COM3`)\n  * `host`: Host or IP address to connect to (only when `transport` set to `tcp`)\n  * `verbose`: Print additional debug logs\n  * `transport`: Method to connect to device (`serial` or `tcp`) (default: `tcp`)\n\n### `camera.close()` : `<Promise>`\n\nManually close connection. Resolves once the connection has been closed.\n\n### `camera.connect()` : `<Promise>`\n\nConnect to camera. The returned promise will resolve once connected.\n\n### `camera.getAGC()` : `<Promise<Boolean>>`\n\nCheck if Automatic Gain Control is turned off or on.\n\n### `camera.getITT()` : `<Promise<String>>`\n\nReturn active intensity transform table mode (`linear`, `inverse`, `s-curve` or `two-cycle`)\n\n### `camera.getLUT()` : `<Promise<String>>`\n\nReturn active look-up table mode (`black-and-white`, `color` or `sepia`)\n\n### `camera.getNUC()` : `<Promise<String>>`\n\nReturn active non-uniformity correction mode (`cold`, `mid`, `warm` or `hot`)\n\n### `camera.getStatus()` : `<Promise<Object>>`\n\nReturn camera status information. Resolves to an object containing the following keys:\n\n  * `numCoolerCycles`: Number of times the cryo cooler has been cycled\n  * `numPowerCycles`: Number of times the device power has been cycled\n  * `coolerTime`: A timestamp indicating cooler time, although it's unclear how this is supposed to be interpreted.\n\n### `camera.invertImage()` : `<Promise>`\n\nVertically invert the output image.\n\n### `camera.run1PointCalibration()` : `<Promise>`\n\nInitiate the single point calibration process for the current NUC mode.\n\n### `camera.run2PointCalibration()` : `<Promise>`\n\nInitiate the two-point calibration process for the current NUC mode.\n\n### `camera.setBrightness(delta : Number)` : `<Promise>`\n\nChange relative brightness\n\n * `delta`: Increase brightness when > 0, otherwise decrease\n\n### `camera.setCooler(enabled : Boolean)` : `<Promise>`\n\nToggle cryo cooler operation.\n\n### `camera.setContrast(delta : Number)` : `<Promise>`\n\nChange relative contrast\n\n * `delta`: Increase contrast when > 0, otherwise decrease\n\n### `camera.setAGC(mode : String)` : `<Promise>`\n\nSet automatic gain control mode\n\n * `mode`: Set AGC to `full`, `midsize`, `center`, `horizon` or `off` to turn off.\n\n### `camera.setITT(mode : String)` : `<Promise>`\n\nSet intensity transform table used for transforming the output values for display.\n\n * `mode`: `linear`, `inverse`, `s-curve`, or `two-cycle`\n\n### `camera.setLUT(mode : String)` : `<Promise>`\n\nSet the look-up table used for coloring the output image.\n\n * `mode`: `black-and-white`, `color` or `sepia`\n\n### `camera.setNUC(mode : String)` : `<Promise>`\n\nSet current non-uniformity correction mode.\n\n * `mode`: `cold`, `mid`, `warm` or `hot`\n\n### `camera.toggleColorBar(enabled : Boolean)` : `<Promise>`\n\nToggle the on-screen color bar legend on or off.\n\n### `camera.toggleFreezeFrame()` : `<Promise>`\n\nToggle freeze frame mode.\n\n### `camera.toggleOSD(enabled : Boolean)` : `<Promise>`\n\nShow or hide the on-screen display sidebar.\n\nLicense\n-------\n\nUnless otherwise specified, all content, including all source code files and documentation files in this repository are:\n\nCopyright (c) 2024 Applied Minds LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at:\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n","readmeFilename":"README.md"}