<p style="text-align: center"><a href="https://www.synchrotron-soleil.fr/en"><img src="https://www.synchrotron-soleil.fr/sites/default/files/logo_0.png" alt="SOLEIL Synchrotron"/></a></p>

**ContactManager** is a device intended to manage local contact for DataStorage, updating its reference in PANIC phonebook.  

<br /><br />

# License

This project is published under the [GNU Lesser General Public License V3](https://www.gnu.org/licenses/lgpl-3.0.en.html)  
*(see LICENSE.txt file)*.  

<br /><br />

# Environment configuration

To properly work, this device needs:  
- Python &ge; 3.10
- pytango &ge; 9.4.1, but &ne; 9.5.1
- numpy 1 *(dependency for pytango)*, &ge; 1.19.5

<br /><br />

# Class Properties

| Name | Type | Description |
| ---- | ---- | ----------- |
| **Description** | String[] | Gives information about ContactManager device and a link to this page. |

<br /><br />

# Device Properties

| Name | Type | Description |
| ---- | ---- | ----------- |
| **ContactKey** | String | The key for which to modify the value in PANIC Phonebook. |
| **ContactList** | String[] | The contacts this device should know.<br />Each contact should be written this way:<br />Contact_Name:PhoneBook_Value<br /><br />The Contact_Name entries will represent the possible enum labels for `contact` attribute.<br />The PhoneBook_Value is what to write in PANIC Phonebook at the key defined in `ContactKey` property when `contact` attribute is set with Contact_Name.<br /><br />Example:<br /><pre>John:john.doe[]()@synchrotron-soleil.fr<br />Jack:%JACK<br />Telma:telma.louise[]()@synchrotron-soleil.fr</pre><br />With this example, `contact` attribute will have the enum labels [\"Unknown\", \"John\", \"Jack\", \"Telma\"]. |

<br /><br />

# Attributes

Every attributes are at OPERATOR Level.  

| Name | Dyn<br/>amic | Attr.<br/>type | R/W<br/>type | Data<br/>type | Description |
| ---- | ------------ | -------------- | ------------ | ------------- | ----------- |
| **info** | no | Spectrum | READ | DEV_STRING | Information about ContactManger.<br />Includes project version, python version, dependencies versions and a link to this page. |
| **panicPhonebookReady** | no | Scalar | READ | DEV_BOOLEAN | Whether PANIC Phonebook was found. |
| **contact** | yes | Scalar | READ_WRITE | DEV_ENUM | What to write in PANIC Phonebook for the key defined in `ContactKey` property.<br />The effective written value will be the one in `ContactList` property for which the key matches the selected label in `contact` attribute.<br /><br />"Unknown" will always be present in enum labels at first index.<br /><br />Setting `contact` attribute with "Unknown" *(0)* will have effect neither on PANIC Phonebook, nore on `contact` read value.<br /><br />`contact` read value may return "Unknown" *(0)* when the value in PANIC Phonebook for the key defined in `ContactKey` property matches no known value, or when this key is not present in PANIC Phonebook. |

<br /><br />

# Commands

Every commands are at OPERATOR Level.  

| Name | Input type | Output type | Description |
| ---- | ---------- |------------ | ----------- |
| **Init** | DEV_VOID |  DEV_VOID  | This command initializes the device, forcing it to parse its properties and rebuild its attributes. |
| **State** | DEV_VOID | DEV_STATE | This command gets the device state (stored in its device_state data member) and returns it to the caller. |
| **Status** | DEV_VOID |  DEV_STRING  | This command gets the device status (stored in its device_status data member) and returns it to the caller. |

<br /><br />

## States

| Name | Description |
| ---- | ----------- |
| **ALARM** | Device failed to update PANIC Phonebook or to init PyAlarm devices. |
| **FAULT** | `ContactList` or `ContactKey` property is not correctly set. |
| **INIT** | Device is initializing, parsing its properties and checking PANIC phonebook availability.<br />In this state, you are not authorized to read `panicPhonebookReady` attribute, nore to read or set `contact` attribute. |
| **MOVING** | Writing PANIC Phonebook and initializing PyAlarm devices.<br />In this state, you are not authorized to set `contact` attribute. |
| **ON** | Device is ready to do its job. |