/* ====================================================================
 * Esp-Sip-Doorbell
 * Heinz Bruederlin (12/2022) (heinz@soft-t.de)
 *
 * Based on Copyright (c) 2018 Juerge Liegner  All rights reserved.
 * ====================================================================
 */
#include <ESP8266WiFi.h>
#include "Sip.h"

//------------------------------------------------
// configuration with fix ip
//------------------------------------------------

// wlan param
const char* wifissid     = "wifissid";
const char* wifipassword = "wifisecret";
const char* wifihostname = "SIP-DOORBELL";

// sip params
const char* sipip     = "192.168.0.1";
int         sipport   = 5060;
const char* sipuser   = "sipuser";
const char* sippasswd = "sipsecret";

// dial params
unsigned    MaxDialSec   = 10;
const char* sipdialnr1   = "**9";
const char* sipdialtext1 = "SIP-Doorbell";

// network params
const char* ip   = "192.168.0.28";
const char* gw   = "192.168.0.1";
const char* mask = "255.255.255.0";
const char* dns  = "192.168.0.1";

// sip params
char caSipIn[2048];
char caSipOut[2048];

Sip aSip(caSipOut, sizeof(caSipOut));

// the setup function runs once when you press reset or power the board
void setup() {
    IPAddress Ip;
    IPAddress Gw;
    IPAddress Mask;
    IPAddress Dns;
    unsigned long startTime;

    Ip.fromString(ip);
    Gw.fromString(gw);
    Mask.fromString(mask);
    Dns.fromString(dns);

    WiFi.hostname(wifihostname);
    WiFi.config(Ip, Gw, Mask, Dns);
    WiFi.begin(wifissid, wifipassword);
    WiFi.mode(WIFI_STA);

    int connectTries = 0;
    while (WiFi.status() != WL_CONNECTED) {
        delay(100);
        connectTries++;
        if (connectTries > 100) {
            ESP.deepSleep(0);
        }
    }
    // WiFi.persistent(true);

    aSip.Init(sipip, sipport, ip, sipport, sipuser, sippasswd, MaxDialSec);
    aSip.Dial(sipdialnr1, sipdialtext1);

    startTime = millis();
    do {
        int packetSize = aSip.Udp.parsePacket();
        if (packetSize > 0) {
            caSipIn[0] = 0;
            packetSize = aSip.Udp.read(caSipIn, sizeof(caSipIn));
            if (packetSize > 0) {
                caSipIn[packetSize] = 0;
            }
        }
        aSip.HandleUdpPacket((packetSize > 0) ? caSipIn : 0);
    } while (aSip.IsBusy() ||
             ((millis() - startTime) < 5U * MaxDialSec * 1000U));

    WiFi.disconnect();
    delay(200);
    ESP.deepSleep(0);
}

void loop() {}
