anchor.diff:  
   handle_event({send_to_widget, Type, Data}, StateName, State) ->
       {ok, Raw} = encode_packet(Type, Data),
  -    uart:send(State#state.uart, Raw),
  +    ftdi:sync_send(State#state.ftdi, Raw),
       {next_state, StateName, State};
   
   handle_event(_Event, StateName, State) ->
  
positive.code: -export([wait_for_hw_version/2, get_parameters/2, get_parameters2/2,
           wait_for_dmx/2, wait_for_dmx_change/2]).
  
  -record(state, {uart, options = #{}, dmxin = none}).
  
  -define(USB_PRO_TIMEOUT, 2000).
  -define(DEFAULT_TIMEOUT, 4000).
  
  -type enttec_widget_opts() :: #{device => file:filename()}.
  
  -type enttec_packet_type() ::
      assign_ports | change_of_state | flash_page | get_hw_version |
  
negative.code:     end,
      NewParams = maps:merge(Params, ParamsFromOpts),
      {ok, SetParams} = encode_packet(set_parameters, NewParams),
      ftdi:sync_send(State#state.ftdi, SetParams),
      {next_state, wait_for_dmx, State};
  
  get_parameters({from_widget, received_dmx, _}, State) ->
  