FreeCalypso > hg > fc-rfcal-tools
changeset 15:724e16223187
autocal/rvinterf.c now has all essential code for talking to rvinterf
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 21 May 2017 23:04:42 +0000 |
parents | 93e5194e5511 |
children | 1c4abfe8bcd9 |
files | autocal/rvinterf.c |
diffstat | 1 files changed, 109 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/autocal/rvinterf.c Sun May 21 23:00:32 2017 +0000 +++ b/autocal/rvinterf.c Sun May 21 23:04:42 2017 +0000 @@ -12,11 +12,16 @@ #include <unistd.h> #include <rvinterf/pktmux.h> #include <rvinterf/localsock.h> +#include <rvinterf/limits.h> #include <rvinterf/exitcodes.h> char *rvif_socket_pathname = "/tmp/rvinterf_socket"; int rvif_socket; +int rx_enable_state; +u_char rvi_msg[LOCALSOCK_MAX_MSG]; +int rvi_msg_len; + connect_rvinterf_socket() { /* local socket binding voodoo copied from osmocon */ @@ -54,3 +59,107 @@ return(0); } + +static void +collect_bytes_from_rvi(buf, nbytes) + u_char *buf; +{ + int cc; + + while (nbytes) { + cc = read(rvif_socket, buf, nbytes); + if (cc <= 0) { + perror("read from rvinterf socket"); + exit(ERROR_RVINTERF); + } + buf += cc; + nbytes -= cc; + } +} + +collect_rvi_msg() +{ + u_char lenbuf[2]; + + collect_bytes_from_rvi(lenbuf, 2); + rvi_msg_len = lenbuf[0] << 8 | lenbuf[1]; + if (rvi_msg_len < 1 || rvi_msg_len > LOCALSOCK_MAX_MSG) { + fprintf(stderr, "Invalid length from rvinterf: %02X%02X\n", + lenbuf[0], lenbuf[1]); + exit(ERROR_RVINTERF); + } + collect_bytes_from_rvi(rvi_msg, rvi_msg_len); + return(0); +} + +send_rvimisc_command(cmdpkt, cmdlen) + u_char *cmdpkt; +{ + u_char lenbuf[2]; + + lenbuf[0] = 0; + lenbuf[1] = cmdlen; + write(rvif_socket, lenbuf, 2); + write(rvif_socket, cmdpkt, cmdlen); +} + +rx_control(enable) +{ + u_char cmdpkt[2]; + int cmdlen; + + /* are we already in the desired state? */ + if (rx_enable_state == enable) + return(0); + /* no, do the work */ + if (enable) { + cmdpkt[0] = CLI2RVI_WANT_MUXPROTO; + cmdpkt[1] = RVT_TM_HEADER; + cmdlen = 2; + } else { + cmdpkt[0] = CLI2RVI_RESET_PACKET_RX; + cmdlen = 1; + } + send_rvimisc_command(cmdpkt, cmdlen); + collect_rvi_msg(); + if (rvi_msg[0] != RVI2CLI_LOCAL_CMD_RESP || rvi_msg_len < 2) { + fprintf(stderr, + "error: unexpected response to rvinterf local command\n"); + exit(ERROR_RVINTERF); + } + if (rvi_msg[1] != '+') { + fprintf(stderr, "Error from rvinterf: %.*s\n", rvi_msg_len - 1, + rvi_msg + 1); + exit(ERROR_RVINTERF); + } + rx_enable_state = enable; + return(0); +} + +send_pkt_to_target(pkt, pktlen) + u_char *pkt; +{ + u_char hdrbuf[3]; + int len1; + + len1 = pktlen + 1; + hdrbuf[0] = len1 >> 8; + hdrbuf[1] = len1 & 0xFF; + hdrbuf[2] = CLI2RVI_PKT_TO_TARGET; + write(rvif_socket, hdrbuf, 3); + write(rvif_socket, pkt, pktlen); +} + +target_pkt_exch(outpkt, outpktlen) + u_char *outpkt; +{ + rx_control(1); + send_pkt_to_target(outpkt, outpktlen); + collect_rvi_msg(); + if (rvi_msg[0] != RVI2CLI_PKT_FROM_TARGET) { + fprintf(stderr, + "error: unexpected response type from rvinterf\n"); + exit(ERROR_RVINTERF); + } + return(0); +}