defmodule Modbus.Helper do use Bitwise @moduledoc false def byte_count(count) do div(count - 1, 8) + 1 end def bool_val(value) do case value do 0 -> 0x00 _ -> 0xFF end end def bin2bitlist(count, bin) when count<=8 do <> = bin << b7::1, b6::1, b5::1, b4::1, b3::1, b2::1, b1::1, b0::1 >> = << b >> list = [b0, b1, b2, b3, b4, b5, b6, b7] {Enum.take(list, count), tail} end def bin2bitlist(count, bin) do <> = bin << b7::1, b6::1, b5::1, b4::1, b3::1, b2::1, b1::1, b0::1 >> = << b >> list = [b0, b1, b2, b3, b4, b5, b6, b7] {list2, tail2} = bin2bitlist(count - 8, tail) {list ++ list2, tail2} end def bin2registerlist(1, bin) do <> = bin {[register], tail} end def bin2registerlist(count, bin) do <> = bin {list2, tail2} = bin2registerlist(count - 1, tail) {[register | list2], tail2} end def bitlist2bin(values) do lists = Enum.chunk(values, 8, 8, [0, 0, 0, 0, 0, 0, 0, 0]) list = for list8 <- lists do [v0, v1, v2, v3, v4, v5, v6, v7] = list8 << v7::1, v6::1, v5::1, v4::1, v3::1, v2::1, v1::1, v0::1 >> end :erlang.iolist_to_binary(list) end def registerlist2bin(values) do list = for value <- values do <> end :erlang.iolist_to_binary(list) end end