short orientation; short flash_mode; short flash_fired; short metering_mode; }; #define BE(v) ((v&0x000000FF)<<24)|((v&0x0000FF00)<<8)|((v&0x00FF0000)>>8)|((v&0xFF000000)>>24) // Convert to big_endian #define BADPIX_CFA_INDEX 6 // Index of CFAPattern value in badpixel_opcodes array static unsigned int badpixel_opcode[] = { // *** all values must be in big endian order BE(1), // Count = 1 BE(4), // FixBadPixelsConstant = 4 BE(0x01030000), // DNG version = 1.3.0.0 BE(1), // Flags = 1 BE(8), // Opcode length = 8 bytes BE(0), // Constant = 0 BE(0), // CFAPattern (set in code below) }; static struct t_data_for_exif exif_data; #define BE(v) ((v&0x000000FF)<<24)|((v&0x0000FF00)<<8)|((v&0x00FF0000)>>8)|((v&0xFF000000)>>24) // Convert to big_endian // warning: according to TIFF format specification, elements must be sorted by tag value in ascending order!
int main (void) { if (!USPiEnvInitialize ()) { return EXIT_HALT; } if (!USPiInitialize ()) { LogWrite (FromSample, LOG_ERROR, "Cannot initialize USPi"); USPiEnvClose (); return EXIT_HALT; } if (!USPiEthernetAvailable ()) { LogWrite (FromSample, LOG_ERROR, "Ethernet device not found"); USPiEnvClose (); return EXIT_HALT; } u8 OwnMACAddress[MAC_ADDRESS_SIZE]; USPiGetMACAddress (OwnMACAddress); while (1) { u8 Buffer[USPI_FRAME_BUFFER_SIZE]; unsigned nFrameLength; if (!USPiReceiveFrame (Buffer, &nFrameLength)) { continue; } LogWrite (FromSample, LOG_NOTICE, "Frame received (length %u)", nFrameLength); if (nFrameLength < sizeof (TARPFrame)) { continue; } TARPFrame *pARPFrame = (TARPFrame *) Buffer; if ( pARPFrame->Ethernet.nProtocolType != BE (ETH_PROT_ARP) || pARPFrame->ARP.nHWAddressSpace != BE (HW_ADDR_ETHER) || pARPFrame->ARP.nProtocolAddressSpace != BE (PROT_ADDR_IP) || pARPFrame->ARP.nHWAddressLength != MAC_ADDRESS_SIZE || pARPFrame->ARP.nProtocolAddressLength != IP_ADDRESS_SIZE || pARPFrame->ARP.nOPCode != BE (ARP_REQUEST)) { continue; } LogWrite (FromSample, LOG_NOTICE, "Valid ARP request from %u.%u.%u.%u received", (unsigned) pARPFrame->ARP.ProtocolAddressSender[0], (unsigned) pARPFrame->ARP.ProtocolAddressSender[1], (unsigned) pARPFrame->ARP.ProtocolAddressSender[2], (unsigned) pARPFrame->ARP.ProtocolAddressSender[3]); if (memcmp (pARPFrame->ARP.ProtocolAddressTarget, OwnIPAddress, IP_ADDRESS_SIZE) != 0) { continue; } LogWrite (FromSample, LOG_NOTICE, "ARP request is to us"); // prepare reply packet memcpy (pARPFrame->Ethernet.MACReceiver, pARPFrame->ARP.HWAddressSender, MAC_ADDRESS_SIZE); memcpy (pARPFrame->Ethernet.MACSender, OwnMACAddress, MAC_ADDRESS_SIZE); pARPFrame->ARP.nOPCode = BE (ARP_REPLY); memcpy (pARPFrame->ARP.HWAddressTarget, pARPFrame->ARP.HWAddressSender, MAC_ADDRESS_SIZE); memcpy (pARPFrame->ARP.ProtocolAddressTarget, pARPFrame->ARP.ProtocolAddressSender, IP_ADDRESS_SIZE); memcpy (pARPFrame->ARP.HWAddressSender, OwnMACAddress, MAC_ADDRESS_SIZE); memcpy (pARPFrame->ARP.ProtocolAddressSender, OwnIPAddress, IP_ADDRESS_SIZE); if (!USPiSendFrame (pARPFrame, sizeof *pARPFrame)) { LogWrite (FromSample, LOG_ERROR, "USPiSendFrame failed"); break; } LogWrite (FromSample, LOG_NOTICE, "ARP reply successfully sent"); } USPiEnvClose (); return EXIT_HALT; }