rx_spi_received_e frSkyDHandlePacket(uint8_t * const packet, uint8_t * const protocolState)
{
    static timeUs_t lastPacketReceivedTime = 0;
    static timeUs_t telemetryTimeUs;

    rx_spi_received_e ret = RX_SPI_RECEIVED_NONE;

    const timeUs_t currentPacketReceivedTime = micros();

    switch (*protocolState) {
    case STATE_STARTING:
        listLength = 47;
        initialiseData(0);
        *protocolState = STATE_UPDATE;
        nextChannel(1);
        cc2500Strobe(CC2500_SRX);

        break;
    case STATE_UPDATE:
        lastPacketReceivedTime = currentPacketReceivedTime;
        *protocolState = STATE_DATA;

        if (rxSpiCheckBindRequested(false)) {
            lastPacketReceivedTime = 0;
            timeoutUs = 50;
            missingPackets = 0;

            *protocolState = STATE_INIT;

            break;
        }
        FALLTHROUGH; //!!TODO -check this fall through is correct
    // here FS code could be
    case STATE_DATA:
        if (cc2500getGdo()) {
            uint8_t ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F;
            if (ccLen >= 20) {
                cc2500ReadFifo(packet, 20);
                if (packet[19] & 0x80) {
                    missingPackets = 0;
                    timeoutUs = 1;
                    if (packet[0] == 0x11) {
                        if ((packet[1] == rxFrSkySpiConfig()->bindTxId[0]) &&
                            (packet[2] == rxFrSkySpiConfig()->bindTxId[1])) {
                            rxSpiLedOn();
                            nextChannel(1);
                            cc2500setRssiDbm(packet[18]);
#if defined(USE_RX_FRSKY_SPI_TELEMETRY)
                            if ((packet[3] % 4) == 2) {
                                telemetryTimeUs = micros();
                                buildTelemetryFrame(packet);
                                *protocolState = STATE_TELEMETRY;
                            } else
#endif
                            {
                                cc2500Strobe(CC2500_SRX);
                                *protocolState = STATE_UPDATE;
                            }
                            ret = RX_SPI_RECEIVED_DATA;
                            lastPacketReceivedTime = currentPacketReceivedTime;
                        }
                    }
                }
            }
        }

        if (cmpTimeUs(currentPacketReceivedTime, lastPacketReceivedTime) > (timeoutUs * SYNC_DELAY_MAX)) {
#if defined(USE_RX_CC2500_SPI_PA_LNA)
            cc2500TxDisable();
#endif
            if (timeoutUs == 1) {
#if defined(USE_RX_CC2500_SPI_PA_LNA) && defined(USE_RX_CC2500_SPI_DIVERSITY) // SE4311 chip
                if (missingPackets >= 2) {
                    cc2500switchAntennae();
                }
#endif

                if (missingPackets > MAX_MISSING_PKT) {
                    timeoutUs = 50;

                    setRssiDirect(0, RSSI_SOURCE_RX_PROTOCOL);
                }

                missingPackets++;
                nextChannel(1);
            } else {
                rxSpiLedToggle();

                setRssi(0, RSSI_SOURCE_RX_PROTOCOL);
                nextChannel(13);
            }

            cc2500Strobe(CC2500_SRX);
            *protocolState = STATE_UPDATE;
        }
        break;
#if defined(USE_RX_FRSKY_SPI_TELEMETRY)
    case STATE_TELEMETRY:
        if (cmpTimeUs(micros(), telemetryTimeUs) >= 1380) {
            cc2500Strobe(CC2500_SIDLE);
            cc2500SetPower(6);
            cc2500Strobe(CC2500_SFRX);
#if defined(USE_RX_CC2500_SPI_PA_LNA)
            cc2500TxEnable();
#endif
            cc2500Strobe(CC2500_SIDLE);
            cc2500WriteFifo(frame, frame[0] + 1);
            *protocolState = STATE_DATA;
            ret = RX_SPI_RECEIVED_DATA;
            lastPacketReceivedTime = currentPacketReceivedTime;
        }

        break;

#endif
    }

    return ret;
}
void peano::applications::latticeboltzmann::blocklatticeboltzmann::tests::DensityInterpolationTest::run(){
  // vertex data TODO
  tarch::la::Vector<TWO_POWER_D, std::bitset<LB_BLOCK_NUMBER_OF_CELLS>* > inner;
  tarch::la::Vector<TWO_POWER_D, std::bitset<LB_BLOCK_NUMBER_OF_CELLS>* > boundary;
  tarch::la::Vector<TWO_POWER_D, std::bitset<TWO_POWER_D>* > nonLocalStreamingFinished;
  tarch::la::Vector<TWO_POWER_D, tarch::la::Vector<LB_BLOCK_NUMBER_OF_CELLS*LB_CURRENT_DIR,double>* > pdf;
  tarch::la::Vector<TWO_POWER_D, tarch::la::Vector<LB_BLOCK_NUMBER_OF_CELLS,double>* > density;
  tarch::la::Vector<TWO_POWER_D, tarch::la::Vector<LB_BLOCK_NUMBER_OF_CELLS*DIMENSIONS,double>* > velocity;
  // parameters for testing all cells
  const tarch::la::Vector<2,int> start(LB_BLOCKSIZE/2, 0);
  const tarch::la::Vector<2,int> end  (  LB_BLOCKSIZE, (LB_BLOCKSIZE/2+(LB_BLOCKSIZE%2)));
  int cellNumber = 0;
  int vertexNumber = 0;
  tarch::la::Vector<DIMENSIONS,int> vertexCoords(0);
  tarch::la::Vector<DIMENSIONS,int> cellCoords(0);

  // initialise pointers
  for (int i = 0; i < TWO_POWER_D; i++){
    inner(i) = new std::bitset<LB_BLOCK_NUMBER_OF_CELLS>();
    boundary(i) = new std::bitset<LB_BLOCK_NUMBER_OF_CELLS>();
    nonLocalStreamingFinished(i) = new std::bitset<TWO_POWER_D>();
    pdf(i) = new tarch::la::Vector<LB_BLOCK_NUMBER_OF_CELLS*LB_CURRENT_DIR,double>(0.0);
    density(i) = new tarch::la::Vector<LB_BLOCK_NUMBER_OF_CELLS,double>(0.0);
    velocity(i) = new tarch::la::Vector<LB_BLOCK_NUMBER_OF_CELLS*DIMENSIONS,double>(0.0);
  }

  // loop over vertices
#if (DIMENSIONS==3)
  for (vertexCoords(2) = 0; vertexCoords(2) < 2; vertexCoords(2)++){
#endif
    for (vertexCoords(1) = 0; vertexCoords(1) < 2; vertexCoords(1)++){
      for (vertexCoords(0) = 0; vertexCoords(0) < 2; vertexCoords(0)++){

#if (DIMENSIONS==3)
        for (cellCoords(2) = start(vertexCoords(2)); cellCoords(2) < end(vertexCoords(2)); cellCoords(2)++){
#endif
          for (cellCoords(1) = start(vertexCoords(1)); cellCoords(1) < end(vertexCoords(1)); cellCoords(1)++){
            for (cellCoords(0) = start(vertexCoords(0)); cellCoords(0) < end(vertexCoords(0)); cellCoords(0)++){

              std::vector<int> elements;
              cellNumber = cellCoords(0) + cellCoords(1)*LB_BLOCKSIZE
#if (DIMENSIONS==3)
                         + cellCoords(2)*LB_BLOCKSIZE*LB_BLOCKSIZE
#endif
                         ;

              // find all element (non-streaming-finished)-combinations and store them in the vector
              determineRelevantElementCombinations(cellCoords,vertexCoords,elements);

              for (int n = 0; n < tarch::la::aPowI(elements.size(),2); n++){
                // initialise data
                initialiseData(
                  cellCoords,cellNumber,vertexCoords,vertexNumber,elements,n,nonLocalStreamingFinished,inner,boundary,pdf,density
                );

                // carry out interpolation
                // first vertexwise
                for (int v = 0; v < TWO_POWER_D; v++){
                  _densityInterpolation.interpolateDensityLocal(*inner(v),*boundary(v),*pdf(v),*density(v),*velocity(v));
                }
                // second elementwise
                _densityInterpolation.interpolateDensity(inner,boundary,nonLocalStreamingFinished,pdf,density,velocity);

                // validate result
                if (!tarch::la::equals((*density(vertexNumber))(cellNumber),((double) (THREE_POWER_D+1)/2),1e-10) ){
                  logInfo("run()", "Data for vertex/cell-number " << vertexNumber << "," << cellNumber  << ":" << std::endl);
#if (DIMENSIONS==2)
                  logInfo("run()",
                    "nonLocalStreamingFinished: " << (*nonLocalStreamingFinished(0))[0] << (*nonLocalStreamingFinished(0))[1] << (*nonLocalStreamingFinished(0))[2] << (*nonLocalStreamingFinished(0))[3] << \
                    " " << (*nonLocalStreamingFinished(1))[0] << (*nonLocalStreamingFinished(1))[1] << (*nonLocalStreamingFinished(1))[2] << (*nonLocalStreamingFinished(1))[3] << \
                    " " << (*nonLocalStreamingFinished(2))[0] << (*nonLocalStreamingFinished(2))[1] << (*nonLocalStreamingFinished(2))[2] << (*nonLocalStreamingFinished(2))[3] << \
                    " " << (*nonLocalStreamingFinished(3))[0] << (*nonLocalStreamingFinished(3))[1] << (*nonLocalStreamingFinished(3))[2] << (*nonLocalStreamingFinished(3))[3]);
#elif (DIMENSIONS==3)
                  logInfo("run()",
                    "nonLocalStreamingFinished: " << (*nonLocalStreamingFinished(0))[0] << (*nonLocalStreamingFinished(0))[1] << (*nonLocalStreamingFinished(0))[2] << (*nonLocalStreamingFinished(0))[3] << (*nonLocalStreamingFinished(0))[4] << (*nonLocalStreamingFinished(0))[5] << (*nonLocalStreamingFinished(0))[6] << (*nonLocalStreamingFinished(0))[7] << \
                    " "                           << (*nonLocalStreamingFinished(1))[0] << (*nonLocalStreamingFinished(1))[1] << (*nonLocalStreamingFinished(1))[2] << (*nonLocalStreamingFinished(1))[3] << (*nonLocalStreamingFinished(1))[4] << (*nonLocalStreamingFinished(1))[5] << (*nonLocalStreamingFinished(1))[6] << (*nonLocalStreamingFinished(1))[7] << \
                    " "                           << (*nonLocalStreamingFinished(2))[0] << (*nonLocalStreamingFinished(2))[1] << (*nonLocalStreamingFinished(2))[2] << (*nonLocalStreamingFinished(2))[3] << (*nonLocalStreamingFinished(2))[4] << (*nonLocalStreamingFinished(2))[5] << (*nonLocalStreamingFinished(2))[6] << (*nonLocalStreamingFinished(2))[7] << \
                    " "                           << (*nonLocalStreamingFinished(3))[0] << (*nonLocalStreamingFinished(3))[1] << (*nonLocalStreamingFinished(3))[2] << (*nonLocalStreamingFinished(3))[3] << (*nonLocalStreamingFinished(3))[4] << (*nonLocalStreamingFinished(3))[5] << (*nonLocalStreamingFinished(3))[6] << (*nonLocalStreamingFinished(3))[7]);
#endif
                  logInfo("run()", "inner/boundary: ");
                  for (int v = 0; v < TWO_POWER_D; v++){
                    for (int c = 0; c < LB_BLOCK_NUMBER_OF_CELLS; c++){
                      tarch::la::Vector<LB_CURRENT_DIR,double> localPdf(0.0);
                      for (int i = 0; i < LB_CURRENT_DIR; i++){
                        localPdf(i) = (*pdf(v))(c*LB_CURRENT_DIR+i);
                      }
                      logInfo("run()", "Vertex " << v << ", cell " << c << ": " << (*inner(v))[c] << "," << (*boundary(v))[c] << "," << (*density(v))[c] << "," << localPdf);
                    }
                  }
                } else {
                  logInfo("run()", "Data for vertex/cell-number " << vertexNumber << "," << cellNumber << ": OK");
                }
                validateNumericalEquals((*density(vertexNumber))(cellNumber),((double) (THREE_POWER_D+1)/2));
              }
              logInfo("run()", "Interpolation on Vertex/Cell " << vertexCoords << "/" << cellCoords << ": OK");
            } // cellCoords(0)
          } // cellCoords(1)
#if (DIMENSIONS==3)
        } // cellCoords(2)
#endif
        // increment vertex counter
        vertexNumber++;
      } // vertexCoords(0)
    } // vertexCoords(1)
#if (DIMENSIONS==3)
  } // vertexCoords(2)
#endif

  // delete pointers
  for (int i = 0; i < TWO_POWER_D; i++){
    delete inner(i);
    delete boundary(i);
    delete nonLocalStreamingFinished(i);
    delete pdf(i);
    delete density(i);
    delete velocity(i);
  }
}
Exemple #3
0
void Projector::initZeros(int current_size)
{
	initialiseData(current_size);
	data.initZeros();
}
rx_spi_received_e frSkySpiDataReceived(uint8_t *packet)
{
    rx_spi_received_e ret = RX_SPI_RECEIVED_NONE;

    switch (protocolState) {
    case STATE_INIT:
        if ((millis() - start_time) > 10) {
            initialise();

            protocolState = STATE_BIND;
        }

        break;
    case STATE_BIND:
        if (rxSpiCheckBindRequested(true) || rxCc2500SpiConfig()->autoBind) {
            rxSpiLedOn();
            initTuneRx();

            protocolState = STATE_BIND_TUNING;
        } else {
            protocolState = STATE_STARTING;
        }

        break;
    case STATE_BIND_TUNING:
       if (tuneRx(packet)) {
            initGetBind();
            initialiseData(1);

            protocolState = STATE_BIND_BINDING1;
        }

        break;
    case STATE_BIND_BINDING1:
        if (getBind1(packet)) {
            protocolState = STATE_BIND_BINDING2;
        }

        break;
    case STATE_BIND_BINDING2:
        if (getBind2(packet)) {
            cc2500Strobe(CC2500_SIDLE);

            protocolState = STATE_BIND_COMPLETE;
        }

        break;
    case STATE_BIND_COMPLETE:
        if (!rxCc2500SpiConfig()->autoBind) {
            writeEEPROM();
        } else {
            uint8_t ctr = 80;
            while (ctr--) {
                rxSpiLedToggle();
                delay(50);
            }
        }

        ret = RX_SPI_RECEIVED_BIND;
        protocolState = STATE_STARTING;

        break;
    default:
        ret = handlePacket(packet, &protocolState);

        break;
    }

    return ret;
}