missing tuner routines

master
texane 2015-01-11 12:51:51 -06:00
parent c39f7f0711
commit a08dd08f3c
2 changed files with 166 additions and 12 deletions

View File

@ -663,6 +663,87 @@ static int handle_query
break ;
}
case RTLSDR_RPC_OP_GET_TUNER_GAINS:
{
uint32_t did;
size_t new_size;
uint8_t* buf;
size_t gain_size;
if (rtlsdr_rpc_msg_pop_uint32(q, &did)) goto on_error;
if ((rpcd->dev == NULL) || (rpcd->did != did)) goto on_error;
err = rtlsdr_get_tuner_gains(rpcd->dev, NULL);
if (err <= 0) goto on_error;
gain_size = err * sizeof(int);
new_size = r->off + sizeof(uint32_t) + gain_size;
if (rtlsdr_rpc_msg_realloc(r, new_size)) goto on_error;
buf = r->fmt + r->off + sizeof(uint32_t);
err = rtlsdr_get_tuner_gains(rpcd->dev, (int*)buf);
if (err <= 0) goto on_error;
rtlsdr_rpc_msg_push_uint32_safe(r, gain_size);
rtlsdr_rpc_msg_skip_safe(r, gain_size);
break ;
}
case RTLSDR_RPC_OP_SET_TUNER_GAIN:
{
uint32_t did;
uint32_t gain;
PRINTF("set_tuner_gain()\n");
if (rtlsdr_rpc_msg_pop_uint32(q, &did)) goto on_error;
if (rtlsdr_rpc_msg_pop_uint32(q, &gain)) goto on_error;
if ((rpcd->dev == NULL) || (rpcd->did != did)) goto on_error;
err = rtlsdr_set_tuner_gain(rpcd->dev, (int)gain);
if (err) goto on_error;
break ;
}
case RTLSDR_RPC_OP_GET_TUNER_GAIN:
{
uint32_t did;
PRINTF("get_tuner_gain()\n");
if (rtlsdr_rpc_msg_pop_uint32(q, &did)) goto on_error;
if ((rpcd->dev == NULL) || (rpcd->did != did)) goto on_error;
err = rtlsdr_get_tuner_gain(rpcd->dev);
break ;
}
case RTLSDR_RPC_OP_SET_TUNER_IF_GAIN:
{
uint32_t did;
uint32_t stage;
uint32_t gain;
PRINTF("set_tuner_if_gain()\n");
if (rtlsdr_rpc_msg_pop_uint32(q, &did)) goto on_error;
if (rtlsdr_rpc_msg_pop_uint32(q, &stage)) goto on_error;
if (rtlsdr_rpc_msg_pop_uint32(q, &gain)) goto on_error;
if ((rpcd->dev == NULL) || (rpcd->did != did)) goto on_error;
err = rtlsdr_set_tuner_if_gain(rpcd->dev, (int)stage, (int)gain);
if (err) goto on_error;
break ;
}
case RTLSDR_RPC_OP_SET_TUNER_GAIN_MODE:
{
uint32_t did;

View File

@ -647,28 +647,101 @@ int rtlsdr_rpc_get_tuner_type(void* devp)
return err;
}
int rtlsdr_rpc_get_tuner_gains(void* dev, int* gainsp)
int rtlsdr_rpc_get_tuner_gains(void* devp, int* gainsp)
{
UNIMPL();
return -1;
rtlsdr_rpc_dev_t* const dev = devp;
rtlsdr_rpc_cli_t* const cli = dev->cli;
rtlsdr_rpc_msg_t* const q = &cli->query;
rtlsdr_rpc_msg_t* const r = &cli->reply;
const uint8_t* tmp;
size_t size;
int err = 0;
rtlsdr_rpc_msg_reset(q);
rtlsdr_rpc_msg_set_op(q, RTLSDR_RPC_OP_GET_TUNER_GAINS);
if (rtlsdr_rpc_msg_push_uint32(q, dev->index)) goto on_error;
if (send_recv_msg(cli, q, r)) goto on_error;
err = rtlsdr_rpc_msg_get_err(r);
if (err <= 0) goto on_error;
if (rtlsdr_rpc_msg_pop_buf(r, &tmp, &size))
{
err = 0;
goto on_error;
}
/* TODO: endianess */
memcpy(gainsp, tmp, size);
on_error:
return err;
}
int rtlsdr_rpc_set_tuner_gain(void* dev, int gain)
int rtlsdr_rpc_set_tuner_gain(void* devp, int gain)
{
UNIMPL();
return -1;
rtlsdr_rpc_dev_t* const dev = devp;
rtlsdr_rpc_cli_t* const cli = dev->cli;
rtlsdr_rpc_msg_t* const q = &cli->query;
rtlsdr_rpc_msg_t* const r = &cli->reply;
int err = -1;
rtlsdr_rpc_msg_reset(q);
rtlsdr_rpc_msg_set_op(q, RTLSDR_RPC_OP_SET_TUNER_GAIN);
if (rtlsdr_rpc_msg_push_uint32(q, dev->index)) goto on_error;
if (rtlsdr_rpc_msg_push_uint32(q, (uint32_t)gain)) goto on_error;
if (send_recv_msg(cli, q, r)) goto on_error;
err = rtlsdr_rpc_msg_get_err(r);
if (err) goto on_error;
on_error:
return err;
}
int rtlsdr_rpc_get_tuner_gain(void* dev)
int rtlsdr_rpc_get_tuner_gain(void* devp)
{
UNIMPL();
return -1;
rtlsdr_rpc_dev_t* const dev = devp;
rtlsdr_rpc_cli_t* const cli = dev->cli;
rtlsdr_rpc_msg_t* const q = &cli->query;
rtlsdr_rpc_msg_t* const r = &cli->reply;
int err = -1;
rtlsdr_rpc_msg_reset(q);
rtlsdr_rpc_msg_set_op(q, RTLSDR_RPC_OP_GET_TUNER_GAIN);
if (rtlsdr_rpc_msg_push_uint32(q, dev->index)) goto on_error;
if (send_recv_msg(cli, q, r)) goto on_error;
err = rtlsdr_rpc_msg_get_err(r);
on_error:
return err;
}
int rtlsdr_rpc_set_tuner_if_gain(void* dev, int stage, int gain)
int rtlsdr_rpc_set_tuner_if_gain(void* devp, int stage, int gain)
{
UNIMPL();
return -1;
rtlsdr_rpc_dev_t* const dev = devp;
rtlsdr_rpc_cli_t* const cli = dev->cli;
rtlsdr_rpc_msg_t* const q = &cli->query;
rtlsdr_rpc_msg_t* const r = &cli->reply;
int err = -1;
rtlsdr_rpc_msg_reset(q);
rtlsdr_rpc_msg_set_op(q, RTLSDR_RPC_OP_SET_TUNER_IF_GAIN);
if (rtlsdr_rpc_msg_push_uint32(q, dev->index)) goto on_error;
if (rtlsdr_rpc_msg_push_uint32(q, (uint32_t)stage)) goto on_error;
if (rtlsdr_rpc_msg_push_uint32(q, (uint32_t)gain)) goto on_error;
if (send_recv_msg(cli, q, r)) goto on_error;
err = rtlsdr_rpc_msg_get_err(r);
if (err) goto on_error;
on_error:
return err;
}
int rtlsdr_rpc_set_tuner_gain_mode(void* devp, int manual)