diff --git a/demos/gnuradio/hackrf_file_tx_demo.grc b/demos/gnuradio/hackrf_file_tx_demo.grc index 59d7f38..37c7721 100644 --- a/demos/gnuradio/hackrf_file_tx_demo.grc +++ b/demos/gnuradio/hackrf_file_tx_demo.grc @@ -49,7 +49,7 @@ blocks: id: variable parameters: comment: '' - value: '929937500' + value: '931937500' states: bus_sink: false bus_source: false @@ -242,44 +242,285 @@ blocks: coordinate: [200, 12.0] rotation: 0 state: true -- name: rational_resampler_xxx_0 - id: rational_resampler_xxx +- name: osmosdr_sink_0 + id: osmosdr_sink parameters: affinity: '' alias: '' + ant0: '1' + ant1: '' + ant10: '' + ant11: '' + ant12: '' + ant13: '' + ant14: '' + ant15: '' + ant16: '' + ant17: '' + ant18: '' + ant19: '' + ant2: '' + ant20: '' + ant21: '' + ant22: '' + ant23: '' + ant24: '' + ant25: '' + ant26: '' + ant27: '' + ant28: '' + ant29: '' + ant3: '' + ant30: '' + ant31: '' + ant4: '' + ant5: '' + ant6: '' + ant7: '' + ant8: '' + ant9: '' + args: hackrf=0 + bb_gain0: '20' + bb_gain1: '20' + bb_gain10: '20' + bb_gain11: '20' + bb_gain12: '20' + bb_gain13: '20' + bb_gain14: '20' + bb_gain15: '20' + bb_gain16: '20' + bb_gain17: '20' + bb_gain18: '20' + bb_gain19: '20' + bb_gain2: '20' + bb_gain20: '20' + bb_gain21: '20' + bb_gain22: '20' + bb_gain23: '20' + bb_gain24: '20' + bb_gain25: '20' + bb_gain26: '20' + bb_gain27: '20' + bb_gain28: '20' + bb_gain29: '20' + bb_gain3: '20' + bb_gain30: '20' + bb_gain31: '20' + bb_gain4: '20' + bb_gain5: '20' + bb_gain6: '20' + bb_gain7: '20' + bb_gain8: '20' + bb_gain9: '20' + bw0: '0' + bw1: '0' + bw10: '0' + bw11: '0' + bw12: '0' + bw13: '0' + bw14: '0' + bw15: '0' + bw16: '0' + bw17: '0' + bw18: '0' + bw19: '0' + bw2: '0' + bw20: '0' + bw21: '0' + bw22: '0' + bw23: '0' + bw24: '0' + bw25: '0' + bw26: '0' + bw27: '0' + bw28: '0' + bw29: '0' + bw3: '0' + bw30: '0' + bw31: '0' + bw4: '0' + bw5: '0' + bw6: '0' + bw7: '0' + bw8: '0' + bw9: '0' + clock_source0: '' + clock_source1: '' + clock_source2: '' + clock_source3: '' + clock_source4: '' + clock_source5: '' + clock_source6: '' + clock_source7: '' comment: '' - decim: int(samp_rate // math.gcd(int(hw_rate), int(samp_rate))) - fbw: '0' - interp: int(hw_rate // math.gcd(int(hw_rate), int(samp_rate))) + corr0: '0.8' + corr1: '0' + corr10: '0' + corr11: '0' + corr12: '0' + corr13: '0' + corr14: '0' + corr15: '0' + corr16: '0' + corr17: '0' + corr18: '0' + corr19: '0' + corr2: '0' + corr20: '0' + corr21: '0' + corr22: '0' + corr23: '0' + corr24: '0' + corr25: '0' + corr26: '0' + corr27: '0' + corr28: '0' + corr29: '0' + corr3: '0' + corr30: '0' + corr31: '0' + corr4: '0' + corr5: '0' + corr6: '0' + corr7: '0' + corr8: '0' + corr9: '0' + freq0: center_freq + freq1: 100e6 + freq10: 100e6 + freq11: 100e6 + freq12: 100e6 + freq13: 100e6 + freq14: 100e6 + freq15: 100e6 + freq16: 100e6 + freq17: 100e6 + freq18: 100e6 + freq19: 100e6 + freq2: 100e6 + freq20: 100e6 + freq21: 100e6 + freq22: 100e6 + freq23: 100e6 + freq24: 100e6 + freq25: 100e6 + freq26: 100e6 + freq27: 100e6 + freq28: 100e6 + freq29: 100e6 + freq3: 100e6 + freq30: 100e6 + freq31: 100e6 + freq4: 100e6 + freq5: 100e6 + freq6: 100e6 + freq7: 100e6 + freq8: 100e6 + freq9: 100e6 + gain0: '40' + gain1: '10' + gain10: '10' + gain11: '10' + gain12: '10' + gain13: '10' + gain14: '10' + gain15: '10' + gain16: '10' + gain17: '10' + gain18: '10' + gain19: '10' + gain2: '10' + gain20: '10' + gain21: '10' + gain22: '10' + gain23: '10' + gain24: '10' + gain25: '10' + gain26: '10' + gain27: '10' + gain28: '10' + gain29: '10' + gain3: '10' + gain30: '10' + gain31: '10' + gain4: '10' + gain5: '10' + gain6: '10' + gain7: '10' + gain8: '10' + gain9: '10' + if_gain0: '20' + if_gain1: '20' + if_gain10: '20' + if_gain11: '20' + if_gain12: '20' + if_gain13: '20' + if_gain14: '20' + if_gain15: '20' + if_gain16: '20' + if_gain17: '20' + if_gain18: '20' + if_gain19: '20' + if_gain2: '20' + if_gain20: '20' + if_gain21: '20' + if_gain22: '20' + if_gain23: '20' + if_gain24: '20' + if_gain25: '20' + if_gain26: '20' + if_gain27: '20' + if_gain28: '20' + if_gain29: '20' + if_gain3: '20' + if_gain30: '20' + if_gain31: '20' + if_gain4: '20' + if_gain5: '20' + if_gain6: '20' + if_gain7: '20' + if_gain8: '20' + if_gain9: '20' maxoutbuf: '0' minoutbuf: '0' - taps: '[]' - type: ccc + nchan: '1' + num_mboards: '1' + sample_rate: hw_rate + sync: sync + time_source0: '' + time_source1: '' + time_source2: '' + time_source3: '' + time_source4: '' + time_source5: '' + time_source6: '' + time_source7: '' + type: fc32 states: bus_sink: false bus_source: false bus_structure: null - coordinate: [1152, 252.0] + coordinate: [928, 460.0] rotation: 0 - state: enabled -- name: soapy_hackrf_sink_0 - id: soapy_hackrf_sink + state: true +- name: rational_resampler_xxx_0 + id: rational_resampler_xxx parameters: affinity: '' alias: '' - amp: 'False' - bandwidth: '0' - center_freq: center_freq comment: '' - dev_args: '' - samp_rate: hw_rate - type: fc32 - vga: '28' + decim: int(samp_rate // math.gcd(int(hw_rate), int(samp_rate))) + fbw: '0' + interp: int(hw_rate // math.gcd(int(hw_rate), int(samp_rate))) + maxoutbuf: '0' + minoutbuf: '0' + taps: '[]' + type: ccc states: bus_sink: false bus_source: false bus_structure: null - coordinate: [1152, 368.0] + coordinate: [1152, 252.0] rotation: 0 state: enabled @@ -291,7 +532,7 @@ connections: - [blocks_throttle_0, '0', rational_resampler_xxx_0, '0'] - [blocks_uchar_to_float_0, '0', blocks_add_const_vxx_0, '0'] - [blocks_unpack_k_bits_bb_0, '0', blocks_repeat_0, '0'] -- [rational_resampler_xxx_0, '0', soapy_hackrf_sink_0, '0'] +- [rational_resampler_xxx_0, '0', osmosdr_sink_0, '0'] metadata: file_format: 1 diff --git a/demos/hackrf_tcp_server/Makefile b/demos/hackrf_tcp_server/Makefile index 049213d..6da12f4 100644 --- a/demos/hackrf_tcp_server/Makefile +++ b/demos/hackrf_tcp_server/Makefile @@ -7,7 +7,7 @@ SRC = main.cpp all: $(TARGET) -$(TARGET): $(SRC) json.hpp +$(TARGET): $(SRC) $(CXX) $(CXXFLAGS) -o $(TARGET) $(SRC) $(LDFLAGS) clean: diff --git a/demos/hackrf_tcp_server/include/config.hpp b/demos/hackrf_tcp_server/include/config.hpp index 9221e67..c05c682 100644 --- a/demos/hackrf_tcp_server/include/config.hpp +++ b/demos/hackrf_tcp_server/include/config.hpp @@ -36,63 +36,57 @@ inline bool load_config(const std::string& filename, Config& cfg) { val.erase(0, val.find_first_not_of(" \t")); val.erase(val.find_last_not_of(" \t") + 1); - switch (key) { - case "PORT": - try { - cfg.PORT = std::stoul(val); - } catch (...) { - std::cerr << "Invalid PORT value: " << val << std::endl; - return false; - } - break; - - case "SAMPLE_RATE": - try { - cfg.SAMPLE_RATE = std::stoull(val); - } catch (...) { - std::cerr << "Invalid SAMPLE_RATE value: " << val << std::endl; - return false; - } - break; - - case "BITRATE": - try { - cfg.BITRATE = std::stoul(val); - } catch (...) { - std::cerr << "Invalid BITRATE value: " << val << std::endl; - return false; - } - break; - - case "AMPLITUDE": - try { - cfg.AMPLITUDE = static_cast(std::stoi(val)); - } catch (...) { - std::cerr << "Invalid AMPLITUDE value: " << val << std::endl; - return false; - } - break; - - case "FREQ_DEV": - try { - cfg.FREQ_DEV = std::stoul(val); - } catch (...) { - std::cerr << "Invalid FREQ_DEV value: " << val << std::endl; - return false; - } - break; - case "TX_GAIN": - try { - cfg.TX_GAIN = static_cast(std::stoi(val)); - } catch (...) { - std::cerr << "Invalid TX_GAIN value: " << val << std::endl; - return false; - } - break; - - default: - std::cerr << "Unknown configuration key: " << key << std::endl; + if (key == "PORT") { + try { + cfg.PORT = std::stoul(val); + } catch (...) { + std::cerr << "Invalid PORT value: " << val << std::endl; + return false; + } + } + else if (key == "SAMPLE_RATE") { + try { + cfg.SAMPLE_RATE = std::stoull(val); + } catch (...) { + std::cerr << "Invalid SAMPLE_RATE value: " << val << std::endl; + return false; + } + } + else if (key == "BITRATE") { + try { + cfg.BITRATE = std::stoul(val); + } catch (...) { + std::cerr << "Invalid BITRATE value: " << val << std::endl; + return false; + } + } + else if (key == "AMPLITUDE") { + try { + cfg.AMPLITUDE = static_cast(std::stoi(val)); + } catch (...) { + std::cerr << "Invalid AMPLITUDE value: " << val << std::endl; + return false; + } + } + else if (key == "FREQ_DEV") { + try { + cfg.FREQ_DEV = std::stoul(val); + } catch (...) { + std::cerr << "Invalid FREQ_DEV value: " << val << std::endl; + return false; + } + } + else if (key == "TX_GAIN") { + try { + cfg.TX_GAIN = static_cast(std::stoi(val)); + } catch (...) { + std::cerr << "Invalid TX_GAIN value: " << val << std::endl; return false; + } + } + else { + std::cerr << "Unknown configuration key: " << key << std::endl; + return false; } } diff --git a/demos/hackrf_tcp_server/include/flex_util.hpp b/demos/hackrf_tcp_server/include/flex_util.hpp index 5e198df..643efe9 100644 --- a/demos/hackrf_tcp_server/include/flex_util.hpp +++ b/demos/hackrf_tcp_server/include/flex_util.hpp @@ -5,7 +5,7 @@ #include #include "../../../tinyflex.h" -inline bool encode_flex_message(const std::string& message, int capcode, uint8_t* flex_buffer, size_t flex_buffer_size, size_t& flex_len, int& error) { +inline bool encode_flex_message(const std::string& message, uint64_t capcode, uint8_t* flex_buffer, size_t flex_buffer_size, size_t& flex_len, int& error) { memset(flex_buffer, 0, flex_buffer_size); error = 0; flex_len = tf_encode_flex_message(message.c_str(), capcode, flex_buffer, flex_buffer_size, &error); diff --git a/demos/hackrf_tcp_server/main.cpp b/demos/hackrf_tcp_server/main.cpp index 494b9e0..c5cafc8 100644 --- a/demos/hackrf_tcp_server/main.cpp +++ b/demos/hackrf_tcp_server/main.cpp @@ -84,14 +84,18 @@ int main(int argc, char* argv[]) { std::string message = input.substr(pos1 + 1, pos2 - pos1 - 1); std::string freq_str = input.substr(pos2 + 1); + uint64_t capcode; + long frequency; + try { - uint64_t capcode = std::stoull(capcode_str); - if (tinyflex::is_capcode_valid(capcode) == 0) { + capcode = std::stoull(capcode_str); + int is_long; + if (!is_capcode_valid(capcode, &is_long)) { throw std::invalid_argument("Invalid capcode: " + capcode_str); } } catch (const std::invalid_argument& e) { - std::string error_msg = std::to_string(error); - printf("%s\n", error_msg); + std::string error_msg = "Invalid capcode: " + capcode_str; + printf("%s\n", error_msg.c_str()); // Send message back to client send(client_fd, error_msg.c_str(), error_msg.size(), 0); @@ -100,7 +104,7 @@ int main(int argc, char* argv[]) { continue; } catch (const std::out_of_range& e) { std::string error_msg = "Capcode out of range: " + capcode_str; - printf("%s\n", error_msg); + printf("%s\n", error_msg.c_str()); // Send message back to client send(client_fd, error_msg.c_str(), error_msg.size(), 0); @@ -110,20 +114,20 @@ int main(int argc, char* argv[]) { } try { - long frequency = std::stoul(freq_str); + frequency = std::stoul(freq_str); if (frequency < 1000000 || frequency > 6000000000) { throw std::out_of_range("Frequency out of valid range: " + freq_str); } } catch (const std::invalid_argument& e) { - std::string error_msg = "Invalid frequency: " + std::to_string(error); - printf("%s\n", error_msg); + std::string error_msg = "Invalid frequency: " + freq_str; + printf("%s\n", error_msg.c_str()); // Send message back to client send(client_fd, error_msg.c_str(), error_msg.size(), 0); close(client_fd); continue; } catch (const std::out_of_range& e) { - std::string error_msg = std::to_string(error); - printf("%s\n", error_msg); + std::string error_msg = "Frequency out of valid range: " + freq_str; + printf("%s\n", error_msg.c_str()); // Send message back to client send(client_fd, error_msg.c_str(), error_msg.size(), 0); @@ -131,7 +135,8 @@ int main(int argc, char* argv[]) { continue; } - printf("Received: CAPCODE=%d, MESSAGE='%s', FREQUENCY=%d\n", capcode, message.c_str(), frequency); + printf("Received: CAPCODE=%llu, MESSAGE='%s', FREQUENCY=%ld\n", + (unsigned long long)capcode, message.c_str(), frequency); // Encode message using TinyFlex uint8_t flex_buffer[1024]; @@ -154,7 +159,7 @@ int main(int argc, char* argv[]) { for (size_t i = 0; i < flex_len; ++i) { printf("%02X ", flex_buffer[i]); } - + printf("\n"); } @@ -165,8 +170,6 @@ int main(int argc, char* argv[]) { continue; } - int result = 0; - // Generate FSK IQ samples from FLEX buffer std::vector iq_samples = generate_fsk_iq_samples( flex_buffer, @@ -200,4 +203,4 @@ int main(int argc, char* argv[]) { close(server_fd); return 0; -} \ No newline at end of file +}