 d92b0a82cc
			
		
	
	
		d92b0a82cc
		
			
		
	
	
	
	
		
			
			"A long time ago in a galaxy far, far away...." we started NFC subsystem refactoring. Starring: - @gornekich - NFC refactoring project lead, architect, senior developer - @gsurkov - architect, senior developer - @RebornedBrain - senior developer Supporting roles: - @skotopes, @DrZlo13, @hedger - general architecture advisors, code review - @Astrrra, @doomwastaken, @Hellitron, @ImagineVagon333 - quality assurance Special thanks: @bettse, @pcunning, @nxv, @noproto, @AloneLiberty and everyone else who has been helping us all this time and contributing valuable knowledges, ideas and source code.
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "iso14443_4_layer.h"
 | |
| 
 | |
| #include <furi.h>
 | |
| 
 | |
| #define ISO14443_4_BLOCK_PCB (1U << 1)
 | |
| #define ISO14443_4_BLOCK_PCB_I (0U)
 | |
| #define ISO14443_4_BLOCK_PCB_R (5U << 5)
 | |
| #define ISO14443_4_BLOCK_PCB_S (3U << 6)
 | |
| 
 | |
| struct Iso14443_4Layer {
 | |
|     uint8_t pcb;
 | |
|     uint8_t pcb_prev;
 | |
| };
 | |
| 
 | |
| static inline void iso14443_4_layer_update_pcb(Iso14443_4Layer* instance) {
 | |
|     instance->pcb_prev = instance->pcb;
 | |
|     instance->pcb ^= (uint8_t)0x01;
 | |
| }
 | |
| 
 | |
| Iso14443_4Layer* iso14443_4_layer_alloc() {
 | |
|     Iso14443_4Layer* instance = malloc(sizeof(Iso14443_4Layer));
 | |
| 
 | |
|     iso14443_4_layer_reset(instance);
 | |
|     return instance;
 | |
| }
 | |
| 
 | |
| void iso14443_4_layer_free(Iso14443_4Layer* instance) {
 | |
|     furi_assert(instance);
 | |
|     free(instance);
 | |
| }
 | |
| 
 | |
| void iso14443_4_layer_reset(Iso14443_4Layer* instance) {
 | |
|     furi_assert(instance);
 | |
|     instance->pcb = ISO14443_4_BLOCK_PCB_I | ISO14443_4_BLOCK_PCB;
 | |
| }
 | |
| 
 | |
| void iso14443_4_layer_encode_block(
 | |
|     Iso14443_4Layer* instance,
 | |
|     const BitBuffer* input_data,
 | |
|     BitBuffer* block_data) {
 | |
|     furi_assert(instance);
 | |
| 
 | |
|     bit_buffer_append_byte(block_data, instance->pcb);
 | |
|     bit_buffer_append(block_data, input_data);
 | |
| 
 | |
|     iso14443_4_layer_update_pcb(instance);
 | |
| }
 | |
| 
 | |
| bool iso14443_4_layer_decode_block(
 | |
|     Iso14443_4Layer* instance,
 | |
|     BitBuffer* output_data,
 | |
|     const BitBuffer* block_data) {
 | |
|     furi_assert(instance);
 | |
| 
 | |
|     bool ret = false;
 | |
| 
 | |
|     do {
 | |
|         if(!bit_buffer_starts_with_byte(block_data, instance->pcb_prev)) break;
 | |
|         bit_buffer_copy_right(output_data, block_data, 1);
 | |
|         ret = true;
 | |
|     } while(false);
 | |
| 
 | |
|     return ret;
 | |
| }
 |