00001
00027
00028 #include<stdbool.h>
00029 #include<stdint.h>
00030
00031 #include"compiler.h"
00032
00033 #include"ieee_const.h"
00034 #include"ieee_types.h"
00035 #include"wpan_mac.h"
00036
00037 #include"chat.h"
00038 #include"atParser.h"
00039 #include"serialPortHAL.h"
00040 #include"utilities.h"
00041
00042
00043
00044
00045 unsigned char __flash ATC[ ] = "AT+C";
00046 unsigned char __flash ATD[ ] = "AT+D";
00047 unsigned char __flash ATR[ ] = "AT+R";
00048 unsigned char __flash ATT[ ] = "AT+T";
00049
00050 uint8_t chatChannel = DEFAULT_CHANNEL;
00051 uint16_t chatPANID = DEFAULT_PANID;
00052 chatState_t state = CHAT_IDLE;
00053 chatRole_t role = UNDEFINED;
00054
00055
00056 static void startNetworkOperation( uint8_t channelToScan );
00057 static void stopNetworkOperation( void );
00058 static void sendMsg( uint8_t msgLength, uint8_t *msg );
00059
00060
00061
00077 void handleNewCommand( void ){
00078
00079 uint8_t *ATCommand;
00080 uint8_t *msg;
00081 uint8_t msgLength;
00082 uint8_t deviceType;
00083
00084
00085 ATCommand = getATCommand( );
00086
00087
00088
00089
00090 if( stringCompare( ATCommand, ATC ) ){
00091
00092
00093 if( state != CHAT_IDLE ){
00094
00095 sendERROR( INVALID_REQUEST );
00096 return;
00097 }
00098
00099
00100 if( !htoi8( getParameterNumber( PARAMETER_1 ), &chatChannel ) ){
00101
00102
00103 sendERROR( DATA_CONVERSION_FAILED );
00104 return;
00105 }
00106
00107
00108 if( !htoi16( getParameterNumber( PARAMETER_2 ), &chatPANID ) ){
00109
00110
00111 sendERROR( DATA_CONVERSION_FAILED );
00112 return;
00113 }
00114
00115
00116 deviceType = *( getParameterNumber( PARAMETER_3 ) );
00117
00118
00119
00120 if( deviceType == DEVICE_TYPE_COORDINATOR ){
00121
00122 role = COORDINATOR;
00123 }
00124
00125
00126 else if( deviceType == DEVICE_TYPE_END_DEVICE ){
00127
00128 role = END_DEVICE;
00129 }
00130
00131
00132 else{
00133
00134 sendERROR( UNKNOWN_DEVICE_TYPE );
00135 return;
00136 }
00137
00138
00139 startNetworkOperation( chatChannel );
00140 }
00141
00142
00143 else if( stringCompare( ATCommand, ATD ) ){
00144
00145 stopNetworkOperation( );
00146 }
00147
00148
00149 else if( stringCompare( ATCommand, ATR ) ){
00150
00151
00152 wpan_mlme_reset_request( true );
00153 state = CHAT_RESET_PENDING;
00154 }
00155
00156
00157 else if( stringCompare( ATCommand, ATT ) ){
00158
00159
00160 if( state != CHAT_CONNECTED ){
00161
00162 sendERROR( INCONSISTENT_STATE );
00163 return;
00164 }
00165
00166
00167 if( !htoi8( getParameterNumber( PARAMETER_1 ), &msgLength ) ){
00168
00169
00170 sendERROR( DATA_CONVERSION_FAILED );
00171 return;
00172 }
00173
00174
00175 msg = getParameterNumber( PARAMETER_2 );
00176 sendMsg( msgLength, msg );
00177 }
00178
00179
00180 else{
00181
00182 sendERROR( UNKNOWN_AT_COMMAND );
00183 }
00184 }
00185
00186
00197 static void startNetworkOperation( uint8_t channelToScan ){
00198
00199 uint32_t channelMask = 1UL;
00200
00201
00202 channelMask = channelMask << chatChannel;
00203
00204
00205 wpan_mlme_scan_request( MLME_SCAN_TYPE_ACTIVE, channelMask,
00206 SCANDURATION );
00207
00208 state = CHAT_ACTIVE_SCAN_PENDING;
00209 }
00210
00211
00216 static void stopNetworkOperation( void ){
00217
00218
00219 }
00220
00230 static void sendMsg( uint8_t msgLength, uint8_t *msg ){
00231
00232
00233 wpan_mcpsdata_addr_t addr_info;
00234 addr_info.SrcAddrMode = WPAN_ADDRMODE_SHORT;
00235 addr_info.DstAddrMode = WPAN_ADDRMODE_SHORT;
00236 addr_info.SrcPANId = chatPANID;
00237 addr_info.DstPANId = chatPANID;
00238
00239
00240 if( !( msgLength <= MAX_MSG_LENGTH ) ){
00241
00242 sendERROR( INVALID_REQUEST );
00243 return;
00244 }
00245
00246
00247
00248 if( role == COORDINATOR ){
00249
00250 addr_info.SrcAddr = COORD_SHORT_ADDRESS;
00251 addr_info.DstAddr = END_DEVICE_SHORT_ADDRESS;
00252 }
00253
00254
00255 else{
00256
00257 addr_info.SrcAddr = END_DEVICE_SHORT_ADDRESS;
00258 addr_info.DstAddr = COORD_SHORT_ADDRESS;
00259 }
00260
00261
00262 if( wpan_mcps_data_request( &addr_info, 0x01, WPAN_TXOPT_ACK, msg, msgLength ) ){
00263
00264 ;
00265 }
00266
00267 else{
00268
00269 sendERROR( EVENT_BUFFER_FULL );
00270 }
00271 }