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:
skarg
2006-08-15 21:35:35 +00:00
parent 4fe0decdf7
commit f4f9241298
9 changed files with 81 additions and 8 deletions
+8 -1
View File
@@ -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;
} }
} }
+7 -1
View File
@@ -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;
+8 -1
View File
@@ -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;
} }
} }
+8 -1
View File
@@ -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;
} }
} }
+10
View File
@@ -245,12 +245,22 @@ 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;
} }
+8 -1
View File
@@ -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;
} }
} }
+8 -1
View File
@@ -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
View File
@@ -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>
+1
View File
@@ -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
} }