/**
 * read callback on data characteristic.
 * reads all the pins marked as inputs, and updates the data stored in the BLE stack.
 */
void MicroBitIOPinService::onDataRead(GattReadAuthCallbackParams *params)
{
    if (params->handle == ioPinServiceDataCharacteristic->getValueHandle())
    {

        // Scan through all pins that our BLE client may be listening for. If any have changed value, update the BLE characterisitc, and NOTIFY our client.
        int pairs = 0;

        for (int i=0; i < MICROBIT_IO_PIN_SERVICE_PINCOUNT; i++)
        {
            if (isInput(i))
            {
                uint8_t value;

                if (isDigital(i))
                    value = MicroBitIOPins[i]->getDigitalValue();
                else
                    value = MicroBitIOPins[i]->getAnalogValue();

                ioPinServiceIOData[i] = value;
                ioPinServiceDataCharacteristicBuffer[pairs].pin = i;
                ioPinServiceDataCharacteristicBuffer[pairs].value = value;

                pairs++;

                if (pairs >= MICROBIT_IO_PIN_SERVICE_DATA_SIZE)
                    break;
            }
        }

        // If there's any data, issue a BLE notification.
        if (pairs > 0)
            ble.gattServer().notify(ioPinServiceDataCharacteristic->getValueHandle(), (uint8_t *)ioPinServiceDataCharacteristicBuffer, pairs * sizeof(IOData));
    }
}
Beispiel #2
0
symbol_t readNumLit(int sign){
    char *s;
    int i = 0;
		//float j = 0;
	s = ccstring();
	if(ch=='0'){
		i = 0;
		if(sign) s = ccstrcat(s, '-');
		s = ccstrcat(s, '0');
		nextchar();
	}else{
		while(isDigital()){
			i = i*10 + (ch-'0');
			s = ccstrcat(s, ch);
			nextchar();
		}
	}
	if(ch=='.'){
		nextchar();
		s = ccstrcat(s, '.');
		if(isDigital()){
			while(isDigital()){
				//j = (j + (float)(ch-'0')) / (float)10.0;
				s = ccstrcat(s, ch);
				nextchar();
			}
			//return Symbol(REAL, (int)((float)i + j));
			return Symbol(REAL, (int)s);
		}else{
               msg(ERR, "a wrong real literal",lineno+1);
		}
	}else{
	    mfree(s);
	    if(sign) i = -i;
		return Symbol(INTEGER, i);
	}
	return 0;
}
Beispiel #3
0
void DigitalTube::invoke(long command){
  
    if(isDigital(command)){
      setTime(getDigital(command));
      return;
    }
    if(command==KEY_BACK){
      leftMove();
      return;
    }
    if(command==KEY_FORWARD){
      rightMove();
      return;
    }
    if(command==KEY_PLAY){
      startTimer();
      return;
    }
}
/**
 * Periodic callback from MicroBit scheduler.
 *
 * Check if any of the pins we're watching need updating. Notify any connected
 * device with any changes.
 */
void MicroBitIOPinService::idleTick()
{
    // If we're not we're connected, then there's nothing to do...
    if (!ble.getGapState().connected)
        return;

    // Scan through all pins that our BLE client may be listening for. If any have changed value, update the BLE characterisitc, and NOTIFY our client.
    int pairs = 0;

    for (int i=0; i < MICROBIT_IO_PIN_SERVICE_PINCOUNT; i++)
    {
        if (isInput(i))
        {
            uint8_t value;

            if (isDigital(i))
               	value = io.pin[i].getDigitalValue();
                //value = MicroBitIOPins[i]->getDigitalValue();
            else
               	value = io.pin[i].getAnalogValue();
                //value = MicroBitIOPins[i]->getAnalogValue();

            // If the data has changed, send an update.
            if (value != ioPinServiceIOData[i])
            {
                ioPinServiceIOData[i] = value;

                ioPinServiceDataCharacteristicBuffer[pairs].pin = i;
                ioPinServiceDataCharacteristicBuffer[pairs].value = value;

                pairs++;

                if (pairs >= MICROBIT_IO_PIN_SERVICE_DATA_SIZE)
                    break;
            }
        }
    }

    // If there were any changes, issue a BLE notification.
    if (pairs > 0)
        ble.gattServer().notify(ioPinServiceDataCharacteristic->getValueHandle(), (uint8_t *)ioPinServiceDataCharacteristicBuffer, pairs * sizeof(IOData));
}
/**
  * Callback. Invoked when any of our attributes are written via BLE.
  */
void MicroBitIOPinService::onDataWritten(const GattWriteCallbackParams *params)
{
    // Check for writes to the IO configuration characteristic
    if (params->handle == ioPinServiceIOCharacteristicHandle && params->len >= sizeof(ioPinServiceIOCharacteristicBuffer))
    {
        uint32_t *value = (uint32_t *)params->data;

        // Our IO configuration may be changing... read the new value, and push it back into the BLE stack.
        ioPinServiceIOCharacteristicBuffer = *value;
        ble.gattServer().write(ioPinServiceIOCharacteristicHandle, (const uint8_t *)&ioPinServiceIOCharacteristicBuffer, sizeof(ioPinServiceIOCharacteristicBuffer));

        // Also, drop any selected pins into input mode, so we can pick up changes later
        for (int i=0; i < MICROBIT_IO_PIN_SERVICE_PINCOUNT; i++)
        {
            if(isDigital(i) && isInput(i))
               io.pin[i].getDigitalValue();
               //MicroBitIOPins[i]->getDigitalValue();

            if(isAnalog(i) && isInput(i))
               io.pin[i].getAnalogValue();
               //MicroBitIOPins[i]->getAnalogValue();
        }
    }

    // Check for writes to the IO configuration characteristic
    if (params->handle == ioPinServiceADCharacteristicHandle && params->len >= sizeof(ioPinServiceADCharacteristicBuffer))
    {
        uint32_t *value = (uint32_t *)params->data;

        // Our IO configuration may be changing... read the new value, and push it back into the BLE stack.
        ioPinServiceADCharacteristicBuffer = *value;
        ble.gattServer().write(ioPinServiceADCharacteristicHandle, (const uint8_t *)&ioPinServiceADCharacteristicBuffer, sizeof(ioPinServiceADCharacteristicBuffer));

        // Also, drop any selected pins into input mode, so we can pick up changes later
        for (int i=0; i < MICROBIT_IO_PIN_SERVICE_PINCOUNT; i++)
        {
            if(isDigital(i) && isInput(i))
               io.pin[i].getDigitalValue();
               //MicroBitIOPins[i]->getDigitalValue();

            if(isAnalog(i) && isInput(i))
               io.pin[i].getAnalogValue();
               //MicroBitIOPins[i]->getAnalogValue();
        }
    }

    if (params->handle == ioPinServiceDataCharacteristic->getValueHandle())
    {
        // We have some pin data to change...
        uint16_t len = params->len;
        IOData *data = (IOData *)params->data;

        // There may be multiple write operaitons... take each in turn and update the pin values
        while (len >= sizeof(IOData))
        {
            if (isOutput(data->pin))
            {
                if (isDigital(data->pin))
               		io.pin[data->pin].setDigitalValue(data->value);
                    //MicroBitIOPins[data->pin]->setDigitalValue(data->value);
                else
               		io.pin[data->pin].setAnalogValue(data->value*4);
                    //MicroBitIOPins[data->pin]->setAnalogValue(data->value*4);
            }

            data++;
            len -= sizeof(IOData);
        }
    }
}
Beispiel #6
0
symbol_t readSym(){
    char *s, tch;
    symtype_t i;

	while(isBlank())nextchar();
	if(isAlpha()){
		s = ccstring();
		s = ccstrcat(s,ch);

		nextchar();
		while(isAlpha() || isDigital()){
			s = ccstrcat(s,ch);
			nextchar();
		}
		for(i = CONST; i<=RETURN; i ++)
			if(ccstrcmp(s,keywords[i-1])==0){
				return Symbol(i, 0);
			}
		return Symbol(ID, (int)s);

	}else if(isDigital()){
        return readNumLit(0);
	}else if(ch=='\''){
		nextchar();
		if(isAlpha() || isDigital() || ch=='+' || ch=='-' || ch=='*' || ch=='/'){
			tch = ch;
			nextchar();
			if(ch=='\''){
				nextchar();
				return Symbol(CHARLIT, (int)tch);
			}
		}
		msg(ERR, "a wrong char literal",lineno+1);
	}else if(ch=='\"'){
		nextchar();
		s = ccstring();
		while(ch!='\"' && ch!=EOF){
			s = ccstrcat(s, ch);
			nextchar();
		}
		if(ch!=EOF){
			nextchar();
			return Symbol(STRLIT, (int)s);
		}
		msg(ERR, "a wrong string literal",lineno+1);

	}else if(ch=='+'){
		nextchar();
		//if(isDigital())
        //    return readNumLit(0);
        //else
            return Symbol(PLUS, 0);
	}else if(ch=='-'){
		nextchar();
		//if(isDigital())
        //    return readNumLit(1);
        //else
            return Symbol(MINUS, 0);
	}else if(ch=='*'){
		nextchar();
		return Symbol(MULTI, 0);
	}else if(ch=='/'){
		nextchar();
		return Symbol(DIVIDE, 0);
	}else if(ch=='<'){
		nextchar();
		if(ch=='='){
			nextchar();
			return Symbol(LEQU, 0);
		}else
			return Symbol(LESS, 0);
	}else if(ch=='>'){
		nextchar();
		if(ch=='='){
			nextchar();
			return Symbol(GEQU, 0);
		}else
			return Symbol(GREATER, 0);
	}else if(ch=='!'){
		nextchar();
		if(ch=='='){
			nextchar();
			return Symbol(UNEQU, 0);
		}
		msg(ERR, "unexpected char \'!\'",lineno+1);
	}else if(ch=='='){
		nextchar();
		if(ch=='='){
			nextchar();
			return Symbol(EQU, 0);
		}else
			return Symbol(ASN, 0);
	}else if(ch=='('){
		nextchar();
		return Symbol(LPAREN, 0);
	}else if(ch==')'){
		nextchar();
		return Symbol(RPAREN, 0);
	}else if(ch=='{'){
		nextchar();
		return Symbol(LBRACE, 0);
	}else if(ch=='}'){
		nextchar();
		return Symbol(RBRACE, 0);
	}else if(ch==';'){
		nextchar();
		return Symbol(SEMIC, 0);
	}else if(ch==':'){
		nextchar();
		return Symbol(COLON, 0);
	}else if(ch==','){
		nextchar();
		return Symbol(COMMA, 0);
	}else if(ch==EOF){
		return Symbol(SEOF, 0);
	}

	msg(ERR, "unknown lexer error",lineno+1);
	return 0;
}