# include "selfdrive/common/params.h"
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
static const char * const kUsage = " %s: read|write|read_block params_path key [value] \n " ;
int main ( int argc , const char * argv [ ] ) {
if ( argc < 4 ) {
printf ( kUsage , argv [ 0 ] ) ;
return 0 ;
}
const char * params_path = argv [ 2 ] ;
const char * key = argv [ 3 ] ;
if ( strcmp ( argv [ 1 ] , " read " ) = = 0 ) {
char * value ;
size_t value_size ;
int result = read_db_value ( params_path , key , & value , & value_size ) ;
if ( result > = 0 ) {
fprintf ( stdout , " Read %zu bytes: " , value_size ) ;
fwrite ( value , 1 , value_size , stdout ) ;
fprintf ( stdout , " \n " ) ;
free ( value ) ;
} else {
fprintf ( stderr , " Error reading: %d \n " , result ) ;
return - 1 ;
}
} else if ( strcmp ( argv [ 1 ] , " write " ) = = 0 ) {
if ( argc < 5 ) {
fprintf ( stderr , " Error: write value required \n " ) ;
return 1 ;
}
const char * value = argv [ 4 ] ;
const size_t value_size = strlen ( value ) ;
int result = write_db_value ( params_path , key , value , value_size ) ;
if ( result > = 0 ) {
fprintf ( stdout , " Wrote %s to %s \n " , value , key ) ;
} else {
fprintf ( stderr , " Error writing: %d \n " , result ) ;
return - 1 ;
}
} else if ( strcmp ( argv [ 1 ] , " read_block " ) = = 0 ) {
char * value ;
size_t value_size ;
read_db_value_blocking ( params_path , key , & value , & value_size ) ;
fprintf ( stdout , " Read %zu bytes: " , value_size ) ;
fwrite ( value , 1 , value_size , stdout ) ;
fprintf ( stdout , " \n " ) ;
free ( value ) ;
} else {
printf ( kUsage , argv [ 0 ] ) ;
return 1 ;
}
return 0 ;
}
// BUILD:
// $ gcc -I$HOME/one selfdrive/common/test_params.c selfdrive/common/params.c selfdrive/common/util.cc -o ./test_params
// $ seq 0 100000 | xargs -P20 -I{} ./test_params write /data/params DongleId {} && sleep 0.1 &
// $ while ./test_params read /data/params DongleId; do sleep 0.05; done