Example #1
0
        public async Task Write(byte[] dataToWrite)
        {
            try
            {
                //string temp = Encoding.UTF8.GetString(dataToWrite, 0, dataToWrite.Length);
                //Debug.WriteLine(">" + dataToWrite.Length + temp + "<");

                if (dataToWrite.Length < 5)
                {
                    return;
                }

                //TcpClnt.WriteStream.Write(dataToWrite, 0, dataToWrite.Length);
                //await TcpClnt.WriteStream.FlushAsync();

                OnSendToPumpController(this, new SendToPumpControllerEventArgs(dataToWrite));
                await Task.Delay(500);
            }
            catch (Exception ex)
            {
                string dataBuffer = Encoding.UTF8.GetString(dataToWrite, 0, dataToWrite.Length);
                SystemLogs.LogError("WriteToSocket Exception", "Error Message: " + ex.Message,
                                    "Buffer:" + dataBuffer);
            }
        }
Example #2
0
        private async Task updatePumpStatus(string allPumpStatus)
        {
            /*
             * 28 02 02 02 02 2F 02 12 02 02 02 02 02 0000000000000000000000000000000000000000
             * 28 02 02 02 02 2F 02 12 02 02 02 02020000000000000000000000000000000000000000
             * 2017/10/25 23:34:38 disp no=1 DSTAT_IDLE, DISP_IDLE
             * 2017/10/25 23:34:38 disp no=2 DSTAT_IDLE, DISP_IDLE
             * 2017/10/25 23:34:38 disp no=3 DSTAT_IDLE, DISP_IDLE
             * 2017/10/25 23:34:38 disp no=4 DSTAT_IDLE, DISP_IDLE
             * 2017/10/25 23:34:38 disp no=5 DSTAT_RUNNING, DISP_RUNNING
             * 2017/10/25 23:34:38 disp no=6 DSTAT_IDLE, DISP_IDLE
             * 2017/10/25 23:34:38 disp no=7 DSTAT_SALECOMPLETE, DISP_RUNNING
             * 2017/10/25 23:34:38 disp no=8 DSTAT_IDLE, DISP_IDLE
             * 2017/10/25 23:34:38 disp no=9 DSTAT_IDLE, DISP_IDLE
             * 2017/10/25 23:34:38 disp no=10 DSTAT_IDLE, DISP_IDLE
             * 2017/10/25 23:34:38 disp no=11 DSTAT_IDLE, DISP_IDLE
             * 2017/10/25 23:34:38 disp no=12 DSTAT_IDLE, DISP_IDLE
             *
             */

            if (allPumpStatus == "")
            {
                allPumpStatus = "0000000000000000000000000000000000000000000000000000000000000";
            }

            PiePumps.pumpStatusUpdate(allPumpStatus);

            if (previousMessageStatus != allPumpStatus)
            {
                for (int i = 0; i < PiePumps.TotalOfPump; i++)
                {
                    UiPumpUpdate(i);
                }

                bool NotRequireToSendReserveState = true;

                if (allPumpStatus.Contains("#").Equals(false) && NotRequireToSendReserveState)
                {
                    OnPumpStatus(this, new PumpStatusEventArgs(
                                     SystemParameters.RetailerNumber,
                                     PiePumps.TotalOfPump,
                                     allPumpStatus));
                }

                previousMessageStatus = allPumpStatus;

                SystemLogs.LogBankServer(allPumpStatus, "PI", "Pump Status");
            }
        }
Example #3
0
        private async Task processUnexectedPumpDispenseCompleted(int pumpId)
        {
            if (PiePumps.Pumps[pumpId].UnexectedPumpDispenseCompletedFlag)
            {
                return;
            }

            PiePumps.Pumps[pumpId].CompletedDispenseCount += 1;
            if (PiePumps.Pumps[pumpId].CompletedDispenseCount > 5)      // 5 seconds wait is enought to make sure the
            {                                                           // pump transaction is not own by others POS
                PiePumps.Pumps[pumpId].UnexectedPumpDispenseCompletedFlag = true;
                PiePumps.Pumps[pumpId].CompletedDispenseCount             = 0;

                // await updatePumpStatusFromDb();

                // straitghaway to clear it. no need to check in DB
                await processDispenseCompleted(pumpId);

                if (DEBUG_MODE)
                {
                    Debug.WriteLine("-> processUnexectedPumpDispenseCompleted for Pump Number " + pumpId);
                    SystemLogs.LogBankServer("Pump No" + pumpId + 1, "POS", "processUnexectedPumpDispenseCompleted");
                }
            }
            else if (PiePumps.Pumps[pumpId].CompletedDispenseCount > 15)                  // 15 seconds wait is enought to make sure the
            {
                // retry when the previous requst is failed
                PiePumps.Pumps[pumpId].UnexectedPumpDispenseCompletedFlag = false;
                PiePumps.Pumps[pumpId].CompletedDispenseCount             = 0;
                if (DEBUG_MODE)
                {
                    Debug.WriteLine("-> processUnexectedPumpDispenseCompleted for Pump Number " + pumpId);
                    SystemLogs.LogBankServer("Pump No" + pumpId + 1, "POS", "processUnexectedPumpDispenseCompleted Retry");
                }
            }
        }
Example #4
0
        public async Task ProcessDataReceived(byte[] data)
        {
            string dataInString = "INIT";

            try
            {
                dataInString = Encoding.UTF8.GetString(data, 0, data.Length);
                if (dataInString.Trim() == "")
                {
                    return;
                }

                MessageType messageType = MessageType.Unknown;

                if (dataInString.Contains("$"))
                {
                    messageType = MessageType.AuthorizationInfo;
                }
                else
                {
                    string messageTypeIdentifier = Encoding.UTF8.GetString(data, 1, 1);
                    Enum.TryParse <MessageType>(messageTypeIdentifier, out messageType);
                }

                if (messageType == MessageType.PumpStatus)
                {
                    int minPumpStatusData = 30;
                    if (data.Length > minPumpStatusData)
                    {
                        dataInString = dataInString.Substring(0, 68);
                        await updatePumpStatus(dataInString);

                        for (int i = 0; i < PiePumps.TotalOfPump; i++)
                        {
                            if (PiePumps.Pumps[i].CurrentStatus == PumpStatus.DispenseCompleted)
                            {
                                if (PiePumps.Pumps[i].Request != RequestPumpStatus.RequestDispenseCompleted)
                                {
                                    await processUnexectedPumpDispenseCompleted(i);

                                    continue;
                                }
                            }
                            else
                            {
                                if (PiePumps.Pumps[i].Request == RequestPumpStatus.RequestReserve)
                                {
                                    processReserve(i);
                                    continue;
                                }
                                else
                                if (PiePumps.Pumps[i].Request == RequestPumpStatus.RequestAutorise)
                                {
                                    processAuthorise(i);
                                    continue;
                                }
                                else if (PiePumps.Pumps[i].Request == RequestPumpStatus.RequestStartedDispense)
                                {
                                    processRunning(i);
                                    continue;
                                }
                                else if (PiePumps.Pumps[i].Request == RequestPumpStatus.RequestDispenseCompleted)
                                {
                                    await processDispenseCompleted(i);

                                    continue;
                                }
                                else if (PiePumps.Pumps[i].Request == RequestPumpStatus.RequestCancel)
                                {
                                    processCancel(i, PiePumps.Pumps[i].ZapOrderId);
                                    continue;
                                }
                            }
                        }

                        if (DEBUG_MODE)
                        {
                            for (int i = 0; i < PiePumps.TotalOfPump; i++)
                            {
                                //if (i > 2)
                                //return;

                                if (PiePumps.Pumps[i].Request > (RequestPumpStatus)2)
                                {
                                    var status = "|" + PiePumps.Pumps[i].PumpId + "*" +
                                                 PiePumps.Pumps[i].ZapOrderId + "*" +
                                                 PiePumps.Pumps[i].Request.ToString("G") + "*" +
                                                 PiePumps.Pumps[i].CurrentStatus.ToString("G") + "*" +
                                                 PiePumps.Pumps[i].RequestTriedCount + "|";
                                    Debug.WriteLine(status);
                                }
                            }
                        }
                    }
                }
                else if (messageType == MessageType.AuthorizationInfo)
                {
                    GetAuthorization(dataInString);
                    SystemLogs.LogBankServer(dataInString + 1, "POS", "Dispense Info");
                }
                //else if (messageType == MessageType.ReserveStatus)
                //{
                //    GetReserveStatus(dataInString);
                //}
                else
                // Sometime it is not trigger properly the reserve status
                // below is the workaround
                if (Encoding.UTF8.GetString(data, 1, 1) == "M")
                {
                    GetReserveStatus(dataInString);
                }

                // Log every received msj to DB. BS is BankServer
                // SystemLogs.LogBankServer(dataInString, "PI", messageType.ToString("G"));

                if (DEBUG_MODE)
                {
                    if (messageType != MessageType.PumpStatus)
                    {
                        Debug.WriteLine("Received from Pie: " + dataInString + Environment.NewLine);
                    }
                    else
                    {
                        if (DEBUG_MODE2)
                        {
                            Debug.WriteLine("Received from Pie: " + dataInString + Environment.NewLine);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                SystemLogs.LogError("ProcessDataReceived Exception", "Error Message: " + ex.Message,
                                    "Received Data: " + dataInString);
                Debug.WriteLineIf(ex.Message != "", ex.Message);
            }
        }
Example #5
0
        public async Task SendDataToPie(MessageCommand messageCommand, string ZapOrderId,
                                        int pumpId             = 0, decimal authoriseLimit = 0,
                                        string transactionId   = "", string webhook_start  = "",
                                        string webhook_success = "", string webhook_error  = "")
        {
            var dataByte = new byte[1];

            byte[] buffer = dataByte;
            string dataBuffer;

            try
            {
                switch (messageCommand)
                {
                case MessageCommand.RequestPumpStatus:
                    //return;
                    buffer = new PumpStatusRequest().GetBytes();
                    break;

                case MessageCommand.Reserve:
                    if (PiePumps.Pumps[pumpId - 1].CurrentStatus == PumpStatus.Idle)
                    {
                        PiePumps.Pumps[pumpId - 1].Request           = RequestPumpStatus.RequestReserve;
                        PiePumps.Pumps[pumpId - 1].ZapOrderId        = ZapOrderId;
                        PiePumps.Pumps[pumpId - 1].RequestTriedCount = 0;

                        PiePumps.Pumps[pumpId].UnexectedPumpDispenseCompletedFlag = false;

                        buffer = new Reserve(pumpId, ZapOrderId).GetBytes();
                    }
                    else
                    {
                        // straight away to reject it
                        ReservePump(pumpId, false);
                    }
                    break;

                case MessageCommand.Authorize:
                    if (PiePumps.Pumps[pumpId - 1].Request != RequestPumpStatus.RequestAutorise)
                    {
                        Debug.WriteLine("Failed. Pump is not in RequestAutorise state");
                        AuthorizePump(pumpId, false);
                        break;
                    }

                    PiePumps.Pumps[pumpId - 1].RequestTriedCount        = 0;
                    PiePumps.Pumps[pumpId - 1].BosTransactionId         = transactionId;
                    PiePumps.Pumps[pumpId - 1].WebhookStartDispense     = webhook_start;
                    PiePumps.Pumps[pumpId - 1].WebhookCompletedDispense = webhook_success;
                    PiePumps.Pumps[pumpId - 1].WebhookError             = webhook_error;

                    buffer = new Authorise(pumpId, authoriseLimit).GetBytes();
                    break;

                case MessageCommand.GetFinalization:
                    PiePumps.Pumps[pumpId - 1].Request           = RequestPumpStatus.RequestFinalize;
                    PiePumps.Pumps[pumpId - 1].RequestTriedCount = 0;

                    buffer = new GetFinalization(pumpId).GetBytes();
                    break;

                case MessageCommand.PumpCancel2:
                    PiePumps.Pumps[pumpId - 1].PreviousRequest = PiePumps.Pumps[pumpId - 1].Request;        // probably cancel request is failed

                    if (PiePumps.Pumps[pumpId - 1].CurrentStatus == PumpStatus.Reserved ||
                        PiePumps.Pumps[pumpId - 1].CurrentStatus == PumpStatus.Authorized)
                    {
                        bool okProceed = true;
                        if (ZapOrderId != "")
                        {
                            if (PiePumps.Pumps[pumpId - 1].ZapOrderId != ZapOrderId)                                        // make sure the same order id)
                            {
                                okProceed = false;
                            }
                        }

                        if (okProceed)
                        {
                            PiePumps.Pumps[pumpId - 1].RequestTriedCount = 0;
                            PiePumps.Pumps[pumpId - 1].Request           = RequestPumpStatus.RequestCancel;
                            buffer = new CancelPump(pumpId).GetBytes();

                            break;
                        }
                    }

                    PiePumps.Pumps[pumpId - 1].RequestTriedCount = 9999;                                   // terus cancel
                    processCancel(pumpId - 1, ZapOrderId);
                    return;
                }

                if (messageCommand != MessageCommand.RequestPumpStatus)
                {
                    dataBuffer = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
                    SystemLogs.LogBankServer(dataBuffer, "POS", messageCommand.ToString("G"));
                }
                await Write(buffer);

                if (DEBUG_MODE)
                {
                    if (messageCommand != MessageCommand.RequestPumpStatus)
                    {
                        Debug.WriteLine("--------> Request to Pie for " + messageCommand.ToString("G") + " Pump No:" + pumpId +
                                        " Data:" + Encoding.UTF8.GetString(buffer, 0, buffer.Length));
                    }
                }
            }
            catch (Exception ex)
            {
                dataBuffer = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
                SystemLogs.LogError("SendDataToBankServer Exception", "Error Message: " + ex.Message,
                                    "Buffer:" + dataBuffer);
            }
        }