Added a way for TSM to indicated a transaction that failed to confirm, and added that into the confirmed handling demos.
This commit is contained in:
@@ -259,12 +259,19 @@ int main(int argc, char *argv[])
|
|||||||
Communication_Password);
|
Communication_Password);
|
||||||
} else if (tsm_invoke_id_free(invoke_id))
|
} else if (tsm_invoke_id_free(invoke_id))
|
||||||
break;
|
break;
|
||||||
|
else if (tsm_invoke_id_failed(invoke_id))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "\rError: TSM Timeout!\r\n");
|
||||||
|
tsm_free_invoke_id(invoke_id);
|
||||||
|
/* try again or abort? */
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* increment timer - exit if timed out */
|
/* increment timer - exit if timed out */
|
||||||
elapsed_seconds += (current_seconds - last_seconds);
|
elapsed_seconds += (current_seconds - last_seconds);
|
||||||
if (elapsed_seconds > timeout_seconds)
|
if (elapsed_seconds > timeout_seconds)
|
||||||
{
|
{
|
||||||
printf("\rError: APDU Timeout!");
|
printf("\rError: APDU Timeout!\r\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,7 +121,13 @@ int Analog_Input_Encode_Property_APDU(uint8_t * apdu,
|
|||||||
case PROP_UNITS:
|
case PROP_UNITS:
|
||||||
apdu_len = encode_tagged_enumerated(&apdu[0], UNITS_PERCENT);
|
apdu_len = encode_tagged_enumerated(&apdu[0], UNITS_PERCENT);
|
||||||
break;
|
break;
|
||||||
/* test case for signed encoding and decoding negative value correctly */
|
case 9997:
|
||||||
|
apdu_len = encode_tagged_real(&apdu[0], 90.510);
|
||||||
|
break;
|
||||||
|
case 9998:
|
||||||
|
apdu_len = encode_tagged_unsigned(&apdu[0], 90);
|
||||||
|
break;
|
||||||
|
/* test case for signed encoding-decoding negative value correctly */
|
||||||
case 9999:
|
case 9999:
|
||||||
apdu_len = encode_tagged_signed(&apdu[0], -200);
|
apdu_len = encode_tagged_signed(&apdu[0], -200);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -286,12 +286,19 @@ int main(int argc, char *argv[])
|
|||||||
requestedOctetCount);
|
requestedOctetCount);
|
||||||
Current_Invoke_ID = invoke_id;
|
Current_Invoke_ID = invoke_id;
|
||||||
}
|
}
|
||||||
|
else if (tsm_invoke_id_failed(invoke_id))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "\rError: TSM Timeout!\r\n");
|
||||||
|
tsm_free_invoke_id(invoke_id);
|
||||||
|
/* try again or abort? */
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* increment timer - exit if timed out */
|
/* increment timer - exit if timed out */
|
||||||
elapsed_seconds += (current_seconds - last_seconds);
|
elapsed_seconds += (current_seconds - last_seconds);
|
||||||
if (elapsed_seconds > timeout_seconds)
|
if (elapsed_seconds > timeout_seconds)
|
||||||
{
|
{
|
||||||
printf("\rError: APDU Timeout!");
|
fprintf(stderr, "\rError: APDU Timeout!\r\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -226,12 +226,19 @@ int main(int argc, char *argv[])
|
|||||||
Target_Object_Index);
|
Target_Object_Index);
|
||||||
} else if (tsm_invoke_id_free(invoke_id))
|
} else if (tsm_invoke_id_free(invoke_id))
|
||||||
break;
|
break;
|
||||||
|
else if (tsm_invoke_id_failed(invoke_id))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "\rError: TSM Timeout!\r\n");
|
||||||
|
tsm_free_invoke_id(invoke_id);
|
||||||
|
/* try again or abort? */
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* increment timer - exit if timed out */
|
/* increment timer - exit if timed out */
|
||||||
elapsed_seconds += (current_seconds - last_seconds);
|
elapsed_seconds += (current_seconds - last_seconds);
|
||||||
if (elapsed_seconds > timeout_seconds)
|
if (elapsed_seconds > timeout_seconds)
|
||||||
{
|
{
|
||||||
printf("\rError: APDU Timeout!");
|
printf("\rError: APDU Timeout!\r\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -245,11 +245,21 @@ int main(int argc, char *argv[])
|
|||||||
Reinitialize_Password);
|
Reinitialize_Password);
|
||||||
} else if (tsm_invoke_id_free(invoke_id))
|
} else if (tsm_invoke_id_free(invoke_id))
|
||||||
break;
|
break;
|
||||||
|
else if (tsm_invoke_id_failed(invoke_id))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "\rError: TSM Timeout!\r\n");
|
||||||
|
tsm_free_invoke_id(invoke_id);
|
||||||
|
/* try again or abort? */
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* increment timer - exit if timed out */
|
/* increment timer - exit if timed out */
|
||||||
elapsed_seconds += (current_seconds - last_seconds);
|
elapsed_seconds += (current_seconds - last_seconds);
|
||||||
if (elapsed_seconds > timeout_seconds)
|
if (elapsed_seconds > timeout_seconds)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "\rError: APDU Timeout!\r\n");
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* keep track of time for next check */
|
/* keep track of time for next check */
|
||||||
last_seconds = current_seconds;
|
last_seconds = current_seconds;
|
||||||
|
|||||||
@@ -264,12 +264,19 @@ int main(int argc, char *argv[])
|
|||||||
&fileData);
|
&fileData);
|
||||||
Current_Invoke_ID = invoke_id;
|
Current_Invoke_ID = invoke_id;
|
||||||
}
|
}
|
||||||
|
else if (tsm_invoke_id_failed(invoke_id))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "\rError: TSM Timeout!\r\n");
|
||||||
|
tsm_free_invoke_id(invoke_id);
|
||||||
|
/* try again or abort? */
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* increment timer - exit if timed out */
|
/* increment timer - exit if timed out */
|
||||||
elapsed_seconds += (current_seconds - last_seconds);
|
elapsed_seconds += (current_seconds - last_seconds);
|
||||||
if (elapsed_seconds > timeout_seconds)
|
if (elapsed_seconds > timeout_seconds)
|
||||||
{
|
{
|
||||||
printf("\rError: APDU Timeout!");
|
fprintf(stderr, "\rError: APDU Timeout!\r\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -323,12 +323,19 @@ int main(int argc, char *argv[])
|
|||||||
Target_Object_Property_Index);
|
Target_Object_Property_Index);
|
||||||
} else if (tsm_invoke_id_free(invoke_id))
|
} else if (tsm_invoke_id_free(invoke_id))
|
||||||
break;
|
break;
|
||||||
|
else if (tsm_invoke_id_failed(invoke_id))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "\rError: TSM Timeout!\r\n");
|
||||||
|
tsm_free_invoke_id(invoke_id);
|
||||||
|
/* try again or abort? */
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* increment timer - exit if timed out */
|
/* increment timer - exit if timed out */
|
||||||
elapsed_seconds += (current_seconds - last_seconds);
|
elapsed_seconds += (current_seconds - last_seconds);
|
||||||
if (elapsed_seconds > timeout_seconds)
|
if (elapsed_seconds > timeout_seconds)
|
||||||
{
|
{
|
||||||
printf("\rError: APDU Timeout!");
|
printf("\rError: APDU Timeout!\r\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+22
-1
@@ -237,7 +237,9 @@ void tsm_timer_milliseconds(uint16_t milliseconds)
|
|||||||
&TSM_List[i].npdu_data,
|
&TSM_List[i].npdu_data,
|
||||||
&TSM_List[i].apdu[0], TSM_List[i].apdu_len);
|
&TSM_List[i].apdu[0], TSM_List[i].apdu_len);
|
||||||
} else {
|
} else {
|
||||||
TSM_List[i].InvokeID = 0;
|
/* note: the invoke id has not been cleared yet
|
||||||
|
and this indicates a failed message:
|
||||||
|
IDLE and a valid invoke id */
|
||||||
TSM_List[i].state = TSM_STATE_IDLE;
|
TSM_List[i].state = TSM_STATE_IDLE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -269,6 +271,25 @@ bool tsm_invoke_id_free(uint8_t invokeID)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* see if the invoke ID has failed get a confirmation */
|
||||||
|
bool tsm_invoke_id_failed(uint8_t invokeID)
|
||||||
|
{
|
||||||
|
bool status = false;
|
||||||
|
uint8_t index;
|
||||||
|
|
||||||
|
index = tsm_find_invokeID_index(invokeID);
|
||||||
|
if (index < MAX_TSM_TRANSACTIONS)
|
||||||
|
{
|
||||||
|
/* a valid invoke ID and the state is IDLE is a
|
||||||
|
message that failed to confirm */
|
||||||
|
if (TSM_List[index].state == TSM_STATE_IDLE)
|
||||||
|
status = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef TEST
|
#ifdef TEST
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|||||||
@@ -109,6 +109,7 @@ extern "C" {
|
|||||||
uint8_t * apdu, uint16_t * apdu_len);
|
uint8_t * apdu, uint16_t * apdu_len);
|
||||||
|
|
||||||
bool tsm_invoke_id_free(uint8_t invokeID);
|
bool tsm_invoke_id_free(uint8_t invokeID);
|
||||||
|
bool tsm_invoke_id_failed(uint8_t invokeID);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user