/** * 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)); } }
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; }
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); } } }
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; }