Creates a channel sample observer. The sample observer creates internal memory for all samples.\n The function also attach the observer to the notifier (see observer pattern). The destructor of the channel observer detach the observer. \param data_group \param group \param channel \return Smart pointer to a channel observer
| 81 | /// detach the observer. \param data_group \param group \param channel \return |
| 82 | /// Smart pointer to a channel observer |
| 83 | ChannelObserverPtr CreateChannelObserver(const IDataGroup &data_group, |
| 84 | const IChannelGroup &group, |
| 85 | const IChannel &channel) { |
| 86 | std::unique_ptr<IChannelObserver> observer; |
| 87 | |
| 88 | // Note, that num,ber of bytes returns number of bytes for |
| 89 | // all value in the array |
| 90 | const auto array_size = channel.ArraySize(); |
| 91 | const auto value_size = channel.DataBytes(); |
| 92 | |
| 93 | switch (channel.DataType()) { |
| 94 | case ChannelDataType::UnsignedIntegerLe: |
| 95 | case ChannelDataType::UnsignedIntegerBe: |
| 96 | switch (value_size) { |
| 97 | case 1: |
| 98 | observer = std::make_unique<detail::ChannelObserver<uint8_t>>( |
| 99 | data_group, group, channel); |
| 100 | break; |
| 101 | |
| 102 | case 2: |
| 103 | observer = std::make_unique<detail::ChannelObserver<uint16_t>>( |
| 104 | data_group, group, channel); |
| 105 | break; |
| 106 | |
| 107 | case 4: |
| 108 | observer = std::make_unique<detail::ChannelObserver<uint32_t>>( |
| 109 | data_group, group, channel); |
| 110 | break; |
| 111 | |
| 112 | case 8: |
| 113 | default: |
| 114 | observer = std::make_unique<detail::ChannelObserver<uint64_t>>( |
| 115 | data_group, group, channel); |
| 116 | break; |
| 117 | } |
| 118 | break; |
| 119 | |
| 120 | case ChannelDataType::SignedIntegerLe: |
| 121 | case ChannelDataType::SignedIntegerBe: |
| 122 | if (value_size <= 1) { |
| 123 | observer = std::make_unique<detail::ChannelObserver<int8_t>>( |
| 124 | data_group, group, channel); |
| 125 | } else if (value_size <= 2) { |
| 126 | observer = std::make_unique<detail::ChannelObserver<int16_t>>( |
| 127 | data_group, group, channel); |
| 128 | } else if (value_size <= 4) { |
| 129 | observer = std::make_unique<detail::ChannelObserver<int32_t>>( |
| 130 | data_group, group, channel); |
| 131 | } else { |
| 132 | observer = std::make_unique<detail::ChannelObserver<int64_t>>( |
| 133 | data_group, group, channel); |
| 134 | } |
| 135 | break; |
| 136 | |
| 137 | case ChannelDataType::FloatLe: |
| 138 | case ChannelDataType::FloatBe: |
| 139 | if (value_size <= 4) { |
| 140 | observer = std::make_unique<detail::ChannelObserver<float>>( |