diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/main.c b/main.c index f26b97c..acfd7a4 100644 --- a/main.c +++ b/main.c @@ -1,6 +1,124 @@ #include +#include + +/* + * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | + * 11111111111111112222222233333333333333334444444444444455555555555555666677777777 + */ + +#pragma pack(1) +typedef struct DataStruct { + uint16_t senderID; + uint8_t packetType; + int16_t altitude; + uint32_t latLonFlags; + uint8_t ext; +} dataStruct_t; + +typedef struct Packet { + uint32_t senderID; + uint32_t packetType; + int32_t altitude; + int32_t longitude; + int32_t latitude; + uint8_t flags; + uint8_t ext; +} packet_t; + +void marshal(packet_t *p, uint8_t *data) { + ((dataStruct_t *) data)->senderID = p->senderID; + ((dataStruct_t *) data)->packetType = p->packetType; + ((dataStruct_t *) data)->altitude = p->altitude; + { // Latitude longitude and flags + uint32_t latLonFlags; + int32_t latitude = p->latitude; + int32_t longitude = p->longitude; + uint32_t flags = p->flags; + // Saturation + if (latitude < -8192) latitude = -8192; + if (latitude > 8191) latitude = 8191; + if (longitude < -8192) longitude = -8192; + if (longitude > 8191) longitude = 8191; + if (flags > 15) flags = 15; + latitude += 8192; + longitude += 8192; + + latLonFlags = (latitude << 18) | (longitude << 4) | flags; + + ((dataStruct_t *) data)->latLonFlags = latLonFlags; + } + ((dataStruct_t *) data)->ext = p->ext; +} + +void unmarshal(uint8_t *data, packet_t *p) { + p->senderID = ((dataStruct_t *) data)->senderID; + p->packetType = ((dataStruct_t *) data)->packetType; + p->altitude = ((dataStruct_t *) data)->altitude; + p->ext = ((dataStruct_t *) data)->ext; + + uint32_t latLonFlags = ((dataStruct_t *) data)->latLonFlags; + + p->latitude = (int32_t) ((latLonFlags & 0b11111111111111000000000000000000) >> 18) - 8192; + p->longitude = (int32_t) ((latLonFlags & 0b00000000000000111111111111110000) >> 4) - 8192; + p->flags = (uint8_t) (latLonFlags & 0b00000000000000000000000000001111); +} int main() { - printf("Hello, World!\n"); + packet_t packetSrc; + packet_t packetDst; + uint8_t data[10]; + + // Inserisco dati in packetSrc + packetSrc.senderID = 1; + packetSrc.packetType = 2; + packetSrc.altitude = 3; + packetSrc.longitude = 4; + packetSrc.latitude = 5; + packetSrc.flags = 6; + packetSrc.ext = 7; + + // Marshalling e Unmarshalling + marshal(&packetSrc, data); + unmarshal(data, &packetDst); + + + // Confronto packetSrc con packetDst + int errors = 0; + + if (packetSrc.senderID != packetDst.senderID) { + errors++; + printf("Sender ID: %i != %i\n", packetSrc.senderID, packetDst.senderID); + } + if (packetSrc.packetType != packetDst.packetType) { + errors++; + printf("Packet Type: %i != %i\n", packetSrc.packetType, packetDst.packetType); + } + if (packetSrc.altitude != packetDst.altitude) { + errors++; + printf("Packet Type: %i != %i\n", packetSrc.altitude, packetDst.altitude); + } + if (packetSrc.longitude != packetDst.longitude) { + errors++; + printf("Longitude: %i != %i\n", packetSrc.longitude, packetDst.longitude); + } + if (packetSrc.latitude != packetDst.latitude) { + errors++; + printf("Latitude: %i != %i\n", packetSrc.latitude, packetDst.latitude); + } + if (packetSrc.flags != packetDst.flags) { + errors++; + printf("Flags: %i != %i\n", packetSrc.flags, packetDst.flags); + } + if (packetSrc.ext != packetDst.ext) { + errors++; + printf("Ext: %i != %i\n", packetSrc.ext, packetDst.ext); + } + + if (errors == 0) { + printf("\nMarshalling e Unmarshalling avvenuto correttamente.\n"); + } else { + printf("\nCi sono stati problemi durante il Marshalling o Unmarshalling.\n"); + } + return 0; }