示例#1
0
文件: usb.cpp 项目: LazyT/obpm
int usbDialog::sendCMD(unsigned char *cmd)
{
	int rc;

	rc = hid_write(dev, cmd, 1 + cmd[1]);

	dumpRawData(true, rc, cmd);

	rc = hid_read_timeout(dev, rawdata, sizeof(rawdata), 1000);

	dumpRawData(false, rc, rawdata);

	return rc;
}
示例#2
0
//TODO: See the processing function below for a more detailed explanation - can't send so many setParam commands in a row
void ADAFRUITBLE::handleTick() {
    MotorController* motorController = DeviceManager::getInstance()->getMotorController();
    Throttle *accelerator = DeviceManager::getInstance()->getAccelerator();
    Throttle *brake = DeviceManager::getInstance()->getBrake();
    BatteryManager *bms = reinterpret_cast<BatteryManager *>(DeviceManager::getInstance()->getDeviceByType(DEVICE_BMS));
    
    uint32_t ms = millis();
    uint32_t IOTemp = 0;
    uint8_t brklt;
    tickCounter++;

    if (ms < 1000) return; //wait 1 seconds for things to settle before doing a thing

    // Do a delayed parameter load once about a second after startup
    if (!didParamLoad && ms > 5000) {
        loadParameters();
        Logger::console("BLE characteristics loaded...");
        bleBitFields.bitfield1 = motorController->getStatusBitfield1();
        bleBitFields.bitfield2 = motorController->getStatusBitfield2();
        bleBitFields.doUpdate = 1;        
        // DeviceManager::getInstance()->updateWifiByID(BRUSA_DMC5);
        didParamLoad = true;
    }
    
    if (paramCache.timeRunning != (ms / 1000))
    {
        paramCache.timeRunning = ms / 1000;
        if (!gatt.setChar(MeasureCharId[0], (uint8_t*)&paramCache.timeRunning, 4))
        {
            Logger::error("Could not update timeRunning");
        }
        else Logger::debug(ADABLUE, "Updated timeRunning");
        dumpRawData((uint8_t *)&paramCache.timeRunning, 4);
    }
    
    //every other time - 80ms by default
    if (tickCounter & 1)
    {
        if (motorController) {
            if ( bleTrqReqAct.torqueRequested  != motorController->getTorqueRequested() ) {
                bleTrqReqAct.torqueRequested = motorController->getTorqueRequested();
                bleTrqReqAct.doUpdate = 1;
            }
            if ( bleTrqReqAct.torqueActual != motorController->getTorqueActual() ) {
                bleTrqReqAct.torqueActual = motorController->getTorqueActual();
                bleTrqReqAct.doUpdate = 1;
            }
            if ( bleSpeeds.speedRequested != motorController->getSpeedRequested() ) {
                bleSpeeds.speedRequested = motorController->getSpeedRequested();
                bleSpeeds.doUpdate = 1;
            }
            
            if ( bleSpeeds.speedActual != motorController->getSpeedActual() ) {
                bleSpeeds.speedActual = motorController->getSpeedActual();
                bleSpeeds.doUpdate = 1;
            }
        }
    
        if (accelerator) {
            RawSignalData *rawSignal = accelerator->acquireRawSignal();
            if ( bleThrBrkLevels.throttleRawLevel1 !=  rawSignal->input1) 
            {
                bleThrBrkLevels.throttleRawLevel1 = rawSignal->input1;
                bleThrBrkLevels.doUpdate = 1;
            }
            if ( bleThrBrkLevels.throttleRawLevel2 !=  rawSignal->input2) 
            {
                bleThrBrkLevels.throttleRawLevel2 = rawSignal->input2;
                bleThrBrkLevels.doUpdate = 1;
            }
            if (bleThrBrkLevels.throttlePercentage != accelerator->getLevel() / 10)
            {
                bleThrBrkLevels.throttlePercentage = accelerator->getLevel() / 10;
                bleThrBrkLevels.doUpdate = 1;
            }
        }
        if (brake) {
            RawSignalData *rawSignal = brake->acquireRawSignal();
            if (bleThrBrkLevels.brakeRawLevel !=  rawSignal->input1) {
                bleThrBrkLevels.brakeRawLevel = rawSignal->input1;
                paramCache.brakeNotAvailable = false;
                bleThrBrkLevels.doUpdate = 1;
            }
            if (bleThrBrkLevels.brakePercentage !=  brake->getLevel() / 10) {
                bleThrBrkLevels.brakePercentage = brake->getLevel() / 10;
                bleThrBrkLevels.doUpdate = 1;
            }            
        } else {
            if ( paramCache.brakeNotAvailable == true ) {
                paramCache.brakeNotAvailable = false; // no need to keep sending this
                bleThrBrkLevels.brakeRawLevel = 0;
                bleThrBrkLevels.doUpdate = 1;
            }
        }
    }
    
    if (tickCounter == 2) {
        if (bms)
        {
            if (blePowerStatus.SOC != bms->getSOC())
            {
                blePowerStatus.SOC = bms->getSOC();
                blePowerStatus.doUpdate = 1;
            }
        }
        if (motorController) {
            //Logger::console("Wifi tick counter 2...");            
            if ( blePowerStatus.busVoltage != motorController->getDcVoltage() ) {
                blePowerStatus.busVoltage = motorController->getDcVoltage();
                if(blePowerStatus.busVoltage<0) blePowerStatus.busVoltage=0; 
                //if(blePowerStatus.busVoltage>4500) blePowerStatus.busVoltage=4500;
                blePowerStatus.doUpdate = 1;
            }
            
            if ( blePowerStatus.busCurrent != motorController->getDcCurrent() ) {
                blePowerStatus.busCurrent = motorController->getDcCurrent();
                blePowerStatus.doUpdate = 1;
            }
            
            if ( blePowerStatus.motorCurrent != motorController->getAcCurrent() ) {
                blePowerStatus.motorCurrent = motorController->getAcCurrent();
                blePowerStatus.doUpdate = 1;
            }

            if ( blePowerStatus.kwHours != motorController->getKiloWattHours()/3600000 ) {
                blePowerStatus.kwHours = motorController->getKiloWattHours()/3600000;
                if(blePowerStatus.kwHours<0)blePowerStatus.kwHours = 0;
                if(blePowerStatus.kwHours>300)blePowerStatus.kwHours = 300;
                blePowerStatus.doUpdate = 1;
            }
            
            if ( blePowerStatus.mechPower != motorController->getMechanicalPower() ) {
                blePowerStatus.mechPower = motorController->getMechanicalPower();
                if (blePowerStatus.mechPower<-250)blePowerStatus.mechPower=-250;
                if (blePowerStatus.mechPower>1500)blePowerStatus.mechPower=1500;
                blePowerStatus.doUpdate = 1;
            }

            //DeviceManager::getInstance()->updateWifi();
        }
    } else if (tickCounter == 3) {
        if (motorController) {
            //Logger::console("Wifi tick counter 3...");

            if ( bleMaxParams.nomVoltage != motorController->getnominalVolt() ) {
                bleMaxParams.nomVoltage = motorController->getnominalVolt();
                bleMaxParams.doUpdate = 1;
            }

            if ( bleBitFields.bitfield1 != motorController->getStatusBitfield1() ) {
                bleBitFields.bitfield1 = motorController->getStatusBitfield1();
                bleBitFields.doUpdate = 1;
            }
            if ( bleBitFields.bitfield2 != motorController->getStatusBitfield2() ) {
                bleBitFields.bitfield2 = motorController->getStatusBitfield2();
                bleBitFields.doUpdate = 1;
            }
            
            IOTemp = 0;
            for (int i = 0; i < 4; i++)
            {
                if (getDigital(i)) bleBitFields.digitalInputs |= 1 << i;
            }            
                        
            if ( bleBitFields.digitalInputs != IOTemp ) {
                bleBitFields.digitalInputs = IOTemp;
                bleBitFields.doUpdate = 1;
            }
            
            IOTemp = 0;
            for (int i = 0; i < 8; i++)
            {
                if (getOutput(i)) bleBitFields.digitalOutputs |= 1 << i;
            }
            
            if ( bleBitFields.digitalOutputs != IOTemp ) {
                bleBitFields.digitalOutputs = IOTemp;
                bleBitFields.doUpdate = 1;
            }
            
            if ( bleModes.isRunning != motorController->isRunning() ) {
                bleModes.isRunning = motorController->isRunning();
                bleModes.doUpdate = 1;
            }
            if ( bleModes.isFaulted != motorController->isFaulted() ) {
                bleModes.isFaulted = motorController->isFaulted();
                bleModes.doUpdate = 1;
            }
            if ( bleModes.isWarning != motorController->isWarning() ) {
                bleModes.isWarning = motorController->isWarning();
                bleModes.doUpdate = 1;
            }
            if ( bleModes.gear != motorController->getSelectedGear() ) {
                bleModes.gear = motorController->getSelectedGear();
                bleModes.doUpdate = 1;
            }
            
            if ( bleModes.powerMode != motorController->getPowerMode() ) {
                bleModes.powerMode = motorController->getPowerMode();
                bleModes.doUpdate = 1;
            }

        }
    } else if (tickCounter == 4) {
        if (motorController) {
            //Logger::console("Wifi tick counter 4...");
            
            if ( bleDigIO.prechargeDuration != motorController->getprechargeR() ) {
                bleDigIO.prechargeDuration = motorController->getprechargeR();
                bleDigIO.doUpdate = 1;
            }

            if ( bleDigIO.prechargeRelay != motorController->getprechargeRelay() ) {
                bleDigIO.prechargeRelay = motorController->getprechargeRelay();
                bleDigIO.doUpdate = 1;
                //Logger::console("Precharge Relay %i", paramCache.prechargeRelay);
                //Logger::console("motorController:prechargeRelay:%d, paramCache.prechargeRelay:%d, Constants:prechargeRelay:%s", motorController->getprechargeRelay(),paramCache.prechargeRelay, Constants::prechargeRelay);
            }

            if ( bleDigIO.mainContRelay != motorController->getmainContactorRelay() ) {
                bleDigIO.mainContRelay = motorController->getmainContactorRelay();
                bleDigIO.doUpdate = 1;
            }


            if ( bleDigIO.coolingRelay != motorController->getCoolFan() ) {
                bleDigIO.coolingRelay = motorController->getCoolFan();
                bleDigIO.doUpdate = 1;
            }

            if ( bleDigIO.coolOnTemp != motorController->getCoolOn() ) {
                bleDigIO.coolOnTemp = motorController->getCoolOn();
                bleDigIO.doUpdate = 1;
            }

            if ( bleDigIO.coolOffTemp != motorController->getCoolOff() ) {
                bleDigIO.coolOffTemp = motorController->getCoolOff();
                bleDigIO.doUpdate = 1;
            }

            if ( bleDigIO.brakeLightOut != motorController->getBrakeLight() ) {
                bleDigIO.brakeLightOut = motorController->getBrakeLight();
                bleDigIO.doUpdate = 1;
            }

            if ( bleDigIO.reverseLightOut != motorController->getRevLight() ) {
                bleDigIO.reverseLightOut = motorController->getRevLight();
                bleDigIO.doUpdate = 1;
            }

            if ( bleDigIO.enableIn != motorController->getEnableIn() ) {
                bleDigIO.enableIn = motorController->getEnableIn();
                bleDigIO.doUpdate = 1;
            }
            if ( bleDigIO.reverseIn != motorController->getReverseIn() ) {
                bleDigIO.reverseIn = motorController->getReverseIn();
                bleDigIO.doUpdate = 1;
            }
        }
    } else if (tickCounter > 4) {
        if (motorController) {
            //Logger::console("Wifi tick counter 5...");
            if ( bleTemperatures.motorTemperature != motorController->getTemperatureMotor() ) {
                bleTemperatures.motorTemperature = motorController->getTemperatureMotor();
                bleTemperatures.doUpdate = 1;
            }
            if ( bleTemperatures.inverterTemperature != motorController->getTemperatureInverter() ) {
                bleTemperatures.inverterTemperature = motorController->getTemperatureInverter();
                bleTemperatures.doUpdate = 1;
            }
            if ( bleTemperatures.systemTemperature != motorController->getTemperatureSystem() ) {
                bleTemperatures.systemTemperature = motorController->getTemperatureSystem();
                bleTemperatures.doUpdate = 1;
            }

        }
        tickCounter = 0;
    }
    transferUpdates(); //send out any updates required
}
示例#3
0
static status_t
catAttr(const char *attribute, const char *fileName, bool keepRaw = false)
{
    int fd = open(fileName, O_RDONLY);
    if (fd < 0)
        return errno;

    attr_info info;
    if (fs_stat_attr(fd, attribute, &info) < 0)
        return errno;

    // limit size of the attribute, only the first 64k will make it on screen
    off_t size = info.size;
    bool cut = false;
    if (size > 64 * 1024) {
        size = 64 * 1024;
        cut = true;
    }

    char* buffer = (char*)malloc(size);
    if (!buffer) {
        fprintf(stderr, "Could not allocate read buffer!\n");
        return B_NO_MEMORY;
    }

    ssize_t bytesRead = fs_read_attr(fd, attribute, info.type, 0, buffer, size);
    if (bytesRead < 0) {
        free(buffer);
        return errno;
    }

    if (bytesRead != size) {
        fprintf(stderr, "Could only read %ld bytes from attribute!\n",
                bytesRead);
        free(buffer);
        return B_ERROR;
    }

    if (keepRaw) {
        off_t pos = 0;
        ssize_t written = 0;
        while (pos < info.size) {
            // write what we have read so far
            written = write(STDOUT_FILENO, buffer, bytesRead);
            // check for write error
            if (written < bytesRead) {
                if (written >= 0) {
                    fprintf(stderr, "Could only write %ld bytes to stream!\n",
                            written);
                    written = B_ERROR;
                } else {
                    fprintf(stderr, "Failed to write to stream: %s\n",
                            strerror(written));
                }
                break;
            }
            // read next chunk of data at pos
            pos += bytesRead;
            bytesRead = fs_read_attr(fd, attribute, info.type, pos, buffer,
                                     size);
            // check for read error
            if (bytesRead < size && pos + bytesRead < info.size) {
                if (bytesRead >= 0) {
                    fprintf(stderr, "Could only read %ld bytes from "
                            "attribute!\n", bytesRead);
                } else {
                    fprintf(stderr, "Failed to read from attribute: %s\n",
                            strerror(bytesRead));
                }
                written = B_ERROR;
                break;
            }
        }
        free(buffer);
        if (written > 0)
            written = B_OK;
        return written;
    }

    switch (info.type) {
    case B_INT8_TYPE:
        printf("%s : int8 : %d\n", fileName, *((int8 *)buffer));
        break;
    case B_UINT8_TYPE:
        printf("%s : uint8 : %u\n", fileName, *((uint8 *)buffer));
        break;
    case B_INT16_TYPE:
        printf("%s : int16 : %d\n", fileName, *((int16 *)buffer));
        break;
    case B_UINT16_TYPE:
        printf("%s : uint16 : %u\n", fileName, *((uint16 *)buffer));
        break;
    case B_INT32_TYPE:
        printf("%s : int32 : %ld\n", fileName, *((int32 *)buffer));
        break;
    case B_UINT32_TYPE:
        printf("%s : uint32 : %lu\n", fileName, *((uint32 *)buffer));
        break;
    case B_INT64_TYPE:
        printf("%s : int64 : %Ld\n", fileName, *((int64 *)buffer));
        break;
    case B_UINT64_TYPE:
        printf("%s : uint64 : %Lu\n", fileName, *((uint64 *)buffer));
        break;
    case B_FLOAT_TYPE:
        printf("%s : float : %f\n", fileName, *((float *)buffer));
        break;
    case B_DOUBLE_TYPE:
        printf("%s : double : %f\n", fileName, *((double *)buffer));
        break;
    case B_BOOL_TYPE:
        printf("%s : bool : %d\n", fileName, *((unsigned char *)buffer));
        break;
    case B_STRING_TYPE:
        printf("%s : string : %s\n", fileName, buffer);
        break;

    case B_MIME_STRING_TYPE:
    case 'MSIG':
    case 'MSDC':
    case 'MPTH':
        printf("%s : %s : %s\n", fileName, type_to_string(info.type),
               buffer);
        break;

    case B_MESSAGE_TYPE:
    {
        BMessage message;
        if (!cut && message.Unflatten(buffer) == B_OK) {
            printf("%s : message :\n", fileName);
            message.PrintToStream();
            break;
        }
        // supposed to fall through
    }

    default:
        // The rest of the attributes types are displayed as raw data
        printf("%s : %s : \n", fileName, type_to_string(info.type));
        dumpRawData(buffer, size);
        break;
    }

    free(buffer);
    return B_OK;
}
示例#4
0
void ADAFRUITBLE::transferUpdates()
{
    if (bleTrqReqAct.doUpdate != 0)
    {
        bleTrqReqAct.doUpdate = 0;
        if (!gatt.setChar(MeasureCharId[1], (uint8_t *)&bleTrqReqAct, sizeof(bleTrqReqAct) - 1))
        {
            Logger::error("Could not update bleTrqReqAct");
        }
        else Logger::debug(ADABLUE, "Updated bleTrqReqAct");
        dumpRawData((uint8_t *)&bleTrqReqAct, sizeof(bleTrqReqAct) - 1);
    }
    
    if (bleThrBrkLevels.doUpdate != 0)
    {
        bleThrBrkLevels.doUpdate = 0;
        if (!gatt.setChar(MeasureCharId[2], (uint8_t *)&bleThrBrkLevels, sizeof(bleThrBrkLevels) - 1))
        {
            Logger::error("Could not update bleThrBrkLevels");
        }

        else Logger::debug(ADABLUE, "Updated bleThrBrkLevels");
        dumpRawData((uint8_t *)&bleThrBrkLevels, sizeof(bleThrBrkLevels) - 1);
    }
    
    if (bleSpeeds.doUpdate != 0)
    {
        bleSpeeds.doUpdate = 0;
        if (!gatt.setChar(MeasureCharId[3], (uint8_t *)&bleSpeeds, sizeof(bleSpeeds) - 1))
        {
            Logger::error("Could not update bleSpeeds");
        }            
        else Logger::debug(ADABLUE, "Updated bleSpeeds");
        dumpRawData((uint8_t *)&bleSpeeds, sizeof(bleSpeeds) - 1);
    }
    
    if (bleModes.doUpdate != 0)
    {
        bleModes.doUpdate = 0;
        if (!gatt.setChar(MeasureCharId[4], (uint8_t *)&bleModes, sizeof(bleModes) - 1))
        {
            Logger::error("Could not update bleModes");
        }            
        else Logger::debug(ADABLUE, "Updated bleModes");
        dumpRawData((uint8_t *)&bleModes, sizeof(bleModes) - 1);
    }
    
    if (blePowerStatus.doUpdate != 0)
    {
        blePowerStatus.doUpdate = 0;
        if (!gatt.setChar(MeasureCharId[5], (uint8_t *)&blePowerStatus, sizeof(blePowerStatus) - 1))
        {
            Logger::error("Could not update blePowerStatus");
        }            
        else Logger::debug(ADABLUE, "Updated blePowerStatus");
        dumpRawData((uint8_t *)&blePowerStatus, sizeof(blePowerStatus) - 1);
    }
    
    if (bleBitFields.doUpdate != 0)
    {
        bleBitFields.doUpdate = 0;
        if (!gatt.setChar(MeasureCharId[6], (uint8_t *)&bleBitFields, sizeof(bleBitFields) - 1))
        {
            Logger::error("Could not update bleBitFields");
        }            
        else Logger::debug(ADABLUE, "Updated bleBitFields");
        dumpRawData((uint8_t *)&bleBitFields, sizeof(bleBitFields) - 1);
    }
    
    if (bleTemperatures.doUpdate != 0)
    {
        bleTemperatures.doUpdate = 0;
        if (!gatt.setChar(MeasureCharId[7], (uint8_t *)&bleTemperatures, sizeof(bleTemperatures) - 1))
        {
            Logger::error("Could not update bleTemperatures");
        }            
        else Logger::debug(ADABLUE, "Updated bleTemperatures");
        dumpRawData((uint8_t *)&bleTemperatures, sizeof(bleTemperatures) - 1);
    }
    
    if (bleDigIO.doUpdate != 0)
    {
        bleDigIO.doUpdate = 0;
        if (!gatt.setChar(MeasureCharId[8], (uint8_t *)&bleDigIO, sizeof(bleDigIO) - 1))
        {
            Logger::error("Could not update bleDigIO");
        }            
        else Logger::debug(ADABLUE, "Updated bleDigIO");
        dumpRawData((uint8_t *)&bleDigIO, sizeof(bleDigIO) - 1);
    }
        
    if (bleThrottleIO.doUpdate != 0)
    {
        bleThrottleIO.doUpdate = 0;
        if (!gatt.setChar(MeasureCharId[9], (uint8_t *)&bleThrottleIO, sizeof(bleThrottleIO) - 1))
        {
            Logger::error("Could not update bleThrottleIO");
        }            
        else Logger::debug(ADABLUE, "Updated bleThrottleIO");
        dumpRawData((uint8_t *)&bleThrottleIO, sizeof(bleThrottleIO) - 1);
    }
    
    if (bleThrottleMap.doUpdate != 0)
    {
        bleThrottleMap.doUpdate = 0;
        if (!gatt.setChar(MeasureCharId[10], (uint8_t *)&bleThrottleMap, sizeof(bleThrottleMap) - 1))
        {
            Logger::error("Could not update bleThrottleMap");
        }            
        else Logger::debug(ADABLUE, "Updated bleThrottleMap");
        dumpRawData((uint8_t *)&bleThrottleMap, sizeof(bleThrottleMap) - 1);
    }    

    if (bleBrakeParam.doUpdate != 0)
    {
        bleBrakeParam.doUpdate = 0;
        if (!gatt.setChar(MeasureCharId[11], (uint8_t *)&bleBrakeParam, sizeof(bleBrakeParam) - 1))
        {
            Logger::error("Could not update bleBrakeParam");
        }            
        else Logger::debug(ADABLUE, "Updated bleBrakeParam");
        dumpRawData((uint8_t *)&bleBrakeParam, sizeof(bleBrakeParam) - 1);
    }
    
    if (bleMaxParams.doUpdate != 0)
    {
        bleMaxParams.doUpdate = 0;
        if (!gatt.setChar(MeasureCharId[12], (uint8_t *)&bleMaxParams, sizeof(bleMaxParams) - 1))
        {
            Logger::error("Could not update bleMaxParams");
        }            
        else Logger::debug(ADABLUE, "Updated bleMaxParams");
        dumpRawData((uint8_t *)&bleMaxParams, sizeof(bleMaxParams) - 1);
    }    
}