public ActionResult Post(string data)
        {
            try
            {
                var list = data.Split('|');
                if (list.Length == 0 || !CheckToken(list[0]))
                {
                    return(Ok());
                }

                var fnItems      = _dataStorage.GetData <TransferData.FnItems>() ?? new TransferData.FnItems();
                var validWaiting = fnItems.Source == TransferData.SourceEnum.Server && fnItems.Valid && list[2] != fnItems.ID;
                //is valid waiting - skip it
                if (!validWaiting)
                {
                    fnItems = new TransferData.FnItems();
                    ProcessStates(list, fnItems);
                    fnItems.Source = TransferData.SourceEnum.Arduino;
                    fnItems.Date   = DateTime.UtcNow;
                    _dataStorage.SaveData(fnItems);
                    //save to recovery after terminal has lost power
                    _dataStorage.SaveData(fnItems, "FnRecovery");
                }

                var cmdItems = _dataStorage.GetData <TransferData.CmdItems>() ?? new TransferData.CmdItems();
                validWaiting = cmdItems.Source == TransferData.SourceEnum.Server && cmdItems.Valid && list[9] != cmdItems.ID;
                //is valid waiting - skip it
                if (!validWaiting)
                {
                    cmdItems = new TransferData.CmdItems();
                    ProcessStates(list, cmdItems);
                    cmdItems.Source = TransferData.SourceEnum.Arduino;
                    cmdItems.Date   = DateTime.UtcNow;
                    _dataStorage.SaveData(cmdItems);
                }

                var inputItems = new TransferData.PanelItems <TransferData.InputStatusEnum>();
                ProcessStates(13, list, inputItems);
                _dataStorage.SaveData(inputItems, "InputItems");

                var outputItems = new TransferData.PanelItems <TransferData.OutputStatusEnum>();
                ProcessStates(25, list, outputItems);
                _dataStorage.SaveData(outputItems, "OutputItems");

                var args = new DataChangedArgs()
                {
                    FnItems = fnItems, CmdItems = cmdItems, InputItems = inputItems, OutputItems = outputItems
                };
                _changeNotifier.OnNotify(args);
            }
            catch (Exception ex)
            {
                _errors.ErrorList.Add(new ErrorModel(ex.ToString()));
            }

            return(Ok());
        }
        private void ProcessStates <T>(int startPos, string[] items, TransferData.PanelItems <T> panelItems) where T : Enum
        {
            var enumList = Enum.GetValues(typeof(T)).Cast <T>().ToArray();

            for (int i = 0; i < 12; i++)
            {
                if (byte.TryParse(items[startPos + i], out byte iState))
                {
                    panelItems.SetSate(enumList[i], (TransferData.FnStateEnum)iState);
                }
            }
        }