void PushN8IMUDevice::gotDataReceived(QString data)
{

    QStringList params;
    if(getPackage(data, params))
    {
        //detect negative values to switch to digital mode.
        if(!digitalAcc) {
            if(params[4].toInt() < 0 ||
               params[5].toInt() < 0 ||
               params[6].toInt() < 0) {
                digitalAcc = true;
            }
        }

        NPushIMUTick * newIMUTick = new NPushIMUTick(params);
        newIMUTick->digitalAcc = digitalAcc;

//        qDebug() << "Parms: " << params[1] << "," << params[2] << "," << params[3];

        if(receivers(SIGNAL(reading_ready(NPushLogTick*))) > 0)
        {
            //anyone listening to us
            emit reading_ready(newIMUTick);
        } else {
            delete newIMUTick;
        }
    }
void PushN8SimulationDevice::timerEvent(QTimerEvent *)
{
    while(!(xml.isEndElement() && xml.name() == "N8SensorsLog")) {

        bool reachedEnd = false;
        while(xml.readNextStartElement())
        {
            NPushLogTick * newTick = 0;
            if(xml.name() == "acc_data")
            {
                newTick = readAccTick();
            } else if(xml.name() == "mag_data")
            {
                newTick = readMagTick();
            } else if(xml.name() == "gps_data")
            {
                newTick = readGpsTick();
            } else if(xml.name() == "imu_data")
            {
                newTick = readImuTick();
                //Imu tick has inner elements, when it returns we can quit
                reachedEnd = true;
            } else if(xml.name() == "gsr_data")
            {
                newTick = readGsrTick();
            } else if(xml.name() == "heart_data")
            {
                newTick = readHeartTick();
            } else if(xml.name() == "foot_data")
            {
                newTick = readFootTick();
            } else {
                //            qDebug() << "Unrecognized tag " << xml.name();
                xml.skipCurrentElement();
            }

            if(newTick != 0) {
                if(receivers(SIGNAL(reading_ready(NPushLogTick*))) > 0)
                {
                    emit reading_ready(newTick);
                } else {
                    delete newTick;
                }
            }

            if(reachedEnd)
                break;
        }

        if(xml.isEndElement() && xml.name() == "N8SensorsLog") {
            qDebug() << "Simulation Ended!!";
            this->stop_readings();
        }
    }
void PushN8PhoneMag::timerEvent(QTimerEvent *)
{
    if(!is_online())
        return;
    NPushMagTick * newMagTick = new NPushMagTick(magSensor->reading());

    if(receivers(SIGNAL(reading_ready(NPushLogTick*))) > 0)
    {
        emit reading_ready(newMagTick);
    } else {
        delete newMagTick;
void PushN8IMUDevice::gotDataReceived(QString data)
{

    QStringList params;
    if(getPackage(data, params))
    {

        NPushIMUTick * newIMUTick = new NPushIMUTick(params);

//        qDebug() << "Parms: " << params[1] << "," << params[2] << "," << params[3];

        if(receivers(SIGNAL(reading_ready(NPushLogTick*))) > 0)
        {
            //anyone listening to us
            emit reading_ready(newIMUTick);
        } else {
            delete newIMUTick;
        }
    }
void PushN8AbsNormFeetDevice::incoming_reading(NPushLogTick * gtick)
{
    if(typeid(*gtick) == typeid(NPushFootTick)) {
        NPushFootTick * ftick = (NPushFootTick *)gtick;

        if(ftick->side == 'L') {
            pdata.LToe.update(
                    (ftick->toes > FOOT_PRESSURE_INVALID_THRESHOLD)?
                    ftick->toes : pdata.RToe.rawVal
                    );

            pdata.LHeel.update(
                    (ftick->heel > FOOT_PRESSURE_INVALID_THRESHOLD)?
                    ftick->heel : pdata.RHeel.rawVal
                    );
        } else {
            pdata.RToe.update(
                    (ftick->toes > FOOT_PRESSURE_INVALID_THRESHOLD)?
                    ftick->toes : pdata.LToe.rawVal
                    );

            pdata.RHeel.update(
                    (ftick->heel > FOOT_PRESSURE_INVALID_THRESHOLD)?
                    ftick->heel : pdata.LHeel.rawVal
                    );
        }

        if((ftick->msecsToEpoch - lastReading) < 100 &&
           (ftick->side != lastReadingSide)) {

            pdata.computeSum();
            pdata.computeNormFactor();

            normRunCount++;

            NPushNormFeetTick * newTick = new NPushNormFeetTick(pdata, lastReading);

            if(receivers(SIGNAL(reading_ready(NPushLogTick*))) > 0)
            {
                emit reading_ready(newTick);
            } else {
                delete newTick;
void PushN8PhoneGPS::positionUpdated(QGeoPositionInfo info)
{
    if(info.isValid() && !gpsOnline) {
        emit connected();
        gpsOnline = true;
        qDebug() << "GPS now connected";
    }

//    if(info.coordinate().isValid() && !gpsOnline)
//    {
//        //emitting connected signal when receiving first reading
//        emit connected();
//        gpsOnline = true;

//    } else if(gpsOnline) {

//        gpsOnline = false;
//        emit disconnected();

//    }

    if(!streaming)
        return;

    if(info.timestamp().isValid()) { //&& info.coordinate().isValid()

        QDateTime correctedTstamp;
        correctedTstamp = info.timestamp().addSecs(UTCOffset);//ugly localisation!
        info.setTimestamp(correctedTstamp);

        //double checking speed

        NPushGpsTick * newGPSTick = new NPushGpsTick(info);

        if(receivers(SIGNAL(reading_ready(NPushLogTick*))) > 0)
        {
            emit reading_ready(newGPSTick);
        } else {
            delete newGPSTick;