public void OnBroadcast(object sender, MesgBroadcastEventArgs e)
        {
            float[]     calibratedXYZ;
            int         count;
            List <Mesg> mesgs = e.mesgs;

            int[] rawXYZ = new int[NUM_AXIS];

            foreach (Mesg mesg in mesgs)
            {
                switch (mesg.Num)
                {
                case MesgNum.AccelerometerData:
                    if (haveAccelCal)
                    {
                        AccelerometerDataMesg accelData = new AccelerometerDataMesg(mesg);
                        count = accelData.GetNumAccelX();
                        for (int i = 0; i < count; i++)
                        {
                            //Extract the uncalibrated accel data from incoming message
                            rawXYZ[X_AXIS_OFFSET] = Convert.ToInt32(accelData.GetAccelX(i));
                            rawXYZ[Y_AXIS_OFFSET] = Convert.ToInt32(accelData.GetAccelY(i));
                            rawXYZ[Z_AXIS_OFFSET] = Convert.ToInt32(accelData.GetAccelZ(i));

                            // Apply calibration to the values
                            calibratedXYZ = AdjustSensorData(rawXYZ, accelCalParams);

                            // Update the message
                            ProcessCalibrationFactor(mesg, accelDataFieldNameXYZ, calibratedXYZ, accelDataFieldNum);
                        }
                    }
                    break;

                case MesgNum.GyroscopeData:
                    if (haveGyroCal)
                    {
                        GyroscopeDataMesg gyroData = new GyroscopeDataMesg(mesg);
                        count = gyroData.GetNumGyroX();
                        for (int i = 0; i < count; i++)
                        {
                            //Extract the uncalibrated gyro data from incoming message
                            rawXYZ[X_AXIS_OFFSET] = Convert.ToInt32(gyroData.GetGyroX(i));
                            rawXYZ[Y_AXIS_OFFSET] = Convert.ToInt32(gyroData.GetGyroY(i));
                            rawXYZ[Z_AXIS_OFFSET] = Convert.ToInt32(gyroData.GetGyroZ(i));

                            // Apply calibration to the values
                            calibratedXYZ = AdjustSensorData(rawXYZ, gyroCalParams);

                            // Update the message
                            ProcessCalibrationFactor(mesg, gyroDataFieldNameXYZ, calibratedXYZ, gyroDataFieldNum);
                        }
                    }
                    break;

                case MesgNum.MagnetometerData:
                    if (haveMagCal)
                    {
                        MagnetometerDataMesg magData = new MagnetometerDataMesg(mesg);
                        count = magData.GetNumMagX();
                        for (int i = 0; i < count; i++)
                        {
                            //Extract the uncalibrated mag data from incoming message
                            rawXYZ[X_AXIS_OFFSET] = Convert.ToInt32(magData.GetMagX(i));
                            rawXYZ[Y_AXIS_OFFSET] = Convert.ToInt32(magData.GetMagY(i));
                            rawXYZ[Z_AXIS_OFFSET] = Convert.ToInt32(magData.GetMagZ(i));

                            // Apply calibration to the values
                            calibratedXYZ = AdjustSensorData(rawXYZ, magCalParams);

                            // Update the message
                            ProcessCalibrationFactor(mesg, magDataFieldNameXYZ, calibratedXYZ, magDataFieldNum);
                        }
                    }
                    break;

                default:
                    break;
                } // switch
            }     // foreach
        }