2018-08-20 22:47:13 -07:00
|
|
|
/*
|
|
|
|
* Auxiliary functions.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2018 Serge Vakulenko, KK6ABQ
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions are met:
|
|
|
|
*
|
|
|
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|
|
|
* this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. The name of the author may not be used to endorse or promote products
|
|
|
|
* derived from this software without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
|
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
|
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
|
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
|
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
|
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
|
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
//
|
|
|
|
// Program version.
|
|
|
|
//
|
|
|
|
extern const char version[];
|
|
|
|
extern const char *copyright;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Trace data i/o via the serial port.
|
|
|
|
//
|
2021-01-05 11:50:26 -08:00
|
|
|
extern int trace_flag;
|
2018-08-20 22:47:13 -07:00
|
|
|
|
|
|
|
//
|
|
|
|
// Print data in hex format.
|
|
|
|
//
|
|
|
|
void print_hex(const unsigned char *data, int len);
|
2018-11-23 18:42:50 -08:00
|
|
|
void print_hex_addr_data(unsigned addr, const unsigned char *data, int len);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Strip trailing spaces and newline.
|
|
|
|
// Shorten the string in place to a specified limit.
|
|
|
|
//
|
|
|
|
char *trim_spaces(char *line, int limit);
|
2018-08-20 22:47:13 -07:00
|
|
|
|
2018-11-23 20:29:02 -08:00
|
|
|
//
|
|
|
|
// Strip optional quotes around the string.
|
|
|
|
//
|
|
|
|
char *trim_quotes(char *line);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Initialize CSV parser.
|
|
|
|
// Check header for correctness.
|
|
|
|
// Return -1 on error.
|
|
|
|
//
|
|
|
|
int csv_init(FILE *csv);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Parse one line of CSV file.
|
|
|
|
// Return 1 on success, 0 on EOF.
|
|
|
|
//
|
|
|
|
int csv_read(FILE *csv, char **radioid, char **callsign, char **name,
|
|
|
|
char **city, char **state, char **country, char **remarks);
|
|
|
|
|
2018-08-25 19:31:02 -07:00
|
|
|
//
|
|
|
|
// DFU functions.
|
|
|
|
//
|
2018-08-25 20:20:51 -07:00
|
|
|
const char *dfu_init(unsigned vid, unsigned pid);
|
2018-08-25 19:31:02 -07:00
|
|
|
void dfu_close(void);
|
2018-09-05 21:03:03 -07:00
|
|
|
void dfu_erase(unsigned start, unsigned finish);
|
2018-08-25 19:31:02 -07:00
|
|
|
void dfu_read_block(int bno, unsigned char *data, int nbytes);
|
|
|
|
void dfu_write_block(int bno, unsigned char *data, int nbytes);
|
2018-09-04 23:37:42 -07:00
|
|
|
void dfu_reboot(void);
|
2018-08-25 19:31:02 -07:00
|
|
|
|
2018-09-15 15:23:43 -07:00
|
|
|
//
|
|
|
|
// HID functions.
|
|
|
|
//
|
2018-09-17 23:07:42 -07:00
|
|
|
int hid_init(int vid, int pid);
|
|
|
|
const char *hid_identify(void);
|
2018-09-15 15:23:43 -07:00
|
|
|
void hid_close(void);
|
2018-09-17 23:07:42 -07:00
|
|
|
void hid_send_recv(const unsigned char *data, unsigned nbytes, unsigned char *rdata, unsigned rlength);
|
2018-09-15 16:43:55 -07:00
|
|
|
void hid_read_block(int bno, unsigned char *data, int nbytes);
|
|
|
|
void hid_read_finish(void);
|
2018-09-15 17:54:48 -07:00
|
|
|
void hid_write_block(int bno, unsigned char *data, int nbytes);
|
|
|
|
void hid_write_finish(void);
|
2018-09-15 15:23:43 -07:00
|
|
|
|
2018-10-13 20:37:14 -07:00
|
|
|
//
|
|
|
|
// Serial functions.
|
|
|
|
//
|
2021-03-04 00:44:52 -08:00
|
|
|
//int serial_init(int vid, int pid);
|
|
|
|
//const char *serial_identify(void);
|
2018-10-13 20:37:14 -07:00
|
|
|
void serial_close(void);
|
2018-10-13 22:33:50 -07:00
|
|
|
void serial_read_region(int addr, unsigned char *data, int nbytes);
|
|
|
|
void serial_write_region(int addr, unsigned char *data, int nbytes);
|
2021-03-04 00:44:52 -08:00
|
|
|
char *find_path(int vid, int pid);
|
2018-10-13 20:37:14 -07:00
|
|
|
|
2018-08-20 22:47:13 -07:00
|
|
|
//
|
|
|
|
// Delay in milliseconds.
|
|
|
|
//
|
|
|
|
void mdelay(unsigned msec);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Check for a regular file.
|
|
|
|
//
|
|
|
|
int is_file(char *filename);
|
|
|
|
|
|
|
|
//
|
2018-08-30 13:39:14 -07:00
|
|
|
// Convert frequency in MHz from floating point to
|
|
|
|
// a binary coded decimal format (8 digits).
|
2018-08-20 22:47:13 -07:00
|
|
|
//
|
2018-10-31 20:52:20 -07:00
|
|
|
unsigned mhz_to_abcdefgh(double mhz);
|
|
|
|
unsigned mhz_to_ghefcdab(double mhz);
|
2018-08-20 22:47:13 -07:00
|
|
|
|
|
|
|
//
|
|
|
|
// Get a binary value of the parameter: On/Off,
|
|
|
|
// Ignore case.
|
|
|
|
//
|
|
|
|
int on_off(char *param, char *value);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Get integer value, or "Off" as 0,
|
|
|
|
// Ignore case.
|
|
|
|
//
|
|
|
|
int atoi_off(const char *value);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Copy a text string to memory image.
|
|
|
|
// Clear unused space to zero.
|
|
|
|
//
|
|
|
|
void copy_str(unsigned char *dest, const char *src, int nbytes);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Find a string in a table of size nelem, ignoring case.
|
|
|
|
// Return -1 when not found.
|
|
|
|
//
|
|
|
|
int string_in_table(const char *value, const char *tab[], int nelem);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Print description of the parameter.
|
|
|
|
//
|
|
|
|
void print_options(FILE *out, const char **tab, int num, const char *info);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Print list of all squelch tones.
|
|
|
|
//
|
|
|
|
void print_squelch_tones(FILE *out, int normal_only);
|
2018-08-27 16:42:50 -07:00
|
|
|
|
|
|
|
//
|
|
|
|
// Write Unicode symbol to a file in UTF-8 encoding.
|
|
|
|
//
|
|
|
|
void putc_utf8(unsigned short ch, FILE *out);
|
2018-08-27 21:31:27 -07:00
|
|
|
|
|
|
|
//
|
|
|
|
// Print utf16 text as utf8.
|
|
|
|
//
|
|
|
|
void print_unicode(FILE *out, const unsigned short *text, unsigned nchars, int fill_flag);
|
2018-09-15 21:09:03 -07:00
|
|
|
void print_ascii(FILE *out, const unsigned char *text, unsigned nchars, int fill_flag);
|
2018-08-29 21:04:13 -07:00
|
|
|
|
|
|
|
//
|
|
|
|
// Fetch Unicode symbol from UTF-8 string.
|
|
|
|
// Advance string pointer.
|
|
|
|
//
|
|
|
|
int utf8_to_unicode(const char **p);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Decode UTF-8 string into UCS-2 string, at most nsym characters.
|
|
|
|
//
|
|
|
|
void utf8_decode(unsigned short *dst, const char *src, unsigned nsym);
|
|
|
|
|
2018-09-18 23:34:56 -07:00
|
|
|
//
|
|
|
|
// Copy ASCII string, at most nsym characters.
|
|
|
|
// Replace underscore by space.
|
|
|
|
//
|
2018-10-17 23:46:25 -07:00
|
|
|
void ascii_decode(unsigned char *dst, const char *src, unsigned nsym, unsigned fill);
|
|
|
|
void ascii_decode_uppercase(unsigned char *dst, const char *src, unsigned nsym, unsigned fill);
|
2018-09-18 23:34:56 -07:00
|
|
|
|
2018-08-29 21:04:13 -07:00
|
|
|
//
|
|
|
|
// Get local time in format: YYYYMMDDhhmmss
|
|
|
|
//
|
|
|
|
void get_timestamp(char p[16]);
|
2018-08-30 12:18:09 -07:00
|
|
|
|
|
|
|
//
|
|
|
|
// Convert tone string to BCD format.
|
|
|
|
// Return -1 on error.
|
|
|
|
// Four possible formats:
|
|
|
|
// nnn.n - CTCSS frequency
|
|
|
|
// DnnnN - DCS normal
|
|
|
|
// DnnnI - DCS inverted
|
|
|
|
// '-' - Disabled
|
|
|
|
//
|
|
|
|
int encode_tone(char *str);
|
2018-08-30 12:27:55 -07:00
|
|
|
|
|
|
|
//
|
|
|
|
// Print frequency (BCD value).
|
|
|
|
//
|
|
|
|
void print_freq(FILE *out, unsigned data);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Convert a 4-byte frequency value from binary coded decimal
|
|
|
|
// to integer format (in Hertz).
|
|
|
|
//
|
|
|
|
int freq_to_hz(unsigned bcd);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Print frequency as MHz.
|
|
|
|
//
|
|
|
|
void print_mhz(FILE *out, unsigned hz);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Print the transmit offset or frequency.
|
|
|
|
//
|
|
|
|
void print_offset(FILE *out, unsigned rx_bcd, unsigned tx_bcd);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Compare channel index for qsort().
|
|
|
|
//
|
|
|
|
int compare_index(const void *pa, const void *pb);
|
2018-10-26 16:43:13 -07:00
|
|
|
int compare_index_ffff(const void *pa, const void *pb);
|
2018-10-27 15:43:01 -07:00
|
|
|
int compare_index_ffffffff(const void *pa, const void *pb);
|
2018-08-30 12:27:55 -07:00
|
|
|
|
|
|
|
//
|
|
|
|
// Print CTSS or DCS tone.
|
|
|
|
//
|
|
|
|
void print_tone(FILE *out, unsigned data);
|