AVR Z-LINKŪ


EventHandler.java

Go to the documentation of this file.
00001 /* This file has been prepared for Doxygen automatic documentation generation.*/
00002 package main;
00003 
00004 import javax.comm.SerialPort;
00005 
00006 import radioInterface.NewAssociationIndication;
00007 import radioInterface.NewAssociationIndicationListener;
00008 import radioInterface.NewDataIndication;
00009 import radioInterface.NewDataIndicationListener;
00010 import radioInterface.NewDisassociationIndication;
00011 import radioInterface.NewDisassociationIndicationListener;
00012 import radioInterface.RadioInterface;
00013 import radioInterface.RadioInterfaceStartException;
00014 import serialInterface.SerialPortUtilities;
00015 
00016 import gui.ChatWindow;
00017 import gui.ChatWindowEvent;
00018 import gui.ChatWindowEventListener;
00019 import gui.Dialogs;
00020 import gui.MainFrame;
00021 import gui.MainFrameEvent;
00022 import gui.MainFrameEventListener;
00023 
00024 
00042 public class EventHandler implements NewAssociationIndicationListener, NewDisassociationIndicationListener,
00043                                                                   NewDataIndicationListener, MainFrameEventListener, ChatWindowEventListener{
00044         
00045         private static final int RETRY_LIMIT = 4;
00046         private static final int MAX_DATA_LENGTH = 30;
00047         private MainFrame Main;
00048         private ChatWindow chat;
00049         private RadioInterface radio;
00050         
00051         private boolean isConnected;
00052         private boolean isCoordinator;
00053         private boolean networkStarted;
00054         
00067         public EventHandler( MainFrame MainTab, ChatWindow ChatTab ){
00068                 
00069                 this.Main = MainTab;
00070                 this.chat = ChatTab;
00071                 this.radio = null;
00072                 
00073                 isConnected = false;
00074                 isCoordinator = false;
00075                 networkStarted = false;
00076                 
00077                 //Setup eventsystem from MainFrame, ChatWindow and RadioInterface.
00078                 this.Main.addMainFrameEventListener( this );
00079                 this.chat.addChatWindowEventListener( this );
00080         }
00081         
00082         
00083         /*=============================== EVENT HANDLERS ==============================*/
00084         
00093         public void NewAssociationIndicationEvent( NewAssociationIndication newAssociation ){
00094                 
00095                 if( isCoordinator ){
00096                         
00097                         networkStarted = true;
00098                         chat.clearConversation( );
00099                         chat.enableMessageWindow( );
00100                 }
00101                 
00102                 else{
00103                         Dialogs.showPlainMessage( Main, "End-devices are not supposed to be open for association!" );
00104                 }
00105         }
00106         
00115         public void NewDisassociationIndicationEvent( NewDisassociationIndication newDisAssociation ){
00116                 // TODO Auto-generated method stub
00117         }
00118         
00127         public void NewDataIndicationEvent( NewDataIndication newData ){
00128                 
00129                 //Append new data.
00130                 chat.appendIncommingMessage( newData.getNewData( ) );
00131         }
00132         
00141         public void MainFrameEvent( MainFrameEvent event ) {
00142                 
00143                 //Extract event type
00144                 int eventType = event.getEventType( );
00145                 
00146                 //Connect to radio plaform.
00147                 if( eventType == MainFrameEvent.CONNECT ){
00148                         
00149                         Main.clearDebugMesasges( );
00150                         Main.appendDebugMessage( "EVENT: Connect" );
00151                         
00152                         //Not connected.
00153                         if( !isConnected ){
00154                                 
00155                                 Main.appendDebugMessage( "Not connected...initialize radio interface." );
00156                                 
00157                                 //Try to open a new radio interface.
00158                                 if( initializeRadio( ) ){
00159                                         
00160                                         Main.appendDebugMessage( "Radio interface initialized." );
00161                                         
00162                                         //See if the radio platform responds.
00163                                         if( sendResetWithRetry( ) ){
00164                                                 
00165                                                 isConnected = true;
00166                                                 networkStarted = false;
00167                                                 
00168                                                 //Configure radio platform with user options
00169                                                 if( configureRadioPlatform( ) ){
00170                                                                 
00171                                                         //Coordinator.
00172                                                         if( isCoordinator ){
00173                                                                 
00174                                                                 chat.clearConversation( );
00175                                                                 
00176                                                                 Main.appendDebugMessage( "Coordinator Started." );
00177                                                                 chat.appendTextToConversation( "Network not started yet." );
00178                                                         }
00179                                                         
00180                                                         else{
00181                                                                 
00182                                                                 Main.appendDebugMessage( "End-device Started." );
00183                                                                 networkStarted = true;
00184                                                                 chat.clearConversation( );
00185                                                                 chat.enableMessageWindow( );
00186                                                         }
00187                                                         
00188                                                         Main.addChatTab( chat );
00189                                                         radio.addNewAssociationIndicationListeners( this );
00190                                                         radio.addNewDataIndicationListeners( this );
00191                                                         radio.addNewDisassociationIndicationListeners( this );
00192                                                         radio.enableIndications( );
00193                                                 }
00194                                                 
00195                                                 else{
00196                                                         
00197                                                         isConnected = false;
00198                                                         radio.disableIndications( );
00199                                                         radio.removeNewAssociationIndicationListeners( this );
00200                                                         radio.removeNewDataIndicationListeners( this );
00201                                                         radio.removeNewDisassociationIndicationListeners( this );
00202                                                         radio.terminateCommunication( );
00203                                                         
00204                                                         Main.appendDebugMessage( "Network configuration and start-up failed." );
00205                                                         Dialogs.showPlainMessage( Main, "Unable to start network." );
00206                                                 }
00207                                         }
00208                                         
00209                                         else{
00210                                                 
00211                                                 radio.terminateCommunication( );
00212                                                 
00213                                                 Main.appendDebugMessage( "AT-Command AT+R failed. Check serial connection." );
00214                                                 Dialogs.showPlainMessage( Main, "Please connect radio platform first." );
00215                                         }
00216                                 }
00217                                 
00218                                 //Not possible to open interface.
00219                                 else{
00220                                         
00221                                         Main.appendDebugMessage( "Something went wrong during initialization." );
00222                                         Dialogs.showPlainMessage( Main, "Radio Interface could not be started." +
00223                                         "\r\nPlease try to reconnect!" );
00224                                 }
00225                         }
00226                         
00227                         //Already connected.
00228                         else{
00229                                 
00230                                 Main.appendDebugMessage( "Already connected." );
00231                                 Dialogs.showPlainMessage( Main, "You are already connected." );
00232                         }
00233                 }
00234                 
00235                 //Disconnect from radio platform.
00236                 else if( eventType == MainFrameEvent.DISCONNECT ){
00237                         
00238                         Main.appendDebugMessage( "EVENT: Disconnect" );
00239                         
00240                         //Not connected.
00241                         if( isConnected == false ){
00242                                 
00243                                 Main.appendDebugMessage( "You are not connected." );
00244                                 Dialogs.showPlainMessage( Main, "You are not connected." );
00245                         }
00246                         
00247                         //Disconnect
00248                         else{
00249                                 
00250                                 Main.appendDebugMessage( "You are connected...terminating RF link." );
00251                                 Main.clearDebugMesasges( );
00252                                 
00253                                 isConnected = false;
00254                                 isCoordinator = false;
00255                                 networkStarted = false;
00256                                 radio.terminateCommunication( );
00257                                 
00259                                 chat.disableMessageWindow( );
00260                                 Main.closeChatTab( chat );
00261                         }
00262                 }
00263                 
00264                 //Clear debug message window.
00265                 else{
00266                         
00267                         Main.clearDebugMesasges( );
00268                 }
00269         }
00270 
00279         public void ChatWindowEvent( ChatWindowEvent event ) {
00280 
00281                 int eventType = event.getEventType( );
00282                 String Message = event.getData( );
00283                 
00284                 //Send message
00285                 if( ( eventType == ChatWindowEvent.ENTER ) || ( eventType == ChatWindowEvent.SEND ) ){
00286                         
00287                         //OK to send message if peer-to-peer connection is established.
00288                         if( networkStarted ){
00289                                 
00290                                 sendMessage( Message );
00291                         }
00292                         
00293                         else{
00294                                 
00295                                 Dialogs.showPlainMessage( Main, "Not possible to send data until connection is established.");
00296                         }
00297                 }
00298                 
00299                 //Clear message window.
00300                 else{
00301                         
00302                         chat.clearMessage( );
00303                 }
00304         }
00305         
00306         /*=============================== HELPER FUNCTIONS ============================*/
00307         
00316         private boolean initializeRadio( ){
00317                 
00318                 //Find a serial port.
00319                 SerialPort portToUse = Dialogs.chooseSerialPort( Main );
00320                 //Proceed if a port was found, set baud rate.
00321                 if( ( portToUse != null ) && ( SerialPortUtilities.setBaudRate( portToUse, 38400 ) ) ){
00322                         
00323                         Main.appendDebugMessage( "Serial Port: " + portToUse.getName() + " open." );
00324                         
00325                         try{
00326                                 radio = new RadioInterface( portToUse );
00327                         }catch( RadioInterfaceStartException rise ){
00328                                 
00329                                 Main.appendDebugMessage( "Failed to open RadioInterface." );
00330                                 rise.printStackTrace( );
00331                                 portToUse.close( );
00332                                 
00333                                 return false;
00334                         }
00335                         
00336                         return true;
00337                 }
00338                 
00339                 //Not able to initialize radio interface.
00340                 else{
00341                         //Close serial port if it was opened.
00342                         if( portToUse != null ){
00343                                 portToUse.close( );
00344                         }
00345                         
00346                         return false;
00347                 }
00348         }
00349         
00363         private boolean sendResetWithRetry( ){
00364                 
00365                 int retryCount = 0;
00366                 
00367                 do{
00368                         
00369                         Main.appendDebugMessage( "Send AT+R." );
00370                         //No retry
00371                         if( radio.sendReset( ) ){
00372                                 
00373                                 Main.appendDebugMessage( "AT+R command successful." );
00374                                 return true;
00375                         }
00376                         //Retry
00377                         else{
00378                                 
00379                                 int responseFromUser = Dialogs.showRetryMessage( Main );
00380 
00381                                 //Retry
00382                                 if( responseFromUser != 0 ){
00383                                         
00384                                         Main.appendDebugMessage( "AT+R command failed." );
00385                                         return false;
00386                                 }       
00387                         }
00388                         
00389                         retryCount++;
00390                 }
00391                 while( retryCount < RETRY_LIMIT );
00392                 
00393                 Main.appendDebugMessage( "AT+R command failed." );
00394                 Dialogs.showErrorMessage( Main, "Too many retries." );
00395                 return false;           
00396         }
00397         
00411         private boolean configureRadioPlatform( ){
00412                 
00413                 String[ ] userOptions = Dialogs.showConfigurationDialog( Main );
00414                 
00415                 if( userOptions[ 2 ].equals( "EndDevice" ) ){
00416                 
00417                         isCoordinator = false;
00418                 }
00419                 
00420                 else{
00421                         
00422                         isCoordinator = true;
00423                 }
00424                 
00425                 return sendConfigureWithRetry( userOptions[ 0 ], userOptions[ 1 ], userOptions[ 2 ] );
00426         }
00427         
00441         private boolean sendConfigureWithRetry( String channel, String panID, String deviceType ){
00442                 
00443                 int retryCount = 0;
00444                 
00445                 do{
00446                         
00447                         Main.appendDebugMessage( "Send AT+C." );
00448                         
00449                         //No retry
00450                         if( radio.sendConfigure( channel, panID, deviceType ) ){
00451                                 
00452                                 Main.appendDebugMessage( "AT+C command successful." );
00453                                 return true;
00454                         }
00455                         //Retry
00456                         else{
00457                                 
00458                                 int responseFromUser = Dialogs.showRetryMessage( Main );
00459 
00460                                 //Retry
00461                                 if( responseFromUser != 0 ){
00462                                         
00463                                         Main.appendDebugMessage( "AT+C command failed." );
00464                                         return false;
00465                                 }       
00466                         }
00467                         
00468                         retryCount++;
00469                 }
00470                 while( retryCount < RETRY_LIMIT );
00471                 
00472                 Main.appendDebugMessage( "AT+C command failed." );
00473                 Dialogs.showErrorMessage( Main, "Too many retries." );
00474                 return false;
00475         }
00476         
00490         public void sendMessage( String Message ){
00491                 
00492                 //Find length and check if possible to send...30 bytes.
00493                 int dataLength = Message.length( );
00494                 
00495                 //Zero, do not send anything.
00496                 if( dataLength == 0 ){
00497                 
00498                         Dialogs.showErrorMessage( Main, "Pointless to send empty message." );
00499                 }
00500                 
00501                 //Allowed length. Send data.
00502                 else if( dataLength < MAX_DATA_LENGTH  ){
00503                         
00504                         if( sendData( Message ) ){
00505                                 
00506                                 chat.appendOutgoingMessage( Message );
00507                                 chat.clearMessage( );
00508                         }
00509                 }
00510                 
00511                 //Message to long. MAX 30 symbols.
00512                 else{
00513                         
00514                         Dialogs.showErrorMessage( Main, "Message too long." );
00515                         chat.clearMessage( );
00516                 }
00517         }
00518         
00529         private boolean sendData( String data ){
00530                 
00531                 int retryCount = 0;
00532                 
00533                 do{
00534                         
00535                         Main.appendDebugMessage( "Send AT+T. Message: ' " + data + " '" );
00536                         
00537                         //No retry
00538                         if( radio.sendData( data ) ){
00539                                 
00540                                 Main.appendDebugMessage( "AT+T command successful." );
00541                                 return true;
00542                         }
00543                         //Retry
00544                         else{
00545                                 
00546                                 int responseFromUser = Dialogs.showRetryMessage( Main );
00547 
00548                                 //Retry
00549                                 if( responseFromUser != 0 ){
00550                                         
00551                                         Main.appendDebugMessage( "AT+T command failed." );
00552                                         return false;
00553                                 }       
00554                         }
00555                         
00556                         retryCount++;
00557                 }
00558                 while( retryCount < RETRY_LIMIT );
00559                 
00560                 Main.appendDebugMessage( "AT+T command failed." );
00561                 Dialogs.showErrorMessage( Main, "Too many retries." );
00562                 return false;
00563         }       
00564 }
@DOC_TITLE@
Generated on Sat Dec 2 16:14:07 2006 for AVR414 User's Guide - ATAVRRZ502 - Accessory Kit by doxygen 1.4.7