What is FastCS?
FastCS is a Python framework for building device drivers for scientific instruments.
It separates the logic of communicating with a device from the control system used to
expose it, so the same driver works with EPICS (CA or PVA), Tango, REST, and GraphQL
without modification.
eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1dWVfbyFx1MDAxMn7Pr+BwX+aeM/St3rvzRlhcdTAwMTJC2LeQmTlcdTAwMWMvMlxijGRsmSX35L/falx1MDAxOSxZi7FBXHTmXHUwMDA2T1x1MDAwZVx1MDAwM2pJbnXXV/VVdVXrv+/m5uaju443/35u3rtt1Np+s1u7mf/TXHUwMDFkv/a6PT9cZrCJxX/3wn63XHUwMDExn3lcdTAwMTZFnd77//yn1umQ5CrSXGIvXHUwMDA3V3pt79JcdTAwMGKiXHUwMDFlnvtcdTAwMTf+PTf33/gntvhNd73x9X7L+2D5/k7TO/5Cd6LV1kF8aXzSQ4fafuAlR29dR5iRxDIqwVrOjZJm2HyHzVx1MDAwYkZzXHUwMDAyUlEqpdSGXHUwMDBiPWy+8ZvRXHUwMDE5nlx1MDAwMsMjZ55/elx1MDAxNuEhIzVcdTAwMDGgVmpccoJaNTyjXHUwMDE2nLa9kWt6UTe88JbCdth1XHUwMDFk/Fx1MDAxN/Xcf0lcdTAwMWbrtcbFaTfsXHUwMDA3zeScmmyaVis5p+W323vRXXxnXHUwMDFjU1x1MDAxY7v5zP2P7vtKM8eHVzVrvTMvdVx1MDAxOX7j6Vng9XojXHUwMDE3hZ1aw4/cuMjkXHRcXO86a814av5J+tStXXprbm6Cfrs9POxcdTAwMDdNz1xy+3zt08iXXHUwMDA1zfsvXHUwMDFiObvnee5cdTAwMGVUU2OZNMl3JoJEgbPs4c0wiKWK4eBcdTAwMWKwxiRz6veWUZSi+LatWrvnJVx1MDAwM+06sZJcdTAwMTKz5Fn6nWYtuu+J5oJxrTWD5KYoVVx1MDAxN9mut8PGRcG3dEI/LcXuk/w2l8hF/Mfw93/+fPzsrMwlXHUwMDE3v8vcZL5d60VL4eWlXHUwMDFm4VNtu1x1MDAxZeVcdTAwMDY+qnWjXHUwMDBmOFl+cJpt84JmSUt81WK3XHUwMDFi3px5tdzU43WlbZ2wfXdcdTAwMWHPZzxcXPHhXHUwMDFmf1x1MDAxNlx1MDAwMZ1Dw/vy6eoo2N/RXHUwMDFmm5+vb8/s8n5cdTAwMWXokXdcdTAwMWJlgG60IYZaoY1kmiueoHJcdTAwMDB0XHUwMDA2XHUwMDA051ZbjSpBXHUwMDE4kzQ/XHUwMDAwnSpFlNSSXHUwMDFirVx1MDAwNM+jXlx0Yoy1eFxu11xuT0lcdTAwMDRkXHUwMDAy2FtNXHUwMDFibCzso24t6HVqXZTPSqGfueox5FN4NvTPXHUwMDBmp8A+VdbifGhRXHUwMDAwfktzR1x1MDAxZrCP+kJzXHUwMDAwZSuGPlxuhrLyKdCPRVx1MDAxMlx1MDAxZr+F6Gv0UlNcdTAwMThcdTAwMDbRnv/ddVpSYimKXHUwMDAyk1x1MDAxNqhAmyNGzlqtXfrtWPuO3HSx7Z9cdTAwMDaxdfNaKdHAXHUwMDAxiXy0pMPmKOwkrVxyvF9ccq1hNz9RYdc/9YNae7+kw7V+XHUwMDE07nq9QZejbt9Lj4b36Vx1MDAwMVx1MDAwZZQwOVx1MDAwNshH9eXFj41cdTAwMWV0edO35nqpfrqyaydcdTAwMDEyqnRNmOCggHIm0lBcdTAwMWNcdTAwMDBcdTAwMTkkQamh+DFcXIqU4DxcdTAwMDCZWUlcdTAwMDQoRLK0kiZcdTAwMTKSIJlcdTAwMTGpXHUwMDE5xX/4XHUwMDA1IGTyXHKPI5m1rCfEb4Lki2mAzK3kgmuTltB7IGtts0dcdTAwMWaAjPiXSoI2yTxWZMSFRUPwfCQvoNR43WI8XHUwMDAzckf8NjTJ0jKuzMhJL1xu52yvq1x1MDAwMfVm/UPrcFx1MDAwNc4vXHUwMDFhsNP77onVztnJ9UTWXHUwMDE5tVx1MDAxZGFMgbHUXHUwMDFhYDqZmFx1MDAxONQoXHUwMDAxRHCmOGOa4oAmnG9onaklnFpcdTAwMGVcdTAwMDbVvuaSXHUwMDE2WGjBXGIwo1x1MDAxY/YpXHUwMDE3aKvfLHQxrm+nwLXEcWSUyVwiXFxzW45rSplVoHWFuFZcdTAwMWF1XHUwMDA1emlMPstCrzp+vFeIaM6JYszi43JcctqmjMdcdTAwMGJcIjrb32qwvLtcdTAwMWOt6W77cHO1eVx1MDAwNSeLR6ec92FcIixLKoiiQktUsai4XHUwMDEzXHUwMDE5jaFMXHUwMDA1XHUwMDEwxangXHUwMDAzXHUwMDFhbvNcdTAwMWU1Ujfi/DpQaOaVSbD+XHUwMDA25KmBPFx1MDAwNdW2OKScXHUwMDBiS9NcdTAwMTJ6XHUwMDBmZGlLmTY1OFx1MDAxM8hYbdLZKYB835BIX0pcdTAwMDL3w4tcdTAwMGYrW0Gj+/n8e91cdTAwMDTs9nAl+Dp8nlx1MDAxMSmsOc9yftjy489x993pe02xvNVcdTAwMGbs7cHpx9ZRa3N7Y3Gy+97/9lPVz1pcdTAwMTB53Voj8q+9vTOv3Z5MXHUwMDExyZGzXkhcdTAwMTOVd71cdTAwMWGddEqbXHUwMDFih1SsXl6c3lx1MDAxY5ngZv2mfsjyOqnrNaKBXCJcdTAwMThVTNxYQoU1XHUwMDE0tYtcdTAwMDCTXHT1SatcdGfWsX5uKZf5XGKAXHUwMDA0Q4BzsMYyJXmB54DKXGKfwFBkKohcYnQxZkoxiczxXHUwMDE3VEx30zBcZmSHOOy8iGFgg85cdTAwMWVcdTAwMWVqJoZTJaWl1Wum+qZdX/9cdTAwMWMt6ejgmKv+2idcdTAwMTGeVqCZTs52XHUwMDE3pVq9Xjlf31o8OPiy9fnwZLOC++6fsYta+1x1MDAxMz/4urja+Ua/Nq86q+bFNN5cdTAwMTiAXHUwMDFmbWq7XFz/snhcdTAwMWS2Plx1MDAwNedr30AuXHUwMDFmyclcdTAwMWNcYk6JZSDRRVx1MDAxMJpnSYdUgkhcdTAwMTdWXHUwMDExXHUwMDFhT1x1MDAwMmFz2Fx1MDAxNkxcdTAwMTKqXFyo2Vx1MDAwNVCV1iqPbmaBSKBWoStcdTAwMDJcXFx0OlvwLo/uhy7S+yvxXYdp4vugjEBcblx1MDAwMapcdTAwMDDghuaOPuBbUIFcdTAwMTPF9Fx1MDAxYvGohnh41zg4J+0w7LyfW3G/f8Ff/1x1MDAwZf5cdTAwMGVcdTAwMWNcdTAwMDPohu22130/tzT83bVcZiQ27Ea993Ntv1x1MDAxN/21/3DgXHUwMDFm11xc7/vt5kmt4//xb/dnt1x1MDAxZvzx70I6w1x1MDAxNDFcdTAwMTbZJ1x1MDAwMDqFiqNvUExn+Einfzad+dVcdTAwMDMyOUlcdTAwMWGjQtX3aH9r9dare1e3d5fL1+ffl+jGxFx1MDAxY4lqt1x1MDAwZaK54IZRMGlvYFx1MDAxMIhBRcqMXHUwMDBi5HGuJKRcdTAwMTY5hopUXHUwMDAxoVqiX8bBMFx1MDAxN2QtUKRGXHUwMDExib5cdTAwMDZlWlx0ZVXyJbNcdTAwMTBgnVx1MDAxZJpUh52plknRJTC2cJlUpVRDRo1Ka1xmeuLwpFXSl2Azza2N/Vx1MDAxM2/162dcdTAwMDM7x9eHzbrpQ1SBXHUwMDFh1cBcdTAwMDCNNFXA0sB7OpvxtkRcdTAwMDTBttfdO77Yv1x0RdBY/n420Vx1MDAxYYfmllx1MDAxOM24YMJwbSCDQk3RVTFcdTAwMDadP66YXHUwMDE2Ou+qMMGQzljgXGZccoNWjFx1MDAxNtCZ50RRXnCZY9pcXIUqYLg7XHUwMDA1XGaRikrBlC1yV1x1MDAxNPAyXHUwMDE4XG6JXHUwMDEzaszTYDhGoJWSTIkpXHUwMDA0OsdcdTAwMGJW3FJBYuZeT2C0tOPVRCMuv3yu7VxiXHUwMDE2bbDrr/Zk5dqsXHUwMDFlbfQng7dkRCG4qaHCOmnJXHUwMDE4WVx1MDAxY02Kjqtb6NBcdTAwMTTNbVx1MDAwZd5cXFE0oOj74i0kt7xgsYNJQ1x1MDAxOONWoVShhjBTOSu/XHUwMDE5vPemgbdhyFNFcUJcdTAwMDKUWllcbjibMr1cdTAwMDY447FcYumfyq/B2lJ0srh+cnXYbG9vrVx1MDAxZldlZZ+vlOJJRZK9XHUwMDE4Rd3do7/8wFx1MDAxMWzvtlx1MDAxM/b6XW94uNVcdTAwMGVrrqFR60R4vHnfcH/630Gte+lcdTAwMTj85WUtaDry7p+eXHUwMDBlOP39kabfXHUwMDFiPeVcdTAwMTV5Ly8+QpW4M8erS1x1MDAxYnstOGt7jVx1MDAwYnPX3fWPor6XV7Il7lxmXHUwMDA3KXFulMap0VarTMhcdTAwMTeZXHUwMDFlQfpcdTAwMGKOIXE8Lc+jXHUwMDA0eipcdTAwMTQsXHUwMDE4ZVxcalhqXTqJ+WpGOKfKSGlAI5maJl2kXHUwMDA1plx1MDAwMfAzXHUwMDE17Sx5M1PkiyhcdTAwMWNKdDJ1oTczLl9cdTAwMDT5MpWgVILBl1e0Y1x1MDAxNWLlQVS52LriX1x1MDAxNr9AcLV0cfvd0jV2PFFqXHUwMDE1R8Xs/HLpOsSlUZksXGapLNFWMFxyUmh07vNZXHUwMDE4jFx1MDAwMVx1MDAwMUWtRC4oXHUwMDFj78jDXHUwMDA1v1x1MDAwMlUl+pxcdTAwMTShgnx3muzon4+WmaIl7cnhgt4gSC1cdTAwMGKzq6hcdTAwMTalcFHIMlx1MDAxOVxiOXtZXHUwMDE4neuTTtdr+bfv53AqnCnq+yedWnT2fm5cdTAwMWJ/vlwiQzzxk1RiMENB/c2G/rZ33deLn9jG8mXQrk+G/oGtVNa6Wlxilk3BXHUwMDEyljBFudDGMkNNflx0XHUwMDA1XHUwMDFkXHUwMDFhYo2LIFJOnTnNg/85IYffXGb8l9OskILLU2VF6ydcYodSU4mTTJ1cdTAwMWF+kqn8qeBf2V5b2ptbWpxcdTAwMWKGz19R1GFM36tcdDyc711cdTAwMWMtbTZb9NPX3b3WxuZieNrpTGjgXHKhllxuxDpcdTAwMDBwluHDXFxcdTAwMGJcIlGYXHUwMDE4TqJFiaL55CzEP1x1MDAwMSFcdTAwMDSaXHJcdTAwMDPozpqC0MObiX/o1KMoXHUwMDBmp1xuLDKGylPlXG6eXFyjhVx1MDAxY1NcdTAwMWXiXFxcImHjSOiqXyh9el7Bn+PuO+NcdTAwMGKlqFxmXHUwMDAy9Df/SEKLi9tr8YJez+tee69qjXOKZ6mEnlxcrG6u7zV35HZYu4u+e9tXx1x1MDAxZv1cdTAwMDLdNZjWXHUwMDEx5cVkvOqhLFx1MDAxYS1ktClOXHUwMDFi6y40XHUwMDAzxMXPUbkprSSkqjaG+VtcdTAwMWF1XHUwMDE3ZVRxbSRPRdpcdTAwMTNfnlx1MDAxOIWm1KI9tWhW+DRcdTAwMGKTv1NiaV2tlGSWJmh+mEt2f+RH0vt7heby5ChiMpfBXHUwMDE1myqR82WS3HGthULCMzvEpdLCzjI5dZ+FnIgmd8vpvpmo9ESp9zOhOa9dXHUwMDBmb1xuRvEyvPY2/EFPe0d+dHY/b/OPXHUwMDA3PT7UL75cdTAwMWVcdTAwMDarnZvrPXt30DxZ9FfaXHUwMDA1qaFcdTAwMDV6XHUwMDA1SbAm6DtcdTAwMWJFnVx1MDAwM81TvvBQsUCcyC4k5UrlOVx1MDAxMZWGuHVcdTAwMTaJ9lm51NC8YkGKStCl4lx1MDAwMslcdTAwMTUoodgr4UQvoFk+Pl+xXGL0LYVOZ+gmikWwMbFDxJWiwJ9ElGZfr1BcdTAwMTCEXHTBuGLSMCuSKKr7SEVcdTAwMTjqXHUwMDFjXG5cdTAwMTIppqbUPHq7MrGPXHUwMDFic1x1MDAwMv9r9FRKTO43jYiFbX7jKPh814ZQNM/tx53zTrB+ZlspSom6p1x1MDAxOUt82K376WxcdTAwMTJE0W3SqZHBJ1xuXHUwMDFmX2mUNVBcXCZcdOODRlx1MDAwZZzitFNpuVx1MDAxMozK3PP/XHUwMDE4fbqJ9WlGh2WU6Vx1MDAxOFx1MDAxZDl+XGbG+Y1cXFx1MDAwMVx1MDAxMZpcdCnR61x1MDAxM4JmVCSVjFx1MDAxOG05yo9wJr2Ae7nokVsh0Vx1MDAwMl1LXHUwMDE0voLgULk3/6ZcIkdV5DTJtZKBQF+cXHUwMDE1kSzGS8t6hFx1MDAwNUVcdTAwMTnwyterx1x1MDAxYupcdTAwMTFBfFx03277sLg2f1Lv7dfGmkZ6W01wabzvPZZIUcqIllx1MDAwZeBcdTAwMWMpbDpvZUCklFtcdTAwMWNCVci4wf/bglxuXHUwMDFijlRMXHUwMDE54+g9SqxcdTAwMDZWoCYo14RZVyus3Jxr80alyvTE5+dTKZxcdTAwMTEjXGaHXCL1oVl5zMlVWTGuaYX6o9A+pSS317xqhp9cdTAwMWGtXHUwMDE287f3Vlx1MDAwZbRcbjf9y1+kPirlaVx1MDAwYpQqwl1cYlx1MDAxNvlcdTAwMDVa3FRk331cXCszmlxu7K+STFxu/uhccstxXHUwMDE13zCHqCq5Wlx1MDAxOSNcdTAwMWJcdTAwMWbFflwiI6PMXHUwMDE4pCmccVx1MDAwYlQnXHUwMDAxgkErXHUwMDBlXHUwMDFh+ng4blxunEU0ucdM5H9cIlI5vlxc6YmPYKRwyfNSc25talxyPp4pguZcXEkjlVx1MDAwMVx0jnr+XCJWWYWLXozPSegnsmhcdTAwMWNcdTAwMTYrmUtkNDa7NGk5oUK4sky3dsF1fmnS1SSwXHUwMDAyt/yNct736XFTMkUluVx1MDAxNFajOslXZs7HgZBSm8GQc0pXYFu5+43+aXLTJ7DCZr39zKh+XHQvbHiuZHpcZjO89JvNdOhslFx1MDAxYz7G1rJ8MfNcdTAwMWPVMMbxdVx1MDAxZWND+tRSV5EtXHUwMDE0Negnm+y2L8Jgs7RcdTAwMDBgtDSuXHUwMDFhXCKHbMYlsSBcdTAwMTH+3OWycFFcdTAwMTDVt1x1MDAwNJ1zNpAtptGgelx1MDAwYilcdTAwMGZ2XHUwMDE2sqFZ5vhLXCL9i3k+a2RMXHUwMDE59Fx1MDAxZVnRUiWT5SpASJfzx1KU/v8qXHUwMDAwVy6s7rNQKKdVUrHXXHUwMDFi3lx1MDAxZr/SPNYrXHUwMDA1XHUwMDFjdK2U1VpR9GNkZuNHgdRcdTAwMThcclx1MDAwNM6Go1ZU5UNXSFx1MDAxOYlBViGo21x1MDAxYdLtYZZXMYxcdTAwMDA1aL5cdTAwMTQyNqbTxXSzQCRmSr1UXHUwMDEw35dcdTAwMDJA8aLUYFx1MDAwNqY0pMWAguRCPK1gfPa1y0K5oMbNOVx1MDAxOX1TLfOP5nWPpS+KUlx1MDAxMm9cdTAwMDdcdTAwMDNuSFlmJ0ouXHUwMDA1UZair6ZxKqQuXGKKa6d7qFvldZWeRbvKXCL3wjugu49erVbplOy3jISMYqlcIiNcdTAwMDH9QCNcbsLi83F4s3QrXG5KLVp1aiss3pwlzVIqp+6Tk9A3tVx1MDAxMquVsZuIPJLoZIlwNUfcWPQsWTaOblxm0cIwt8wtXHUwMDA0N1wiX1x1MDAxZupWX+NFWYmmQODUJaBLxdGBXGIltLBui3TOaMJcdTAwMTLeVMuoatl4tmaxXGa0XHUwMDAxla9cdTAwMGZ1iiVfKp5kJOA0u73GZqc+o1LFYlx1MDAxNHH7qVx0ozlqXHUwMDBmy0b8IVx1MDAwNegsKY2EzVx1MDAwMHWF0I/drVxc6uPWnLz/XHUwMDFhRVVcdTAwMTY8XHUwMDFlv8Hm3NOCx9K41Fx1MDAwZdRcdTAwMWPCcic8I7NB0NfBf9Tt3KLcLnj5OP/sRo9te/9uu75yeL3u6Vx1MDAwZlcgO+2lheW8Pi3d14ZcdTAwMWFcdTAwMTckXHUwMDE2XHUwMDE2Jd9YJrI61VpiXHUwMDAwT3I7+HPGn7avXHJlXHUwMDA2XXhr3UZkXHUwMDAyKfbbvjYlXHUwMDFhVXvFXHUwMDFhtSiajFMm3d6kJZWgpa//kOC2cpS6wljSoHbdrWxPXHUwMDEzTVx1MDAxZSPUmyxcXLysrVx1MDAxZnX2lvtcdTAwMTdf9y6/2aVjOsmSiNtcdTAwMDSbKOHSq9xG91LmfFx1MDAwZkYsTpTFkWNSXHUwMDE1ZS2ySXbWnSaO8XttXHUwMDFhoVuTizDFaVBmpN4mtSdMfiuJxK1QXHUwMDEy1ZWCXG4jXHUwMDE2VW5cbuO2XG7w6/3IW9t6RfVZpT2vZjmkv8/aatur7V9fIJFfvbnd2l2dqDpcdTAwMGKNM6KPO1x1MDAxM1x1MDAwZS7VzmZWQ5hcdTAwMTGEu9przqyR2lx1MDAxNCRcIrO4fpujoCH/XHUwMDAxXHJFXHUwMDAxXHUwMDA1Zlx0qlxma1x1MDAwNHXvM1x1MDAxMTBNROE3g/jpXHUwMDE0XHUwMDEwV0ClXHUwMDExKl+1MOjLmFx1MDAxN1xcIMZccoCusJjh3k5BelxmnoDxwS3/uK9cdTAwMDZcbprut1dU2jS++5VUM43fJGf80qfLiJVcIn4hlU7v4DSw35SO8NGCXHJrXHUwMDE1cVx1MDAxNZrIM4FcdTAwMGKtUlVcdTAwMGJcdNTBvVDITVxid1x1MDAxNTNGTpMp93vx0bNipE/h4aPj6TZhMEX4T4eGcy+qYq5cdTAwMTB3hrZ9q3bFXHUwMDEzxZhyjd0xqFx1MDAxYty+6+nLXHUwMDE3uNtQRFxuytyGLUKnX1tXfL9cdTAwMDUmXGJ6XHUwMDAzSOsl4473wkgsciEv8slcdTAwMWTfZe78fFx1MDAxN378XHUwMDBlcHNPc+E1Q/ONalx1MDAwMSxcdTAwMWFoK0eqKoCgV6kpSGZcdTAwMDHVXHUwMDA2oFx1MDAwNsg93+y68P291r74sFx1MDAwMt5xfUt/3TzYO+tcdTAwMWVcdTAwMTfsh1m+Na2r8ORuo1x1MDAwM/fCXHUwMDE5yFx1MDAxNK9TQJdcdTAwMDdcdTAwMTBPkiHx0elXVkzjw2tJXHUwMDE4XGLtVordT/GmM8t0pj9cdTAwMDU7Msq6l1wiXHUwMDE2akdXdlWmXHUwMDFlJVg58o7PirSjXHUwMDE1LFx1MDAxNVx1MDAxM3+WXHUwMDBmXHUwMDBmYm356LNe713umN7x1s3dhv5cdTAwMTZOyPeVq/M0UqDHrbNhfkdcdTAwMTBcXNG+kJpTR6tcbraBXHUwMDE0MVwiXFx+pJW8MMPxzaGfWJ7Pp3Ho3cvK0DcvSnDSdFxchaGIM3uqlmdjIfVcdTAwMDauXG78+V2vVUj1X4VLP9L5arz6UJ/Xulx1MDAwN99N4/bm5DzqXXT6wW5BXHUwMDAyUiHKhUtLXHUwMDFmLOVorbPvq5SEIzeiyFx1MDAxZYWgnOaZ/iRePWfIXGY0+lxuSI2kTe9g/Vx1MDAwNvO5UZhP89JKQa1cdTAwMDZlis1cdTAwMTbIUrOF3FS78peqY89cdTAwMWHQJ3xWfVu/68fbkL0mPz7X5Up89/HbyI/z3SnOXHUwMDA10eiwKMMst5Ddv1m7rGXliqbAXHUwMDAw51x1MDAwNfs3K1x1MDAwNL3bZE1Lrd2rplxulue5tFx1MDAwNOm/ditcdTAwMWZcdTAwMTb1XHUwMDAzm62M5VlcIqIl+yROtWNA/Fx1MDAwZbvC+Hx6Q4js7omauZdcdTAwMThWXHUwMDFlupv6JVx1MDAwNMPD1SZcdTAwMTSiXGJqY9x+OlxuKPpWo867c7gkqlx0QFx1MDAxOUbjw+Rj95NEUce90UG3QihlRnzbhbzEJzd8l7nx83338e9JmXua71x1MDAwZcYyirbaXG7OUItm199Hm2k+U2omfPd39+M8X+t09lwilMzhKM5f+97Nh7wu+Vcr/rhay/hcdJxcdTAwMWXxYlxi/nj3439xXHUwMDE5mlx1MDAxMyJ9 fastcs fastcs-eiger FastCS InteractiveShell event_loop: EventLoop controller: Controller transports: list[Transport] build_api() run() EigerController frames: AttrRW[int] exposure: AttrRW[float] captured: AttrR[int] arm: Command trigger: Command disarm: Command pv_prefix: str ui_path: Path EPICS CA Transport connect(ControllerAPI) serve() PVs dbl() EigerAttributeIO update() send() EigerAttributeIORef uri: str
Architecture
A FastCS application has three layers:
Controller - a Python class that models the device. It holds attributes and
commands, implements connection logic, and creates periodic polling tasks. The
controller can create AttributeIO s to handle update and send operations between
attributes and the device.
Attributes and commands - typed values (AttrR , AttrW , AttrRW ) and callable
actions (@command ) declared on the controller. Attributes represent the device’s
readable and writable parameters and carry metadata such as units, limits, and alarm
thresholds. Commands are actions that can be triggered to run.
Transport - the protocol layer that exposes the controller’s attributes and commands
to a control system. FastCS provides transports for EPICS CA, EPICS PVA, Tango, REST,
and GraphQL.
eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1dWXfaSlx1MDAxMn7Pr8jxvF40vS/z5oXYON6JbZyZOT4yXGJb7Fx1MDAwMeFtTv77VMtcdNpaXHUwMDAyXGbOJTGc3CXaaLrrq/pq6dL/Pnz8uFx1MDAxMTxccryNf33c8Fx1MDAxZetux29cZt2Hjb/M8XtvOPL7PThFwr+P+uNhPbzyLlxiXHUwMDA2o3/985/uYOBEdzn1fvflTq/jdb1eMIJr/1xyf//48X/hv+GM3zD3VzrqrvXYVPT6VnpcdTAwMGacXFxI+cVcdTAwMGZvXHIv+jkgdzjsP0SHXHUwMDFm4Vx1MDAxOJdcbjtcXDEuJeVMcz45+1x1MDAwNGcxUsRhjEmCkURS6cnZXHUwMDA3v1x1MDAxMdzBXHUwMDE1aHLkzvNv74LwJuFcdTAwMTDBMZaYXG5OtVx1MDAxMpNr3N5tx0vcNVxuhv22t93v9IdmhP/AWuI6icZ449bbt8P+uNeYXFxcdTAwMTNcZt3eaOBcdTAwMGVhQqLrmn6nU1xynsKnw8TCXHUwMDA0bqS+4/LHiEnqeN5d8KW3dz1vZCZcdTAwMWRPjvZcdTAwMDdu3Vx1MDAwZl7mJvpcdTAwMTVmhINKI1xcn/9GY1x1MDAxYbpdr2JcdTAwMTaoN+50Jof9XsMzU79xI3qJr+s1fnzdz9WNlo78OPI9XHUwMDFhvOeZJ2OuXHUwMDEwkZRhNTlcdTAwMTOJXHUwMDE5pipz+KjfXHUwMDBiZY4rTqlEKlpwf7RcdTAwMDNyXHUwMDE2hI9tup2RXHUwMDE3LYJcdTAwMTlbOSaD0W9cdTAwMWNcdTAwMGZcdTAwMWHuyy1cdTAwMTgkSHCOtEIsmpmO32unJ6DTr7ct3zLo+3FcdTAwMTE3n+j/PkYyXHUwMDEz/mXy///9a/rVWYmMbv+QesxGx1x1MDAxZFx1MDAwNdv9btdcdTAwMGbgd52YMaXHP1xu3GGwXHUwMDA1y+j3btPnvF4j50x416ZB4J3nZoRcdTAwMDLui59LQ9Xr3PRcdTAwMWYsc9bt33uH/sswR5d+cPdjlX5e+CEmNCmdsbfz7XJcdTAwMDc3q/290e5o/OTuN4/b7Zl0hsBYOyD+jGBcdTAwMDKyXHUwMDE3XHUwMDEzvVx1MDAxMFx1MDAxN1iDRlx1MDAxMZJSxCTSXGaz2ZSGdlx1MDAxNMFcdTAwMDIhIZRQXHUwMDFjRXK5Vlx1MDAxYUmlMVhcXGkwQoRcdTAwMDQwRIOJKVxygmSe0qCCIUmJjuzAn6s0SlmRXFxrjY1gS5yc9Vx1MDAwZsp+6fCLOz45U9fnx9dZrTH06sFcdTAwMGJuk2xcdTAwMDNm0mGUKUm4wppGzMCAg1PuSKk1XGJcdTAwMDTXjIro7E/FXHUwMDAxkuJwJlxiXFzEMFY8XHUwMDEy1IlcItFcdTAwMTHspiuOJlJ1hN6L4lxiZlVcdTAwMWM0V3FcdTAwMDBcdTAwMWMoKFtcdTAwMWTp9EhxcFFANqRcdTAwMTRgfV9FNibDi1x1MDAwNjpcdTAwMTFH9+x2t76HXHUwMDFho0rteHuvdrp7vePubsRhPFx1MDAxMcnAe1xmNiYnvmdcdTAwMTC8uFIqgE3xOJNjTFwiRmnmMCB5mHBOONFJxFx1MDAwMJyKXHUwMDExo5XDsyAh81jX91x1MDAwNZKxXHUwMDFkJEml/Fx1MDAwM1xyWmFEXHUwMDE15jY0sJiwp9BAXHUwMDEwXHUwMDE4XHUwMDE1qrnEr4HDm5jRUPDg939cdFx1MDAxN7I/jC9jv1x1MDAxN1T955eBJ45+crt+J1x1MDAxNMPEczY7/q2ZgY06XGbZXHUwMDFibsSnIfDBuZ1cXND1XHUwMDFijbiJqMNDXb/nXHIrs9ia/tC/9Xtu50v+2N1x0D/zRi+jXHUwMDBmhmMvPjfe3oR8OoRcdTAwMTeA97R2cTBcdTAwMTQj/7ZcIj4/b5Hq4VPwMJ7D5knhIHBBNNNKMSyTLjZlXHUwMDFh/G+pueZcZlxiMyFZusypcjC45kyBXHUwMDBiXHUwMDBlrnqkZtdWbzqg7+dcdTAwMDC0JFx1MDAwMjNNSFxcZH/gWapcXDxjXCKxIOBcbi3buu13Kv6R37h7wGf1XHUwMDEy5Sffbr3BYFx1MDAwNa1b8TiLrFx1MDAxYsy1ozRcdTAwMDbzpsC6MZmEhlwi06DBwDhS+DBcbvRcXPFcdTAwMTgvWdu66dB4mFx1MDAwM1x1MDAxYYgjxiWiNlsnXG6woZCSXHUwMDE0cbk6LuNPW3c+ilx1MDAxYqe/z8xNMS9pM5dcdTAwMWP2cizcw9HOOOiRXHUwMDFh2Tw+2CqV77+djlx1MDAwZt05LFx1MDAxY9eORlxuUVx1MDAwNFx1MDAxY1/TXHUwMDA0iDHW4EZcdTAwMDM4kYJcdTAwMGKo1lx1MDAxMcYn9k1Ih2vDYsEzpJws6tW9r3DQ81x1MDAxYyBmXHUwMDE4yFxiplbCKlnm6Fx1MDAwNMRCgXNBNH1cdTAwMTVhLbRwu4/jy/rJjnSDs06j5FXklbe3ilx1MDAxNq5wnIVcdTAwMTZcdTAwMGUhh0omXGZ3XHUwMDAzU5WKlVx1MDAxMkqmgENcdEeYXHUwMDBmg2s55VhkwTGXhXtX4JBoXHUwMDFlcFCkJWfCglxyITOR0lx0NjDHXHUwMDA0zuvVc+b23GHjXHUwMDAxlnFcdTAwMTWM3Fx1MDAxNFx1MDAwYpM2ctmhL8fQ7XyqlfdcdTAwMWbvdL2hn/uH366OxLdcdTAwMWKZxbHX6fiDUcbMXHUwMDEx5FxiXHUwMDBlSKZcdTAwMTK8Nk2SjpxEXHUwMDA2yoyAplRcXIlcYlx1MDAwNT+RXGa3OoarSoZcYlx1MDAxMFZp46pIOkxJJpEgmEmA/Fx1MDAxY8gmTe0x9rcgu+GO7rxfXGZtPFx1MDAwN7Rh0WDWpVx1MDAxNdsyXHUwMDE2hkljW4LXh5BYumP3XHUwMDEwfK3dPDz1v3qfR335dVx1MDAwZvdu7k6XafZwXHUwMDFjXHUwMDFkrzd7RHS++qdlt/Rp/2TAdqv7p1+ah7PWXHUwMDE1UEdoRFx1MDAxOFxmXG70ajJuqYRJIEolwauA/8YyiJNcdTAwMTShXHUwMDAzwi80XHUwMDAzOok1xpjSLFrgXG74XG5cZo9cdTAwMTGUIVxy6vv3QMvfYFx1MDAwN7FaOGkopVx1MDAwNs2ms5ZwIyw0oLkgQkQpgjR7XHUwMDE1in6DpGGupJpPVkaj52WwPHdcdTAwMTIxtnw/SoRerG15OKhstyulk+ftnWs+8J6uusiN6ZeNbr9cdTAwMTGKot9cdTAwMWL5XHIvfqbpP0bfnfydJlx1MDAwMkBDsiOkXHUwMDE2RCR+p4NcdTAwMDSVXHUwMDA0K66pwkCjVOZ3Rlx1MDAxMvX7pDtZvXvub/X9c8E292vbrd1g7/BqxlwiXHSCXHUwMDFkLjVHnGrwXHUwMDAyXCJrbzCtNXJcdTAwMDBOXHUwMDA0XHUwMDFib1xmXHUwMDBilk3cIFx1MDAwN4E8KS4lx+BcdTAwMTljSS15XHUwMDFjI11SmOBcdTAwMTlWlFx1MDAxMFx1MDAxOYuQrTVgSlx1MDAwM+4urFx1MDAwMbGG9Vx1MDAwNPYnbPFhWO7cslx0XGbUj0tcdTAwMDJcdTAwMDD5M1VgqUBYw/NZOV2mXHUwMDE2zC+lyNOP94/3pd2j5qN7c9N6wjW5WW1cdTAwMWZ4S9CPnCqCOdMmwVx1MDAxN2XDzVx1MDAwN/QjXHUwMDEzzNTOXHUwMDEw+Fx1MDAwM+58gXpcXDUlqPavtset2zLrXHUwMDFk35ev79tHu0FwM6tcdTAwMTKkXHUwMDBlgd+NXHUwMDExpVx1MDAxOLEkXHUwMDBilFxmOzBPTCDCgSFEyI90IHhBgilFlVx1MDAwNHeLSFx1MDAxYT0gVjnGXHUwMDFjXHUwMDEwPkpcdTAwMDFjlJhM+VpcdTAwMDfm6cCLZZSOIcyB5thCiCD1ub6UxCD0wJNWJ1x1MDAwZrBsXHUwMDE1mCur4fmsmP5cblwi+EaKXHUwMDBlU0YxU1xmtFx1MDAxZFx1MDAwMqX2V3JcIoyjrShXXG70IMNIZ+vmfkcqWOyzXHUwMDE3hoAx6DlcZoRcdTAwMTmIsWCapeJGmjlYI6SQkVx1MDAxYc6ygSNpJEdcYiBcdTAwMTHMlNOiRUPA70vpXHUwMDExu86zXHUwMDE39HBBqFx1MDAwMpm1KDeZLVx1MDAwYvip25RcdTAwMGXDRG9cdTAwMTNcdTAwMDKeJ5RcdTAwMTNJ44846mZcdTAwMTBcZs8uVyFcdTAwMDA8JfKaXHUwMDBlXHUwMDAwp1x1MDAwN76c8G+xOpyW51x1MDAwNOtcdTAwMDY0llx1MDAwMo/XlIFcdTAwMDKM5OGFzWhHXHUwMDAz0SFcdTAwMDQoIObZrTJcdTAwMDTujsd/uVx1MDAwNcc49tA1kJNAplx1MDAwYpevXHUwMDEyQbRU1MpdeD68wWprKYhES49cdTAwMDNcdTAwMTeHXHUwMDE3XHUwMDEyMvli4CZnvv9V9Nxixv765za22pvN21Pi31x1MDAwZjtPtfrluHSx3V3BuHXxOFx1MDAwYmy1QFx1MDAxYTw1rSmRXHUwMDE4K52sR5KaOqxcYuFcXIV1XGZaMXBtgFx1MDAxYS1cXI70vlx1MDAwMM5mt9QwuUhgzK07WJjOL0diUlCuSSxcXL1SpnpcdTAwMTUs9Vx1MDAxNCNptdTLNtTFXHUwMDAx7Fx1MDAxOUpupYNcdTAwMDTXnFAg3yq5zSRmqDmiIENcdTAwMTZLjZOWem2o58ExX9hQS1Cw4FxmWe10tngpSteaMmtMxavAXWT3ivOgXHSRnMuejsbuVsDlqVx1MDAxN+xcctTl4KTl33/KKX+a67llv9mqXHUwMDBmXHUwMDAyvNuq+sPH6vjxM71dxfxy8e+fkl/mjqJCUi6Z0ihpqUHHO8ZRNlx1MDAxOVx1MDAxNlx1MDAxMFxui6m2bUFcdTAwMDXUY6Xg94GbLVxiU2uA51x1MDAwMXxcdHFEoSXMNJXWfevx7b9pkHPBiJSS/6G5lOTG9bRIRndngPpcdTAwMGLSJm+UVsZMKFx1MDAwNWtOiFx1MDAwMjgn0sphZolwYuqqXHUwMDE4J4xjnU2gr27mpFhcdTAwMGZcdTAwMTfFXGYlJ1x1MDAwZXghgiEsuGKZmOHEXHUwMDEzyaEwXFyvXZFcdTAwMDU0nJgjaEg5NTVO1qAhJ1x1MDAwNUXVoHiEpvpNOnAs7IqsRNBwilx1MDAxYmBzRZZcdTAwMWUzLKFWc2u0u99Ccr99u3vjV3WbzMpRpFx1MDAwMzZcdTAwMGWUm8KIsWTtN2PSMZv5QHKAqlx1MDAxMFx1MDAxZNtDXHUwMDEzq1x1MDAwMZGEaUHNXHUwMDA2KImZbWeE1I5cdTAwMTRcdTAwMTLUI1x1MDAwMkWJ1FxcrOVd7XaSenHSQlx1MDAxNEIm92mrI8XxnS8prMNcdTAwMWFrrP7U8o98MTWfjID+XHUwMDFhXHUwMDBls9K5xM98X5VbXHUwMDA3JXT69WFcdTAwMWNcZnnv6Vx1MDAxM5qtooJzYVpgaFxy861xfM9pWFdLicklMpOMovGas1x1MDAwMreHYelQuIUxIFx1MDAwYkzNVULmXHUwMDAx+aB41Vx1MDAxNEg03uUqkE9L8HpcdTAwMDRcdTAwMDdf1ZJKNFx1MDAwYiFyXHUwMDBiyGBdXHUwMDE08MDXXHUwMDE1T0yGl1xiXHUwMDE0WLlnTERcdTAwMDdn+1x1MDAwZv7d551n3azJbrM6blx1MDAxY11cdTAwMWPOXHUwMDEzKNBEXHUwMDEyXHUwMDFj2660XHUwMDEyXHUwMDBlVUbYV15cdTAwMTlcdTAwMDVDP1x1MDAxNeFM6aNcdTAwMDI1Y1/DWdxcdTAwMGbws1x1MDAxY1xuOp2bskaMklx1MDAwMVSMsHIoaHRCsVx1MDAxMlx1MDAxOPyyjJ5cdNtcdTAwMDaaLZ3aTDLBlrotNo/38b5cdTAwMTRNTqmqvWVcdTAwMDGlyCySzfsg+TtbwEhcdTAwMGJAXHUwMDAxfVx1MDAxM+cjMiGvcD6qgFx1MDAwMKvvXHUwMDEx61x1MDAxNvUrfI8pNjrteySHvVx1MDAxY9ej++S2rj1V6Vf3+d7NsHX/rexaXHUwMDFhj9hcbi9cdTAwMDG8jtHAWlxuXHUwMDE2X5CXXadMOUb7wSllgmmW7TdcdTAwMTa8XHUwMDEy6YBGJ6ZnXHUwMDAz55TLefamvS/87i1MXHUwMDE0zDZ6Q6VtjkZBny3QzDB+uHWJjbamXHUwMDExhZvDm1ZTadrd2nm+apVr+utndfXbXHUwMDEzhVJW3P9oqmBfxVx1MDAxOaiCIFx1MDAwMrRcdTAwMTij4P5cdTAwMTFTXHUwMDA3l1I1YJtcdTAwMWNcdTAwMTRufmJcdTAwMTLzbIk3hmmmZn+7ksj0Z1WW5kZrppCraSpzlEwgU7TGsNX3yNZRxJKqXHUwMDAyIED56jGF8/CRq8BcdTAwMTWmXHUwMDE46kxcdTAwMGKX1MCXw1x1MDAxNs5cdTAwMGaean6Dd+vtNjo/6F1dXdx/sextt7NcdTAwMDVuukxQkzxcdTAwMDeUJlx1MDAwM5XAXHUwMDBmXHUwMDFjjVx1MDAwNMOmSVx1MDAwNcJ8JrZANahPRoRSXHUwMDE0XHUwMDAzqDlbh1x1MDAxNfIwvL8wWyCm53KY6rHRhfxqKCVghZB6XHUwMDFktF/HXHUwMDE2+tfq6Kh34YsxOdkptVsn1eblxe/PXHUwMDE2suL+R7NcdTAwMDX7Ks7GXHUwMDE2mKOwKcxQStJUgSXn0lx1MDAwMaqFhJDENJq20Vx1MDAwNexcYr1cdTAwMGUsvFLVfJ6dLlx1MDAxOG1cdTAwMDJ0XHUwMDAxWSOV+TtdXHUwMDExJVx1MDAxYUlO32Sb10Js4WR80/FHd6tAXHUwMDE3pljqNF3IjHw5fFx1MDAwMZdLT+Vj7Fx1MDAxZVTdvYutg4Py/TBozZGEMPt8NdEyLiNh20bTzk1QYFx1MDAxMsqQfiGyTa2s4Vx1MDAwNWBcdTAwMTlcdTAwMWFcdTAwMWNcdKK10pjFZGyN4iSKXHUwMDBmXHUwMDE2z0NgjTjiwlqzIFh+L1x1MDAwZnDQqDKb2X9cdTAwMWRjaKPaUFx1MDAxZJZuyiebpFs5fEKH3p3+7Vx1MDAxOUNW3P9owmBfxFx1MDAxOVxiXHUwMDAz5zBRWFx1MDAxOVViRE+mXHSDduBcdTAwMWbTbFxizkuadU2AbkjwbCRcIsQ0XHUwMDFikuvwwjya5nB2vkA0zL+g1jdcdTAwMDPQXFxcdTAwMGaEc1g28UY7J6NvfVx1MDAxNV2w90D/xVRhipHOUoWldz+vyC/jJ9roXHUwMDBlvlX2g/r95v1D7aA6x1ZcZlx1MDAwM1HKXHUwMDA0XHUwMDEzXHUwMDE4XHUwMDAwKJKZRODxjqaMXHUwMDEwTVx1MDAwMedUWXqfXHUwMDBik2o0b1x1MDAxM6KIcmnDr2mvXHUwMDBl56UgXHUwMDA0XFwvReeJNLyvbpjVWYlD/lx1MDAwYkBcdTAwMThcdTAwMDFkmeSEXHUwMDA15pxcdTAwMTdUbWNcdTAwMGVrxJdcdTAwMTlqeFx1MDAxMc/NreOzTmuzQZ9OR9vXtdaVbFeW2iN9SVtcdTAwMWSKx1nYPoBcdTAwMDLZ1piaPimK0yTZNjXAjnnPXHUwMDE2lkxQqUi2k1x1MDAxNFx1MDAxMVx1MDAwZTG7mShXUphcdTAwMTZcdTAwMTWLllx1MDAwMr8v0HyZ3Vx1MDAwNlJcdDxDXHUwMDEzbtvTwLKWcfI+XHUwMDEwjFx1MDAxOFx1MDAwMv23gptcdTAwMTIrx6tQXHUwMDA2PMVcdTAwMDSljWB80MuxgZeDXHUwMDFhXHUwMDFhdp9P9fbTqLLb0aSs44XGxVx1MDAxZJC4Y6JZlJnOsVwiWo1wvoDcUsRgmaSWVGfL+NdcdTAwMTXAy4Ty+TJcIu1cdTAwMTJcdTAwMTaLWDuoY0Jy02hcdTAwMTTojVx1MDAwMP/jT33dZmFcdHBpXVx1MDAwM/wxo1Pqg9Fu+fPtdfmucX2xR8jd871cdTAwMTYzXHUwMDExXHUwMDAymGVcdTAwMDdcdTAwMGKYcNM1SKLk1iAhkFx1MDAwM7ZcdTAwMDZmXHUwMDE5a9NZMqtTMOVcdTAwMGVcdTAwMTfF/YRiXCK1XG5bg1jq+N/aePpcImf3o73ztJacgN9i48sqV1uY1SOYrtLbeX8ygut+73owXHUwMDBlrsF8d8xC/6dcdTAwMTfuunFcdTAwMDY5/jKez19cdTAwMWWGXHUwMDAymM9cdTAwMTSC/iCPJiR+RZpcdTAwMTPMNOzlkIUj97l76DW3n9uDO6/j6vFgWLdU7VmBLVx1MDAxZESkUZCIcJzkXG7aXHUwMDE0JFFg8khQqpUlNzZcdTAwMDOuyVx1MDAxYde5uK7NXHUwMDAza1gkyZHVXHLOb4VtXlx1MDAwZqDUKnXCzkP1MqDc8Zq/XHUwMDAyycuG70OJPtzqq9HFqFxcq1x1MDAxZH456nzbrlx1MDAxZc1cdTAwMDRfiZBcdTAwMTPm/qnpTZPy07GJY1NJgT2ajZ+Wd5mB4camzVx1MDAxZlNKMPDmIzl/XHUwMDFkfN/eTV8p+F7NXHUwMDBlX3C1TLGh9V1mXHUwMDA1bcBcdTAwMDQhVFx1MDAxMqTfxE1fXGK+lWNnlFc2v1x1MDAxYajNjHA5YEVl7/G0/alSXHUwMDFknm6dsnp3c+v03PJcdTAwMTJ7SyFcbmbKXHUwMDExYGNcdTAwMDVcdTAwMDdrKkRcdTAwMWGtlDiUXHUwMDEw825cbqpcYlDtXGZapZq6w2WN1ny0fp2jXHUwMDEyXHUwMDA1oEq0sFx1MDAxNreR/EpcdTAwMTTAquk9q1bP2Fx1MDAwMlx1MDAxNsb5pasrg9f0XHUwMDE4l4PYqzN//1x1MDAwNPVLT/T8cYtcdTAwMWZtb1dZuzFcdTAwMWJizWtwlaZMU9NqPun2amyKVE37J81cdTAwMTBcIjRbc1x1MDAxMr6JXHUwMDAzT6k0X9PjXFzEurMjlmBcdTAwMDHAI9hcdTAwMTZcdTAwMDdX+VxyMVx1MDAxOJhlXHSOy+q9Se3lkSnn8Wz1UTzjuJeD7Fx1MDAwMOPjwZa89IPnqiBfWzV1WZ+JOKeRndxCXCLA0lx1MDAxMlNoxuFcdTAwMGZcdTAwMDJcdTAwMWGdRbbEjq1H39rZzUdzY1x1MDAxZTRTzqR5449cdTAwMDXOsULPTFNskyt+o30jXHUwMDBiO7spZIxWXHUwMDE4xMXDnVx1MDAxYrtcdTAwMWZ+XHUwMDA02zfcwaBcdTAwMWFcdTAwMTg98DNcdTAwMDOyce97XHUwMDBmW1m5/0cz/JjUeYh8I/NemDj5/uH7/1x1MDAwMXuzV+wifQ== Transport User Hardware AttrRW AttrR AttrW Send Update Publish Put IO _on_put_callback AttrW.put _on_put_callback IO.send IO.update update_callback AttrR.update _on_update_callbacks
Sub-controllers let you model hierarchical devices — a sub-controller’s attributes are
exposed under a prefixed path, and a set of identical sub-controllers can be grouped
using ControllerVector . See Controllers for details.
Writing a driver
To create a driver, subclass Controller , declare attributes and commands as typed
class members, and implement lifecycle hooks (connect , reconnect , disconnect ) and
periodic scan tasks. The tutorials walk through a complete example.
Deploying as an application
Passing the controller class to launch() generates a standard CLI with run and
schema commands. The run command takes a YAML configuration file that specifies
both the controller’s settings and which transports to start. Swapping or adding
transports requires only a config change, not a code change. See
Launching the framework for details.
Benefits
Simple API — a driver is a plain Python class with typed class-variable attributes.
There is no boilerplate or protocol-specific code in the driver itself.
Control-system-agnostic testing — controllers have no dependency on EPICS, Tango,
or any other control system and can be unit-tested as ordinary Python objects. Testing
device logic does not require a running IOC or device server.
Multiple transports from a single driver — the same controller can serve EPICS CA,
EPICS PVA, Tango, REST, and GraphQL simultaneously or in any combination.
Automatic reconnection — if a scan task raises an exception, FastCS pauses all
tasks and calls reconnect() automatically, resuming once the connection is restored.
Auto-generated OPI screens — EPICS transports generate CSS-Phoebus screen files
from the controller’s attribute metadata, with no additional effort from the driver
author.
Interactive shell — FastCS starts an IPython shell alongside the running driver,
giving direct access to the live controller instance for inspection and ad-hoc commands
without restarting.
Structured logging and per-attribute tracing — FastCS uses
loguru for structured logging. The Tracer mixin
adds TRACE-level logging to individual attributes, allowing fine-grained visibility
into specific values without increasing the verbosity of the whole driver.
Graylog integration — the generated CLI accepts a --graylog-endpoint option that
forwards all log output to a Graylog instance, with support for static and
environment-variable-sourced fields for log enrichment.