]>
git.defcon.no Git - hm-trp-tool/blob - configurator.cpp
1 #include "configurator.h"
2 #include "ui_creator.h"
10 #include <termios.h> /* Terminal I/O support */
11 #include <errno.h> /* Error number definitions */
12 #include <fcntl.h> /* File descriptor manipulation */
17 #define CBUFFER_SIZE 32
20 const int count_devtype
= 4 ;
21 const char * dev_name
[ 4 ] = {
28 const uint32_t freq_min
[ 4 ] = {
34 const uint32_t freq_max
[ 4 ] = {
40 const uint32_t freq_default
[ 4 ] = {
47 const int count_recv_bw
= 12 ;
48 // Values selected somewhat randomly...
49 const int recv_bw
[ 12 ] = {
64 const int count_freq_dev
= 10 ;
65 // Values selected somewhat randomly...
66 const int freq_dev
[ 10 ] = { // Values as kHz ..
79 const int count_powerlevel
= 8 ;
80 const int powerlevel
[ 8 ] = { 1 , 2 , 5 , 8 , 11 , 14 , 17 , 20 };
82 const int count_rates
= 9 ;
83 const int port_rate_value
[ 9 ] = {
95 const int port_rates
[ 9 ] = {
107 const char cmd_reset
[ 3 ] = { 0xAA , 0xFA , 0xF0 };
108 const char cmd_config
[ 3 ] = { 0xAA , 0xFA , 0xE1 };
109 const char cmd_frequency
[ 3 ] = { 0xAA , 0xFA , 0xD2 };
110 const char cmd_air_rate
[ 3 ] = { 0xAA , 0xFA , 0xC3 };
111 const char cmd_bw
[ 3 ] = { 0xAA , 0xFA , 0xB4 };
112 const char cmd_deviation
[ 3 ] = { 0xAA , 0xFA , 0xA5 };
113 const char cmd_power
[ 3 ] = { 0xAA , 0xFA , 0x96 };
114 const char cmd_uart_rate
[ 3 ] = { 0xAA , 0xFA , 0x1E };
115 const char cmd_RSSI
[ 3 ] = { 0xAA , 0xFA , 0x87 };
116 const char cmd_SNR
[ 3 ] = { 0xAA , 0xFA , 0x78 };
118 int Configurator :: write_uint32_t ( int f
, uint32_t v
)
121 unsigned char buf
[ 4 ];
123 for ( i
= 0 ; i
< 4 ; i
++ )
124 buf
[ i
] = ( v
>>( 8 * i
) & 0xff );
126 return write ( f
, buf
, 4 );
129 int Configurator :: write_uint16_t ( int f
, uint16_t v
)
132 unsigned char buf
[ 2 ];
134 for ( i
= 0 ; i
< 2 ; i
++ )
135 buf
[ i
] = ( v
>>( 8 * i
) & 0xff );
137 return write ( f
, buf
, 2 );
140 int Configurator :: write_uint8_t ( int f
, uint8_t v
)
142 return write ( f
, & v
, 1 );
145 int Configurator :: write_cmd ( int f
, const char * buf
)
147 return write ( f
, buf
, 3 ); // Send the command to the device
150 int Configurator :: read_config ( int fd
, config_t
* config
)
153 unsigned char buf
[ CBUFFER_SIZE
];
156 res
= write_cmd ( fd
, cmd_config
); // Send the command to the device
157 if ( res
< 0 ) return (- 1 ); // and die on failure..
160 uint8_t * tmp_config
= ( uint8_t *) config
;
162 bzero ( buf
, CBUFFER_SIZE
);
163 res
= read ( fd
, buf
, 1 );
167 * tmp_config
++ = ( uint8_t ) buf
[ 0 ];
168 // Make sure wo don't overflow the config struct.
169 if ( ( uint8_t *) tmp_config
> (( uint8_t *) config
+ sizeof ( config_t
)) ) return (- 2 );
181 config
-> freq
= __bswap_32 ( config
-> freq
);
182 config
-> air_rate
= __bswap_32 ( config
-> air_rate
);
183 config
-> bw
= __bswap_16 ( config
-> bw
);
184 config
-> uart_rate
= __bswap_32 ( config
-> uart_rate
);
188 return 0 ; // No errors, but no valid config
191 int Configurator :: read_ok ( int fd
)
198 while ( ( read ( fd
, & c
, 1 ) > 0 ) && ( i
< 4 ) ) ok
[ i
++] = c
;
199 if ( strcmp ( ( const char *) ok
, "OK \r\n " ) == 0 ) return 1 ;
204 int Configurator :: open_port ( const char * device
, int rate
)
209 f
= open ( device
, O_RDWR
| O_NOCTTY
); // Not using O_NDELAY, that caused ERR11: temp unavail.
217 // 8 bits, local mode, read enabled
218 tio
. c_cflag
|= CS8
| CLOCAL
| CREAD
;
221 tio
. c_cflag
&= ~ CRTSCTS
;
224 tio
. c_iflag
= IGNPAR
;
227 tio
. c_lflag
= 0 ; // Non-canonical read, no other options.
228 tio
. c_cc
[ VMIN
] = 0 ; // Disable minimum characters for read
229 tio
. c_cc
[ VTIME
] = 5 ; // Wait for a max of 0.5 second
231 tcsetattr ( f
, TCSANOW
,& tio
); // Apply this now.
233 tcflush ( f
, TCIOFLUSH
); // the serial input buffer.
239 Configurator :: Configurator ( QWidget
* parent
) :
241 ui ( new Ui :: Configurator
)
246 config
= ( config_t
*) malloc ( sizeof ( config_t
));
247 bzero ( config
, sizeof ( config_t
));
248 connect ( ui
-> serialPort
, SIGNAL ( returnPressed ()), this , SLOT ( on_readButton_clicked ()));
252 Configurator ::~ Configurator ()
257 void Configurator :: on_readButton_clicked ()
259 ui
-> statusBar
-> showMessage ( "Looking for device..." );
261 ui
-> serialPort
-> setFocus ();
263 ui
-> readButton
-> setEnabled ( false );
264 ui
-> writeButton
-> setEnabled ( false );
265 ui
-> defaultsButton
-> setEnabled ( false );
268 QCoreApplication :: processEvents ();
271 QByteArray byteArray
= ( ui
-> serialPort
-> text ()). toLocal8Bit ();
272 const char * device
= byteArray
. constData ();
274 bzero ( config
, sizeof ( config_t
));
276 for ( int r
= 0 ; r
<= count_rates
; r
++ )
278 cur_rate_i
= port_rates
[ r
];
279 int fd
= open_port ( device
, cur_rate_i
);
282 ui
-> statusBar
-> showMessage ( QString ( "Failed to open port: " ) + QString ( strerror ( errno
)) );
283 ui
-> readButton
-> setEnabled ( true );
287 if ( read_config ( fd
, config
) < 0 )
289 ui
-> statusBar
-> showMessage ( QString ( "Failed to read config: " ) + QString ( strerror ( errno
)) );
290 ui
-> readButton
-> setEnabled ( true );
293 if ( read_config ( fd
, config
) == 1 )
295 ui
-> statusBar
-> showMessage ( QString ( "Found device at " ) + QString (). setNum ( port_rate_value
[ r
] ) );
296 printf ( "Read Verify-rate: %d \n " , cur_rate_i
);
298 if ( ( config
-> air_rate
< ( uint32_t ) port_rates
[ 0 ]) ||
299 ( config
-> uart_rate
< ( uint32_t ) port_rates
[ 0 ]) ||
300 ( config
-> bw
< ( uint16_t ) recv_bw
[ 0 ] ) ||
301 ( config
-> deviation
< ( uint8_t ) freq_dev
[ 0 ] ) )
303 QMessageBox :: critical ( this , QString ( "Power cycle device!" ),
304 QString ( "The data returned by the connected " ) + QString ( dev_name
[ dev_model
] ) + QString ( " is invalid. \n Please power-cycle your device by e.g. disconnecting \n and reconnectingbefore proceeding." )
308 printf ( "Freq %d \n " , config
-> freq
);
309 printf ( "Air rate %d \n " , config
-> air_rate
);
310 printf ( "Deviation %d \n " , config
-> deviation
);
311 printf ( "TX Power %d \n " , config
-> power
);
312 printf ( "BW %d \n " , config
-> bw
);
313 printf ( "UART rate %d \n " , config
-> uart_rate
);
315 ui
-> curRate
-> setText ( QString (). setNum ( port_rate_value
[ r
] ) );
317 for ( int i
= 0 ; i
< count_devtype
; i
++ )
319 if ( ( config
-> freq
>= freq_min
[ i
]) &&
320 ( config
-> freq
<= freq_max
[ i
]))
321 { dev_model
= i
; break ; }
324 ui
-> devType
-> setText ( QString ( dev_name
[ dev_model
] ) );
326 ui
-> airRate
-> clear ();
327 for ( int i
= 0 ; i
< count_rates
; i
++ )
328 ui
-> airRate
-> insertItem ( i
, QString (). setNum ( port_rate_value
[ i
] ) );
330 ui
-> uartRate
-> clear ();
331 for ( int i
= 0 ; i
< count_rates
; i
++ )
332 ui
-> uartRate
-> insertItem ( i
, QString (). setNum ( port_rate_value
[ i
] ) );
334 ui
-> recvBandwidth
-> clear ();
335 for ( int i
= 0 ; i
< count_recv_bw
; i
++ )
336 ui
-> recvBandwidth
-> insertItem ( i
, QString (). setNum ( recv_bw
[ i
] ) );
338 ui
-> freqDeviation
-> clear ();
339 for ( int i
= 0 ; i
< count_freq_dev
; i
++ )
340 ui
-> freqDeviation
-> insertItem ( i
, QString (). setNum ( freq_dev
[ i
] ) );
342 ui
-> powerLevel
-> clear ();
343 for ( int i
= 0 ; i
< count_powerlevel
; i
++ )
344 ui
-> powerLevel
-> insertItem ( i
, QString (). setNum ( powerlevel
[ i
] ) );
346 for ( int i
= 0 ; i
< count_rates
; i
++ )
347 if ( config
-> air_rate
== ( uint32_t ) port_rate_value
[ i
] )
348 ui
-> airRate
-> setCurrentIndex ( i
);
350 for ( int i
= 0 ; i
< count_rates
; i
++ )
351 if ( config
-> uart_rate
== ( uint32_t ) port_rate_value
[ i
] )
352 ui
-> uartRate
-> setCurrentIndex ( i
);
354 for ( int i
= 0 ; i
< count_recv_bw
; i
++ )
355 if ( config
-> bw
== ( uint16_t ) recv_bw
[ i
] )
356 ui
-> recvBandwidth
-> setCurrentIndex ( i
);
358 for ( int i
= 0 ; i
< count_freq_dev
; i
++ )
359 if ( config
-> deviation
== ( uint8_t ) freq_dev
[ i
] )
360 ui
-> freqDeviation
-> setCurrentIndex ( i
);
362 for ( int i
= 0 ; i
< count_powerlevel
; i
++ )
363 if ( powerlevel
[ config
-> power
] == ( uint8_t ) powerlevel
[ i
] )
364 ui
-> powerLevel
-> setCurrentIndex ( i
);
366 ui
-> frequency
-> setText ( QString (). setNum ( config
-> freq
/ 1000 ) );
368 ui
-> readButton
-> setEnabled ( true );
369 ui
-> writeButton
-> setEnabled ( true );
370 ui
-> defaultsButton
-> setEnabled ( true );
378 ui
-> statusBar
-> showMessage ( QString ( "Unable to locate device!" ), 10000 );
379 QMessageBox :: critical ( this , QString ( "Unable to locate device" ),
380 QString ( "Could not find a connected HM-TRP. \n Please verify that the CONFIG pin is jumpered LOW, \n and power-cycle your device by e.g. disconnecting \n and reconnecting before proceeding." )
383 ui
-> readButton
-> setEnabled ( true );
388 void Configurator :: on_writeButton_clicked ()
391 ui
-> serialPort
-> setFocus ();
392 ui
-> statusBar
-> showMessage ( QString ( "Writing settings to device ..." ) );
394 ui
-> readButton
-> setEnabled ( false );
395 ui
-> writeButton
-> setEnabled ( false );
396 ui
-> defaultsButton
-> setEnabled ( false );
399 QCoreApplication :: processEvents ();
401 QByteArray byteArray
= ( ui
-> serialPort
-> text ()). toLocal8Bit ();
402 const char * device
= byteArray
. constData ();
404 int fd
= open_port ( device
, cur_rate_i
);
407 ui
-> statusBar
-> showMessage ( QString ( "Failed to open port: " ) + QString ( strerror ( errno
)) );
408 ui
-> readButton
-> setEnabled ( true );
412 if ( read_config ( fd
, config
) != 1 )
414 ui
-> statusBar
-> showMessage ( QString ( "Failed to verify device config: " ) + QString ( strerror ( errno
)) );
415 ui
-> readButton
-> setEnabled ( true );
419 uint32_t freq
= ( ui
-> frequency
-> text ()). toInt () * 1000 ;
422 ( freq
< ( uint32_t ) freq_min
[ dev_model
] ) ||
423 ( freq
> ( uint32_t ) freq_max
[ dev_model
] ) )
425 QMessageBox :: critical ( this , QString ( "Invalid frequency" ),
426 QString ( "The given frequency is outside of the permitted range \n " ) +
427 QString ( "Device type " ) + QString ( dev_name
[ dev_model
] ) + QString ( " permits frequencies \n " ) +
428 QString ( "from " ) + QString (). setNum ( freq_min
[ dev_model
]/ 1000 ) + QString ( "kHz to " ) + QString (). setNum ( freq_max
[ dev_model
]/ 1000 ) + QString ( "kHz." )
433 config
-> air_rate
= ui
-> airRate
-> currentText (). toInt ();
434 config
-> bw
= ui
-> recvBandwidth
-> currentText (). toInt ();
435 config
-> deviation
= ui
-> freqDeviation
-> currentText (). toInt ();
437 config
-> uart_rate
= ui
-> uartRate
-> currentText (). toInt ();
442 for ( int i
= 0 ; i
< count_powerlevel
; i
++ )
445 if ( ui
-> powerLevel
-> currentText (). toInt () == powerlevel
[ i
] )
452 printf ( "After config changes:" );
453 printf ( "Freq %d \n " , config
-> freq
);
454 printf ( "Air rate %d \n " , config
-> air_rate
);
455 printf ( "Deviation %d \n " , config
-> deviation
);
456 printf ( "TX Power %d \n " , config
-> power
);
457 printf ( "BW %d \n " , config
-> bw
);
458 printf ( "UART rate %d \n " , config
-> uart_rate
);
460 write_cmd ( fd
, cmd_frequency
);
461 write_uint32_t ( fd
, config
-> freq
);
462 if ( ! read_ok ( fd
) )
463 return errorStatus ( "Failed to set frequency" );
465 write_cmd ( fd
, cmd_air_rate
);
466 write_uint32_t ( fd
, config
-> air_rate
);
467 if ( ! read_ok ( fd
) )
468 return errorStatus ( "Failed to set air data rate" );
470 write_cmd ( fd
, cmd_bw
);
471 write_uint16_t ( fd
, config
-> bw
);
472 if ( ! read_ok ( fd
) )
473 return errorStatus ( "Failed to set recieve bandwidth" );
475 write_cmd ( fd
, cmd_deviation
);
476 write_uint8_t ( fd
, config
-> deviation
);
477 if ( ! read_ok ( fd
) )
478 return errorStatus ( "Failed to set frequency deviation" );
480 write_cmd ( fd
, cmd_power
);
481 write_uint8_t ( fd
, config
-> power
);
482 if ( ! read_ok ( fd
) )
483 return errorStatus ( "Failed to set transmit power" );
485 write_cmd ( fd
, cmd_uart_rate
);
486 write_uint32_t ( fd
, config
-> uart_rate
);
487 read_ok ( fd
); // Clear buffer.
491 on_readButton_clicked ();
495 void Configurator :: on_defaultsButton_clicked ()
498 ui
-> serialPort
-> setFocus ();
500 ui
-> readButton
-> setEnabled ( false );
501 ui
-> writeButton
-> setEnabled ( false );
502 ui
-> defaultsButton
-> setEnabled ( false );
505 QCoreApplication :: processEvents ();
507 QByteArray byteArray
= ( ui
-> serialPort
-> text ()). toLocal8Bit ();
508 const char * device
= byteArray
. constData ();
510 int fd
= open_port ( device
, cur_rate_i
);
513 ui
-> statusBar
-> showMessage ( QString ( "Failed to open port: " ) + QString ( strerror ( errno
)) );
514 ui
-> readButton
-> setEnabled ( true );
518 if ( read_config ( fd
, config
) != 1 )
520 ui
-> statusBar
-> showMessage ( QString ( "Failed to verify device config: " ) + QString ( strerror ( errno
)) );
521 ui
-> readButton
-> setEnabled ( true );
524 write_cmd ( fd
, cmd_reset
);
527 QMessageBox :: critical ( this , QString ( "Power cycle device!" ),
528 QString ( "The reset command has been sent to the " ) + QString ( dev_name
[ dev_model
] ) + QString ( ". \n Please power-cycle your device by e.g. disconnecting \n and reconnectingbefore proceeding." )
531 on_readButton_clicked ();
535 void Configurator :: errorStatus ( QString message
)
537 ui
-> statusBar
-> showMessage ( message
);
538 ui
-> readButton
-> setEnabled ( true );
539 ui
-> writeButton
-> setEnabled ( true );
540 ui
-> defaultsButton
-> setEnabled ( true );