{"id":25895494,"url":"https://github.com/diamondlightsource/adexternal","last_synced_at":"2026-02-03T18:33:07.251Z","repository":{"id":147426252,"uuid":"593202986","full_name":"DiamondLightSource/ADExternal","owner":"DiamondLightSource","description":"areaDetector plugin to process a frame in an external program","archived":false,"fork":false,"pushed_at":"2025-11-19T15:40:28.000Z","size":263,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-11-19T17:26:06.796Z","etag":null,"topics":["epics-support-module","from-dls-controls"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DiamondLightSource.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-01-25T13:33:05.000Z","updated_at":"2025-11-19T15:40:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"a5baa73f-9b20-41d6-9410-dfb3ff1f832d","html_url":"https://github.com/DiamondLightSource/ADExternal","commit_stats":null,"previous_names":["diamondlightsource/adexternal"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/DiamondLightSource/ADExternal","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DiamondLightSource%2FADExternal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DiamondLightSource%2FADExternal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DiamondLightSource%2FADExternal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DiamondLightSource%2FADExternal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DiamondLightSource","download_url":"https://codeload.github.com/DiamondLightSource/ADExternal/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DiamondLightSource%2FADExternal/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29052632,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-03T15:43:47.601Z","status":"ssl_error","status_checked_at":"2026-02-03T15:43:46.709Z","response_time":96,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["epics-support-module","from-dls-controls"],"created_at":"2025-03-02T22:31:37.460Z","updated_at":"2026-02-03T18:33:07.234Z","avatar_url":"https://github.com/DiamondLightSource.png","language":"C++","readme":"# ADExternal\n\nADExternal is an areaDetector plugin to process a frame in an external\nprocess minimising data copying by using shared memory.\n\nThe processing side (external process) is called `worker`, examples of it\ncan be found under folder `worker/python`.\n\nA worker can be implemented in any language, the protocol is documented in\n [PROTOCOL](PROTOCOL.md)\n\n## Features\n- The EPICS side is assolated of the processing side and therefore a failure\nin the processing task will not affect EPICS stability\n- Frame is passed to the worker using shared memory, therefore, minimising\noverhead\n- A worker can add attributes to the frame\n- A worker can update PV values\n- A worker can process a frame in place or might prefer to create a new frame\n- There can be more than one worker to process in parallel\n\n## Limitations\n- ADCore version 3-13 or newer is required.\n- There can only be one shared memory per IOC (given that it is used for every\n  frame allocation), if there are multiple ADExternal instances, only the first\n  instance will create the shared memory and the rest will use the same one,\n  make sure that memory size is big enough for all the area detector plugins\n  and drivers used.\n- Each ADExternal instance must use a different socket path\n- The asyn parameters that are updated by the worker should have a name that\n starts with a letter indicating the type (`i` for integer, `d` for double or\n `s` for string)\n- Asyn parameters' initial values are determined by workers and all of them\n  should use the same values (this could be changed if needed)\n- A worker that creates a new frame can only do it with size equals or less than\nthe input frame size, that is a consequence of reusing the same shared memory\narea for the output frame.\n\n## Quickstart\n- Configure the plugin in the target IOC\n```c\n# ADExternalConfig(\n#    portName, socketPath, shmName, className, identity,\n#    queueSize, blockingCallbacks, NDArrayPort, NDArrayAddr, maxMemory,\n#    priority, stackSize)\nADExternalConfig(\n    \"ad.ext\", \"/tmp/unix_sock_name.sock\", \"shm_name1\", \"Template\", \"\",\n    5, 1, \"ad.cam\", 0, 67108864,\n    0, 0)\n```\nIn this case, it uses an example worker type called `Template`.\n\n`maxMemory` specifies shared memory size.\n\n- Run the worker passing the path to the unix socket\n```bash\n$ python worker/python/Template.py /tmp/unix_sock_name.sock\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdiamondlightsource%2Fadexternal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdiamondlightsource%2Fadexternal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdiamondlightsource%2Fadexternal/lists"}