Este documento descreve a C API em andamento para escrever chips personalizados para o simulador Wokwi.
Primeiro, certifique-se de incluir wokwi-api.h. Cada método externo que você declara deve ser encapsulado com a macro EXPORT (por exemplo, void EXPORT(my_method_name) (uint32_t arg) { ... }).
O chip deve declarar um método chip_init. Este método será chamado para cada nova instância do chip. Se o chip possui algum estado interno, o chip_init deve alocar memória para o estado interno e retornar um ponteiro para esta memória.
Este ponteiro será passado no primeiro argumento para qualquer ouvinte que você declarar (por exemplo, chip_pin_change). Para chip sem nenhum estado interno, basta retornar NULL.
Aqui está um exemplo de um arquivo de chip mínimo:
#include "wokwi-api.h"
void* EXPORT(chip_init)(void) {
/* Este método é executado quando a simulação é iniciada. É chamado uma vez para cada instância do chip. */
/* Deve retornar um ponteiro para uma estrutura com dados específicos da instância do chip, ou NULL se o chip não tiver estado interno. */
return NULL;
}Chips interage com a simulação usando pinos digitais. Use a macro DECLARE_PIN para definir seus pinos, por exemplo:
DECLARE_PIN(VCC);
DECLARE_PIN(GND);
DECLARE_PIN(SCL);
DECLARE_PIN(SDA);
DECLARE_PIN(INT);Em seguida, use os pinos no código chamando a macro PIN. Por exemplo, o código a seguir irá configurar o pino INT como um pino de saída digital:
pin_mode(PIN(INT), OUTPUT);Os seguintes métodos da API interagem com os pinos GPIO:
Configura o pin dado como entrada ou saída digital. Os valores válidos para mode são: INPUT, OUTPUT, INPUT_PULLUP e INPUT_PULLDOWN.
Defina o valor de saída para um pino digital. Use as constantes LOW e HIGH para value.
Lê o valor digital atual do pino, retorna LOW ou HIGH.
Escuta as alterações no valor digital do pino fornecido. Os valores válidos para edge são:
BOTH- Ouça qualquer alteração de valorFALLING- Ouça as mudanças de ALTO para BAIXORISING- Ouça as mudanças de BAIXO a altoNONE- Pare de ouvir as alterações
Você também precisa declarar um listener com a seguinte assinatura:
void EXPORT(chip_pin_change)(void *chip, uint32_t pin, uint32_t value) {
// ...
}
Este listener será chamado para alterações em qualquer pino que você assistiu com digital_watch().
O argumento chip é um ponteiro para o estado do chip, conforme retornado de chip_init(). O parâmetro pin é o índice do pino, e value é o novo valor digital do pino, LOW ou HIGH.
Retorna o tempo atual do simulador (virtual) em nanossegundos.
Para criar um dispositivo I2C, você precisa declarar quatro retornos de chamada: chip_i2c_connect, chip_i2c_read, chip_i2c_write e chip_i2c_disconnect. Os dois primeiros argumentos para todos esses retornos de chamada são um ponteiro para o estado do chip e o índice da interface i2c.
Inicializa um dispositivo I2C. O dispositivo se conectará ao barramento I2C nos pinos pin_scl e pin_sda, e ouvirá as solicitações correspondentes ao endereço fornecido.
Chamado sempre que seu chip é endereçado no barramento I2C. O parâmetro address contém o endereço do seu dispositivo.
Retorne true para reconhecer a conexão ou false para descartá-la.
Chamado quando o microcontrolador quer ler um byte de dados do seu chip.
Chamado quando o microcontrolador grava um byte em seu chip. data conterá o byte de entrada. Retorne true para confirmar a transação ou false para encerrar a conexão.
Chamado quando o microcontrolador se desconecta do seu chip.
Uri Shaked - wokwi-custom-chips-c-api.md