static void GenerateData()

in DataGenerators/TelcoGeneratorCore/Program.cs [68:279]


        static void GenerateData(EventHubProducerClient producer, string[] args)
        {
            Queue callBackQ = new Queue();

            // Parse parameters
            // Number of cdr records, probability of fraud, and number of hours
            GenConfig config = new GenConfig(Int32.Parse(args[0]), float.Parse(args[1]), Int32.Parse(args[2]));

            // print statistics
            Console.Error.WriteLine(config);

            // Start the generation

            // Generate the call nos
            CallStore mobileNos = new CallStore(100000);

            int numCallbackPerFile = (int)(config.nCallBackPercent * config.nCDRPerFile);

            // Data generation always start with the current time

            double timeAdvancementPerSet = (0.0 + config.nDurationHours) / config.nSets;

            Console.Error.WriteLine("Time Increment Per Set: " + timeAdvancementPerSet);

            // Start generating per set
            DateTime simulationTime = DateTime.Now;
            Random r = new Random();

            bool invalidRec = false;
            bool genCallback = false;


            // TOOD: Update this to number of hours
            DateTimeOffset ptTime = DateTimeOffset.Now;
            DateTimeOffset endTime = ptTime.AddHours(config.nDurationHours);

            while (endTime.Subtract(ptTime) >= TimeSpan.Zero)
            {
                DateTimeOffset currentTime = ptTime;

                Console.WriteLine(String.Format("{0:yyyyMMdd HHmmss}", simulationTime));



                for (int cdr = 0; cdr < config.nCDRPerFile; cdr++)
                {
                    currentTime = ptTime;

                    // Determine whether to generate an invalid CDR record
                    double pvalue = r.NextDouble();
                    if (pvalue < 0.1)
                        invalidRec = true;
                    else
                        invalidRec = false;

                    // Determine whether there will be a callback
                    pvalue = r.NextDouble();
                    if (pvalue >= config.nCallBackPercent)
                        genCallback = true;
                    else
                        genCallback = false;


                    // Determine called and calling num
                    int calledIdx = r.Next(0, mobileNos.CallNos.Length);
                    int callingIdx = r.Next(0, mobileNos.CallNos.Length);


                    CDRrecord rec = new CDRrecord();
                    rec.setData("FileNum", "" + cdr);

                    int switchIdx = r.Next(0, mobileNos.switchCountries.Length);
                    int switchAltIdx = r.Next(0, mobileNos.switchCountries.Length);

                    // Find an alternate switch
                    while (switchAltIdx == switchIdx)
                    {
                        switchAltIdx = r.Next(0, mobileNos.switchCountries.Length);
                    }

                    rec.setData("SwitchNum", mobileNos.switchCountries[switchIdx]);


                    if (invalidRec)
                    {
                        rec.setData("Date", "F");
                        rec.setData("Time", "F");
                        rec.setData("DateTime", "F F");
                    }
                    else
                    {
                        String callDate = String.Format("{0:yyyyMMdd}", currentTime);
                        String callTime = String.Format("{0:HHmmss}", currentTime);

                        rec.setData("Date", callDate);
                        rec.setData("Time", callTime);
                        rec.setData("DateTime", callDate + " " + callTime);

                        String calledNum = mobileNos.CallNos[calledIdx];
                        String callingNum = mobileNos.CallNos[callingIdx];

                        rec.setData("CalledNum", calledNum);
                        rec.setData("CallingNum", callingNum);


                        // Sim card fraud record
                        if (genCallback)
                        {
                            // For call back the A->B end has duration 0
                            rec.setData("CallPeriod", "0");

                            // need to generate another set of no
                            calledIdx = callingIdx;
                            callingIdx = r.Next(0, mobileNos.CallNos.Length);

                            CDRrecord callbackRec = new CDRrecord();
                            callbackRec.setData("FileNum", "" + cdr);
                            callbackRec.setData("SwitchNum", mobileNos.switchCountries[switchAltIdx]);

                            //callbackRec.setData("SwitchNum", "" + (f + 1));

                            // Pertub second 
                            int pertubs = r.Next(0, 30);

                            callDate = String.Format("{0:yyyyMMdd}", currentTime);
                            callTime = String.Format("{0:HHmmss}", currentTime.AddMinutes(pertubs));

                            callbackRec.setData("Date", callDate);
                            callbackRec.setData("Time", callTime);
                            callbackRec.setData("DateTime", callDate + " " + callTime);

                            // Set it as the same calling IMSI
                            callbackRec.setData("CallingIMSI", rec.CallingIMSI);

                            calledNum = mobileNos.CallNos[calledIdx];
                            callingNum = mobileNos.CallNos[callingIdx];

                            callbackRec.setData("CalledNum", calledNum);
                            callbackRec.setData("CallingNum", callingNum);


                            // Determine duration of call
                            int callPeriod = r.Next(1, 1000);
                            callbackRec.setData("CallPeriod", "" + callPeriod);

                            // Enqueue the call back rec 
                            callBackQ.Enqueue(callbackRec);
                            cdr++;
                        }
                        else
                        {
                            int callPeriod = r.Next(1, 800);
                            rec.setData("CallPeriod", "" + callPeriod);
                        }
                    }

                    // send cdr rec to output
                    //if (genCallback)  Console.Write("callback A->B ");
                    outputCDRRecs(producer, rec);

                    if (callBackQ.Count > 0 && (cdr % 7 == 0))
                    {
                        CDRrecord drec;
                        drec = (CDRrecord)callBackQ.Dequeue();
                        outputCDRRecs(producer, drec);

                        //Console.Write("callback C->A!");
                        //outputCDRRecs(s, f, drec);
                    }

                    // Sleep for 1000ms
                    System.Threading.Thread.Sleep(100);

                    // get the current time after generation
                    ptTime = DateTimeOffset.Now;
                } // cdr


                // Clear the remaining entries in the call back queue
                if (callBackQ.Count > 0)
                {
                    // need to empty queue
                    while (callBackQ.Count > 0)
                    {
                        CDRrecord dr = (CDRrecord)callBackQ.Dequeue();
                        outputCDRRecs(producer, dr);
                        //outputCDRRecs(s, f, dr);
                    }
                }

                // close the file
                if (writer != null)
                {
                    writer.Flush();
                    writer.Close();
                    writer = null;
                }


                // Advance Time
                if (timeAdvancementPerSet < 1.0)
                    simulationTime = simulationTime.AddMinutes(timeAdvancementPerSet * 60);
                else
                    simulationTime = simulationTime.AddHours(timeAdvancementPerSet);

                // Sleep for 1000ms
                System.Threading.Thread.Sleep(1000);

            } // while - within duration


        }