Subversion Repositories tpanel

Rev

Rev 168 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 168 Rev 169
Line 52... Line 52...
52
using std::bind;
52
using std::bind;
53
 
53
 
54
TIcons *gIcons = nullptr;
54
TIcons *gIcons = nullptr;
55
TPrjResources *gPrjResources = nullptr;
55
TPrjResources *gPrjResources = nullptr;
56
TPageManager *gPageManager = nullptr;
56
TPageManager *gPageManager = nullptr;
-
 
57
//std::vector<amx::ANET_COMMAND> TPageManager::mCommands;
-
 
58
 
57
extern amx::TAmxNet *gAmxNet;
59
extern amx::TAmxNet *gAmxNet;
58
extern std::atomic<bool> _netRunning;
60
extern std::atomic<bool> _netRunning;
59
extern bool _restart_;                          //!< If this is set to true then the whole program will start over.
61
extern bool _restart_;                          //!< If this is set to true then the whole program will start over.
60
 
62
 
61
mutex surface_mutex;
63
mutex surface_mutex;
Line 740... Line 742...
740
 
742
 
741
    // Freshly initialize everything.
743
    // Freshly initialize everything.
742
    initialize();
744
    initialize();
743
}
745
}
744
 
746
 
-
 
747
void TPageManager::runCommands()
-
 
748
{
-
 
749
    DECL_TRACER("TPageManager::runCommands()");
-
 
750
 
-
 
751
    if (mBusy || cmdLoop_busy)
-
 
752
        return;
-
 
753
 
-
 
754
    try
-
 
755
    {
-
 
756
        mThreadCommand = std::thread([=] { this->commandLoop(); });
-
 
757
        mThreadCommand.detach();
-
 
758
    }
-
 
759
    catch (std::exception& e)
-
 
760
    {
-
 
761
        MSG_ERROR("Error starting thread for command loop: " << e.what());
-
 
762
        _netRunning = false;
-
 
763
    }
-
 
764
}
-
 
765
 
745
/*
766
/*
746
 * The following method is called by the class TAmxNet whenever an event from
767
 * The following method is called by the class TAmxNet whenever an event from
747
 * the controller occured.
768
 * the Netlinx occured.
748
 */
769
 */
749
void TPageManager::doCommand(const amx::ANET_COMMAND& cmd)
770
void TPageManager::doCommand(const amx::ANET_COMMAND& cmd)
750
{
771
{
751
    DECL_TRACER("TPageManager::doCommand(const amx::ANET_COMMAND& cmd)");
772
    DECL_TRACER("TPageManager::doCommand(const amx::ANET_COMMAND& cmd)");
752
 
773
 
-
 
774
    if (!cmdLoop_busy)
-
 
775
        runCommands();
-
 
776
 
753
    mCommands.push_back(cmd);
777
    mCommands.push_back(cmd);
-
 
778
}
-
 
779
 
-
 
780
void TPageManager::commandLoop()
-
 
781
{
-
 
782
    DECL_TRACER("TPageManager::commandLoop()");
754
 
783
 
755
    if (mBusy)
784
    if (mBusy || cmdLoop_busy)
756
        return;
785
        return;
757
 
786
 
758
    mBusy = true;
787
    mBusy = cmdLoop_busy = true;
759
    string com;
788
    string com;
760
 
789
 
761
    while (mCommands.size() > 0)
790
    while (cmdLoop_busy && !killed && !_restart_)
762
    {
791
    {
763
        amx::ANET_COMMAND& bef = mCommands.at(0);
-
 
764
        mCommands.erase(mCommands.begin());
792
        while (mCommands.size() > 0)
765
 
-
 
766
        switch (bef.MC)
-
 
767
        {
793
        {
768
            case 0x0006:
-
 
769
            case 0x0018:	// feedback channel on
794
            amx::ANET_COMMAND bef = mCommands.at(0);
770
                com.assign("ON-");
-
 
771
                com.append(to_string(bef.data.chan_state.channel));
795
            mCommands.erase(mCommands.begin());
772
                parseCommand(bef.device1, bef.data.chan_state.port, com);
-
 
773
            break;
-
 
774
 
796
 
-
 
797
            switch (bef.MC)
-
 
798
            {
775
            case 0x0007:
799
                case 0x0006:
776
            case 0x0019:	// feedback channel off
800
                case 0x0018:	// feedback channel on
777
                com.assign("OFF-");
801
                    com.assign("ON-");
778
                com.append(to_string(bef.data.chan_state.channel));
802
                    com.append(to_string(bef.data.chan_state.channel));
779
                parseCommand(bef.device1, bef.data.chan_state.port, com);
803
                    parseCommand(bef.device1, bef.data.chan_state.port, com);
780
            break;
804
                break;
781
 
805
 
-
 
806
                case 0x0007:
782
            case 0x000a:	// level value change
807
                case 0x0019:	// feedback channel off
783
                com = "LEVEL-";
808
                    com.assign("OFF-");
784
                com += to_string(bef.data.message_value.value);
809
                    com.append(to_string(bef.data.chan_state.channel));
-
 
810
                    parseCommand(bef.device1, bef.data.chan_state.port, com);
785
                com += ",";
811
                break;
786
 
812
 
787
                switch (bef.data.message_value.type)
813
                case 0x000a:	// level value change
788
                {
814
                    com = "LEVEL-";
789
                    case 0x10: com += to_string(bef.data.message_value.content.byte); break;
-
 
790
                    case 0x11: com += to_string(bef.data.message_value.content.ch); break;
-
 
791
                    case 0x20: com += to_string(bef.data.message_value.content.integer); break;
-
 
792
                    case 0x21: com += to_string(bef.data.message_value.content.sinteger); break;
-
 
793
                    case 0x40: com += to_string(bef.data.message_value.content.dword); break;
-
 
794
                    case 0x41: com += to_string(bef.data.message_value.content.sdword); break;
-
 
795
                    case 0x4f: com += to_string(bef.data.message_value.content.fvalue); break;
-
 
796
                    case 0x8f: com += to_string(bef.data.message_value.content.dvalue); break;
815
                    com += to_string(bef.data.message_value.value);
797
                }
816
                    com += ",";
798
 
817
 
799
                parseCommand(bef.device1, bef.data.message_value.port, com);
818
                    switch (bef.data.message_value.type)
800
            break;
819
                    {
-
 
820
                        case 0x10: com += to_string(bef.data.message_value.content.byte); break;
-
 
821
                        case 0x11: com += to_string(bef.data.message_value.content.ch); break;
-
 
822
                        case 0x20: com += to_string(bef.data.message_value.content.integer); break;
-
 
823
                        case 0x21: com += to_string(bef.data.message_value.content.sinteger); break;
-
 
824
                        case 0x40: com += to_string(bef.data.message_value.content.dword); break;
-
 
825
                        case 0x41: com += to_string(bef.data.message_value.content.sdword); break;
-
 
826
                        case 0x4f: com += to_string(bef.data.message_value.content.fvalue); break;
-
 
827
                        case 0x8f: com += to_string(bef.data.message_value.content.dvalue); break;
-
 
828
                    }
801
 
829
 
802
            case 0x000c:	// Command string
830
                    parseCommand(bef.device1, bef.data.message_value.port, com);
803
            {
831
                break;
804
                amx::ANET_MSG_STRING msg = bef.data.message_string;
-
 
805
 
832
 
806
                if (msg.length < strlen((char *)&msg.content))
-
 
807
                {
-
 
808
                    mCmdBuffer.append((char *)&msg.content);
-
 
809
                    break;
-
 
810
                }
-
 
811
                else if (mCmdBuffer.length() > 0)
833
                case 0x000c:	// Command string
812
                {
834
                {
813
                    mCmdBuffer.append((char *)&msg.content);
-
 
814
                    size_t len = (mCmdBuffer.length() >= sizeof(msg.content)) ? (sizeof(msg.content)-1) : mCmdBuffer.length();
-
 
815
                    strncpy((char *)&msg.content, mCmdBuffer.c_str(), len);
835
                    amx::ANET_MSG_STRING msg = bef.data.message_string;
816
                    msg.content[len] = 0;
-
 
817
                }
-
 
818
 
836
 
819
                if (getCommand((char *)msg.content) == "^UTF")  // This is already UTF8!
837
                    if (msg.length < strlen((char *)&msg.content))
-
 
838
                    {
820
                    com.assign((char *)msg.content);
839
                        mCmdBuffer.append((char *)&msg.content);
-
 
840
                        break;
-
 
841
                    }
-
 
842
                    else if (mCmdBuffer.length() > 0)
821
                else
843
                    {
822
                    com.assign(cp1250ToUTF8((char *)&msg.content));
844
                        mCmdBuffer.append((char *)&msg.content);
-
 
845
                        size_t len = (mCmdBuffer.length() >= sizeof(msg.content)) ? (sizeof(msg.content)-1) : mCmdBuffer.length();
-
 
846
                        strncpy((char *)&msg.content, mCmdBuffer.c_str(), len);
-
 
847
                        msg.content[len] = 0;
-
 
848
                    }
823
 
849
 
824
                parseCommand(bef.device1, msg.port, com);
850
                    if (getCommand((char *)msg.content) == "^UTF")  // This is already UTF8!
825
                mCmdBuffer.clear();
851
                        com.assign((char *)msg.content);
826
            }
852
                    else
827
            break;
853
                        com.assign(cp1250ToUTF8((char *)&msg.content));
828
 
854
 
829
            case 0x0502:    // Blink message (contains date and time)
-
 
830
                com = "BLINK-" + to_string(bef.data.blinkMessage.hour) + ":";
-
 
831
                com += to_string(bef.data.blinkMessage.minute) + ":";
-
 
832
                com += to_string(bef.data.blinkMessage.second) + ",";
-
 
833
                com += to_string(bef.data.blinkMessage.year) + "-";
-
 
834
                com += to_string(bef.data.blinkMessage.month) + "-";
855
                    parseCommand(bef.device1, msg.port, com);
835
                com += to_string(bef.data.blinkMessage.day) + ",";
856
                    mCmdBuffer.clear();
836
                com += to_string(bef.data.blinkMessage.weekday) + ",";
-
 
837
                com += ((bef.data.blinkMessage.LED & 0x0001) ? "ON" : "OFF");
-
 
838
                parseCommand(0, 0, com);
857
                }
839
            break;
858
                break;
840
 
859
 
841
            case 0x1000:	// Filetransfer
860
                case 0x0502:    // Blink message (contains date and time)
-
 
861
                    com = "BLINK-" + to_string(bef.data.blinkMessage.hour) + ":";
-
 
862
                    com += to_string(bef.data.blinkMessage.minute) + ":";
842
            {
863
                    com += to_string(bef.data.blinkMessage.second) + ",";
843
                amx::ANET_FILETRANSFER ftr = bef.data.filetransfer;
864
                    com += to_string(bef.data.blinkMessage.year) + "-";
-
 
865
                    com += to_string(bef.data.blinkMessage.month) + "-";
-
 
866
                    com += to_string(bef.data.blinkMessage.day) + ",";
-
 
867
                    com += to_string(bef.data.blinkMessage.weekday) + ",";
-
 
868
                    com += ((bef.data.blinkMessage.LED & 0x0001) ? "ON" : "OFF");
-
 
869
                    parseCommand(0, 0, com);
-
 
870
                break;
844
 
871
 
845
                if (ftr.ftype == 0)
872
                case 0x1000:	// Filetransfer
846
                {
873
                {
-
 
874
                    amx::ANET_FILETRANSFER ftr = bef.data.filetransfer;
-
 
875
 
847
                    switch(ftr.function)
876
                    if (ftr.ftype == 0)
848
                    {
877
                    {
-
 
878
                        switch(ftr.function)
-
 
879
                        {
849
                        case 0x0100:	// Syncing directory
880
                            case 0x0100:	// Syncing directory
850
                            com = "#FTR-SYNC:0:";
881
                                com = "#FTR-SYNC:0:";
851
                            com.append((char*)&ftr.data[0]);
882
                                com.append((char*)&ftr.data[0]);
852
                            parseCommand(bef.device1, bef.port1, com);
883
                                parseCommand(bef.device1, bef.port1, com);
853
                        break;
884
                            break;
854
 
885
 
855
                        case 0x0104:	// Delete file
886
                            case 0x0104:	// Delete file
856
                            com = "#FTR-SYNC:"+to_string(bef.count)+":Deleting files ... ("+to_string(bef.count)+"%)";
887
                                com = "#FTR-SYNC:"+to_string(bef.count)+":Deleting files ... ("+to_string(bef.count)+"%)";
857
                            parseCommand(bef.device1, bef.port1, com);
888
                                parseCommand(bef.device1, bef.port1, com);
858
                        break;
889
                            break;
859
 
890
 
860
                        case 0x0105:	// start filetransfer
891
                            case 0x0105:	// start filetransfer
861
                            com = "#FTR-START";
892
                                com = "#FTR-START";
862
                            parseCommand(bef.device1, bef.port1, com);
893
                                parseCommand(bef.device1, bef.port1, com);
863
                        break;
894
                            break;
-
 
895
                        }
864
                    }
896
                    }
865
                }
-
 
866
                else
897
                    else
867
                {
-
 
868
                    switch(ftr.function)
-
 
869
                    {
898
                    {
870
                        case 0x0003:	// Received part of file
-
 
871
                        case 0x0004:	// End of file
-
 
872
                            com = "#FTR-FTRPART:"+to_string(bef.count)+":"+to_string(ftr.info1);
-
 
873
                            parseCommand(bef.device1, bef.port1, com);
-
 
874
                        break;
899
                        switch(ftr.function)
875
 
-
 
876
                        case 0x0007:	// End of file transfer
-
 
877
                        {
900
                        {
-
 
901
                            case 0x0003:	// Received part of file
878
                            com = "#FTR-END";
902
                            case 0x0004:	// End of file
-
 
903
                                com = "#FTR-FTRPART:"+to_string(bef.count)+":"+to_string(ftr.info1);
879
                            parseCommand(bef.device1, bef.port1, com);
904
                                parseCommand(bef.device1, bef.port1, com);
880
                        }
-
 
881
                        break;
905
                            break;
882
 
906
 
-
 
907
                            case 0x0007:	// End of file transfer
-
 
908
                            {
-
 
909
                                com = "#FTR-END";
-
 
910
                                parseCommand(bef.device1, bef.port1, com);
-
 
911
                            }
-
 
912
                            break;
-
 
913
 
883
                        case 0x0102:	// Receiving file
914
                            case 0x0102:	// Receiving file
884
                            com = "#FTR-FTRSTART:"+to_string(bef.count)+":"+to_string(ftr.info1)+":";
915
                                com = "#FTR-FTRSTART:"+to_string(bef.count)+":"+to_string(ftr.info1)+":";
885
                            com.append((char*)&ftr.data[0]);
916
                                com.append((char*)&ftr.data[0]);
886
                            parseCommand(bef.device1, bef.port1, com);
917
                                parseCommand(bef.device1, bef.port1, com);
887
                        break;
918
                            break;
-
 
919
                        }
888
                    }
920
                    }
889
                }
921
                }
-
 
922
                break;
890
            }
923
            }
891
            break;
-
 
892
        }
924
        }
-
 
925
 
-
 
926
        std::this_thread::sleep_for(std::chrono::milliseconds(50));
893
    }
927
    }
894
 
928
 
895
    mBusy = false;
929
    mBusy = false;
-
 
930
    cmdLoop_busy = false;
896
}
931
}
897
 
932
 
898
void TPageManager::deployCallbacks()
933
void TPageManager::deployCallbacks()
899
{
934
{
900
    DECL_TRACER("TPageManager::deployCallbacks()");
935
    DECL_TRACER("TPageManager::deployCallbacks()");
Line 5083... Line 5118...
5083
                            case 'F':   // Set focus of text area button
5118
                            case 'F':   // Set focus of text area button
5084
                                // FIXME: Add code to set the focus of text area button
5119
                                // FIXME: Add code to set the focus of text area button
5085
                            break;
5120
                            break;
5086
 
5121
 
5087
                            case 'M':   // Submit text
5122
                            case 'M':   // Submit text
-
 
5123
                                if (content.find("|"))  // To be replaced by LF (0x0a)?
-
 
5124
                                {
-
 
5125
                                    size_t pos = 0;
-
 
5126
 
-
 
5127
                                    while ((pos = content.find("|")) != string::npos)
-
 
5128
                                        content = content.replace(pos, 1, "\n");
-
 
5129
                                }
-
 
5130
 
5088
                                bt->setText(content, btState);
5131
                                bt->setText(content, btState);
5089
                            break;
5132
                            break;
5090
 
5133
 
5091
                            case 'O':   // Sound
5134
                            case 'O':   // Sound
5092
                                bt->setSound(content, btState);
5135
                                bt->setSound(content, btState);
Line 5105... Line 5148...
5105
                        }
5148
                        }
5106
                    break;
5149
                    break;
5107
 
5150
 
5108
                    case 'T':   // Set text
5151
                    case 'T':   // Set text
5109
                        content = iter->substr(1);
5152
                        content = iter->substr(1);
-
 
5153
 
-
 
5154
                        if (content.find("|"))  // To be replaced by LF (0x0a)?
-
 
5155
                        {
-
 
5156
                            size_t pos = 0;
-
 
5157
 
-
 
5158
                            while ((pos = content.find("|")) != string::npos)
-
 
5159
                                content = content.replace(pos, 1, "\n");
-
 
5160
                        }
-
 
5161
 
5110
                        bt->setText(content, btState);
5162
                        bt->setText(content, btState);
5111
                    break;
5163
                    break;
5112
 
5164
 
5113
                    case 'U':   // Set the unicode text
5165
                    case 'U':   // Set the unicode text
5114
                        if (iter->at(1) == 'N')
5166
                        if (iter->at(1) == 'N')
Line 5123... Line 5175...
5123
                                char ch = (char)strtol(byte.c_str(), NULL, 16);
5175
                                char ch = (char)strtol(byte.c_str(), NULL, 16);
5124
                                text += ch;
5176
                                text += ch;
5125
                                pos += 2;
5177
                                pos += 2;
5126
                            }
5178
                            }
5127
 
5179
 
-
 
5180
                            if (text.find("|"))  // To be replaced by LF (0x0a)?
-
 
5181
                            {
-
 
5182
                                size_t pos = 0;
-
 
5183
 
-
 
5184
                                while ((pos = text.find("|")) != string::npos)
-
 
5185
                                    text = text.replace(pos, 1, "\n");
-
 
5186
                            }
-
 
5187
 
5128
                            bt->setText(text, btState);
5188
                            bt->setText(text, btState);
5129
                        }
5189
                        }
5130
                    break;
5190
                    break;
5131
 
5191
 
5132
                    case 'V':   // Video on / off
5192
                    case 'V':   // Video on / off