Raspberry Pi Pico

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

На плате ESP32-WROOM-32U как-то совсем плохо.... не находит ничего.

видимо антенны совсем пло... да ее вовсе нет! :)

ну ты оригинал, эту плату без антенны подключать нельзя, чип сожжёшь...

если поделишься кодом, могу собрать на аналогичной плате макетик и показать. что у меня...
Микротик находит порядка 90 сетей )))

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

эту плату без антенны подключать нельзя, чип сожжёшь...

да ну, телевизор без антенны не сгорает же

ua6em пишет:

если поделишься кодом,

Чтобы не загромождать ветку расписал подробно в исходном сообщении #248

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

эту плату без антенны подключать нельзя, чип сожжёшь...

да ну, телевизор без антенны не сгорает же

ua6em пишет:

если поделишься кодом,

Чтобы не загромождать ветку расписал подробно в исходном сообщении #248

 

присоединюсь к словам WDRAKULA...
Приятель, мастер спорта на УКВ кстати, попросил роутер недорогой, из наличия был только Длинк с вайфаем с наружными антеннами, через неделю привозит, говорит не работает и греется, где антенны говорю...а мы их не ставили...сразу выкинули...
Матерился я долго но внутри себя )))
Свои балалайки значит без антенны включать нельзя, сразу сгорают, а заводские можно?
"Умом Россию не понять"

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

присоединюсь к словам WDRAKULA...

вот честно - ему верю, а тебе нет. Ибо ты неоднократно показал. что даже в том, в чем ты разбираешься - путаник ты большой.

По сути спорить не буду, мои познания в радио даже не нулевые, а отрицательные. Но думаю, что сам чип (в смысле микроконтроллер) у меня пока не сгорел, ибо на команды отвечает.

b707
Offline
Зарегистрирован: 26.05.2017

andycat пишет:
w5500 + wiznet библиотеки, обмен по spi все по sdk библиотекам.

вот это не поможет?

https://github.com/khoih-prog/EthernetWebServer

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

b707 пишет:

andycat пишет:
w5500 + wiznet библиотеки, обмен по spi все по sdk библиотекам.

вот это не поможет?

https://github.com/khoih-prog/EthernetWebServer

да не....я с регистрами и вообще с w5500 давно достаточно работаю, сложного ниче нет. А вот DNS работать не хочет 

ioLibrary_Driver/Internet/DNS at master · Wiznet/ioLibrary_Driver · GitHub

то ли я че то не догоняю, то ли лыжи (библиотека) не едут. Ошибка на парсинге ответа от DNS сервера.

Update: починил.

HTTP Client Pico RP2040 на втором ядре с иcпользованием библиотек Wiznet W5500

Start W5500

IP was not assigned :(

IP was not assigned :(

IP was not assigned :(

IP was not assigned :(

IP was not assigned :(

IP was not assigned :(

IP was not assigned :(

IP was not assigned :(

IP was not assigned :(

IP was not assigned :(
Callback: IP assigned! Leased time: 600 sec
IP:  10.127.0.10
GW:  10.127.0.1
Net: 255.255.255.240
DNS1: 10.127.0.1
DNS2: 8.8.8.8
Resolving domain name "ip-v4.ru"...
2:TCP client loopback start
2:Socket opened
2:Try to connect to the 195.24.66.87 : 80
2:Connected to - 195.24.66.87 : 80
GET / HTTP/1.1
Host: ip-v4.ru
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5
Accept: text/html
Connection: close

HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Fri, 02 Sep 2022 06:38:58 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 3887
Connection: close
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN

<!DOCTYPE html>
<html>
<head>
<meta name="robots" content="index, nofollow, noarchive" />
<meta name="keywords" content="my ip, ru-center, looking glass, lg.nic.ru, traceroute, my ip address, my ipv4, lg">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/png" href="/img/16.png" sizes="16x16">
<link rel="icon" type="image/png" href="/img/32.png" sizes="32x32">
<link rel="icon" type="image/png" href="/img/48.png" sizes="48x48">
<link rel="icon" type="image/png" href="/img/96.png" sizes="96x96">
<title>IPv4 simple looking glass</title>
<style>
body {
  margin: 0;
  font-family: Arial, Helvetica, sans-serif;
}

.nav {
  overflow: hidden;
  background-color: #333;
  text-align: center;
}

.nav li {
  display: inline;
  white-space: nowrap;
}

.nav a {
  display: inline-block;
  color: #f2f2f2;
  text-align: center;
  padding: 14px 16px;
  text-decoration: none;
  font-size: 17px;
}

.nav a:hover {
  background-color: #ddd;
  color: black;
}

.nav a.active {
  background-color: #4CAF50;
  color: white;
}

.theButton {
        background:linear-gradient(to bottom, #77b55a 5%, #72b352 100%);
        background-color:#77b55a;
        border-radius:4px;
        border:8px solid #333333;
        display:inline-block;
        cursor:pointer;
        color:#ffffff;
        font-family:Arial;
        font-size:16px;
        font-weight:bold;
        padding:7px 16px;
        text-decoration:none;
        text-shadow:1px 1px 0px #5b8a3c;
}
.theButton:hover {
        background:linear-gradient(to bottom, #72b352 5%, #77b55a 100%);
        background-color:#72b352;
}
.theButton:active {
        position:relative;
        top:1px;
}

</style>
</head>
<body>

 <header>
   <h3 style="font-weight:normal;white-space:nowrap;" align="center"><font color="white">RU-CENTER Looking Glass</font></h3>
   <h3 style="font-weight:normal;white-space:nowrap;" align="center"><a style="text-decoration:none;color:inherit" href="/">Simple IPv4 Looking Glass</a></h3>
 </header>
 <form method="POST" role="form">
 <div class="container">

  <div class="nav">
    <li><input type="text" style="height:28px;width:130px;border:9px solid #333333;font-size:14px;" placeholder="IPv4 address" name="destination" value="176.59.170.160"></li>
    <li><button id="ping" formaction="/ping" type="submit" value="ping" class="theButton" name="ping">Ping</button>
    <button id="mtr" formaction="/mtr" type="submit" value="mtr" class="theButton" name="mtr">MTR</button></li>
    <li><button id="nmap" formaction="/nmap" type="submit" value="nmap" class="theButton" name="namp">Nmap</button>
    <button id="whois" formaction="/whois" type="submit" value="whois" class="theButton" name="whois">Whois</button></li>
  </div>

  <div style="padding-left:16px">
  <form role="form">
      <br>
      <p align="center" id="ext_addr">Your public IP address: 176.59.170.160</p>
      <p align="center" id="int_addr"></p>
      <p align="center" id="warning"></p>
      <br>
  </form>
  <script>
    window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
    var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};
    pc.createDataChannel('');
    pc.createOffer(pc.setLocalDescription.bind(pc), noop);
    pc.onicecandidate = function(ice)
    {
      if (ice && ice.candidate && ice.candidate.candidate)
      {
        var intIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1];
        pc.onicecandidate = noop;
        document.getElementById('int_addr').textContent = 'Your private IP address: '.concat(intIP);
        document.getElementById('warning').textContent = 'Turn off WebRTC in your browser to hide private IP address';
      }
    };
  </script>
  </div>
 </div>
 </form>

 <div class="nav">
   <li><a href="https://www.nic.ru/catalog/hosting/">Located at RU-CENTER Hosting</a></li>
 </div>

<script>
</script>
</body>
</html>

2:CloseWait
2:Socket Closed

-

/**
 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 *
 * sockpico.c
 * 
 * andycat2013@yandex.ru
 *
 */

#include <stdio.h>
#include "pico/stdlib.h"
#include "millpico.h"
#include "w5500pico.h"
#include "ghtmltext.h"

int main() {
    stdio_init_all(); // init pico RP2040
    startCore1w5500pico(true);
    // end start setup
    //sendHTTPGETreqByIP((unsigned char *)&http_ip1, 80, (unsigned char *)&http_get_test1);
    sendHTTPGETreqByURL((unsigned char *)&http_url1, 80, (unsigned char *)&http_get_test1);
    while(1) { // main loop
        // ---- end loop ---
	}
    return 0;
}

-

#include <stdio.h>
#include <string.h>
#include "pico/stdlib.h"
#include "w5500pico.h"
#include "millpico.h"
#include "pico/multicore.h"
#include "pico/binary_info.h"
#include "hardware/spi.h"

#include "socket.h"
#include "dhcp.h"
#include "dns.h"

uint8_t dhcp_buffer[2048]; // 1K should be enough, see https://forum.wiznet.io/t/topic/1612/2
uint8_t dns_buffer[2048]; // 1K seems to be enough for this buffer as well
uint8_t rx_tx_buff_sizes[] = {2, 2, 2, 2, 2, 2, 2, 2};

wiz_NetInfo net_info = {
        .mac  = { 0xEA, 0x11, 0x22, 0x33, 0x44, 0xEA },
        .dhcp = NETINFO_DHCP,
        //.dhcp = NETINFO_STATIC,
        .ip = {10,127,0,10},
        .sn = {255,255,255,240},
        .gw = {10,127,0,1}
};

uint8_t dns1[4] = {10,127,0,1};
uint8_t dns2[4] = {8,8,8,8};

volatile bool ip_assigned = false;

enum t_clientStatus {clHtNone = 0, clHtGetIP, clHtSendGet, clHtWorkSock};

bool startWithDHCP = true;

struct t_httpClient {
    enum t_clientStatus clientStatus;
    unsigned char bufRet[RECV_CLIENT_BUF_SIZE];
    unsigned char * destURL;
    unsigned short destPort;
    unsigned char * bufSendGET;
    uint8_t addr[4];
};

struct t_httpClient httpClient;

void sendHTTPGETreqByURL(unsigned char * destURL, unsigned short destPort, unsigned char * bufSendGET) {
    httpClient.destURL = destURL;
    httpClient.destPort = destPort;
    httpClient.bufSendGET = bufSendGET;
    httpClient.clientStatus = clHtGetIP;
}

void sendHTTPGETreqByIP(unsigned char * destIP, unsigned short destPort, unsigned char * bufSendGET) {
    httpClient.destPort = destPort;
    httpClient.bufSendGET = bufSendGET;
    httpClient.addr[0] = *destIP; httpClient.addr[1] = *(destIP+1);
    httpClient.addr[2] = *(destIP+2); httpClient.addr[3] = *(destIP+3);
    httpClient.clientStatus = clHtSendGet;
}

void loopHTTPclient(void) {
    if (!ip_assigned) return;
    uint8_t sn = CLIENT_HTTP_SOCKET;
    static bool firstStartClient;
    switch (httpClient.clientStatus) {
        case clHtGetIP: {
            printf("Resolving domain name \"%s\"...\r\n", httpClient.destURL);
            DNS_init(DNS_SOCKET, dns_buffer);
            int8_t res = DNS_run((uint8_t*)&dns1, httpClient.destURL, (uint8_t *)&httpClient.addr);
            if (res != 1) {
                printf("DNS_run() failed, res = %d\r\n", res);
                res = DNS_run((uint8_t*)&dns2, httpClient.destURL, (uint8_t *)&httpClient.addr);
                if (res != 1) {
                    printf("DNS_run() failed, res = %d\r\n", res);
                    httpClient.clientStatus = clHtNone;
                    return;
                }
            }
            httpClient.clientStatus = clHtSendGet;
            break;
        }
        case clHtSendGet: {
            firstStartClient = true;
            httpClient.clientStatus = clHtWorkSock;
            break;
        }
        case clHtWorkSock: {
            uint16_t size = 0;
            // Port number for TCP client (will be increased)
            static uint16_t any_port = 	51037;
            // Socket Status Transitions
            // Check the W5500 Socket n status register (Sn_SR, The 'Sn_SR' controlled by Sn_CR command or Packet send/recv status)
            switch(getSn_SR(sn)) {
                case SOCK_ESTABLISHED : {
                    if(getSn_IR(sn) & Sn_IR_CON) {	// Socket n interrupt register mask; TCP CON interrupt = connection with peer is successful
			            printf("%d:Connected to - %d.%d.%d.%d : %d\r\n",sn, httpClient.addr[0], httpClient.addr[1], httpClient.addr[2], httpClient.addr[3], httpClient.destPort);
			            setSn_IR(sn, Sn_IR_CON);  // this interrupt should be write the bit cleared to '1'
                        // show get req to consol
                        printf("%s", httpClient.bufSendGET);
                        // send HTTP GET req
                        send(sn, httpClient.bufSendGET, strlen((const char *)httpClient.bufSendGET));
                    }
		            if ((size = getSn_RX_RSR(sn)) > 0) { // Sn_RX_RSR: Socket n Received Size Register, Receiving data length
			            if(size > RECV_CLIENT_BUF_SIZE) size = RECV_CLIENT_BUF_SIZE; // DATA_BUF_SIZE means user defined buffer size (array)
			            int32_t ret = recv(sn, httpClient.bufRet, size); // Data Receive process (H/W Rx socket buffer -> User's buffer)
                        if (ret > 0) { // have recv data
                            // test show to consol
                            httpClient.bufRet[ret] = 0;
                            printf("%s", httpClient.bufRet);
                        }
                    }
                    break;
                }
                case SOCK_CLOSE_WAIT : {
                    printf("%d:CloseWait\r\n",sn);
                    disconnect(sn);
                    printf("%d:Socket Closed\r\n", sn);
                    break;
                }
                case SOCK_INIT : {
    	            printf("%d:Try to connect to the %d.%d.%d.%d : %d\r\n", sn, httpClient.addr[0], httpClient.addr[1], httpClient.addr[2], httpClient.addr[3], httpClient.destPort);
    	            connect(sn, httpClient.addr, httpClient.destPort);	//	Try to TCP connect to the TCP server (destination)
                    break;
                }
                case SOCK_CLOSED : {
                    if (firstStartClient) {
                        close(sn);
        	            if ((socket(sn, Sn_MR_TCP, any_port++, 0x00)) != sn){
                            if(any_port == 0xffff) any_port = 50000; // TCP socket open with 'any_port' port number
                        } 
    	                printf("%d:TCP client loopback start\r\n",sn);
                        printf("%d:Socket opened\r\n",sn);
                        firstStartClient = false;
                    } else {
                        httpClient.clientStatus = clHtNone;
                    }
                    break;
                }
                default: {}
            }
            break;
        }
        default: {}
    }
}

void Callback_IPAssigned(void) {
    printf("Callback: IP assigned! Leased time: %d sec\r\n",
                getDHCPLeasetime());
    ip_assigned = true;
    getIPfromDHCP(net_info.ip);
    getGWfromDHCP(net_info.gw);
    getSNfromDHCP(net_info.sn);
    getDNSfromDHCP(dns1);
    wizchip_setnetinfo(&net_info);
        printf(
            "IP:  %d.%d.%d.%d\r\n"
            "GW:  %d.%d.%d.%d\r\n"
            "Net: %d.%d.%d.%d\r\n"
            "DNS1: %d.%d.%d.%d\r\n"
            "DNS2: %d.%d.%d.%d\r\n",
            net_info.ip[0], net_info.ip[1], net_info.ip[2], net_info.ip[3],
            net_info.gw[0], net_info.gw[1], net_info.gw[2], net_info.gw[3],
            net_info.sn[0], net_info.sn[1], net_info.sn[2], net_info.sn[3],
            dns1[0], dns1[1], dns1[2], dns1[3],
            dns2[0], dns2[1], dns2[2], dns2[3]);
}

void Callback_IPConflict(void) {
    printf("Callback: IP conflict!\r\n");
}

void W5500_Select(void) {
    gpio_put(W5500pinCSn, 0);
}

void W5500_Unselect(void) {
    gpio_put(W5500pinCSn, 1);
}

void W5500_ReadBuff(uint8_t* buff, uint16_t len) {
    spi_read_blocking(spi_default, 0x00, buff, len);
}

void W5500_WriteBuff(uint8_t* buff, uint16_t len) {
    spi_write_blocking(spi_default, buff, len);
}

uint8_t W5500_ReadByte(void) {
    uint8_t byte;
    W5500_ReadBuff(&byte, sizeof(byte));
    return byte;
}

void W5500_WriteByte(uint8_t byte) {
    W5500_WriteBuff(&byte, sizeof(byte));
}

void w5500hardReset(void) { // аппаратный сброс модуля
    ip_assigned = false;
    gpio_put(W5500pinRST, 0); // LOW level pin
    sleep_ms(70UL); 
    gpio_put(W5500pinRST, 1); // HIGH level pin
    sleep_ms(2000UL); // дать прочухаться устройству/роутеру на том конце провода
}

void initRSTpinW5500(void) {
    gpio_init(W5500pinRST); 
    gpio_set_dir(W5500pinRST, GPIO_OUT); 
    gpio_put(W5500pinRST, 1); 
    gpio_init(W5500pinCSn); 
    gpio_set_dir(W5500pinCSn, GPIO_OUT); 
    gpio_put(W5500pinCSn, 1); 
}

void initSPIw5500(void) {
#if !defined(spi_default) || !defined(PICO_DEFAULT_SPI_SCK_PIN) || !defined(PICO_DEFAULT_SPI_TX_PIN) || !defined(PICO_DEFAULT_SPI_RX_PIN) || !defined(PICO_DEFAULT_SPI_CSN_PIN)
#warning spi/spi_master example requires a board with SPI pins
    puts("Default SPI pins were not defined");
#else
    // Enable SPI 0 at 1 MHz and connect to GPIOs
    spi_init(spi_default, 1000 * 1000);
    gpio_set_function(PICO_DEFAULT_SPI_RX_PIN, GPIO_FUNC_SPI);
    gpio_set_function(PICO_DEFAULT_SPI_SCK_PIN, GPIO_FUNC_SPI);
    gpio_set_function(PICO_DEFAULT_SPI_TX_PIN, GPIO_FUNC_SPI);
    gpio_set_function(PICO_DEFAULT_SPI_CSN_PIN, GPIO_FUNC_SPI);
    // Make the SPI pins available to picotool
    bi_decl(bi_4pins_with_func(PICO_DEFAULT_SPI_RX_PIN, PICO_DEFAULT_SPI_TX_PIN, PICO_DEFAULT_SPI_SCK_PIN, PICO_DEFAULT_SPI_CSN_PIN, GPIO_FUNC_SPI));
#endif
}

void w5500initLib() {
    reg_wizchip_cs_cbfunc(W5500_Select, W5500_Unselect);
    reg_wizchip_spi_cbfunc(W5500_ReadByte, W5500_WriteByte);
    reg_wizchip_spiburst_cbfunc(W5500_ReadBuff, W5500_WriteBuff);
    wizchip_init(rx_tx_buff_sizes, rx_tx_buff_sizes);
    setSHAR(net_info.mac); // set MAC address before using DHCP
    if (startWithDHCP) {
        net_info.dhcp = NETINFO_DHCP;
        DHCP_init(DHCP_SOCKET, dhcp_buffer);
        reg_dhcp_cbfunc(Callback_IPAssigned, Callback_IPAssigned, Callback_IPConflict);
    } else {
        net_info.dhcp = NETINFO_STATIC;
        wizchip_setnetinfo(&net_info);
        ip_assigned = true;
        printf(
            "IP:  %d.%d.%d.%d\r\n"
            "GW:  %d.%d.%d.%d\r\n"
            "Net: %d.%d.%d.%d\r\n"
            "DNS1: %d.%d.%d.%d\r\n"
            "DNS2: %d.%d.%d.%d\r\n",
            net_info.ip[0], net_info.ip[1], net_info.ip[2], net_info.ip[3],
            net_info.gw[0], net_info.gw[1], net_info.gw[2], net_info.gw[3],
            net_info.sn[0], net_info.sn[1], net_info.sn[2], net_info.sn[3],
            dns1[0], dns1[1], dns1[2], dns1[3],
            dns2[0], dns2[1], dns2[2], dns2[3]);
    }
}

void loopDHCPclient (void) {
    static unsigned long timerDHCPhandler = 0;
    static unsigned short counterDHCPrun  = 0;
    if ((millis() - timerDHCPhandler) >= 1000UL) {
        if (counterDHCPrun) {
            DHCP_run();
            if (ip_assigned) {
                counterDHCPrun = 0;
                timerDHCPhandler = millis();
            } else {
                --counterDHCPrun;
                if ((!ip_assigned) && (!counterDHCPrun)) {
                    printf("\r\nIP was not assigned :(\r\n");
                    timerDHCPhandler = millis();
                }
            }
        } else {
            DHCP_time_handler();    
            counterDHCPrun = 1000;
        }
    }
}

void core1_entry() {
    initPinLed(); // init pin led
    startMillisTimer();
    initPinKey(); // init pin key IRQ
    initRSTpinW5500();
    initSPIw5500();
    w5500hardReset();
    printf("Start W5500\n");
    w5500initLib();
    set1secCallback(DNS_time_handler);
    while (1) {
        blinkLedBoardLoop(); // blink board led
        if (startWithDHCP) loopDHCPclient(); 
        loopHTTPclient();
    }
}

void startCore1w5500pico(bool wDHCPclient) {
    httpClient.clientStatus = clHtNone; // reset HTTP client
    startWithDHCP = wDHCPclient;
    multicore_launch_core1(core1_entry);
}

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

понеслась))

RP2040-Zero

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

скорость -чтения записи на LittleFS

==> Time to write 64KB in 1b chunks = 1428 milliseconds = 45.89 KB/s
Reading 64K file in 1-byte chunks
==> Time to read 64KB in 1b chunks = 223 milliseconds = 293.88 KB/s
done

Загрузил бибилиотеку ADAFRUIT ST7735, взял тестовый скеч, контроллер добавлять не стал, поправил пины на avr и ОНА ПРОСТО РАБОТАЕТ!!!
Есть предположение. что большинство библиотек будут работать из коробки...
Плату в аддоне выбираю GENERIC RP2040 (параметры ставлю по плате)

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Спрошу еще раз! в Linux  из IDE у кого-то работает загрузка в RP2040???
UBUNTU22 ежели что

Произошла ошибка при загрузке скетча
/home/user/snap/arduino/70/.arduino15/packages/rp2040/tools/pqt-openocd/1.4.0-c-0196c06/bin/openocd: error while loading shared libraries: libhidapi-hidraw.so.0: cannot open shared object file: No such file or directory

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

ua6em пишет:

 error while loading shared libraries: libhidapi-hidraw.so.0: cannot open shared object file: No such file or directory

во всяком случае он же черным по русски пишет - не загружена библиотека HID - думаю надо переустановить драйвера и/или запустить.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andycat пишет:

ua6em пишет:

 error while loading shared libraries: libhidapi-hidraw.so.0: cannot open shared object file: No such file or directory

во всяком случае он же черным по русски пишет - не загружена библиотека HID - думаю надо переустановить драйвера и/или запустить.

на одном под 1.8.9 одолел, на другом под 1.8.19 делал ручками символические ссылки, модули к ядру добавлял после, надо попробовать переустановить аддон)))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

Аддон от Earle Philhower. лежит тут. Инструкция по установке в описании.

к сожалению инструкция не рассматривает установку аддона в системе работающей под LINUX (в частности UBUNTU)
 

До установки аддона надо установить недостающие модуля ядра:
1. sudo apt update
2. sudo apt install libhidapi-hidraw0

Далее по обычной схеме
 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Смотрю образец скетча для TFT, вижу - #if defined(ARDUINO_FEATHER_ESP32)...
А как плата Generic RP2040 определена? Сходу не нашёл

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

По частотомеру, наивно полагал, что я один тут Д'Артаньян, идею частотомера не выдавал
оказывается всё давно придумано до нас )))
 

b707
Offline
Зарегистрирован: 26.05.2017

Влад все верно обьяснил, меня что-то заклинило на длине периода. А если считать число импульсов, то код элементарный. Вспоминаю, что весной я сам выкладывал тут в какой-то ветке ссылку на библиотеку частотомерадо 8 Мгц на обычной уно с точностью в сотню герц.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:
библиотеку частотомера до 8 Мгц на обычной уно с точностью в сотню герц.

на нано у меня реализовано в генераторе для катушки Мишина, почитал, что люди делают на расбери пико, это просто космос, мы тут все в песочнице )))

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

мы тут все в песочнице )))

пиши про себя :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

мы тут все в песочнице )))

пиши про себя :)

я давно возле Айти с 1976 года, право имею оценить ...взгляд сталевара со стороны...

PS есть такая профессия - критик )))
PPS а камень действительно очень хорош, но параметры искусственно сильно занижены, внутри он значительно получше, надо бы у Юрия Панчула поинтересоваться, он в теме по этим ядрам
PPPS частотомер без внешнего обвеса с 20 ppm это уже более чем индикатор, а к примеру частотомер, на основе фазового детектора с диапазоном до 150  мегагерц использующий в качестве одного из сигналов PWM?

Недаром и такой успех, 2 миллиона продаж за столь короткое время

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ST7735 проверить, SPI0 или SPI1:

/**************************************************************************
  This is a library for several Adafruit displays based on ST77* drivers.

  Works with the Adafruit 1.8" TFT Breakout w/SD card
    ----> http://www.adafruit.com/products/358
  The 1.8" TFT shield
    ----> https://www.adafruit.com/product/802
  The 1.44" TFT breakout
    ----> https://www.adafruit.com/product/2088
  The 1.14" TFT breakout
  ----> https://www.adafruit.com/product/4383
  The 1.3" TFT breakout
  ----> https://www.adafruit.com/product/4313
  The 1.54" TFT breakout
    ----> https://www.adafruit.com/product/3787
  The 1.69" TFT breakout
    ----> https://www.adafruit.com/product/5206
  The 2.0" TFT breakout
    ----> https://www.adafruit.com/product/4311
  as well as Adafruit raw 1.8" TFT display
    ----> http://www.adafruit.com/products/618

  Check out the links above for our tutorials and wiring diagrams.
  These displays use SPI to communicate, 4 or 5 pins are required to
  interface (RST is optional).

  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.
  MIT license, all text above must be included in any redistribution
 **************************************************************************/

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>

#define SPI01

#if defined(SPI01) 
  #define TFT_CS        13  //
  #define TFT_RST       14  //
  #define TFT_DC        15  //
  #define TFT_MOSI      11  // 
  #define TFT_SCLK      10  //

#else
  #define TFT_CS        5   //
  #define TFT_RST       6   //
  #define TFT_DC        7   //
  #define TFT_MOSI      3   // 
  #define TFT_SCLK      2   //

#endif

/*
"""
// для RP2040 SPI1
#define TFT_CS         GP13 - CS 
#define TFT_RST        GP14 - RESET
#define TFT_DC         GP15 - A0
#define TFT_SCK        GP10 - SCK
#define TFT_SDA        GP11 - SDA (MOSI, TX) 
#define TFT_LED        Vout
#define TFT_VCC         3V3 - 3V3
#define TFT_GND        GND - GND

// для RP2040 SPI1
#define TFT_CS         GP5 - CS 
#define TFT_RST        GP6 - RESET
#define TFT_DC         GP7 - A0
#define TFT_SCK        GP2 - SCK
#define TFT_SDA        GP3 - SDA (MOSI, TX) 
#define TFT_LED        Vout
#define TFT_VCC         3V3 - 3V3
#define TFT_GND        GND - GND
"""
*/
// OPTION 1 (recommended) is to use the HARDWARE SPI pins, which are unique
// to each board and not reassignable. For Arduino Uno: MOSI = pin 11 and
// SCLK = pin 13. This is the fastest mode of operation and is required if
// using the breakout board's microSD card.

// For 1.44" and 1.8" TFT with ST7735 use:
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

// For 1.14", 1.3", 1.54", 1.69", and 2.0" TFT with ST7789:
//Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);


// OPTION 2 lets you interface the display using ANY TWO or THREE PINS,
// tradeoff being that performance is not as fast as hardware SPI above.
//#define TFT_MOSI 11  // Data out
//#define TFT_SCLK 13  // Clock out

// For ST7735-based displays, we will use this call
 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

// OR for the ST7789-based displays, we will use this call
//Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);


float p = 3.1415926;

void setup(void) {
  Serial.begin(115200);
  Serial.print(F("Hello! ST77xx TFT Test"));
  pinMode(29, OUTPUT);
  digitalWrite(29,HIGH);

  // Use this initializer if using a 1.8" TFT screen:
  tft.initR(INITR_BLACKTAB);      // Init ST7735S chip, black tab
  tft.setRotation(1);
  tft.setSPISpeed(50000000);


  // OR use this initializer if using a 1.8" TFT screen with offset such as WaveShare:
  // tft.initR(INITR_INITR_BLACKTAB);      // Init ST7735S chip, green tab

  // OR use this initializer (uncomment) if using a 1.44" TFT:
  //tft.initR(INITR_144GREENTAB); // Init ST7735R chip, green tab

  // OR use this initializer (uncomment) if using a 0.96" 160x80 TFT:
  //tft.initR(INITR_MINI160x80);  // Init ST7735S mini display

  // OR use this initializer (uncomment) if using a 1.3" or 1.54" 240x240 TFT:
  //tft.init(240, 240);           // Init ST7789 240x240

  // OR use this initializer (uncomment) if using a 1.69" 280x240 TFT:
  //tft.init(240, 280);           // Init ST7789 280x240

  // OR use this initializer (uncomment) if using a 2.0" 320x240 TFT:
  //tft.init(240, 320);           // Init ST7789 320x240

  // OR use this initializer (uncomment) if using a 1.14" 240x135 TFT:
  //tft.init(135, 240);           // Init ST7789 240x135
  
  // OR use this initializer (uncomment) if using a 1.47" 172x320 TFT:
  //tft.init(172, 320);           // Init ST7789 172x320

  // SPI speed defaults to SPI_DEFAULT_FREQ defined in the library, you can override it here
  // Note that speed allowable depends on chip and quality of wiring, if you go too fast, you
  // may end up with a black screen some times, or all the time.
  //tft.setSPISpeed(40000000);

  Serial.println(F("Initialized"));

  uint16_t time = millis();
  tft.fillScreen(ST77XX_BLACK);
  time = millis() - time;

  Serial.println(time, DEC);
  Serial.println("done");
  delay(1000);
}// ******* END SETUP *******



void loop() {
  tft.invertDisplay(true);
  delay(500);
  tft.invertDisplay(false);
  delay(500);

   // tft print function!
  tftPrintTest();
  delay(4000);

  // a single pixel
  tft.drawPixel(tft.width()/2, tft.height()/2, ST77XX_GREEN);
  delay(500);

  // line draw test
  testlines(ST77XX_YELLOW);
  delay(500);

  // optimized lines
  testfastlines(ST77XX_RED, ST77XX_BLUE);
  delay(500);

  testdrawrects(ST77XX_GREEN);
  delay(500);

  testfillrects(ST77XX_YELLOW, ST77XX_MAGENTA);
  delay(500);

  tft.fillScreen(ST77XX_BLACK);
  testfillcircles(10, ST77XX_BLUE);
  testdrawcircles(10, ST77XX_WHITE);
  delay(500);

  testroundrects();
  delay(500);

  testtriangles();
  delay(500);

  tft.setRotation(0);
  mediabuttons();
  tft.setRotation(1);
  delay(500);

  Serial.println("done");
  delay(1000);
  
  tft.fillScreen(ST77XX_BLACK);
  tft.setCursor(0, 30);
  tft.setTextSize(2);
  tft.setTextWrap(true);
  tft.setTextColor(ST77XX_WHITE);
  tft.print("Sketch has been running for:");
  tft.setTextColor(ST77XX_MAGENTA);
  tft.print(millis() / 1000);
  tft.setTextColor(ST77XX_WHITE);
  tft.print(" seconds.");
  delay(3000);
  
}


// ************** END LOOP **************


void testlines(uint16_t color) {
  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawLine(0, 0, x, tft.height()-1, color);
    delay(0);
  }
  for (int16_t y=0; y < tft.height(); y+=6) {
    tft.drawLine(0, 0, tft.width()-1, y, color);
    delay(0);
  }

  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color);
    delay(0);
  }
  for (int16_t y=0; y < tft.height(); y+=6) {
    tft.drawLine(tft.width()-1, 0, 0, y, color);
    delay(0);
  }

  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawLine(0, tft.height()-1, x, 0, color);
    delay(0);
  }
  for (int16_t y=0; y < tft.height(); y+=6) {
    tft.drawLine(0, tft.height()-1, tft.width()-1, y, color);
    delay(0);
  }

  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color);
    delay(0);
  }
  for (int16_t y=0; y < tft.height(); y+=6) {
    tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color);
    delay(0);
  }
}

void testdrawtext(char *text, uint16_t color) {
  tft.setCursor(0, 0);
  tft.setTextColor(color);
  tft.setTextWrap(true);
  tft.print(text);
}

void testfastlines(uint16_t color1, uint16_t color2) {
  tft.fillScreen(ST77XX_BLACK);
  for (int16_t y=0; y < tft.height(); y+=5) {
    tft.drawFastHLine(0, y, tft.width(), color1);
  }
  for (int16_t x=0; x < tft.width(); x+=5) {
    tft.drawFastVLine(x, 0, tft.height(), color2);
  }
}

void testdrawrects(uint16_t color) {
  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color);
  }
}

void testfillrects(uint16_t color1, uint16_t color2) {
  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x=tft.width()-1; x > 6; x-=6) {
    tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1);
    tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2);
  }
}

void testfillcircles(uint8_t radius, uint16_t color) {
  for (int16_t x=radius; x < tft.width(); x+=radius*2) {
    for (int16_t y=radius; y < tft.height(); y+=radius*2) {
      tft.fillCircle(x, y, radius, color);
    }
  }
}

void testdrawcircles(uint8_t radius, uint16_t color) {
  for (int16_t x=0; x < tft.width()+radius; x+=radius*2) {
    for (int16_t y=0; y < tft.height()+radius; y+=radius*2) {
      tft.drawCircle(x, y, radius, color);
    }
  }
}

void testtriangles() {
  tft.fillScreen(ST77XX_BLACK);
  uint16_t color = 0xF800;
  int t;
  int w = tft.width()/2;
  int x = tft.height()-1;
  int y = 0;
  int z = tft.width();
  for(t = 0 ; t <= 15; t++) {
    tft.drawTriangle(w, y, y, x, z, x, color);
    x-=4;
    y+=4;
    z-=4;
    color+=100;
  }
}

void testroundrects() {
  tft.fillScreen(ST77XX_BLACK);
  uint16_t color = 100;
  int i;
  int t;
  for(t = 0 ; t <= 4; t+=1) {
    int x = 0;
    int y = 0;
    int w = tft.width()-2;
    int h = tft.height()-2;
    for(i = 0 ; i <= 16; i+=1) {
      tft.drawRoundRect(x, y, w, h, 5, color);
      x+=2;
      y+=3;
      w-=4;
      h-=6;
      color+=1100;
    }
    color+=100;
  }
}

void tftPrintTest() {
  tft.setTextWrap(false);
  tft.fillScreen(ST77XX_BLACK);
  tft.setCursor(0, 30);
  tft.setTextColor(ST77XX_RED);
  tft.setTextSize(1);
  tft.println("Hello World!");
  tft.setTextColor(ST77XX_YELLOW);
  tft.setTextSize(2);
  tft.println("Hello World!");
  tft.setTextColor(ST77XX_GREEN);
  tft.setTextSize(3);
  tft.println("Hello World!");
  tft.setTextColor(ST77XX_BLUE);
  tft.setTextSize(4);
  tft.print(1234.567);
  delay(1500);
  tft.setCursor(0, 0);
  tft.fillScreen(ST77XX_BLACK);
  tft.setTextColor(ST77XX_WHITE);
  tft.setTextSize(0);
  tft.println("Hello World!");
  tft.setTextSize(1);
  tft.setTextColor(ST77XX_GREEN);
  tft.print(p, 6);
  tft.println(" Want pi?");
  tft.println(" ");
  tft.print(8675309, HEX); // print 8,675,309 out in HEX!
  tft.println(" Print HEX!");
  tft.println(" ");
  tft.setTextColor(ST77XX_WHITE);
  tft.println("Sketch has been");
  tft.println("running for: ");
  tft.setTextColor(ST77XX_MAGENTA);
  tft.print(millis() / 1000);
  tft.setTextColor(ST77XX_WHITE);
  tft.print(" seconds.");
}

void mediabuttons() {
  // play
  tft.fillScreen(ST77XX_BLACK);
  tft.fillRoundRect(25, 10, 78, 60, 8, ST77XX_WHITE);
  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_RED);
  delay(500);
  // pause
  tft.fillRoundRect(25, 90, 78, 60, 8, ST77XX_WHITE);
  tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_GREEN);
  tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_GREEN);
  delay(500);
  // play color
  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_BLUE);
  delay(50);
  // pause color
  tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_RED);
  tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_RED);
  // play color
  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_GREEN);
}

DS18B20 и ST7735 (набросок)
 

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>

#define SPI01

#if defined(SPI01)          // для RP2040 SPI1
#define TFT_CS        13  // GP13 - CS 
#define TFT_RST       14  // GP14 - RESET
#define TFT_DC        15  // GP15 - A0
#define TFT_MOSI      11  // GP11 - SDA (MOSI, TX)
#define TFT_SCLK      10  // GP10 - SCK 

#else                       // для RP2040 SPI0
#define TFT_CS        5   // GP5 - CS 
#define TFT_RST       6   // GP6 - RESET
#define TFT_DC        7   // GP7 - A0
#define TFT_MOSI      3   // GP3 - SDA (MOSI, TX)
#define TFT_SCLK      2   // GP2 - SCK
#endif

// For ST7735-based displays, we will use this call
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

// DS18B20
#include <OneWire.h>
#define Pin_VccDS 20  // DS18B20 - VDD (+3.3V) R 4.7k -[]-
#define Pin_SigDS 21  // DS18B20 - Data        R 4.7k ----

OneWire  ds(Pin_SigDS);
byte addr[8];    // = {0x28, 0xEC, 0xF0, 0xD5, 0x04, 0x00, 0x00, 0xF2};

volatile float temperature;
uint32_t timing;
uint32_t t1;
uint32_t t2;


void getTemperature()
{
  int16_t temp;
  t1 = micros();
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);                       // Считывание значения с датчика
  temp = (ds.read() | ds.read() << 8);  // Принимаем два байта температуры
  temperature = (float)temp / 16.0;     // round((float)temp / 16.0);
  ds.reset();
  ds.write(0xCC);                       // Обращение ко всем датчикам
  ds.write(0x44);                       // Команда на конвертацию
  t2 = micros();
}


void setup(void) {
  Serial.begin(115200);
  Serial.print(F("Hello! ST77xx TFT Test"));

  // TFT LED
  pinMode(29, OUTPUT);
  digitalWrite(29, HIGH); // Led ON
  // Use this initializer if using a 1.8" TFT screen:
  tft.initR(INITR_BLACKTAB);      // Init ST7735S chip, black tab
  tft.setRotation(1);
  tft.setSPISpeed(50000000);
  Serial.println(F("Initialized"));
  uint32_t times = millis();
  times = millis() - times;
  Serial.println(times, DEC);
  Serial.println("done");
  tft.fillScreen(ST77XX_BLACK);
  tft.setCursor(0, 30);
  tft.setTextColor(ST77XX_WHITE);
  tft.setTextSize(2);
  tft.print("Temp = ");

  // DS18B20
  pinMode(Pin_VccDS, OUTPUT);
  digitalWrite(Pin_VccDS, HIGH); // DS_VCC ON

label:
  ds.reset();      // сброс шины
  ds.search(addr); // определение адреса датчика
  if (OneWire::crc8(addr, 7) != addr[7])
  { //проверка массива адреса на срц
    Serial.println F("CRC ADRESS DS18B20 is not valid!");
    goto label;
  }
  ds.reset();      // сброс шины
  ds.select(addr); // выставить адрес
  ds.write(0x4E);  // разрешение записать конфиг
  ds.write(0x7F);  // Th контроль температуры макс 128грд
  ds.write(0xFF);  // Tl контроль температуры мин -128грд
  ds.write(0x60);  // 0x60 12-бит разрешение, 0x00 -9бит разрешение
  ds.write(0x7F);  // точность 0,5гр = 1F; 0,25гр = 3F; 0,125гр = 5F; 0,0625гр = 7F;

  // запросим температуру, считывать будем по таймеру
  ds.reset();
  ds.write(0xCC); // Обращение ко всем датчикам
  ds.write(0x44); // Команда на конвертацию
  timing = millis();

}// ******* END SETUP *******



void loop() {

  if (millis() - timing > 1000)
  {
    timing = millis();
    getTemperature();
    Serial.print("  Temperature = ");
    Serial.print(temperature, 3);
    tft.setCursor(78, 30);
    tft.setTextSize(2);
    tft.setCursor(78, 30);
    tft.setTextColor(ST77XX_MAGENTA, ST77XX_BLACK);
    tft.print(temperature, 1);
    tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
    tft.fillCircle(134, 30, 2, ST77XX_WHITE);
    tft.setCursor(138, 30);
    
    //tft.print("°C");
    tft.print("C");
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Частотомер, ппм...это пустые слова для меня. Я в реальной жизни ни к ИТ ни к электронике отношения не имею.
Ну сделаю я частотомер на 150мгц - а нахрена он мне?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Аддон от Earle Philhower что-то не нахожу как добраться к RTC?

разобрался, второй вопрос, в часах RTC дата уже была выставлена, в Питоне, при переходе под IDE дата сбросилась на 1970 год, это нормально? Что именно затрагивает RTC и в какой момент?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Появилась в продаже Rasberry PI PICO W на алиэкспрессе, дешевле 1300 не нашёл (с бесплатной доставкой), а стоит ли эта плата этого, тем более что AP+STA она не умеет и число подключений к AP всего 4-ре клиента?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

У этого продавца плата без W стоит от 600+. Так что 1300 это оверпрайс. Подождём менее жадных.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Komandir пишет:

У этого продавца плата без W стоит от 600+. Так что 1300 это оверпрайс. Подождём менее жадных.

я тут подумал, что для большинства применений памяти в 4 метра за глаза, закажу с пяток и таких...
PS за 170 рублей то...
Пока вижу, что если не лезть в дебри, а чисто средствами ардуино IDE всё работает из коробки...
Да, PWM средствами ардуино только до 1 мегагерца...

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

Появилась в продаже Rasberry PI PICO W на алиэкспрессе, дешевле 1300 не нашёл (с бесплатной доставкой), а стоит ли эта плата этого

ты можешь получить ровно то же самое, причем даже с тем же софтом - если возьмешь к Пике за 170р внешний ЕСП32 за 250

ua6em пишет:

Да, PWM средствами ардуино только до 1 мегагерца...

PWM средствами СДК это всего несколько строк. Вот, к примеру, ШИМ на 2 МГц со скважностью 50%

// PWM timer config
#define PWM_WRAP ((F_CPU/1000000ul)/2)      // timer period 2 MHz
pwm_config c_OE = pwm_get_default_config();
pwm_config_set_clkdiv(&c_OE, 1);                         // prescaler
pwm_config_set_wrap(&c_OE, PWM_WRAP-1);
pwm_config_set_output_polarity(&c_OE, true, true);   // invert A & B outputs (similar to PWM2 mode in STM32)
// PWM pin config
uint8_t OE_slice_num = pwm_gpio_to_slice_num(pin_OE); 
gpio_set_function(pin_OE, GPIO_FUNC_PWM);
pwm_set_gpio_level(pin_OE, PWM_WRAP / 2);
pwm_init(OE_slice_num, &c_OE, true);         // start PWM timer

только разрешение такого ШИМ получается всего 64

PS код на скорую руку, могут быть опечатки. Однако выдрано из реального проекта, где этот код работает

Update: - поправил код, а то в первый раз не все скопировал

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
SAB
Offline
Зарегистрирован: 27.12.2016

Там с WiFi за ~1600 руб. Смотри внимательнее

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

WEB сервер

/**
 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 *
 * sockpico.c
 * 
 * andycat2013@yandex.ru
 *
 */

#include <stdio.h>
#include "pico/stdlib.h"
#include "millpico.h"
#include "w5500pico.h"
#include "ghtmltext.h"

int main() {
    stdio_init_all(); // init pico RP2040
    startCore1w5500pico(true);
    // end start setup
    //sendHTTPGETreqByIP((unsigned char *)&http_ip1, 80, (unsigned char *)&http_get_test1);
    sendHTTPGETreqByURL((unsigned char *)&http_url1, 80, (unsigned char *)&http_get_test1);
    startHTTPserver();
    while(1) { // main loop
        // ---- end loop ---
	}
    return 0;
}


#include <stdio.h>
#include <string.h>
#include "pico/stdlib.h"
#include "w5500pico.h"
#include "millpico.h"
#include "pico/multicore.h"
#include "pico/binary_info.h"
#include "hardware/spi.h"

#include "socket.h"
#include "dhcp.h"
#include "dns.h"
#include "httpServer.h"
#include "ghtmltext.h"

uint8_t dhcp_buffer[2048]; // 1K should be enough, see https://forum.wiznet.io/t/topic/1612/2
uint8_t dns_buffer[2048]; // 1K seems to be enough for this buffer as well
uint8_t rx_tx_buff_sizes[] = {2, 2, 2, 2, 2, 2, 2, 2};

wiz_NetInfo net_info = {
        .mac  = { 0xEA, 0x11, 0x22, 0x33, 0x44, 0xEA },
        .dhcp = NETINFO_DHCP,
        //.dhcp = NETINFO_STATIC,
        .ip = {10,127,0,10},
        .sn = {255,255,255,240},
        .gw = {10,127,0,1}
};

uint8_t dns1[4] = {4,4,4,4};
uint8_t dns2[4] = {8,8,8,8};

volatile bool ip_assigned = false;

bool useHTTPserver;
unsigned char serverSocketsHTTP[8];
unsigned char countHTTPsockets;
bool initsSocketsHTTP;
unsigned char httpSERVERbufRX[HTTP_SERVER_BUF_SIZE];
unsigned char httpSERVERbufTX[HTTP_SERVER_BUF_SIZE];
bool regPagesHTTPsrv;

enum t_clientStatus {clHtNone = 0, clHtGetIP, clHtSendGet, clHtWorkSock};

bool startWithDHCP = true;

struct t_httpClient {
    enum t_clientStatus clientStatus;
    unsigned char bufRet[RECV_CLIENT_BUF_SIZE];
    unsigned char * destURL;
    unsigned short destPort;
    unsigned char * bufSendGET;
    uint8_t addr[4];
};

struct t_httpClient httpClient;

void sendHTTPGETreqByURL(unsigned char * destURL, unsigned short destPort, unsigned char * bufSendGET) {
    httpClient.destURL = destURL;
    httpClient.destPort = destPort;
    httpClient.bufSendGET = bufSendGET;
    httpClient.clientStatus = clHtGetIP;
}

void sendHTTPGETreqByIP(unsigned char * destIP, unsigned short destPort, unsigned char * bufSendGET) {
    httpClient.destPort = destPort;
    httpClient.bufSendGET = bufSendGET;
    httpClient.addr[0] = *destIP; httpClient.addr[1] = *(destIP+1);
    httpClient.addr[2] = *(destIP+2); httpClient.addr[3] = *(destIP+3);
    httpClient.clientStatus = clHtSendGet;
}

void loopHTTPclient(void) {
    if (!ip_assigned) return;
    uint8_t sn = CLIENT_HTTP_SOCKET;
    static bool firstStartClient;
    switch (httpClient.clientStatus) {
        case clHtGetIP: {
            printf("Resolving domain name \"%s\"...\r\n", httpClient.destURL);
            DNS_init(DNS_SOCKET, dns_buffer);
            int8_t res = DNS_run((uint8_t*)&dns1, httpClient.destURL, (uint8_t *)&httpClient.addr);
            if (res != 1) {
                printf("DNS_run() failed, res = %d\r\n", res);
                res = DNS_run((uint8_t*)&dns2, httpClient.destURL, (uint8_t *)&httpClient.addr);
                if (res != 1) {
                    printf("DNS_run() failed, res = %d\r\n", res);
                    httpClient.clientStatus = clHtNone;
                    return;
                }
            }
            httpClient.clientStatus = clHtSendGet;
            break;
        }
        case clHtSendGet: {
            firstStartClient = true;
            httpClient.clientStatus = clHtWorkSock;
            break;
        }
        case clHtWorkSock: {
            uint16_t size = 0;
            // Port number for TCP client (will be increased)
            static uint16_t any_port = 	51037;
            // Socket Status Transitions
            // Check the W5500 Socket n status register (Sn_SR, The 'Sn_SR' controlled by Sn_CR command or Packet send/recv status)
            switch(getSn_SR(sn)) {
                case SOCK_ESTABLISHED : {
                    if(getSn_IR(sn) & Sn_IR_CON) {	// Socket n interrupt register mask; TCP CON interrupt = connection with peer is successful
			            printf("%d:Connected to - %d.%d.%d.%d : %d\r\n",sn, httpClient.addr[0], httpClient.addr[1], httpClient.addr[2], httpClient.addr[3], httpClient.destPort);
			            setSn_IR(sn, Sn_IR_CON);  // this interrupt should be write the bit cleared to '1'
                        // show get req to consol
                        printf("%s", httpClient.bufSendGET);
                        // send HTTP GET req
                        send(sn, httpClient.bufSendGET, strlen((const char *)httpClient.bufSendGET));
                    }
		            if ((size = getSn_RX_RSR(sn)) > 0) { // Sn_RX_RSR: Socket n Received Size Register, Receiving data length
			            if(size > RECV_CLIENT_BUF_SIZE) size = RECV_CLIENT_BUF_SIZE; // DATA_BUF_SIZE means user defined buffer size (array)
			            int32_t ret = recv(sn, httpClient.bufRet, size); // Data Receive process (H/W Rx socket buffer -> User's buffer)
                        if (ret > 0) { // have recv data
                            // test show to consol
                            httpClient.bufRet[ret] = 0;
                            printf("%s", httpClient.bufRet);
                        }
                    }
                    break;
                }
                case SOCK_CLOSE_WAIT : {
                    printf("%d:CloseWait\r\n",sn);
                    disconnect(sn);
                    printf("%d:Socket Closed\r\n", sn);
                    break;
                }
                case SOCK_INIT : {
    	            printf("%d:Try to connect to the %d.%d.%d.%d : %d\r\n", sn, httpClient.addr[0], httpClient.addr[1], httpClient.addr[2], httpClient.addr[3], httpClient.destPort);
    	            connect(sn, httpClient.addr, httpClient.destPort);	//	Try to TCP connect to the TCP server (destination)
                    break;
                }
                case SOCK_CLOSED : {
                    if (firstStartClient) {
                        close(sn);
        	            if ((socket(sn, Sn_MR_TCP, any_port++, 0x00)) != sn){
                            if(any_port == 0xffff) any_port = 50000; // TCP socket open with 'any_port' port number
                        } 
    	                printf("%d:TCP client loopback start\r\n",sn);
                        printf("%d:Socket opened\r\n",sn);
                        firstStartClient = false;
                    } else {
                        httpClient.clientStatus = clHtNone;
                    }
                    break;
                }
                default: {}
            }
            break;
        }
        default: {}
    }
}

void Callback_IPAssigned(void) {
    printf("Callback: IP assigned! Leased time: %d sec\r\n",
                getDHCPLeasetime());
    ip_assigned = true;
    getIPfromDHCP(net_info.ip);
    getGWfromDHCP(net_info.gw);
    getSNfromDHCP(net_info.sn);
    getDNSfromDHCP(dns1);
    wizchip_setnetinfo(&net_info);
        printf(
            "IP:  %d.%d.%d.%d\r\n"
            "GW:  %d.%d.%d.%d\r\n"
            "Net: %d.%d.%d.%d\r\n"
            "DNS1: %d.%d.%d.%d\r\n"
            "DNS2: %d.%d.%d.%d\r\n",
            net_info.ip[0], net_info.ip[1], net_info.ip[2], net_info.ip[3],
            net_info.gw[0], net_info.gw[1], net_info.gw[2], net_info.gw[3],
            net_info.sn[0], net_info.sn[1], net_info.sn[2], net_info.sn[3],
            dns1[0], dns1[1], dns1[2], dns1[3],
            dns2[0], dns2[1], dns2[2], dns2[3]);
}

void Callback_IPConflict(void) {
    printf("Callback: IP conflict!\r\n");
}

void W5500_Select(void) {
    gpio_put(W5500pinCSn, 0);
}

void W5500_Unselect(void) {
    gpio_put(W5500pinCSn, 1);
}

void W5500_ReadBuff(uint8_t* buff, uint16_t len) {
    spi_read_blocking(spi_default, 0x00, buff, len);
}

void W5500_WriteBuff(uint8_t* buff, uint16_t len) {
    spi_write_blocking(spi_default, buff, len);
}

uint8_t W5500_ReadByte(void) {
    uint8_t byte;
    W5500_ReadBuff(&byte, sizeof(byte));
    return byte;
}

void W5500_WriteByte(uint8_t byte) {
    W5500_WriteBuff(&byte, sizeof(byte));
}

void w5500hardReset(void) { // аппаратный сброс модуля
    ip_assigned = false;
    gpio_put(W5500pinRST, 0); // LOW level pin
    sleep_ms(70UL); 
    gpio_put(W5500pinRST, 1); // HIGH level pin
    sleep_ms(2000UL); // дать прочухаться устройству/роутеру на том конце провода
}

void initRSTpinW5500(void) {
    gpio_init(W5500pinRST); 
    gpio_set_dir(W5500pinRST, GPIO_OUT); 
    gpio_put(W5500pinRST, 1); 
    gpio_init(W5500pinCSn); 
    gpio_set_dir(W5500pinCSn, GPIO_OUT); 
    gpio_put(W5500pinCSn, 1); 
}

void initSPIw5500(void) {
#if !defined(spi_default) || !defined(PICO_DEFAULT_SPI_SCK_PIN) || !defined(PICO_DEFAULT_SPI_TX_PIN) || !defined(PICO_DEFAULT_SPI_RX_PIN) || !defined(PICO_DEFAULT_SPI_CSN_PIN)
#warning spi/spi_master example requires a board with SPI pins
    puts("Default SPI pins were not defined");
#else
    // Enable SPI 0 at 1 MHz and connect to GPIOs
    spi_init(spi_default, 1000 * 1000);
    gpio_set_function(PICO_DEFAULT_SPI_RX_PIN, GPIO_FUNC_SPI);
    gpio_set_function(PICO_DEFAULT_SPI_SCK_PIN, GPIO_FUNC_SPI);
    gpio_set_function(PICO_DEFAULT_SPI_TX_PIN, GPIO_FUNC_SPI);
    gpio_set_function(PICO_DEFAULT_SPI_CSN_PIN, GPIO_FUNC_SPI);
    // Make the SPI pins available to picotool
    bi_decl(bi_4pins_with_func(PICO_DEFAULT_SPI_RX_PIN, PICO_DEFAULT_SPI_TX_PIN, PICO_DEFAULT_SPI_SCK_PIN, PICO_DEFAULT_SPI_CSN_PIN, GPIO_FUNC_SPI));
#endif
}

void w5500initLib() {
    reg_wizchip_cs_cbfunc(W5500_Select, W5500_Unselect);
    reg_wizchip_spi_cbfunc(W5500_ReadByte, W5500_WriteByte);
    reg_wizchip_spiburst_cbfunc(W5500_ReadBuff, W5500_WriteBuff);
    wizchip_init(rx_tx_buff_sizes, rx_tx_buff_sizes);
    setSHAR(net_info.mac); // set MAC address before using DHCP
    if (startWithDHCP) {
        net_info.dhcp = NETINFO_DHCP;
        DHCP_init(DHCP_SOCKET, dhcp_buffer);
        reg_dhcp_cbfunc(Callback_IPAssigned, Callback_IPAssigned, Callback_IPConflict);
    } else {
        net_info.dhcp = NETINFO_STATIC;
        wizchip_setnetinfo(&net_info);
        printf(
            "IP:  %d.%d.%d.%d\r\n"
            "GW:  %d.%d.%d.%d\r\n"
            "Net: %d.%d.%d.%d\r\n"
            "DNS1: %d.%d.%d.%d\r\n"
            "DNS2: %d.%d.%d.%d\r\n",
            net_info.ip[0], net_info.ip[1], net_info.ip[2], net_info.ip[3],
            net_info.gw[0], net_info.gw[1], net_info.gw[2], net_info.gw[3],
            net_info.sn[0], net_info.sn[1], net_info.sn[2], net_info.sn[3],
            dns1[0], dns1[1], dns1[2], dns1[3],
            dns2[0], dns2[1], dns2[2], dns2[3]);
        ip_assigned = true;
    }
}

void loopDHCPclient (void) {
    static unsigned long timerDHCPhandler = 0;
    static unsigned short counterDHCPrun  = 0;
    if ((millis() - timerDHCPhandler) >= 1000UL) {
        if (counterDHCPrun) {
            DHCP_run();
            if (ip_assigned) {
                counterDHCPrun = 0;
                timerDHCPhandler = millis();
            } else {
                --counterDHCPrun;
                if ((!ip_assigned) && (!counterDHCPrun)) {
                    printf("\r\nIP was not assigned :(\r\n");
                    timerDHCPhandler = millis();
                }
            }
        } else {
            DHCP_time_handler();    
            counterDHCPrun = 1000;
        }
    }
}

void loopHTTPserver (void) {
    static unsigned char currentHTTPserverSocketNum;
    if (!ip_assigned) return;
    if (!initsSocketsHTTP) {
        httpServer_init(httpSERVERbufTX, httpSERVERbufRX, countHTTPsockets, serverSocketsHTTP);
        initsSocketsHTTP = true;
        currentHTTPserverSocketNum = 0;
    } else if (!regPagesHTTPsrv) {
        reg_httpServer_webContent((unsigned char *)INITIAL_WEBPAGE, (unsigned char *)SOCKPICO_START_WEBPAGE_HTML);
        reg_httpServer_webContent((unsigned char *)M_INITIAL_WEBPAGE, (unsigned char *)SOCKPICO_START_WEBPAGE_HTML);
        reg_httpServer_webContent((unsigned char *)MOBILE_INITIAL_WEBPAGE, (unsigned char *)SOCKPICO_START_WEBPAGE_HTML);
        reg_httpServer_webContent((unsigned char *)SET_DATETIME_WEBPAGE, (unsigned char *)SOCKPICO_SETDATETIME_WEBPAGE_HTML);
        regPagesHTTPsrv = true;
        display_reg_webContent_list();
    } else {
        httpServer_run(currentHTTPserverSocketNum);
        ++currentHTTPserverSocketNum;
        if (currentHTTPserverSocketNum >= countHTTPsockets) currentHTTPserverSocketNum = 0;
    }
}

void core1_entry() {
    initPinLed(); // init pin led
    startMillisTimer();
    initPinKey(); // init pin key IRQ
    initRSTpinW5500();
    initSPIw5500();
    w5500hardReset();
    printf("Start W5500\n");
    w5500initLib();
    set1secFCallback(DNS_time_handler);
    set1secSCallback(httpServer_time_handler);
    while (1) {
        blinkLedBoardLoop(); // blink board led
        if (startWithDHCP) loopDHCPclient(); 
        loopHTTPclient();
        if (useHTTPserver) loopHTTPserver();
    }
}

void startCore1w5500pico(bool wDHCPclient) {
    httpClient.clientStatus = clHtNone; // reset HTTP client
    useHTTPserver = false;
    startWithDHCP = wDHCPclient;
    multicore_launch_core1(core1_entry);
}

void startHTTPserver(void) {
    countHTTPsockets = HTTP_SERVER_END_SOCKET - HTTP_SERVER_BEG_SOCKET + 1;
    for (unsigned char i=0; i<countHTTPsockets; ++i) serverSocketsHTTP[i] = HTTP_SERVER_BEG_SOCKET + i;
    initsSocketsHTTP = false;
    regPagesHTTPsrv = false;
    useHTTPserver = true;
}

void getDNS1(unsigned char * inDNS) {
    *inDNS = dns1[0];
    *(inDNS+1) = dns1[1];
    *(inDNS+2) = dns1[2];
    *(inDNS+3) = dns1[3];
}

void getDNS2(unsigned char * inDNS) {
    *inDNS = dns2[0];
    *(inDNS+1) = dns2[1];
    *(inDNS+2) = dns2[2];
    *(inDNS+3) = dns2[3];
}

-

Start W5500

IP was not assigned :(

IP was not assigned :(

IP was not assigned :(

IP was not assigned :(

IP was not assigned :(

IP was not assigned :(

IP was not assigned :(

IP was not assigned :(

IP was not assigned :(

IP was not assigned :(
Callback: IP assigned! Leased time: 600 sec
IP:  10.127.0.10
GW:  10.127.0.1
Net: 255.255.255.240
DNS1: 10.127.0.1
DNS2: 8.8.8.8
Resolving domain name "ip-v4.ru"...

=== List of Web content in code flash ===
 [1] index.html, 664 byte, [ ... ]
 [2] m/index.html, 664 byte, [ ... ]
 [3] mobile/index.html, 664 byte, [ ... ]
 [4] setdatetime/index.html, 581 byte, [ ... ]
=========================================

2:TCP client loopback start
2:Socket opened
> HTTPSocket[3] : CLOSED
> HTTPSocket[3] : OPEN
2:Try to connect to the 195.24.66.87 : 80
> HTTPSocket[4] : CLOSED
> HTTPSocket[4] : OPEN
2:Connected to - 195.24.66.87 : 80
GET / HTTP/1.1
Host: ip-v4.ru
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5
Accept: text/html
Connection: close

> HTTPSocket[5] : CLOSED
> HTTPSocket[5] : OPEN
> HTTPSocket[6] : CLOSED
> HTTPSocket[6] : OPEN
> HTTPSocket[7] : CLOSED
> HTTPSocket[7] : OPEN
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Wed, 07 Sep 2022 08:00:28 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 3885
Connection: close
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN

<!DOCTYPE html>
<html>
<head>
<meta name="robots" content="index, nofollow, noarchive" />
<meta name="keywords" content="my ip, ru-center, looking glass, lg.nic.ru, traceroute, my ip address, my ipv4, lg">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/png" href="/img/16.png" sizes="16x16">
<link rel="icon" type="image/png" href="/img/32.png" sizes="32x32">
<link rel="icon" type="image/png" href="/img/48.png" sizes="48x48">
<link rel="icon" type="image/png" href="/img/96.png" sizes="96x96">
<title>IPv4 simple looking glass</title>
<style>
body {
  margin: 0;
  font-family: Arial, Helvetica, sans-serif;
}

.nav {
  overflow: hidden;
  background-color: #333;
  text-align: center;
}

.nav li {
  display: inline;
  white-space: nowrap;
}

.nav a {
  display: inline-block;
  color: #f2f2f2;
  text-align: center;
  padding: 14px 16px;
  text-decoration: none;
  font-size: 17px;
}

.nav a:hover {
  background-color: #ddd;
  color: black;
}

.nav a.active {
  background-color: #4CAF50;
  color: white;
}

.theButton {
        background:linear-gradient(to bottom, #77b55a 5%, #72b352 100%);
        background-color:#77b55a;
        border-radius:4px;
        border:8px solid #333333;
        display:inline-block;
        cursor:pointer;
        color:#ffffff;
        font-family:Arial;
        font-size:16px;
        font-weight:bold;
        padding:7px 16px;
        text-decoration:none;
        text-shadow:1px 1px 0px #5b8a3c;
}
.theButton:hover {
        background:linear-gradient(to bottom, #72b352 5%, #77b55a 100%);
        background-color:#72b352;
}
.theButton:active {
        position:relative;
        top:1px;
}

</style>
</head>
<body>

 <header>
   <h3 style="font-weight:normal;white-space:nowrap;" align="center"><font color="white">RU-CENTER Looking Glass</font></h3>
   <h3 style="font-weight:normal;white-space:nowrap;" align="center"><a style="text-decoration:none;color:inherit" href="/">Simple IPv4 Looking Glass</a></h3>
 </header>
 <form method="POST" role="form">
 <div class="container">

  <div class="nav">
    <li><input type="text" style="height:28px;width:130px;border:9px solid #333333;font-size:14px;" placeholder="IPv4 address" name="destination" value="176.59.42.115"></li>
    <li><button id="ping" formaction="/ping" type="submit" value="ping" class="theButton" name="ping">Ping</button>
    <button id="mtr" formaction="/mtr" type="submit" value="mtr" class="theButton" name="mtr">MTR</button></li>
    <li><button id="nmap" formaction="/nmap" type="submit" value="nmap" class="theButton" name="namp">Nmap</button>
    <button id="whois" formaction="/whois" type="submit" value="whois" class="theButton" name="whois">Whois</button></li>
  </div>

  <div style="padding-left:16px">
  <form role="form">
      <br>
      <p align="center" id="ext_addr">Your public IP address: 176.59.42.115</p>
      <p align="center" id="int_addr"></p>
      <p align="center" id="warning"></p>
      <br>
  </form>
  <script>
    window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
    var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};
    pc.createDataChannel('');
    pc.createOffer(pc.setLocalDescription.bind(pc), noop);
    pc.onicecandidate = function(ice)
    {
      if (ice && ice.candidate && ice.candidate.candidate)
      {
        var intIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1];
        pc.onicecandidate = noop;
        document.getElementById('int_addr').textContent = 'Your private IP address: '.concat(intIP);
        document.getElementById('warning').textContent = 'Turn off WebRTC in your browser to hide private IP address';
      }
    };
  </script>
  </div>
 </div>
 </form>

 <div class="nav">
   <li><a href="https://www.nic.ru/catalog/hosting/">Located at RU-CENTER Hosting</a></li>
 </d2:CloseWait
2:Socket Closed

> HTTPSocket[3] : HTTP Request received from 10.127.0.11 : 52559
> HTTPSocket[3] : [State] STATE_HTTP_REQ_DONE
  uri_name = /

> HTTPSocket[3] : HTTP Method GET
> HTTPSocket[3] : Request Type = 1
> HTTPSocket[3] : Request URI = index.html
> HTTPSocket[3] : Find Content [index.html] ok - Start [0] len [ 664 ]byte
> HTTPSocket[3] : Requested content len = [ 664 ]byte
> HTTPSocket[3] : HTTP Response Header - STATUS_OK
> HTTPSocket[3] : [Send] HTTP Response Header [ 89 ]byte
> HTTPSocket[3] : HTTP Response end - file len [ 664 ]byte
> HTTPSocket[3] : [Send] HTTP Response body [ 664 ]byte
> HTTPSocket[3] : HTTP Response body - offset [ 664 ]
> HTTPSocket[3] : [State] STATE_HTTP_RES_DONE
> HTTPSocket[3] : CLOSED
> HTTPSocket[3] : OPEN

> HTTPSocket[4] : HTTP Request received from 10.127.0.11 : 52560
> HTTPSocket[4] : [State] STATE_HTTP_REQ_DONE
  uri_name = setdatetime

> HTTPSocket[4] : HTTP Method GET
> HTTPSocket[4] : Request Type = 1
> HTTPSocket[4] : Request URI = setdatetime/index.html
> HTTPSocket[4] : Find Content [setdatetime/index.html] ok - Start [3] len [ 581 ]byte
> HTTPSocket[4] : Requested content len = [ 581 ]byte
> HTTPSocket[4] : HTTP Response Header - STATUS_OK
> HTTPSocket[4] : [Send] HTTP Response Header [ 89 ]byte
> HTTPSocket[4] : HTTP Response end - file len [ 581 ]byte
> HTTPSocket[4] : [Send] HTTP Response body [ 581 ]byte
> HTTPSocket[4] : HTTP Response body - offset [ 581 ]
> HTTPSocket[4] : [State] STATE_HTTP_RES_DONE
> HTTPSocket[4] : CLOSED
> HTTPSocket[4] : OPEN

> HTTPSocket[3] : HTTP Request received from 10.127.0.11 : 52561
> HTTPSocket[3] : [State] STATE_HTTP_REQ_DONE
  uri_name = senddatetime.cgl

> HTTPSocket[3] : HTTP Method GET
> HTTPSocket[3] : Request Type = 37
> HTTPSocket[3] : Request URI = senddatetime.cgl
> HTTPSocket[3] : HTTP Response Header + Body - CGI
> HTTPSocket[3] : HTTP Response Header + Body - send len [ 35 ]byte
> HTTPSocket[3] : ClOSE_WAIT
> HTTPSocket[3] : CLOSED
> HTTPSocket[3] : OPEN

> HTTPSocket[5] : HTTP Request received from 10.127.0.11 : 52565
> HTTPSocket[5] : [State] STATE_HTTP_REQ_DONE
  uri_name = /

> HTTPSocket[5] : HTTP Method GET
> HTTPSocket[5] : Request Type = 1
> HTTPSocket[5] : Request URI = index.html
> HTTPSocket[5] : Find Content [index.html] ok - Start [0] len [ 664 ]byte
> HTTPSocket[5] : Requested content len = [ 664 ]byte
> HTTPSocket[5] : HTTP Response Header - STATUS_OK
> HTTPSocket[5] : [Send] HTTP Response Header [ 89 ]byte
> HTTPSocket[5] : HTTP Response end - file len [ 664 ]byte
> HTTPSocket[5] : [Send] HTTP Response body [ 664 ]byte
> HTTPSocket[5] : HTTP Response body - offset [ 664 ]
> HTTPSocket[5] : [State] STATE_HTTP_RES_DONE
> HTTPSocket[5] : CLOSED
> HTTPSocket[5] : OPEN

-

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

ua6em пишет:

RTC проверил, через полдня после отключения часики идут нормально, что там за батарейка такая???

нашлись пины куда батарейку цеплять?
я в даташите не нашел :(

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andycat пишет:

ua6em пишет:

RTC проверил, через полдня после отключения часики идут нормально, что там за батарейка такая???

нашлись пины куда батарейку цеплять?
я в даташите не нашел :(

я тоже, часики через какое-то время сбрасываются если модуль не под питанием

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

я тоже, часики через какое-то время сбрасываются если модуль не под питанием

цитата с arduino.cc

This RP2040-based RTC, using ISR for callback function, has no battery backup. Time will be lost when powered down. Examples show how to use NTP-client to update RTC on every start-up.

 

непонятно, зачем такой RTC ? Если есть возможность получить время по NTP после рестарта - то и RTC никакой не нужен

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

b707 пишет:

 

непонятно, зачем такой RTC ? 

учитывая потребление в спящем режиме < 2мА то какое нибудь устройство от аккумулятора, периодически просыпающееся, можно замутить.
ЗЫ. Только почитать надо работает ли RTC в sleep mode....

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andycat пишет:

b707 пишет:

 

непонятно, зачем такой RTC ? 

учитывая потребление в спящем режиме < 2мА то какое нибудь устройство от аккумулятора, периодически просыпающееся, можно замутить.
ЗЫ. Только почитать надо работает ли RTC в sleep mode....

к примеру анализатор спектра )))
 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Modyfi

забавно :))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Старею однако )))

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Modified

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

пока не окончен роман вопрос остаётся открытым modify или modified )))
ЗЫ языками особо не владею

Зато вчера поймал комбинационную от двух WIFI девайсов аж на 2.52 одно TL-WAS5110G другое UR-354AN4G стоит выключить любой из девайсов помеха пропадает, то-есть сертификация чистой воды фикция и стрижка бабла, всё куплено в официальном магазине...

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

ua6em пишет:

пока не окончен роман вопрос остаётся открытым modify или modified )))
ЗЫ языками особо не владею

Зато вчера поймал комбинационную от двух WIFI девайсов аж на 2.52 одно TL-WAS5110G другое UR-354AN4G стоит выключить любой из девайсов помеха пропадает, то-есть сертификация чистой воды фикция и стрижка бабла, всё куплено в официальном магазине...

в роутерах стоит настройка страны использования и во многих ее можно менять, что не мешает сертификации. Очень помогает в густо забитых эфиром многоквартирных домах.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andycat пишет:

в роутерах стоит настройка страны использования и во многих ее можно менять, что не мешает сертификации. Очень помогает в густо забитых эфиром многоквартирных домах.

Меня сейчас другое интересует, можно ли в NRF24 выставить частоту ниже 2400, тогда можно сделать сканер с более широким диапазоном

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andycat пишет:

WEB сервер

А вот использовать LAN8720 без разгона процессора по видимому не получится...

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

ua6em пишет:

andycat пишет:

WEB сервер

А вот использовать LAN8720 без разгона процессора по видимому не получится...

а зачем такие скорости на МК?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

b707 пишет:
не так уж ее и много.... на обычный блинк уходит 50Кб из 250 -ти :)
Есть ощущение, что они туда PVM запихали :-)

это не ощущение, это правда жизни...

import machine
import utime

import array, time
from machine import Pin
import rp2
from rp2 import PIO, StateMachine, asm_pio
# LED引脚
led_onboard = machine.Pin(25, machine.Pin.OUT)


# Configure the number of WS2812 LEDs.
NUM_LEDS = 10

@asm_pio(sideset_init=PIO.OUT_LOW, out_shiftdir=PIO.SHIFT_LEFT, autopull=True, pull_thresh=24)
def ws2812():
    T1 = 2
    T2 = 5
    T3 = 3
    label("bitloop")
    out(x, 1)               .side(0)    [T3 - 1] 
    jmp(not_x, "do_zero")   .side(1)    [T1 - 1] 
    jmp("bitloop")          .side(1)    [T2 - 1] 
    label("do_zero")
    nop()                   .side(0)    [T2 - 1]
    
# Create the StateMachine with the ws2812 program, outputting on Pin(23).ws2812引脚
sm = StateMachine(0, ws2812, freq=8000000, sideset_base=Pin(23))

# Start the StateMachine, it will wait for data on its FIFO.
sm.active(1)

# Display a pattern on the LEDs via an array of LED RGB values.
ar = array.array("I", [0 for _ in range(NUM_LEDS)])

time.sleep_ms(200)

print("red")

for j in range(0, 20): 
    for i in range(NUM_LEDS): 
        ar[i] = j<<8 
    sm.put(ar,8) 
    time.sleep_ms(50)
    
print("green")
for j in range(0, 20): 
    for i in range(NUM_LEDS): 
        ar[i] = j<<16 
    sm.put(ar,8) 
    time.sleep_ms(50)
    
print("blue")
for j in range(0, 100): 
    for i in range(NUM_LEDS): 
        ar[i] = j 
    sm.put(ar,8) 
    time.sleep_ms(5)

print("white")
for j in range(0, 100):
    for i in range(NUM_LEDS): 
        ar[i] = j<<16 + j<<8 + j 
    sm.put(ar,8) 
    time.sleep_ms(100)
    
# while True: 
    led_onboard.value(1) 
    utime.sleep(.3) 
    led_onboard.value(0) 
    utime.sleep(.3)

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Для библиотеки Adafruit_GFX есть правленный форк для  чипа RP2040...
Описание кодировки цвета и не только доступно тут
Онлайн подбор цвета можно сделать тут

Фунция перевода в нужный нам формат может быть такой:
 

uint16_t setColor(uint8_t red, uint8_t green, uint8_t blue){
  red = red * 31 / 255;
  green = green * 63 / 255;
  blue = blue *31 / 255;
  uint16_t color = ((uint16_t)red<<11) +((uint16_t)green <<5) +  blue;
  return color;
}

Применение:
 

  tft.setTextColor(setColor(247,234,105), ST77XX_BLACK);   

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

Для библиотеки Adafruit_GFX есть правленный форк для  чипа RP2040...
Описание кодировки цвета и не только доступно тут
Онлайн подбор цвета можно сделать тут

Фунция перевода в нужный нам формат может быть такой:
 

uint16_t setColor(uint8_t red, uint8_t green, uint8_t blue){
  red = red * 31 / 255;
  green = green * 63 / 255;
  blue = blue *31 / 255;
  uint16_t color = ((uint16_t)red<<11) +((uint16_t)green <<5) +  blue;
  return color;
}

Применение:
 

  tft.setTextColor(setColor(247,234,105), ST77XX_BLACK);   

 

Немножечко странная функция перевода.

Нет, если применять ее только с setTextColor - еще туда сюда. А если для каждого пикселя цветного изображения, то 3 деления на пиксель - не многовато ли?

Чем стандартный подход не устраивает?

И еще: вопросы работы с цветным экраном имеют вполне своеобразную специфику, притом, специфика эта не зависит от используемого контроллера. Не лучше ли для таких вопросов завести отдельную тему?

Т.е. какое отношение вообще имеет кодировка цвета к контроллеру RPi?

Ну и касательно специфики контроллера: коль скоро мы используем достаточно мощный контроллер, не следует ли подумать об использовании 18-разрядного цвета, который поддерживается большинством цветных экранов, вместо 16-разрядного?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

Немножечко странная функция перевода.

поясните, особо копать интернет времени между укладкой кафеля и дописыванием скетча сканера не было, нашел, как кодируется цвет у Adafruit_GFX (а я использую эту библиотеку), решил в лоб, видимо есть более изящное решение...

PS можно написать в одну строку, только код сожрёт памяти на 100 байт больше...
 

uint16_t setColor(uint8_t red, uint8_t green, uint8_t blue){
  uint16_t color = ((uint16_t)map(red,0,255,0,31)<<11) + ((uint16_t)map(green,0,255,0,63) <<5) + map(blue,0,255,0,31);
  return color;
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

несколько изменил китайский блинк в составе поставляемого модуля )))
 

import machine
import utime

import array, time
from machine import Pin
import rp2
from rp2 import PIO, StateMachine, asm_pio
# LED引脚
led_onboard = machine.Pin(25, machine.Pin.OUT)


# Configure the number of WS2812 LEDs.
NUM_LEDS = 10

@asm_pio(sideset_init=PIO.OUT_LOW, out_shiftdir=PIO.SHIFT_LEFT, autopull=True, pull_thresh=24)
def ws2812():
    T1 = 2
    T2 = 5
    T3 = 3
    label("bitloop")
    out(x, 1)               .side(0)    [T3 - 1] 
    jmp(not_x, "do_zero")   .side(1)    [T1 - 1] 
    jmp("bitloop")          .side(1)    [T2 - 1] 
    label("do_zero")
    nop()                   .side(0)    [T2 - 1]
    
# Create the StateMachine with the ws2812 program, outputting on Pin(23).ws2812引脚
sm = StateMachine(0, ws2812, freq=8000000, sideset_base=Pin(23))

# Start the StateMachine, it will wait for data on its FIFO.
sm.active(1)

# Display a pattern on the LEDs via an array of LED RGB values.
ar = array.array("I", [0 for _ in range(NUM_LEDS)])

time.sleep_ms(200)

print("red")

for j in range(0, 20): 
    for i in range(NUM_LEDS): 
        ar[i] = j<<8 
    sm.put(ar,8) 
    time.sleep_ms(50)
    
print("green")
for j in range(0, 20): 
    for i in range(NUM_LEDS): 
        ar[i] = j<<16 
    sm.put(ar,8) 
    time.sleep_ms(50)
    
print("blue")
for j in range(0, 100): 
    for i in range(NUM_LEDS): 
        ar[i] = j 
    sm.put(ar,8) 
    time.sleep_ms(5)

print("white")
for j in range(0, 100):
    for i in range(NUM_LEDS): 
        ar[i] = j<<0 + j<<1 + j<<0
    sm.put(ar,8) 
    time.sleep_ms(100)
    
# while True: 
    led_onboard.value(1) 
    utime.sleep(.3) 
    led_onboard.value(0) 
    utime.sleep(.3)  

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

andriano пишет:

Немножечко странная функция перевода.

поясните, особо копать интернет времени между укладкой кафеля и дописыванием скетча сканера не было, нашел, как кодируется цвет у Adafruit_GFX (а я использую эту библиотеку), решил в лоб, видимо есть более изящное решение...

PS можно написать в одну строку, только код сожрёт памяти на 100 байт больше...
 

uint16_t setColor(uint8_t red, uint8_t green, uint8_t blue){
  uint16_t color = ((uint16_t)map(red,0,255,0,31)<<11) + ((uint16_t)map(green,0,255,0,63) <<5) + map(blue,0,255,0,31);
  return color;
}

 

  uint16_t color = ((red & 0xf8)<<11) + ((green & 0xfc) <<5) + (blue & 0xf8);

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

uint16_t color = ((red & 0xf8)<<11) + ((green & 0xfc) <<5) + (blue & 0xf8);

Байт в байт, что ещё раз доказывает, что компиляторы пишут умные люди )))
PS на досуге подвигаю шашечки, посмотреть как в этом случае логичекое И работает, благодарю

Разобрался, Хитро однако! Буду знать...мне простительно, я не настоящий сталевар )))
 

  uint16_t color = ((red & 0x0b11111000) << 11) + ((green & 0b11111100) << 5) + (blue & 0b11111000);

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

вопрос больше не про Pico, а про Си. Пытаюсь перевести весь код на C++ рельсы, все подравнял, почти все модули компилируются норм, осталась одна ошибка

-строка

        bi_decl(bi_4pins_with_func(PICO_DEFAULT_SPI_RX_PIN, PICO_DEFAULT_SPI_TX_PIN, PICO_DEFAULT_SPI_SCK_PIN, PICO_DEFAULT_SPI_CSN_PIN, GPIO_FUNC_SPI));

-ошибка

In file included from C:\RP2040\pico-sdk\src\common\pico_binary_info\include/pico/binary_info.h:28,
                 from C:\RP2040\pico-examples\sockmodem\w5500pico.cpp:7:
C:\RP2040\pico-examples\sockmodem\w5500pico.cpp: In function 'void initSPIw5500()':
C:\RP2040\pico-sdk\src\common\pico_binary_info\include/pico/binary_info/code.h:94:5: error: narrowing conversion of '-1939523574' from 'int' to 'uint32_t' {aka 'long unsigned int'} [-Wnarrowing]
   94 |     }
      |     ^
C:\RP2040\pico-sdk\src\common\pico_binary_info\include/pico/binary_info/code.h:35:44: note: in definition of macro 'bi_decl'
   35 | #define bi_decl(_decl) __bi_mark_enclosure _decl; __bi_decl(__bi_ptr_lineno_var_name, &__bi_lineno_var_name.core, ".binary_info.keep.", __used);
      |                                            ^~~~~
C:\RP2040\pico-sdk\src\common\pico_binary_info\include/pico/binary_info/code.h:134:54: note: in expansion of macro '__bi_encoded_pins_with_func'
  134 | #define bi_4pins_with_func(p0, p1, p2, p3, func)     __bi_encoded_pins_with_func(BI_PINS_ENCODING_MULTI 
| ((func << 3)) | ((p0) << 7) | ((p1) << 12) | ((p2) << 17) | ((p3) << 22) | ((p3) << 27))
      |                                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\RP2040\pico-examples\sockmodem\w5500pico.cpp:240:17: note: in expansion of macro 'bi_4pins_with_func'        
  240 |         bi_decl(bi_4pins_with_func(PICO_DEFAULT_SPI_RX_PIN, PICO_DEFAULT_SPI_TX_PIN, PICO_DEFAULT_SPI_SCK_PIN, PICO_DEFAULT_SPI_CSN_PIN, GPIO_FUNC_SPI));

-вот описание макроса

/**
 * Declare some binary information that will be included if the contain source file/line is compiled into the binary
 * \ingroup pico_binary_info
 */
#define bi_decl(_decl) __bi_mark_enclosure _decl; __bi_decl(__bi_ptr_lineno_var_name, &__bi_lineno_var_name.core, ".binary_info.keep.", __used);

-вот весь код из SDK

/*
 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef _PICO_BINARY_INFO_CODE_H
#define _PICO_BINARY_INFO_CODE_H

// pico.h is not available when PICO_NO_BINARY_INFO=1 is used for builds outside of the SDK (e.g. picotool)
// and only needed anyway (because of macro definitions) in PICO_NO_BINARY_INFO=0 builds
#if !PICO_NO_BINARY_INFO
#include "pico.h"
#endif

#include "pico/binary_info/structure.h"

#if !PICO_NO_BINARY_INFO
#define __bi_decl(name, bi, section_prefix, attr) static const attr __attribute__((section(section_prefix __STRING(name)))) struct _binary_info_core *name = bi
#define __bi_lineno_var_name __CONCAT(__bi_, __LINE__)
#define __bi_ptr_lineno_var_name __CONCAT(__bi_ptr, __LINE__)
#define __bi_enclosure_check_lineno_var_name __CONCAT(_error_bi_is_missing_enclosing_decl_,__LINE__)
#define __bi_mark_enclosure static const __unused int __bi_enclosure_check_lineno_var_name=0;
#if !defined(__GNUC__) || __cplusplus || __GNUC__ >= 8
#define __bi_enclosure_check(x) (x + __bi_enclosure_check_lineno_var_name)
#else
// skip the version check on older GCC non C++, as it doesn't compile.. this is only here to catch the
// user accidentally forgetting to enclose the binary item with bi_decl
#define __bi_enclosure_check(x) (x)
#endif
/**
 * Declare some binary information that will be included if the contain source file/line is compiled into the binary
 * \ingroup pico_binary_info
 */
#define bi_decl(_decl) __bi_mark_enclosure _decl; __bi_decl(__bi_ptr_lineno_var_name, &__bi_lineno_var_name.core, ".binary_info.keep.", __used);
/**
 * Declare some binary information that will be included if the function containing the decl is linked into the binary.
 * The SDK uses --gc-sections, so functions that are never called will be removed by the linker, and any associated
 * binary information declared this way will also be stripped
 * \ingroup pico_binary_info
 */
#define bi_decl_if_func_used(_decl) ({__bi_mark_enclosure _decl; __bi_decl(__bi_ptr_lineno_var_name, &__bi_lineno_var_name.core, ".binary_info.", ); *(volatile uint8_t *)&__bi_ptr_lineno_var_name;});

#define bi_decl_with_attr(_decl, _attr) __bi_mark_enclosure _attr _decl; __bi_decl(__bi_ptr_lineno_var_name, &__bi_lineno_var_name.core, ".binary_info.keep.", __used);
#define bi_decl_if_func_used_with_attr(_decl, _attr) ({__bi_mark_enclosure _attr _decl; __bi_decl(__bi_ptr_lineno_var_name, &__bi_lineno_var_name.core, ".binary_info.", ); *(volatile uint8_t *)&__bi_ptr_lineno_var_name;});
#else
#define __bi_decl(bi, name, attr)
#define bi_decl_with_attr(_decl, _attr)
#define bi_decl(_decl)
#define bi_decl_if_func_used_with_attr(_decl, _attr) ((void)0);
#define bi_decl_if_func_used(_decl) ((void)0);
#endif

#define bi_int(_tag, _id, _value) \
     static const struct _binary_info_id_and_int __bi_lineno_var_name = { \
        .core = { \
            .type = __bi_enclosure_check(BINARY_INFO_TYPE_ID_AND_INT), \
            .tag = _tag, \
        },\
        .id = _id, \
        .value = _value \
    };

#define bi_string(_tag, _id, _value) \
    static const struct _binary_info_id_and_string __bi_lineno_var_name = { \
        .core = { \
            .type = __bi_enclosure_check(BINARY_INFO_TYPE_ID_AND_STRING), \
            .tag = _tag, \
        },\
        .id = _id, \
        .value = _value, \
    }

#define bi_block_device(_tag, _name, _address, _size, _extra, _flags) \
    static const struct _binary_info_block_device __bi_lineno_var_name = { \
        .core = { \
            .type = __bi_enclosure_check(BINARY_INFO_TYPE_BLOCK_DEVICE), \
            .tag = _tag, \
        },\
        .name = _name, \
        .address = _address, \
        .size = _size, \
        .extra = _extra, \
        .flags = _flags, \
    }

#define __bi_encoded_pins_with_func(_encoding) \
    static const struct _binary_info_pins_with_func __bi_lineno_var_name = { \
        .core = { \
            .type = __bi_enclosure_check(BINARY_INFO_TYPE_PINS_WITH_FUNC), \
            .tag = BINARY_INFO_TAG_RASPBERRY_PI, \
        },\
        .pin_encoding = _encoding \
    }

#define __bi_pins_with_name(_mask, _label) \
    static const struct _binary_info_pins_with_name __bi_lineno_var_name = { \
        .core = { \
            .type = __bi_enclosure_check(BINARY_INFO_TYPE_PINS_WITH_NAME), \
            .tag = BINARY_INFO_TAG_RASPBERRY_PI, \
        },\
        .pin_mask = _mask, \
        .label = _label \
    }

#define __bi_named_group(_parent_tag, _parent_id, _group_tag, _group_id, _label, _flags) \
static const struct _binary_info_named_group __bi_lineno_var_name = { \
        .core = { \
            .type = __bi_enclosure_check(BINARY_INFO_TYPE_NAMED_GROUP), \
            .tag = _parent_tag, \
        },\
        .parent_id = _parent_id, \
        .group_tag = _group_tag, \
        .flags = _flags, \
        .group_id = _group_id, \
        .label = _label \
    }

#define bi_binary_end(end) bi_int(BINARY_INFO_TAG_RASPBERRY_PI, BINARY_INFO_ID_RP_BINARY_END, end)
#define bi_program_name(name) bi_string(BINARY_INFO_TAG_RASPBERRY_PI, BINARY_INFO_ID_RP_PROGRAM_NAME, name)
#define bi_program_description(description) bi_string(BINARY_INFO_TAG_RASPBERRY_PI, BINARY_INFO_ID_RP_PROGRAM_DESCRIPTION, description)
#define bi_program_version_string(version_string) bi_string(BINARY_INFO_TAG_RASPBERRY_PI, BINARY_INFO_ID_RP_PROGRAM_VERSION_STRING, version_string)
#define bi_program_build_date_string(date_string) bi_string(BINARY_INFO_TAG_RASPBERRY_PI, BINARY_INFO_ID_RP_PROGRAM_BUILD_DATE_STRING, date_string)
#define bi_program_url(url) bi_string(BINARY_INFO_TAG_RASPBERRY_PI, BINARY_INFO_ID_RP_PROGRAM_URL, url)
// multiple of these may be added
#define bi_program_feature(feature) bi_string(BINARY_INFO_TAG_RASPBERRY_PI, BINARY_INFO_ID_RP_PROGRAM_FEATURE, feature)
#define bi_program_build_attribute(attr) bi_string(BINARY_INFO_TAG_RASPBERRY_PI, BINARY_INFO_ID_RP_PROGRAM_BUILD_ATTRIBUTE, attr)
#define bi_program_feature_group(tag, id, name) __bi_named_group(BINARY_INFO_TAG_RASPBERRY_PI, BINARY_INFO_ID_RP_PROGRAM_FEATURE, tag, id, name, 0)
#define bi_program_feature_group_with_flags(tag, id, name, flags) __bi_named_group(BINARY_INFO_TAG_RASPBERRY_PI, BINARY_INFO_ID_RP_PROGRAM_FEATURE, tag, id, name, flags)

#define bi_1pin_with_func(p0, func)                  __bi_encoded_pins_with_func(BI_PINS_ENCODING_MULTI | ((func << 3)) | ((p0) << 7) | ((p0) << 12))
#define bi_2pins_with_func(p0, p1, func)             __bi_encoded_pins_with_func(BI_PINS_ENCODING_MULTI | ((func << 3)) | ((p0) << 7) | ((p1) << 12) | ((p1) << 17))
#define bi_3pins_with_func(p0, p1, p2, func)         __bi_encoded_pins_with_func(BI_PINS_ENCODING_MULTI | ((func << 3)) | ((p0) << 7) | ((p1) << 12) | ((p2) << 17) | ((p2) << 22))
#define bi_4pins_with_func(p0, p1, p2, p3, func)     __bi_encoded_pins_with_func(BI_PINS_ENCODING_MULTI | ((func << 3)) | ((p0) << 7) | ((p1) << 12) | ((p2) << 17) | ((p3) << 22) | ((p3) << 27))
#define bi_5pins_with_func(p0, p1, p2, p3, p4, func) __bi_encoded_pins_with_func(BI_PINS_ENCODING_MULTI | ((func << 3)) | ((p0) << 7) | ((p1) << 12) | ((p2) << 17) | ((p3) << 22) | ((p4) << 27))
#define bi_pin_range_with_func(plo, phi, func)       __bi_encoded_pins_with_func(BI_PINS_ENCODING_RANGE | ((func << 3)) | ((plo) << 7) | ((phi) << 12))

#define bi_pin_mask_with_name(pmask, label)          __bi_pins_with_name((pmask), (label))
// names are separated by | ... i.e. "name1|name2|name3"
#define bi_pin_mask_with_names(pmask, label)          __bi_pins_with_name((pmask), (label))
#define bi_1pin_with_name(p0, name)                   bi_pin_mask_with_name(1u << (p0), name)
#define bi_2pins_with_names(p0, name0, p1, name1)     bi_pin_mask_with_names((1u << (p0)) | (1u << (p1)), name0 "|" name1)
#define bi_3pins_with_names(p0, name0, p1, name1, p2, name2)  bi_pin_mask_with_names((1u << (p0)) | (1u << (p1)) | (1u << (p2)), name0 "|" name1 "|" name2)
#define bi_4pins_with_names(p0, name0, p1, name1, p2, name2, p3, name3)  bi_pin_mask_with_names((1u << (p0)) | (1u << (p1)) | (1u << (p2)) | (1u << (p3)), name0 "|" name1 "|" name2 "|" name3)

#endif

не могу понять откуда компилятор берет -1939523574

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

или как вариант откомпилировать эту строку в Си без плюсов, но не могу найти что завернуть в условие

    #ifdef __cplusplus