diff options
Diffstat (limited to 'src/DabMux.cpp')
| -rw-r--r-- | src/DabMux.cpp | 148 | 
1 files changed, 86 insertions, 62 deletions
| diff --git a/src/DabMux.cpp b/src/DabMux.cpp index 655985f..08a3c15 100644 --- a/src/DabMux.cpp +++ b/src/DabMux.cpp @@ -27,10 +27,6 @@  #   include "config.h"  #endif -#define EDI_DEBUG 0 -#define EDI_DUMP 1 -#define EDI_PFT 1 -  #include <cstdio>  #include <stdlib.h>  #include <iostream> @@ -331,6 +327,17 @@ int main(int argc, char *argv[])      int statsserverport = 0; +    edi_configuration_t edi_conf; + +    // Defaults for edi +    edi_conf.enabled     = false; +    edi_conf.dest_addr   = ""; +    edi_conf.dest_port   = 0; +    edi_conf.source_port = 0; +    edi_conf.dump        = false; +    edi_conf.enable_pft  = false; + +      struct timeval mnsc_time;      /* TODO:  @@ -355,7 +362,7 @@ int main(int argc, char *argv[])                  string conf_file = argv[2];                  parse_configfile(conf_file, outputs, ensemble, &enableTist, &FICL, -                        &factumAnalyzer, &limit, &rc, &statsserverport); +                        &factumAnalyzer, &limit, &rc, &statsserverport, &edi_conf);              }              catch (runtime_error &e) { @@ -658,6 +665,13 @@ int main(int argc, char *argv[])          etiLog.log(info, "--- Output list ---");          printOutputs(outputs); +        if (edi_conf.enabled) { +            etiLog.level(warn) << "EXPERIMENTAL EDI OUTPUT ENABLED!"; +            etiLog.level(info) << "edi to " << edi_conf.dest_addr << ":" << edi_conf.dest_port; +            etiLog.level(info) << "source port " << edi_conf.source_port; +            etiLog.level(info) << "verbose     " << edi_conf.verbose; +        } +          /* These iterators are used to fill the respective FIG.           * It is necessary to cycle through all the FIGs that have @@ -674,23 +688,29 @@ int main(int argc, char *argv[])          serviceFIG0_17 = ensemble->services.end();          subchannelFIG0_1 = ensemble->subchannels.end(); +        if (edi_conf.verbose) { +            etiLog.log(info, "Setup EDI debug"); +        } +        std::ofstream edi_debug_file; -#if EDI_DEBUG -        etiLog.log(info, "Setup EDI debug"); -#  if EDI_DUMP -        std::ofstream edi_debug_file("./edi.debug"); -#  endif -        UdpSocket edi_output(13000); -        etiLog.log(info, "EDI debug set up"); -#endif +        if (edi_conf.dump) { +            edi_debug_file.open("./edi.debug"); +        } +        UdpSocket edi_output; + +        if (edi_conf.enabled) { +            edi_output.create(edi_conf.source_port); +        } + +        if (edi_conf.verbose) { +            etiLog.log(info, "EDI debug set up"); +        }          // The TagPacket will then be placed into an AFPacket -        AFPacketiser edi_afPacketiser(EDI_AFPACKET_PROTOCOLTYPE_TAGITEMS); +        AFPacketiser edi_afPacketiser(edi_conf.verbose); -#if EDI_PFT          // The AF Packet will be protected with reed-solomon and split in fragments -        PFT edi_pft(207, 3); -#endif +        PFT edi_pft(207, 3, edi_conf.verbose);          /*   Each iteration of the main loop creates one ETI frame */          for (currentFrame = 0; running; currentFrame++) { @@ -2019,66 +2039,70 @@ int main(int argc, char *argv[])               ***********   Finalise and send EDI   ********************************               **********************************************************************/ -#if EDI_DEBUG -            // put tags *ptr, DETI and all subchannels into one TagPacket -            edi_tagpacket.tag_items.push_back(&edi_tagStarPtr); -            edi_tagpacket.tag_items.push_back(&edi_tagDETI); +            if (edi_conf.enabled) { +                // put tags *ptr, DETI and all subchannels into one TagPacket +                edi_tagpacket.tag_items.push_back(&edi_tagStarPtr); +                edi_tagpacket.tag_items.push_back(&edi_tagDETI); -            list<TagESTn>::iterator tag; -            for (tag = edi_subchannels.begin(); tag != edi_subchannels.end(); ++tag) { -                edi_tagpacket.tag_items.push_back(&(*tag)); -            } +                list<TagESTn>::iterator tag; +                for (tag = edi_subchannels.begin(); tag != edi_subchannels.end(); ++tag) { +                    edi_tagpacket.tag_items.push_back(&(*tag)); +                } -            // Assemble into one AF Packet -            AFPacket edi_afpacket = edi_afPacketiser.Assemble(edi_tagpacket); +                // Assemble into one AF Packet +                AFPacket edi_afpacket = edi_afPacketiser.Assemble(edi_tagpacket); -#  if EDI_PFT -            // Apply PFT layer to AF Packet (Reed Solomon FEC and Fragmentation) -            vector< PFTFragment > edi_fragments = -                edi_pft.Assemble(edi_afpacket); +                if (edi_conf.enable_pft) { +                    // Apply PFT layer to AF Packet (Reed Solomon FEC and Fragmentation) +                    vector< PFTFragment > edi_fragments = +                        edi_pft.Assemble(edi_afpacket); -            // Send over ethernet -            vector< vector<uint8_t> >::iterator edi_frag; -            for (edi_frag = edi_fragments.begin(); -                    edi_frag != edi_fragments.end(); -                    ++edi_frag) { +                    // Send over ethernet +                    vector< vector<uint8_t> >::iterator edi_frag; +                    for (edi_frag = edi_fragments.begin(); +                            edi_frag != edi_fragments.end(); +                            ++edi_frag) { -                UdpPacket udppacket; +                        UdpPacket udppacket; -                InetAddress& addr = udppacket.getAddress(); -                addr.setAddress("127.0.0.1"); -                addr.setPort(12000); +                        InetAddress& addr = udppacket.getAddress(); +                        addr.setAddress(edi_conf.dest_addr.c_str()); +                        addr.setPort(edi_conf.dest_port); -                udppacket.addData(&(edi_frag->front()), edi_frag->size()); +                        udppacket.addData(&(edi_frag->front()), edi_frag->size()); -                edi_output.send(udppacket); +                        edi_output.send(udppacket); -#    if EDI_DUMP -                std::ostream_iterator<uint8_t> debug_iterator(edi_debug_file); -                std::copy(edi_frag->begin(), edi_frag->end(), debug_iterator); -#    endif -            } +                        if (edi_conf.dump) { +                            std::ostream_iterator<uint8_t> debug_iterator(edi_debug_file); +                            std::copy(edi_frag->begin(), edi_frag->end(), debug_iterator); +                        } +                    } -            fprintf(stderr, "EDI number of PFT fragments %zu\n", edi_fragments.size()); -#  else -            // Send over ethernet +                    if (edi_conf.verbose) { +                        fprintf(stderr, "EDI number of PFT fragments %zu\n", +                                edi_fragments.size()); +                    } +                } +                else { +                    // Send over ethernet -            UdpPacket udppacket; +                    UdpPacket udppacket; -            InetAddress& addr = udppacket.getAddress(); -            addr.setAddress("192.168.3.2"); -            addr.setPort(12000); +                    InetAddress& addr = udppacket.getAddress(); +                    addr.setAddress(edi_conf.dest_addr.c_str()); +                    addr.setPort(edi_conf.dest_port); -            udppacket.addData(&(edi_afpacket.front()), edi_afpacket.size()); +                    udppacket.addData(&(edi_afpacket.front()), edi_afpacket.size()); -            edi_output.send(udppacket); -#  endif +                    edi_output.send(udppacket); +                } -#  if EDI_DUMP -            std::ostream_iterator<uint8_t> debug_iterator(edi_debug_file); -            std::copy(edi_afpacket.begin(), edi_afpacket.end(), debug_iterator); -#  endif -#endif +                if (edi_conf.dump) { +                    std::ostream_iterator<uint8_t> debug_iterator(edi_debug_file); +                    std::copy(edi_afpacket.begin(), edi_afpacket.end(), debug_iterator); +                } +            }  #if _DEBUG              /**********************************************************************  | 
