diff --git a/bacnet-stack/arf.c b/bacnet-stack/arf.c index a23201bc..c87d15ed 100644 --- a/bacnet-stack/arf.c +++ b/bacnet-stack/arf.c @@ -207,11 +207,10 @@ int arf_ack_encode_apdu( if (apdu) { - apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST; - apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted()); - apdu[2] = invoke_id; - apdu[3] = SERVICE_CONFIRMED_ATOMIC_READ_FILE; // service choice - apdu_len = 4; + apdu[0] = PDU_TYPE_COMPLEX_ACK; + apdu[1] = invoke_id; + apdu[2] = SERVICE_CONFIRMED_ATOMIC_READ_FILE; // service choice + apdu_len = 3; // endOfFile apdu_len += encode_tagged_boolean(&apdu[apdu_len], data->endOfFile); switch (data->access) @@ -348,13 +347,12 @@ int arf_ack_decode_apdu( if (!apdu) return -1; // optional checking - most likely was already done prior to this call - if (apdu[0] != PDU_TYPE_CONFIRMED_SERVICE_REQUEST) + if (apdu[0] != PDU_TYPE_COMPLEX_ACK) return -1; - // apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted()); - *invoke_id = apdu[2]; /* invoke id - filled in by net layer */ - if (apdu[3] != SERVICE_CONFIRMED_ATOMIC_READ_FILE) + *invoke_id = apdu[1]; /* invoke id - filled in by net layer */ + if (apdu[2] != SERVICE_CONFIRMED_ATOMIC_READ_FILE) return -1; - offset = 4; + offset = 3; if (apdu_len > offset) { diff --git a/bacnet-stack/awf.c b/bacnet-stack/awf.c index 23414ed4..0246d693 100644 --- a/bacnet-stack/awf.c +++ b/bacnet-stack/awf.c @@ -221,11 +221,10 @@ int awf_ack_encode_apdu( if (apdu) { - apdu[0] = PDU_TYPE_CONFIRMED_SERVICE_REQUEST; - apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted()); - apdu[2] = invoke_id; - apdu[3] = SERVICE_CONFIRMED_ATOMIC_WRITE_FILE; // service choice - apdu_len = 4; + apdu[0] = PDU_TYPE_COMPLEX_ACK; + apdu[1] = invoke_id; + apdu[2] = SERVICE_CONFIRMED_ATOMIC_WRITE_FILE; // service choice + apdu_len = 3; switch (data->access) { case FILE_STREAM_ACCESS: @@ -291,13 +290,12 @@ int awf_ack_decode_apdu( if (!apdu) return -1; // optional checking - most likely was already done prior to this call - if (apdu[0] != PDU_TYPE_CONFIRMED_SERVICE_REQUEST) + if (apdu[0] != PDU_TYPE_COMPLEX_ACK) return -1; - // apdu[1] = encode_max_segs_max_apdu(0, Device_Max_APDU_Length_Accepted()); - *invoke_id = apdu[2]; /* invoke id - filled in by net layer */ - if (apdu[3] != SERVICE_CONFIRMED_ATOMIC_WRITE_FILE) + *invoke_id = apdu[1]; /* invoke id - filled in by net layer */ + if (apdu[2] != SERVICE_CONFIRMED_ATOMIC_WRITE_FILE) return -1; - offset = 4; + offset = 3; if (apdu_len > offset) { diff --git a/bacnet-stack/bacfile.c b/bacnet-stack/bacfile.c index a3b77612..062fe413 100644 --- a/bacnet-stack/bacfile.c +++ b/bacnet-stack/bacfile.c @@ -304,6 +304,7 @@ bool bacfile_read_data(BACNET_ATOMIC_READ_FILE_DATA *data) pFilename = bacfile_name(data->object_instance); if (pFilename) { + found = true; pFile = fopen(pFilename,"rb"); if (pFile) { @@ -315,10 +316,16 @@ bool bacfile_read_data(BACNET_ATOMIC_READ_FILE_DATA *data) fclose(pFile); } else + { data->fileDataLength = 0; + data->endOfFile = true; + } } else + { data->fileDataLength = 0; + data->endOfFile = true; + } return found; } diff --git a/bacnet-stack/handlers.c b/bacnet-stack/handlers.c index 21136dc6..f4e554bb 100644 --- a/bacnet-stack/handlers.c +++ b/bacnet-stack/handlers.c @@ -685,7 +685,9 @@ void AtomicReadFileHandler( &Tx_Buf[pdu_len], service_data->invoke_id, ABORT_REASON_SEGMENTATION_NOT_SUPPORTED); - fprintf(stderr,"Sending Abort!\n"); + fprintf(stderr,"Sending Abort! %u octets requested. Only able to send %u octets.\n", + data.type.stream.requestedOctetCount, + data.fileDataLength); send = true; } }