diff options
| author | Dean <Dean@d5102386-fcda-11dd-9fdb-3debd5008f28> | 2010-06-22 07:55:02 +0000 |
|---|---|---|
| committer | Dean <Dean@d5102386-fcda-11dd-9fdb-3debd5008f28> | 2010-06-22 07:55:02 +0000 |
| commit | 015d0176d00ab2560c74e5f4283b63365abd525b (patch) | |
| tree | f528ee0e799a0ea9f2d4cfcf183cda12a2609f82 /Demos/Host/Incomplete/BluetoothHost | |
| parent | 9a6a5d0e5d6684780109b04dc5c708c63e4ad609 (diff) | |
Use a bitmask instead of an array of bools in the SDP UUID List matching algorithm to reduce the compiled code size and stack used.
git-svn-id: http://lufa-lib.googlecode.com/svn/trunk@1347 d5102386-fcda-11dd-9fdb-3debd5008f28
Diffstat (limited to 'Demos/Host/Incomplete/BluetoothHost')
| -rw-r--r-- | Demos/Host/Incomplete/BluetoothHost/Lib/SDP.c | 33 | ||||
| -rw-r--r-- | Demos/Host/Incomplete/BluetoothHost/Lib/SDP.h | 2 |
2 files changed, 17 insertions, 18 deletions
diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/SDP.c b/Demos/Host/Incomplete/BluetoothHost/Lib/SDP.c index 0daf8e24..d0122515 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/SDP.c +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/SDP.c @@ -458,27 +458,20 @@ static void* SDP_GetAttributeValue(const ServiceAttributeTable_t* AttributeTable static bool SDP_SearchServiceTable(uint8_t UUIDList[][UUID_SIZE_BYTES], const uint8_t TotalUUIDs, const ServiceAttributeTable_t* CurrAttributeTable) { - bool UUIDMatch[TotalUUIDs]; - - /* Set all the match flags to false (not matched) before starting the search */ - memset(UUIDMatch, false, sizeof(UUIDMatch)); - const void* CurrAttribute; + uint16_t UUIDMatchFlags = 0; /* Search through the current attribute table, checking each attribute value for UUID matches */ while ((CurrAttribute = pgm_read_ptr(&CurrAttributeTable->Data)) != NULL) { - SDP_CheckUUIDMatch(UUIDList, TotalUUIDs, UUIDMatch, CurrAttribute); + SDP_CheckUUIDMatch(UUIDList, TotalUUIDs, &UUIDMatchFlags, CurrAttribute); CurrAttributeTable++; } /* Determine how many UUID matches in the list we have found */ - uint8_t UUIDMatches = 0; - for (uint8_t i = 0; i < TotalUUIDs; i++) - { - if (UUIDMatch[i]) - UUIDMatches++; - } + uint8_t UUIDMatches; + for (UUIDMatches = 0; UUIDMatchFlags; UUIDMatches++) + UUIDMatchFlags &= (UUIDMatchFlags - 1); /* If all UUIDs have been matched to the current service, return true */ return (UUIDMatches == TotalUUIDs); @@ -494,7 +487,7 @@ static bool SDP_SearchServiceTable(uint8_t UUIDList[][UUID_SIZE_BYTES], const ui * * \return True if all the UUIDs given in the UUID list appear in the given attribute table, false otherwise */ -static void SDP_CheckUUIDMatch(uint8_t UUIDList[][UUID_SIZE_BYTES], const uint8_t TotalUUIDs, bool UUIDMatch[], +static void SDP_CheckUUIDMatch(uint8_t UUIDList[][UUID_SIZE_BYTES], const uint8_t TotalUUIDs, uint16_t* UUIDMatchFlags, const void* CurrAttribute) { uint8_t CurrAttributeType = (pgm_read_byte(CurrAttribute) & ~0x07); @@ -502,16 +495,20 @@ static void SDP_CheckUUIDMatch(uint8_t UUIDList[][UUID_SIZE_BYTES], const uint8_ /* Check the data type of the current attribute value - if UUID, compare, if Sequence, unwrap and recurse */ if (CurrAttributeType == SDP_DATATYPE_UUID) { + uint16_t CurrUUIDMatchMask = (1 << 0); + /* Look for matches in the UUID list against the current attribute UUID value */ for (uint8_t i = 0; i < TotalUUIDs; i++) { /* Check if the current unmatched UUID is identical to the search UUID */ - if (!(UUIDMatch[i]) && !(memcmp_P(UUIDList[i], (CurrAttribute + 1), UUID_SIZE_BYTES))) + if (!(*UUIDMatchFlags & CurrUUIDMatchMask) && !(memcmp_P(UUIDList[i], (CurrAttribute + 1), UUID_SIZE_BYTES))) { /* Indicate match found for the current attribute UUID and early-abort */ - UUIDMatch[i] = true; + *UUIDMatchFlags |= CurrUUIDMatchMask; break; } + + CurrUUIDMatchMask <<= 1; } } else if (CurrAttributeType == SDP_DATATYPE_Sequence) @@ -527,8 +524,10 @@ static void SDP_CheckUUIDMatch(uint8_t UUIDList[][UUID_SIZE_BYTES], const uint8_ uint8_t InnerHeaderSize; uint16_t InnerSize = SDP_GetLocalAttributeContainerSize(CurrAttribute, &InnerHeaderSize); - SDP_CheckUUIDMatch(UUIDList, TotalUUIDs, UUIDMatch, CurrAttribute); - + /* Recursively search of the next element in the sequence, trying to match UUIDs with the UUID list */ + SDP_CheckUUIDMatch(UUIDList, TotalUUIDs, UUIDMatchFlags, CurrAttribute); + + /* Skip to the next element in the sequence */ SequenceSize -= InnerHeaderSize + InnerSize; CurrAttribute += InnerHeaderSize + InnerSize; } diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/SDP.h b/Demos/Host/Incomplete/BluetoothHost/Lib/SDP.h index c5247752..e7d02b0a 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/SDP.h +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/SDP.h @@ -218,7 +218,7 @@ static bool SDP_SearchServiceTable(uint8_t UUIDList[][UUID_SIZE_BYTES], const uint8_t TotalUUIDs, const ServiceAttributeTable_t* CurrAttributeTable); - static void SDP_CheckUUIDMatch(uint8_t UUIDList[][UUID_SIZE_BYTES], const uint8_t TotalUUIDs, bool UUIDMatch[], + static void SDP_CheckUUIDMatch(uint8_t UUIDList[][UUID_SIZE_BYTES], const uint8_t TotalUUIDs, uint16_t* UUIDMatchFlags, const void* CurrAttribute); static uint8_t SDP_GetAttributeList(uint16_t AttributeList[][2], const void** const CurrentParameter); |
